From 5e64624059d6f984f4304abf336cce05cdb0212f Mon Sep 17 00:00:00 2001 From: Wolfgang Wiedmeyer Date: Sun, 25 Oct 2015 21:44:51 +0100 Subject: remove more unused drivers, readd accidentally removed iommu, reenable graphics settings --- arch/arm/configs/cyanogenmod_i9300_defconfig | 23 +- drivers/Kconfig | 2 + drivers/Makefile | 2 + drivers/iommu/Kconfig | 161 + drivers/iommu/Makefile | 12 + drivers/iommu/exynos-iommu.c | 1054 + drivers/iommu/exynos-iovmm.c | 510 + drivers/iommu/iommu.c | 343 + drivers/media/Kconfig | 9 - drivers/media/Makefile | 2 - drivers/media/isdbt/Kconfig | 14 - drivers/media/isdbt/Makefile | 8 - drivers/media/isdbt/fc8100/KLlist.c | 285 - drivers/media/isdbt/fc8100/LKlist.h | 44 - drivers/media/isdbt/fc8100/Makefile | 16 - drivers/media/isdbt/fc8100/bbm.c | 237 - drivers/media/isdbt/fc8100/bbm.h | 61 - drivers/media/isdbt/fc8100/fc8100.c | 271 - drivers/media/isdbt/fc8100/fc8100.h | 66 - drivers/media/isdbt/fc8100/fc8100_bb.c | 204 - drivers/media/isdbt/fc8100/fc8100_bb.h | 29 - drivers/media/isdbt/fc8100/fc8100_i2c.c | 349 - drivers/media/isdbt/fc8100/fc8100_i2c.h | 43 - drivers/media/isdbt/fc8100/fc8100_isr.c | 27 - drivers/media/isdbt/fc8100/fc8100_isr.h | 31 - drivers/media/isdbt/fc8100/fc8100_regs.h | 337 - drivers/media/isdbt/fc8100/fc8100_tun.c | 351 - drivers/media/isdbt/fc8100/fc8100_tun.h | 29 - drivers/media/isdbt/fc8100/fci_hal.c | 199 - drivers/media/isdbt/fc8100/fci_hal.h | 41 - drivers/media/isdbt/fc8100/fci_i2c.c | 42 - drivers/media/isdbt/fc8100/fci_i2c.h | 31 - drivers/media/isdbt/fc8100/fci_oal.c | 34 - drivers/media/isdbt/fc8100/fci_oal.h | 27 - drivers/media/isdbt/fc8100/fci_tun.c | 162 - drivers/media/isdbt/fc8100/fci_tun.h | 56 - drivers/media/isdbt/fc8100/fci_types.h | 46 - drivers/media/isdbt/fc8150/Makefile | 18 - drivers/media/isdbt/fc8150/bbm.c | 287 - drivers/media/isdbt/fc8150/bbm.h | 60 - drivers/media/isdbt/fc8150/fc8150.c | 525 - drivers/media/isdbt/fc8150/fc8150.h | 120 - drivers/media/isdbt/fc8150/fc8150_bb.c | 789 - drivers/media/isdbt/fc8150/fc8150_bb.h | 22 - drivers/media/isdbt/fc8150/fc8150_hpi.c | 197 - drivers/media/isdbt/fc8150/fc8150_hpi.h | 33 - drivers/media/isdbt/fc8150/fc8150_i2c.c | 237 - drivers/media/isdbt/fc8150/fc8150_i2c.h | 33 - drivers/media/isdbt/fc8150/fc8150_isr.c | 47 - drivers/media/isdbt/fc8150/fc8150_isr.h | 22 - drivers/media/isdbt/fc8150/fc8150_ppi.c | 212 - drivers/media/isdbt/fc8150/fc8150_ppi.h | 33 - drivers/media/isdbt/fc8150/fc8150_regs.h | 136 - drivers/media/isdbt/fc8150/fc8150_spi.c | 293 - drivers/media/isdbt/fc8150/fc8150_spi.h | 33 - drivers/media/isdbt/fc8150/fc8150_spib.c | 210 - drivers/media/isdbt/fc8150/fc8150_spib.h | 34 - drivers/media/isdbt/fc8150/fc8150_tun.c | 393 - drivers/media/isdbt/fc8150/fc8150_tun.h | 26 - drivers/media/isdbt/fc8150/fc8151_tun.c | 413 - drivers/media/isdbt/fc8150/fc8151_tun.h | 26 - drivers/media/isdbt/fc8150/fci_bypass.c | 39 - drivers/media/isdbt/fc8150/fci_bypass.h | 34 - drivers/media/isdbt/fc8150/fci_hal.c | 245 - drivers/media/isdbt/fc8150/fci_hal.h | 37 - drivers/media/isdbt/fc8150/fci_i2c.c | 226 - drivers/media/isdbt/fc8150/fci_i2c.h | 29 - drivers/media/isdbt/fc8150/fci_oal.c | 50 - drivers/media/isdbt/fc8150/fci_oal.h | 28 - drivers/media/isdbt/fc8150/fci_ringbuffer.c | 271 - drivers/media/isdbt/fc8150/fci_ringbuffer.h | 89 - drivers/media/isdbt/fc8150/fci_tun.c | 204 - drivers/media/isdbt/fc8150/fci_tun.h | 46 - drivers/media/isdbt/fc8150/fci_types.h | 61 - drivers/media/isdbt/isdbt.c | 598 - drivers/media/isdbt/isdbt.h | 26 - drivers/media/tdmb/Kconfig | 89 - drivers/media/tdmb/Makefile | 41 - drivers/media/tdmb/fc8050/Makefile | 15 - drivers/media/tdmb/fc8050/bbm.c | 364 - drivers/media/tdmb/fc8050/bbm.h | 102 - drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.c | 607 - drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.h | 73 - drivers/media/tdmb/fc8050/fc8050_bb.c | 607 - drivers/media/tdmb/fc8050/fc8050_bb.h | 63 - drivers/media/tdmb/fc8050/fc8050_i2c.c | 171 - drivers/media/tdmb/fc8050/fc8050_i2c.h | 50 - drivers/media/tdmb/fc8050/fc8050_isr.c | 116 - drivers/media/tdmb/fc8050/fc8050_isr.h | 54 - drivers/media/tdmb/fc8050/fc8050_regs.h | 414 - drivers/media/tdmb/fc8050/fc8050_spi.c | 324 - drivers/media/tdmb/fc8050/fc8050_spi.h | 51 - drivers/media/tdmb/fc8050/fc8050_tun.c | 255 - drivers/media/tdmb/fc8050/fc8050_tun.h | 43 - drivers/media/tdmb/fc8050/fci_hal.c | 231 - drivers/media/tdmb/fc8050/fci_hal.h | 57 - drivers/media/tdmb/fc8050/fci_i2c.c | 263 - drivers/media/tdmb/fc8050/fci_i2c.h | 47 - drivers/media/tdmb/fc8050/fci_oal.c | 39 - drivers/media/tdmb/fc8050/fci_oal.h | 42 - drivers/media/tdmb/fc8050/fci_tun.c | 166 - drivers/media/tdmb/fc8050/fci_tun.h | 65 - drivers/media/tdmb/fc8050/fci_types.h | 77 - drivers/media/tdmb/fc8050/fic.c | 80 - drivers/media/tdmb/fc8050/fic.h | 42 - drivers/media/tdmb/fc8050/ficdecoder.c | 1654 -- drivers/media/tdmb/fc8050/ficdecoder.h | 183 - drivers/media/tdmb/mtv318/Makefile | 7 - drivers/media/tdmb/mtv318/raontv.c | 117 - drivers/media/tdmb/mtv318/raontv.h | 274 - drivers/media/tdmb/mtv318/raontv_ficdec.c | 2710 --- drivers/media/tdmb/mtv318/raontv_ficdec.h | 39 - drivers/media/tdmb/mtv318/raontv_ficdec_internal.h | 699 - drivers/media/tdmb/mtv318/raontv_internal.h | 796 - drivers/media/tdmb/mtv318/raontv_port.c | 169 - drivers/media/tdmb/mtv318/raontv_port.h | 432 - drivers/media/tdmb/mtv318/raontv_rf.c | 1532 -- drivers/media/tdmb/mtv318/raontv_rf.h | 46 - drivers/media/tdmb/mtv318/raontv_rf_adc_data.h | 1037 - .../media/tdmb/mtv318/raontv_rf_pll_data_tdmb.h | 412 - drivers/media/tdmb/mtv318/raontv_tdmb.c | 1987 -- drivers/media/tdmb/t3900/INC_FICDEC.c | 1535 -- drivers/media/tdmb/t3900/INC_INCLUDES.h | 1060 - drivers/media/tdmb/t3900/INC_INTERFACE.c | 530 - drivers/media/tdmb/t3900/INC_PROCESS.c | 1893 -- drivers/media/tdmb/t3900/INC_RF_CTRL500.c | 2544 -- drivers/media/tdmb/t3900/Makefile | 6 - drivers/media/tdmb/tcc3170/Makefile | 8 - drivers/media/tdmb/tcc3170/inc/tcbd_api_common.h | 365 - .../tcc3170/inc/tcbd_diagnosis/tcbd_diagnosis.h | 52 - drivers/media/tdmb/tcc3170/inc/tcbd_drv_io.h | 95 - drivers/media/tdmb/tcc3170/inc/tcbd_drv_ip.h | 78 - drivers/media/tdmb/tcc3170/inc/tcbd_drv_register.h | 558 - drivers/media/tdmb/tcc3170/inc/tcbd_drv_rf.h | 31 - drivers/media/tdmb/tcc3170/inc/tcbd_error.h | 53 - drivers/media/tdmb/tcc3170/inc/tcbd_feature.h | 125 - drivers/media/tdmb/tcc3170/inc/tcbd_hal.h | 35 - .../inc/tcbd_stream_parser/tcbd_stream_parser.h | 45 - drivers/media/tdmb/tcc3170/inc/tcc317x_boot_tdmb.h | 1011 - .../tcc3170/inc/tcc_fic_decoder/tcc_fic_decoder.h | 123 - .../tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_fig.h | 228 - drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_debug.h | 75 - drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_os.h | 62 - drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_queue.h | 66 - drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_types.h | 50 - drivers/media/tdmb/tcc3170/src/Makefile | 19 - drivers/media/tdmb/tcc3170/src/tcbd_api_common.c | 648 - .../media/tdmb/tcc3170/src/tcbd_diagnosis/Makefile | 5 - .../tcc3170/src/tcbd_diagnosis/tcbd_diagnosis.c | 386 - drivers/media/tdmb/tcc3170/src/tcbd_drv_dual.c | 54 - drivers/media/tdmb/tcc3170/src/tcbd_drv_io.c | 516 - drivers/media/tdmb/tcc3170/src/tcbd_drv_ip.c | 808 - drivers/media/tdmb/tcc3170/src/tcbd_drv_peri.c | 267 - drivers/media/tdmb/tcc3170/src/tcbd_drv_rf.c | 254 - drivers/media/tdmb/tcc3170/src/tcbd_hal.c | 140 - .../tdmb/tcc3170/src/tcbd_stream_parser/Makefile | 6 - .../src/tcbd_stream_parser/tcbd_stream_parser.c | 525 - .../tdmb/tcc3170/src/tcc_fic_decoder/Makefile | 7 - .../tcc3170/src/tcc_fic_decoder/tcc_fic_decoder.c | 540 - .../tcc3170/src/tcc_fic_decoder/tcc_fic_fig0.c | 911 - .../tcc3170/src/tcc_fic_decoder/tcc_fic_fig1.c | 254 - .../media/tdmb/tcc3170/src/tcpal_linux/Makefile | 15 - .../tdmb/tcc3170/src/tcpal_linux/tcpal_debug.c | 106 - .../tdmb/tcc3170/src/tcpal_linux/tcpal_io_cspi.c | 492 - .../tdmb/tcc3170/src/tcpal_linux/tcpal_io_i2c.c | 309 - .../tcc3170/src/tcpal_linux/tcpal_irq_handler.c | 246 - .../tdmb/tcc3170/src/tcpal_linux/tcpal_linux.c | 138 - .../tdmb/tcc3170/src/tcpal_linux/tcpal_queue.c | 201 - drivers/media/tdmb/tdmb.c | 867 - drivers/media/tdmb/tdmb.h | 181 - drivers/media/tdmb/tdmb_data.c | 463 - drivers/media/tdmb/tdmb_ebi.c | 36 - drivers/media/tdmb/tdmb_port_fc8050.c | 220 - drivers/media/tdmb/tdmb_port_mtv318.c | 257 - drivers/media/tdmb/tdmb_port_t3900.c | 291 - drivers/media/tdmb/tdmb_port_tcc3170.c | 478 - drivers/media/tdmb/tdmb_spi.c | 72 - drivers/misc/Kconfig | 29 +- drivers/misc/Makefile | 12 +- drivers/misc/c2c/Kconfig | 24 - drivers/misc/c2c/Makefile | 5 - drivers/misc/c2c/samsung-c2c.c | 712 - drivers/misc/c2c/samsung-c2c.h | 334 - drivers/misc/inv_mpu/Kconfig | 24 - drivers/misc/inv_mpu/Makefile | 22 - drivers/misc/inv_mpu/README | 104 - drivers/misc/inv_mpu/accel/Kconfig | 133 - drivers/misc/inv_mpu/accel/Makefile | 38 - drivers/misc/inv_mpu/accel/adxl34x.c | 728 - drivers/misc/inv_mpu/accel/bma150.c | 776 - drivers/misc/inv_mpu/accel/bma222.c | 654 - drivers/misc/inv_mpu/accel/bma250.c | 787 - drivers/misc/inv_mpu/accel/cma3000.c | 222 - drivers/misc/inv_mpu/accel/kxsd9.c | 264 - drivers/misc/inv_mpu/accel/kxtf9.c | 841 - drivers/misc/inv_mpu/accel/lis331.c | 745 - drivers/misc/inv_mpu/accel/lis3dh.c | 728 - drivers/misc/inv_mpu/accel/lsm303dlx_a.c | 881 - drivers/misc/inv_mpu/accel/mma8450.c | 804 - drivers/misc/inv_mpu/accel/mma845x.c | 713 - drivers/misc/inv_mpu/accel/mpu6050.c | 732 - drivers/misc/inv_mpu/accel/mpu6050.h | 28 - drivers/misc/inv_mpu/compass/Kconfig | 94 - drivers/misc/inv_mpu/compass/Makefile | 30 - drivers/misc/inv_mpu/compass/ak8972.c | 499 - drivers/misc/inv_mpu/compass/ak8975.c | 504 - drivers/misc/inv_mpu/compass/hscdtd002b.c | 294 - drivers/misc/inv_mpu/compass/hscdtd004a.c | 318 - drivers/misc/inv_mpu/compass/lsm303dlx_m.c | 395 - drivers/misc/inv_mpu/compass/mmc314x.c | 313 - drivers/misc/inv_mpu/compass/yas529-kernel.c | 611 - drivers/misc/inv_mpu/compass/yas530.c | 596 - drivers/misc/inv_mpu/compass/yas530_ext.c | 288 - drivers/misc/inv_mpu/compass/yas530_ext.h | 28 - drivers/misc/inv_mpu/log.h | 287 - drivers/misc/inv_mpu/mldl_cfg.c | 1913 -- drivers/misc/inv_mpu/mldl_cfg.h | 381 - drivers/misc/inv_mpu/mldl_print_cfg.c | 138 - drivers/misc/inv_mpu/mldl_print_cfg.h | 38 - drivers/misc/inv_mpu/mlsl-kernel.c | 420 - drivers/misc/inv_mpu/mlsl.h | 193 - drivers/misc/inv_mpu/mltypes.h | 234 - drivers/misc/inv_mpu/mpu-dev.c | 2348 -- drivers/misc/inv_mpu/mpu-dev.h | 42 - drivers/misc/inv_mpu/mpu6050b1.h | 437 - drivers/misc/inv_mpu/mpuirq.c | 261 - drivers/misc/inv_mpu/mpuirq.h | 36 - drivers/misc/inv_mpu/pressure/Kconfig | 20 - drivers/misc/inv_mpu/pressure/Makefile | 8 - drivers/misc/inv_mpu/pressure/bma085.c | 367 - drivers/misc/inv_mpu/sensors_core.c | 100 - drivers/misc/inv_mpu/slaveirq.c | 266 - drivers/misc/inv_mpu/slaveirq.h | 36 - drivers/misc/inv_mpu/timerirq.c | 296 - drivers/misc/inv_mpu/timerirq.h | 30 - drivers/misc/modem_if_na/Kconfig | 30 - drivers/misc/modem_if_na/Makefile | 8 - drivers/misc/modem_if_na/lte_modem_bootloader.c | 320 - drivers/misc/modem_if_na/modem.c | 221 - drivers/misc/modem_if_na/modem_io_device.c | 965 - drivers/misc/modem_if_na/modem_link_device_dpram.c | 1504 -- drivers/misc/modem_if_na/modem_link_device_dpram.h | 165 - drivers/misc/modem_if_na/modem_link_device_usb.c | 1031 - drivers/misc/modem_if_na/modem_link_device_usb.h | 148 - drivers/misc/modem_if_na/modem_link_pm_usb.c | 370 - drivers/misc/modem_if_na/modem_link_pm_usb.h | 88 - .../misc/modem_if_na/modem_modemctl_device_cbp71.c | 269 - .../modem_if_na/modem_modemctl_device_cmc220.c | 254 - .../modem_if_na/modem_net_flowcontrol_device.c | 115 - drivers/misc/modem_if_na/modem_prj.h | 239 - drivers/misc/modem_if_na/modem_utils.c | 391 - drivers/misc/modem_if_na/modem_utils.h | 158 - drivers/misc/modem_if_na/modem_variation.h | 124 - drivers/misc/modem_if_u1/Kconfig | 104 - drivers/misc/modem_if_u1/Makefile | 26 - drivers/misc/modem_if_u1/lte_modem_bootloader.c | 313 - drivers/misc/modem_if_u1/modem_link_device_c2c.c | 61 - drivers/misc/modem_if_u1/modem_link_device_c2c.h | 216 - drivers/misc/modem_if_u1/modem_link_device_dpram.c | 2657 -- drivers/misc/modem_if_u1/modem_link_device_dpram.h | 253 - .../modem_if_u1/modem_link_device_dpram_ext_op.c | 1309 - drivers/misc/modem_if_u1/modem_link_device_hsic.c | 1604 -- drivers/misc/modem_if_u1/modem_link_device_hsic.h | 155 - .../misc/modem_if_u1/modem_link_device_memory.h | 552 - drivers/misc/modem_if_u1/modem_link_device_mipi.c | 1418 -- drivers/misc/modem_if_u1/modem_link_device_mipi.h | 158 - drivers/misc/modem_if_u1/modem_link_device_pld.c | 1627 -- drivers/misc/modem_if_u1/modem_link_device_pld.h | 231 - .../modem_if_u1/modem_link_device_pld_ext_op.c | 556 - drivers/misc/modem_if_u1/modem_link_device_spi.c | 1787 -- drivers/misc/modem_if_u1/modem_link_device_spi.h | 276 - drivers/misc/modem_if_u1/modem_link_device_usb.c | 1028 - drivers/misc/modem_if_u1/modem_link_device_usb.h | 132 - drivers/misc/modem_if_u1/modem_link_pm_usb.c | 417 - drivers/misc/modem_if_u1/modem_link_pm_usb.h | 65 - .../misc/modem_if_u1/modem_modemctl_device_cbp71.c | 233 - .../misc/modem_if_u1/modem_modemctl_device_cbp72.c | 273 - .../modem_if_u1/modem_modemctl_device_cmc221.c | 317 - .../modem_if_u1/modem_modemctl_device_esc6270.c | 343 - .../modem_if_u1/modem_modemctl_device_mdm6600.c | 790 - .../modem_if_u1/modem_modemctl_device_sprd8803.c | 262 - .../modem_if_u1/modem_modemctl_device_xmm6260.c | 303 - .../modem_if_u1/modem_modemctl_device_xmm6262.c | 344 - .../modem_if_u1/modem_net_flowcontrol_device.c | 116 - drivers/misc/modem_if_u1/modem_prj.h | 773 - drivers/misc/modem_if_u1/modem_sim_slot_switch.c | 108 - drivers/misc/modem_if_u1/modem_utils.c | 1237 - drivers/misc/modem_if_u1/modem_utils.h | 315 - drivers/misc/modem_if_u1/modem_variation.h | 175 - drivers/misc/modem_if_u1/sipc4_io_device.c | 1710 -- drivers/misc/modem_if_u1/sipc4_modem.c | 366 - drivers/misc/modem_if_u1/sipc5_io_device.c | 1608 -- drivers/misc/modem_if_u1/sipc5_modem.c | 385 - drivers/misc/mpu3050/Kconfig | 147 - drivers/misc/mpu3050/Makefile | 145 - drivers/misc/mpu3050/README | 250 - drivers/misc/mpu3050/accel/adxl346.c | 163 - drivers/misc/mpu3050/accel/bma150.c | 149 - drivers/misc/mpu3050/accel/bma222.c | 142 - drivers/misc/mpu3050/accel/cma3000.c | 109 - drivers/misc/mpu3050/accel/kxsd9.c | 145 - drivers/misc/mpu3050/accel/kxtf9.c | 641 - drivers/misc/mpu3050/accel/kxud9.c | 145 - drivers/misc/mpu3050/accel/lis331.c | 617 - drivers/misc/mpu3050/accel/lis3dh.c | 625 - drivers/misc/mpu3050/accel/lsm303a.c | 178 - drivers/misc/mpu3050/accel/mantis.c | 306 - drivers/misc/mpu3050/accel/mma8450.c | 156 - drivers/misc/mpu3050/accel/mma845x.c | 158 - drivers/misc/mpu3050/compass/ami304.c | 164 - drivers/misc/mpu3050/compass/ami30x.c | 167 - drivers/misc/mpu3050/compass/hmc5883.c | 254 - drivers/misc/mpu3050/compass/hscdtd002b.c | 163 - drivers/misc/mpu3050/compass/hscdtd004a.c | 162 - drivers/misc/mpu3050/compass/lsm303m.c | 244 - drivers/misc/mpu3050/compass/mmc314x.c | 184 - drivers/misc/mpu3050/compass/mmc328x.c | 220 - drivers/misc/mpu3050/compass/mpuak8975.c | 188 - drivers/misc/mpu3050/compass/yas529-kernel.c | 477 - drivers/misc/mpu3050/log.h | 290 - drivers/misc/mpu3050/mldl_cfg.c | 1742 -- drivers/misc/mpu3050/mldl_cfg.h | 209 - drivers/misc/mpu3050/mlos-kernel.c | 93 - drivers/misc/mpu3050/mlos.h | 73 - drivers/misc/mpu3050/mlsl-kernel.c | 331 - drivers/misc/mpu3050/mlsl.h | 110 - drivers/misc/mpu3050/mltypes.h | 227 - drivers/misc/mpu3050/mpu-accel.c | 679 - drivers/misc/mpu3050/mpu-accel.h | 8 - drivers/misc/mpu3050/mpu-dev.c | 2280 -- drivers/misc/mpu3050/mpu-i2c.c | 196 - drivers/misc/mpu3050/mpu-i2c.h | 58 - drivers/misc/mpu3050/mpuirq.c | 448 - drivers/misc/mpu3050/mpuirq.h | 48 - drivers/misc/mpu3050/sensors_core.c | 100 - drivers/misc/mpu3050/slaveirq.c | 270 - drivers/misc/mpu3050/slaveirq.h | 46 - drivers/misc/mpu3050/timerirq.c | 294 - drivers/misc/mpu3050/timerirq.h | 28 - drivers/misc/tzic.c | 241 - drivers/net/wireless/ath/ath6kl/bmi.c | 548 - drivers/net/wireless/ath/ath6kl/bmi.h | 247 - drivers/net/wireless/ath/ath6kl/btc.h | 76 - drivers/net/wireless/ath/ath6kl/c210.c | 152 - drivers/net/wireless/ath/ath6kl/cfg80211.c | 3623 --- drivers/net/wireless/ath/ath6kl/cfg80211.h | 60 - drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.c | 205 - drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.h | 30 - drivers/net/wireless/ath/ath6kl/common.h | 87 - drivers/net/wireless/ath/ath6kl/core.h | 932 - drivers/net/wireless/ath/ath6kl/dbglog.c | 168 - drivers/net/wireless/ath/ath6kl/dbglog.h | 24 - drivers/net/wireless/ath/ath6kl/debug.c | 2022 -- drivers/net/wireless/ath/ath6kl/debug.h | 161 - drivers/net/wireless/ath/ath6kl/debugfs_pri.c | 246 - drivers/net/wireless/ath/ath6kl/debugfs_pri.h | 43 - drivers/net/wireless/ath/ath6kl/hif-ops.h | 157 - drivers/net/wireless/ath/ath6kl/hif.c | 791 - drivers/net/wireless/ath/ath6kl/hif.h | 315 - drivers/net/wireless/ath/ath6kl/htc.c | 2888 --- drivers/net/wireless/ath/ath6kl/htc.h | 621 - drivers/net/wireless/ath/ath6kl/init.c | 2330 -- drivers/net/wireless/ath/ath6kl/main.c | 1324 - drivers/net/wireless/ath/ath6kl/msm.c | 425 - drivers/net/wireless/ath/ath6kl/pm.c | 258 - drivers/net/wireless/ath/ath6kl/pm.h | 24 - drivers/net/wireless/ath/ath6kl/sdio.c | 1534 -- drivers/net/wireless/ath/ath6kl/softmac.c | 265 - drivers/net/wireless/ath/ath6kl/target.h | 360 - drivers/net/wireless/ath/ath6kl/testmode.c | 124 - drivers/net/wireless/ath/ath6kl/testmode.h | 37 - drivers/net/wireless/ath/ath6kl/txrx.c | 1853 -- drivers/net/wireless/ath/ath6kl/usb.c | 433 - drivers/net/wireless/ath/ath6kl/wmi.c | 3947 --- drivers/net/wireless/ath/ath6kl/wmi.h | 2602 -- drivers/net/wireless/ath/ath6kl/wmi_btcoex.c | 627 - drivers/net/wireless/ath/ath6kl/wmi_btcoex.h | 125 - drivers/net/wireless/ath/ath6kl/wmiconfig.c | 88 - drivers/net/wireless/ath/ath6kl/wmiconfig.h | 25 - drivers/video/Kconfig | 1 - drivers/video/Makefile | 10 - drivers/video/samsung_duallcd/Kconfig | 12 - drivers/video/samsung_duallcd/Makefile | 51 - drivers/video/samsung_duallcd/aid_s6e8aa0.h | 239 - drivers/video/samsung_duallcd/boot_progressbar.c | 266 - drivers/video/samsung_duallcd/boot_progressbar.h | 13 - drivers/video/samsung_duallcd/dsim2/Makefile | 5 - drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi.c | 803 - .../samsung_duallcd/dsim2/s5p_mipi_dsi_common.c | 884 - .../samsung_duallcd/dsim2/s5p_mipi_dsi_common.h | 45 - .../samsung_duallcd/dsim2/s5p_mipi_dsi_lowlevel.c | 627 - .../samsung_duallcd/dsim2/s5p_mipi_dsi_lowlevel.h | 111 - drivers/video/samsung_duallcd/dsim2_tmp/Makefile | 5 - .../video/samsung_duallcd/dsim2_tmp/s5p_mipi_dsi.c | 800 - .../dsim2_tmp/s5p_mipi_dsi_common.c | 940 - .../dsim2_tmp/s5p_mipi_dsi_common.h | 49 - .../dsim2_tmp/s5p_mipi_dsi_lowlevel.c | 635 - .../dsim2_tmp/s5p_mipi_dsi_lowlevel.h | 111 - drivers/video/samsung_duallcd/ea8061_gamma_l.h | 311 - drivers/video/samsung_duallcd/ea8061_param.h | 348 - drivers/video/samsung_duallcd/extension/Makefile | 6 - drivers/video/samsung_duallcd/extension/cmc623.h | 725 - drivers/video/samsung_duallcd/extension/mdnie.c | 729 - drivers/video/samsung_duallcd/extension/mdnie.h | 134 - .../video/samsung_duallcd/extension/regs-mdnie.h | 166 - .../samsung_duallcd/extension/regs_fimd_lite.h | 396 - .../video/samsung_duallcd/extension/s5p_fimd_ext.c | 209 - .../video/samsung_duallcd/extension/s5p_fimd_ext.h | 30 - .../samsung_duallcd/extension/s5p_fimd_lite.c | 502 - .../samsung_duallcd/extension/s5p_fimd_lite.h | 37 - drivers/video/samsung_duallcd/lcdfreq.c | 492 - drivers/video/samsung_duallcd/ld9040.c | 1234 - drivers/video/samsung_duallcd/ld9042_panel.h | 1448 -- drivers/video/samsung_duallcd/ld9042_volt_tbl.h | 1479 -- drivers/video/samsung_duallcd/logo_rgb24.h | 24004 ------------------- drivers/video/samsung_duallcd/mdnie.c | 916 - drivers/video/samsung_duallcd/mdnie.h | 128 - drivers/video/samsung_duallcd/mdnie_color_tone.h | 148 - .../video/samsung_duallcd/mdnie_color_tone_4210.h | 264 - drivers/video/samsung_duallcd/mdnie_dmb.h | 382 - drivers/video/samsung_duallcd/mdnie_table.h | 217 - drivers/video/samsung_duallcd/mdnie_table_4412.h | 307 - drivers/video/samsung_duallcd/mdnie_table_c1m0.h | 775 - drivers/video/samsung_duallcd/mdnie_table_gc1.h | 611 - drivers/video/samsung_duallcd/mdnie_table_p2_boe.h | 1694 -- .../video/samsung_duallcd/mdnie_table_p2_hydis.h | 1689 -- drivers/video/samsung_duallcd/mdnie_table_p2_sec.h | 1689 -- drivers/video/samsung_duallcd/mdnie_table_p4.h | 1765 -- drivers/video/samsung_duallcd/mdnie_table_p4note.h | 1238 - drivers/video/samsung_duallcd/mdnie_table_p8.h | 1092 - drivers/video/samsung_duallcd/mdnie_table_q1.h | 1082 - drivers/video/samsung_duallcd/mdnie_table_u1.h | 1055 - drivers/video/samsung_duallcd/mdnie_tunning.c | 131 - drivers/video/samsung_duallcd/nt35560.c | 628 - drivers/video/samsung_duallcd/nt35560.h | 104 - drivers/video/samsung_duallcd/s3cfb.h | 397 - drivers/video/samsung_duallcd/s3cfb2.c | 1232 - drivers/video/samsung_duallcd/s3cfb2.h | 299 - drivers/video/samsung_duallcd/s3cfb2_fimd4x.c | 558 - drivers/video/samsung_duallcd/s3cfb2_fimd5x.c | 562 - drivers/video/samsung_duallcd/s3cfb2_fimd6x.c | 562 - drivers/video/samsung_duallcd/s3cfb2_lte480wv.c | 46 - drivers/video/samsung_duallcd/s3cfb2_tl2796.c | 46 - drivers/video/samsung_duallcd/s3cfb_ams369fg06.c | 536 - drivers/video/samsung_duallcd/s3cfb_dummymipilcd.c | 237 - drivers/video/samsung_duallcd/s3cfb_ea8061.c | 1497 -- drivers/video/samsung_duallcd/s3cfb_fimd6x.c | 998 - drivers/video/samsung_duallcd/s3cfb_ht101hd1.c | 45 - drivers/video/samsung_duallcd/s3cfb_ielcd.c | 164 - drivers/video/samsung_duallcd/s3cfb_ielcd.h | 32 - drivers/video/samsung_duallcd/s3cfb_lms501kf03.c | 415 - drivers/video/samsung_duallcd/s3cfb_lte480wv.c | 45 - drivers/video/samsung_duallcd/s3cfb_main.c | 1099 - drivers/video/samsung_duallcd/s3cfb_mdnie.c | 205 - drivers/video/samsung_duallcd/s3cfb_mdnie.h | 337 - drivers/video/samsung_duallcd/s3cfb_ops.c | 1551 -- drivers/video/samsung_duallcd/s3cfb_s6c1372.c | 214 - drivers/video/samsung_duallcd/s3cfb_s6e39a0.c | 1095 - drivers/video/samsung_duallcd/s3cfb_s6e63m0.c | 1205 - drivers/video/samsung_duallcd/s3cfb_s6e8aa0.c | 1534 -- drivers/video/samsung_duallcd/s3cfb_s6e8ab0.c | 985 - drivers/video/samsung_duallcd/s3cfb_wa101s.c | 46 - drivers/video/samsung_duallcd/s5p-dsim.c | 1597 -- drivers/video/samsung_duallcd/s5p-dsim.h | 90 - drivers/video/samsung_duallcd/s5p_dsim_lowlevel.c | 641 - drivers/video/samsung_duallcd/s5p_dsim_lowlevel.h | 76 - drivers/video/samsung_duallcd/s6d6aa1.c | 664 - drivers/video/samsung_duallcd/s6dr171.c | 571 - drivers/video/samsung_duallcd/s6dr171_param.h | 279 - .../video/samsung_duallcd/s6e63m0_gamma_grande.h | 128 - drivers/video/samsung_duallcd/s6e63m0_gamma_l.h | 257 - drivers/video/samsung_duallcd/s6e63m0_param.h | 188 - drivers/video/samsung_duallcd/s6e63m0_volt_tbl.h | 620 - drivers/video/samsung_duallcd/s6e8aa0_gamma_c1m0.h | 235 - drivers/video/samsung_duallcd/s6e8aa0_gamma_l.h | 311 - .../video/samsung_duallcd/s6e8aa0_gamma_midas.h | 782 - drivers/video/samsung_duallcd/s6e8aa0_gamma_q1.h | 189 - drivers/video/samsung_duallcd/s6e8aa0_param.h | 212 - drivers/video/samsung_duallcd/s6e8aa0_volt_tbl.h | 2328 -- drivers/video/samsung_duallcd/s6e8aa1.c | 599 - drivers/video/samsung_duallcd/s6e8aa1_param.h | 74 - drivers/video/samsung_duallcd/s6e8ab0_gamma.h | 210 - drivers/video/samsung_duallcd/s6e8ab0_param.h | 201 - drivers/video/samsung_duallcd/s6e8ab0_volt_tbl.h | 550 - drivers/video/samsung_duallcd/smart_dimming.c | 989 - drivers/video/samsung_duallcd/smart_dimming.h | 126 - .../video/samsung_duallcd/smart_dimming_ld9042.c | 749 - .../video/samsung_duallcd/smart_dimming_ld9042.h | 106 - .../video/samsung_duallcd/smart_dimming_s6e63m0.c | 630 - .../video/samsung_duallcd/smart_dimming_s6e63m0.h | 114 - .../video/samsung_duallcd/smart_dimming_s6e8ab0.c | 703 - .../video/samsung_duallcd/smart_dimming_s6e8ab0.h | 113 - .../video/samsung_duallcd/smart_mtp_2p2_gamma.h | 1051 - drivers/video/samsung_duallcd/smart_mtp_s6e63m0.c | 843 - drivers/video/samsung_duallcd/smart_mtp_s6e63m0.h | 125 - drivers/zorro/.gitignore | 2 + 496 files changed, 2107 insertions(+), 229293 deletions(-) create mode 100644 drivers/iommu/Kconfig create mode 100644 drivers/iommu/Makefile create mode 100644 drivers/iommu/exynos-iommu.c create mode 100644 drivers/iommu/exynos-iovmm.c create mode 100644 drivers/iommu/iommu.c delete mode 100644 drivers/media/isdbt/Kconfig delete mode 100644 drivers/media/isdbt/Makefile delete mode 100644 drivers/media/isdbt/fc8100/KLlist.c delete mode 100644 drivers/media/isdbt/fc8100/LKlist.h delete mode 100644 drivers/media/isdbt/fc8100/Makefile delete mode 100644 drivers/media/isdbt/fc8100/bbm.c delete mode 100644 drivers/media/isdbt/fc8100/bbm.h delete mode 100644 drivers/media/isdbt/fc8100/fc8100.c delete mode 100644 drivers/media/isdbt/fc8100/fc8100.h delete mode 100644 drivers/media/isdbt/fc8100/fc8100_bb.c delete mode 100644 drivers/media/isdbt/fc8100/fc8100_bb.h delete mode 100644 drivers/media/isdbt/fc8100/fc8100_i2c.c delete mode 100644 drivers/media/isdbt/fc8100/fc8100_i2c.h delete mode 100644 drivers/media/isdbt/fc8100/fc8100_isr.c delete mode 100644 drivers/media/isdbt/fc8100/fc8100_isr.h delete mode 100644 drivers/media/isdbt/fc8100/fc8100_regs.h delete mode 100644 drivers/media/isdbt/fc8100/fc8100_tun.c delete mode 100644 drivers/media/isdbt/fc8100/fc8100_tun.h delete mode 100644 drivers/media/isdbt/fc8100/fci_hal.c delete mode 100644 drivers/media/isdbt/fc8100/fci_hal.h delete mode 100644 drivers/media/isdbt/fc8100/fci_i2c.c delete mode 100644 drivers/media/isdbt/fc8100/fci_i2c.h delete mode 100644 drivers/media/isdbt/fc8100/fci_oal.c delete mode 100644 drivers/media/isdbt/fc8100/fci_oal.h delete mode 100644 drivers/media/isdbt/fc8100/fci_tun.c delete mode 100644 drivers/media/isdbt/fc8100/fci_tun.h delete mode 100644 drivers/media/isdbt/fc8100/fci_types.h delete mode 100644 drivers/media/isdbt/fc8150/Makefile delete mode 100644 drivers/media/isdbt/fc8150/bbm.c delete mode 100644 drivers/media/isdbt/fc8150/bbm.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_bb.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150_bb.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_hpi.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150_hpi.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_i2c.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150_i2c.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_isr.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150_isr.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_ppi.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150_ppi.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_regs.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_spi.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150_spi.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_spib.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150_spib.h delete mode 100644 drivers/media/isdbt/fc8150/fc8150_tun.c delete mode 100644 drivers/media/isdbt/fc8150/fc8150_tun.h delete mode 100644 drivers/media/isdbt/fc8150/fc8151_tun.c delete mode 100644 drivers/media/isdbt/fc8150/fc8151_tun.h delete mode 100644 drivers/media/isdbt/fc8150/fci_bypass.c delete mode 100644 drivers/media/isdbt/fc8150/fci_bypass.h delete mode 100644 drivers/media/isdbt/fc8150/fci_hal.c delete mode 100644 drivers/media/isdbt/fc8150/fci_hal.h delete mode 100644 drivers/media/isdbt/fc8150/fci_i2c.c delete mode 100644 drivers/media/isdbt/fc8150/fci_i2c.h delete mode 100644 drivers/media/isdbt/fc8150/fci_oal.c delete mode 100644 drivers/media/isdbt/fc8150/fci_oal.h delete mode 100644 drivers/media/isdbt/fc8150/fci_ringbuffer.c delete mode 100644 drivers/media/isdbt/fc8150/fci_ringbuffer.h delete mode 100644 drivers/media/isdbt/fc8150/fci_tun.c delete mode 100644 drivers/media/isdbt/fc8150/fci_tun.h delete mode 100644 drivers/media/isdbt/fc8150/fci_types.h delete mode 100644 drivers/media/isdbt/isdbt.c delete mode 100644 drivers/media/isdbt/isdbt.h delete mode 100644 drivers/media/tdmb/Kconfig delete mode 100644 drivers/media/tdmb/Makefile delete mode 100644 drivers/media/tdmb/fc8050/Makefile delete mode 100644 drivers/media/tdmb/fc8050/bbm.c delete mode 100644 drivers/media/tdmb/fc8050/bbm.h delete mode 100644 drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.c delete mode 100644 drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.h delete mode 100644 drivers/media/tdmb/fc8050/fc8050_bb.c delete mode 100644 drivers/media/tdmb/fc8050/fc8050_bb.h delete mode 100644 drivers/media/tdmb/fc8050/fc8050_i2c.c delete mode 100644 drivers/media/tdmb/fc8050/fc8050_i2c.h delete mode 100644 drivers/media/tdmb/fc8050/fc8050_isr.c delete mode 100644 drivers/media/tdmb/fc8050/fc8050_isr.h delete mode 100644 drivers/media/tdmb/fc8050/fc8050_regs.h delete mode 100644 drivers/media/tdmb/fc8050/fc8050_spi.c delete mode 100644 drivers/media/tdmb/fc8050/fc8050_spi.h delete mode 100644 drivers/media/tdmb/fc8050/fc8050_tun.c delete mode 100644 drivers/media/tdmb/fc8050/fc8050_tun.h delete mode 100644 drivers/media/tdmb/fc8050/fci_hal.c delete mode 100644 drivers/media/tdmb/fc8050/fci_hal.h delete mode 100644 drivers/media/tdmb/fc8050/fci_i2c.c delete mode 100644 drivers/media/tdmb/fc8050/fci_i2c.h delete mode 100644 drivers/media/tdmb/fc8050/fci_oal.c delete mode 100644 drivers/media/tdmb/fc8050/fci_oal.h delete mode 100644 drivers/media/tdmb/fc8050/fci_tun.c delete mode 100644 drivers/media/tdmb/fc8050/fci_tun.h delete mode 100644 drivers/media/tdmb/fc8050/fci_types.h delete mode 100644 drivers/media/tdmb/fc8050/fic.c delete mode 100644 drivers/media/tdmb/fc8050/fic.h delete mode 100644 drivers/media/tdmb/fc8050/ficdecoder.c delete mode 100644 drivers/media/tdmb/fc8050/ficdecoder.h delete mode 100644 drivers/media/tdmb/mtv318/Makefile delete mode 100644 drivers/media/tdmb/mtv318/raontv.c delete mode 100644 drivers/media/tdmb/mtv318/raontv.h delete mode 100644 drivers/media/tdmb/mtv318/raontv_ficdec.c delete mode 100644 drivers/media/tdmb/mtv318/raontv_ficdec.h delete mode 100644 drivers/media/tdmb/mtv318/raontv_ficdec_internal.h delete mode 100644 drivers/media/tdmb/mtv318/raontv_internal.h delete mode 100644 drivers/media/tdmb/mtv318/raontv_port.c delete mode 100644 drivers/media/tdmb/mtv318/raontv_port.h delete mode 100644 drivers/media/tdmb/mtv318/raontv_rf.c delete mode 100644 drivers/media/tdmb/mtv318/raontv_rf.h delete mode 100644 drivers/media/tdmb/mtv318/raontv_rf_adc_data.h delete mode 100644 drivers/media/tdmb/mtv318/raontv_rf_pll_data_tdmb.h delete mode 100644 drivers/media/tdmb/mtv318/raontv_tdmb.c delete mode 100644 drivers/media/tdmb/t3900/INC_FICDEC.c delete mode 100644 drivers/media/tdmb/t3900/INC_INCLUDES.h delete mode 100644 drivers/media/tdmb/t3900/INC_INTERFACE.c delete mode 100644 drivers/media/tdmb/t3900/INC_PROCESS.c delete mode 100644 drivers/media/tdmb/t3900/INC_RF_CTRL500.c delete mode 100644 drivers/media/tdmb/t3900/Makefile delete mode 100644 drivers/media/tdmb/tcc3170/Makefile delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_api_common.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_diagnosis/tcbd_diagnosis.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_drv_io.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_drv_ip.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_drv_register.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_drv_rf.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_error.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_feature.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_hal.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcbd_stream_parser/tcbd_stream_parser.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcc317x_boot_tdmb.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_decoder.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_fig.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_debug.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_os.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_queue.h delete mode 100644 drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_types.h delete mode 100644 drivers/media/tdmb/tcc3170/src/Makefile delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_api_common.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_diagnosis/Makefile delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_diagnosis/tcbd_diagnosis.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_drv_dual.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_drv_io.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_drv_ip.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_drv_peri.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_drv_rf.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_hal.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_stream_parser/Makefile delete mode 100644 drivers/media/tdmb/tcc3170/src/tcbd_stream_parser/tcbd_stream_parser.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/Makefile delete mode 100644 drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_decoder.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_fig0.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_fig1.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcpal_linux/Makefile delete mode 100644 drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_debug.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_io_cspi.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_io_i2c.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_irq_handler.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_linux.c delete mode 100644 drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_queue.c delete mode 100644 drivers/media/tdmb/tdmb.c delete mode 100644 drivers/media/tdmb/tdmb.h delete mode 100644 drivers/media/tdmb/tdmb_data.c delete mode 100644 drivers/media/tdmb/tdmb_ebi.c delete mode 100644 drivers/media/tdmb/tdmb_port_fc8050.c delete mode 100644 drivers/media/tdmb/tdmb_port_mtv318.c delete mode 100644 drivers/media/tdmb/tdmb_port_t3900.c delete mode 100644 drivers/media/tdmb/tdmb_port_tcc3170.c delete mode 100644 drivers/media/tdmb/tdmb_spi.c delete mode 100644 drivers/misc/c2c/Kconfig delete mode 100644 drivers/misc/c2c/Makefile delete mode 100644 drivers/misc/c2c/samsung-c2c.c delete mode 100644 drivers/misc/c2c/samsung-c2c.h delete mode 100644 drivers/misc/inv_mpu/Kconfig delete mode 100644 drivers/misc/inv_mpu/Makefile delete mode 100644 drivers/misc/inv_mpu/README delete mode 100644 drivers/misc/inv_mpu/accel/Kconfig delete mode 100644 drivers/misc/inv_mpu/accel/Makefile delete mode 100644 drivers/misc/inv_mpu/accel/adxl34x.c delete mode 100644 drivers/misc/inv_mpu/accel/bma150.c delete mode 100644 drivers/misc/inv_mpu/accel/bma222.c delete mode 100644 drivers/misc/inv_mpu/accel/bma250.c delete mode 100644 drivers/misc/inv_mpu/accel/cma3000.c delete mode 100644 drivers/misc/inv_mpu/accel/kxsd9.c delete mode 100644 drivers/misc/inv_mpu/accel/kxtf9.c delete mode 100644 drivers/misc/inv_mpu/accel/lis331.c delete mode 100644 drivers/misc/inv_mpu/accel/lis3dh.c delete mode 100644 drivers/misc/inv_mpu/accel/lsm303dlx_a.c delete mode 100644 drivers/misc/inv_mpu/accel/mma8450.c delete mode 100644 drivers/misc/inv_mpu/accel/mma845x.c delete mode 100644 drivers/misc/inv_mpu/accel/mpu6050.c delete mode 100644 drivers/misc/inv_mpu/accel/mpu6050.h delete mode 100644 drivers/misc/inv_mpu/compass/Kconfig delete mode 100644 drivers/misc/inv_mpu/compass/Makefile delete mode 100644 drivers/misc/inv_mpu/compass/ak8972.c delete mode 100644 drivers/misc/inv_mpu/compass/ak8975.c delete mode 100644 drivers/misc/inv_mpu/compass/hscdtd002b.c delete mode 100644 drivers/misc/inv_mpu/compass/hscdtd004a.c delete mode 100644 drivers/misc/inv_mpu/compass/lsm303dlx_m.c delete mode 100644 drivers/misc/inv_mpu/compass/mmc314x.c delete mode 100644 drivers/misc/inv_mpu/compass/yas529-kernel.c delete mode 100644 drivers/misc/inv_mpu/compass/yas530.c delete mode 100644 drivers/misc/inv_mpu/compass/yas530_ext.c delete mode 100644 drivers/misc/inv_mpu/compass/yas530_ext.h delete mode 100644 drivers/misc/inv_mpu/log.h delete mode 100644 drivers/misc/inv_mpu/mldl_cfg.c delete mode 100644 drivers/misc/inv_mpu/mldl_cfg.h delete mode 100644 drivers/misc/inv_mpu/mldl_print_cfg.c delete mode 100644 drivers/misc/inv_mpu/mldl_print_cfg.h delete mode 100644 drivers/misc/inv_mpu/mlsl-kernel.c delete mode 100644 drivers/misc/inv_mpu/mlsl.h delete mode 100644 drivers/misc/inv_mpu/mltypes.h delete mode 100644 drivers/misc/inv_mpu/mpu-dev.c delete mode 100644 drivers/misc/inv_mpu/mpu-dev.h delete mode 100644 drivers/misc/inv_mpu/mpu6050b1.h delete mode 100644 drivers/misc/inv_mpu/mpuirq.c delete mode 100644 drivers/misc/inv_mpu/mpuirq.h delete mode 100644 drivers/misc/inv_mpu/pressure/Kconfig delete mode 100644 drivers/misc/inv_mpu/pressure/Makefile delete mode 100644 drivers/misc/inv_mpu/pressure/bma085.c delete mode 100644 drivers/misc/inv_mpu/sensors_core.c delete mode 100644 drivers/misc/inv_mpu/slaveirq.c delete mode 100644 drivers/misc/inv_mpu/slaveirq.h delete mode 100644 drivers/misc/inv_mpu/timerirq.c delete mode 100644 drivers/misc/inv_mpu/timerirq.h delete mode 100644 drivers/misc/modem_if_na/Kconfig delete mode 100644 drivers/misc/modem_if_na/Makefile delete mode 100644 drivers/misc/modem_if_na/lte_modem_bootloader.c delete mode 100644 drivers/misc/modem_if_na/modem.c delete mode 100644 drivers/misc/modem_if_na/modem_io_device.c delete mode 100644 drivers/misc/modem_if_na/modem_link_device_dpram.c delete mode 100644 drivers/misc/modem_if_na/modem_link_device_dpram.h delete mode 100644 drivers/misc/modem_if_na/modem_link_device_usb.c delete mode 100644 drivers/misc/modem_if_na/modem_link_device_usb.h delete mode 100644 drivers/misc/modem_if_na/modem_link_pm_usb.c delete mode 100644 drivers/misc/modem_if_na/modem_link_pm_usb.h delete mode 100644 drivers/misc/modem_if_na/modem_modemctl_device_cbp71.c delete mode 100644 drivers/misc/modem_if_na/modem_modemctl_device_cmc220.c delete mode 100644 drivers/misc/modem_if_na/modem_net_flowcontrol_device.c delete mode 100644 drivers/misc/modem_if_na/modem_prj.h delete mode 100644 drivers/misc/modem_if_na/modem_utils.c delete mode 100644 drivers/misc/modem_if_na/modem_utils.h delete mode 100644 drivers/misc/modem_if_na/modem_variation.h delete mode 100644 drivers/misc/modem_if_u1/Kconfig delete mode 100644 drivers/misc/modem_if_u1/Makefile delete mode 100644 drivers/misc/modem_if_u1/lte_modem_bootloader.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_c2c.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_c2c.h delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_dpram.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_dpram.h delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_dpram_ext_op.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_hsic.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_hsic.h delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_memory.h delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_mipi.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_mipi.h delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_pld.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_pld.h delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_pld_ext_op.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_spi.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_spi.h delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_usb.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_device_usb.h delete mode 100644 drivers/misc/modem_if_u1/modem_link_pm_usb.c delete mode 100644 drivers/misc/modem_if_u1/modem_link_pm_usb.h delete mode 100644 drivers/misc/modem_if_u1/modem_modemctl_device_cbp71.c delete mode 100644 drivers/misc/modem_if_u1/modem_modemctl_device_cbp72.c delete mode 100644 drivers/misc/modem_if_u1/modem_modemctl_device_cmc221.c delete mode 100644 drivers/misc/modem_if_u1/modem_modemctl_device_esc6270.c delete mode 100644 drivers/misc/modem_if_u1/modem_modemctl_device_mdm6600.c delete mode 100644 drivers/misc/modem_if_u1/modem_modemctl_device_sprd8803.c delete mode 100644 drivers/misc/modem_if_u1/modem_modemctl_device_xmm6260.c delete mode 100644 drivers/misc/modem_if_u1/modem_modemctl_device_xmm6262.c delete mode 100644 drivers/misc/modem_if_u1/modem_net_flowcontrol_device.c delete mode 100644 drivers/misc/modem_if_u1/modem_prj.h delete mode 100644 drivers/misc/modem_if_u1/modem_sim_slot_switch.c delete mode 100644 drivers/misc/modem_if_u1/modem_utils.c delete mode 100644 drivers/misc/modem_if_u1/modem_utils.h delete mode 100644 drivers/misc/modem_if_u1/modem_variation.h delete mode 100644 drivers/misc/modem_if_u1/sipc4_io_device.c delete mode 100644 drivers/misc/modem_if_u1/sipc4_modem.c delete mode 100644 drivers/misc/modem_if_u1/sipc5_io_device.c delete mode 100644 drivers/misc/modem_if_u1/sipc5_modem.c delete mode 100755 drivers/misc/mpu3050/Kconfig delete mode 100755 drivers/misc/mpu3050/Makefile delete mode 100755 drivers/misc/mpu3050/README delete mode 100755 drivers/misc/mpu3050/accel/adxl346.c delete mode 100755 drivers/misc/mpu3050/accel/bma150.c delete mode 100755 drivers/misc/mpu3050/accel/bma222.c delete mode 100755 drivers/misc/mpu3050/accel/cma3000.c delete mode 100755 drivers/misc/mpu3050/accel/kxsd9.c delete mode 100644 drivers/misc/mpu3050/accel/kxtf9.c delete mode 100755 drivers/misc/mpu3050/accel/kxud9.c delete mode 100755 drivers/misc/mpu3050/accel/lis331.c delete mode 100755 drivers/misc/mpu3050/accel/lis3dh.c delete mode 100755 drivers/misc/mpu3050/accel/lsm303a.c delete mode 100755 drivers/misc/mpu3050/accel/mantis.c delete mode 100755 drivers/misc/mpu3050/accel/mma8450.c delete mode 100755 drivers/misc/mpu3050/accel/mma845x.c delete mode 100755 drivers/misc/mpu3050/compass/ami304.c delete mode 100755 drivers/misc/mpu3050/compass/ami30x.c delete mode 100755 drivers/misc/mpu3050/compass/hmc5883.c delete mode 100755 drivers/misc/mpu3050/compass/hscdtd002b.c delete mode 100755 drivers/misc/mpu3050/compass/hscdtd004a.c delete mode 100755 drivers/misc/mpu3050/compass/lsm303m.c delete mode 100755 drivers/misc/mpu3050/compass/mmc314x.c delete mode 100755 drivers/misc/mpu3050/compass/mmc328x.c delete mode 100755 drivers/misc/mpu3050/compass/mpuak8975.c delete mode 100755 drivers/misc/mpu3050/compass/yas529-kernel.c delete mode 100755 drivers/misc/mpu3050/log.h delete mode 100755 drivers/misc/mpu3050/mldl_cfg.c delete mode 100755 drivers/misc/mpu3050/mldl_cfg.h delete mode 100755 drivers/misc/mpu3050/mlos-kernel.c delete mode 100755 drivers/misc/mpu3050/mlos.h delete mode 100755 drivers/misc/mpu3050/mlsl-kernel.c delete mode 100755 drivers/misc/mpu3050/mlsl.h delete mode 100755 drivers/misc/mpu3050/mltypes.h delete mode 100755 drivers/misc/mpu3050/mpu-accel.c delete mode 100755 drivers/misc/mpu3050/mpu-accel.h delete mode 100755 drivers/misc/mpu3050/mpu-dev.c delete mode 100755 drivers/misc/mpu3050/mpu-i2c.c delete mode 100755 drivers/misc/mpu3050/mpu-i2c.h delete mode 100755 drivers/misc/mpu3050/mpuirq.c delete mode 100755 drivers/misc/mpu3050/mpuirq.h delete mode 100755 drivers/misc/mpu3050/sensors_core.c delete mode 100755 drivers/misc/mpu3050/slaveirq.c delete mode 100755 drivers/misc/mpu3050/slaveirq.h delete mode 100755 drivers/misc/mpu3050/timerirq.c delete mode 100755 drivers/misc/mpu3050/timerirq.h delete mode 100644 drivers/misc/tzic.c delete mode 100755 drivers/net/wireless/ath/ath6kl/bmi.c delete mode 100755 drivers/net/wireless/ath/ath6kl/bmi.h delete mode 100644 drivers/net/wireless/ath/ath6kl/btc.h delete mode 100644 drivers/net/wireless/ath/ath6kl/c210.c delete mode 100755 drivers/net/wireless/ath/ath6kl/cfg80211.c delete mode 100755 drivers/net/wireless/ath/ath6kl/cfg80211.h delete mode 100644 drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.c delete mode 100644 drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.h delete mode 100755 drivers/net/wireless/ath/ath6kl/common.h delete mode 100755 drivers/net/wireless/ath/ath6kl/core.h delete mode 100644 drivers/net/wireless/ath/ath6kl/dbglog.c delete mode 100644 drivers/net/wireless/ath/ath6kl/dbglog.h delete mode 100755 drivers/net/wireless/ath/ath6kl/debug.c delete mode 100755 drivers/net/wireless/ath/ath6kl/debug.h delete mode 100644 drivers/net/wireless/ath/ath6kl/debugfs_pri.c delete mode 100644 drivers/net/wireless/ath/ath6kl/debugfs_pri.h delete mode 100755 drivers/net/wireless/ath/ath6kl/hif-ops.h delete mode 100755 drivers/net/wireless/ath/ath6kl/hif.c delete mode 100755 drivers/net/wireless/ath/ath6kl/hif.h delete mode 100755 drivers/net/wireless/ath/ath6kl/htc.c delete mode 100755 drivers/net/wireless/ath/ath6kl/htc.h delete mode 100755 drivers/net/wireless/ath/ath6kl/init.c delete mode 100755 drivers/net/wireless/ath/ath6kl/main.c delete mode 100644 drivers/net/wireless/ath/ath6kl/msm.c delete mode 100644 drivers/net/wireless/ath/ath6kl/pm.c delete mode 100644 drivers/net/wireless/ath/ath6kl/pm.h delete mode 100755 drivers/net/wireless/ath/ath6kl/sdio.c delete mode 100644 drivers/net/wireless/ath/ath6kl/softmac.c delete mode 100755 drivers/net/wireless/ath/ath6kl/target.h delete mode 100755 drivers/net/wireless/ath/ath6kl/testmode.c delete mode 100755 drivers/net/wireless/ath/ath6kl/testmode.h delete mode 100644 drivers/net/wireless/ath/ath6kl/txrx.c delete mode 100755 drivers/net/wireless/ath/ath6kl/usb.c delete mode 100755 drivers/net/wireless/ath/ath6kl/wmi.c delete mode 100755 drivers/net/wireless/ath/ath6kl/wmi.h delete mode 100644 drivers/net/wireless/ath/ath6kl/wmi_btcoex.c delete mode 100644 drivers/net/wireless/ath/ath6kl/wmi_btcoex.h delete mode 100644 drivers/net/wireless/ath/ath6kl/wmiconfig.c delete mode 100644 drivers/net/wireless/ath/ath6kl/wmiconfig.h delete mode 100644 drivers/video/samsung_duallcd/Kconfig delete mode 100644 drivers/video/samsung_duallcd/Makefile delete mode 100644 drivers/video/samsung_duallcd/aid_s6e8aa0.h delete mode 100644 drivers/video/samsung_duallcd/boot_progressbar.c delete mode 100644 drivers/video/samsung_duallcd/boot_progressbar.h delete mode 100644 drivers/video/samsung_duallcd/dsim2/Makefile delete mode 100644 drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi.c delete mode 100644 drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi_common.c delete mode 100644 drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi_common.h delete mode 100644 drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi_lowlevel.c delete mode 100644 drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi_lowlevel.h delete mode 100644 drivers/video/samsung_duallcd/dsim2_tmp/Makefile delete mode 100644 drivers/video/samsung_duallcd/dsim2_tmp/s5p_mipi_dsi.c delete mode 100644 drivers/video/samsung_duallcd/dsim2_tmp/s5p_mipi_dsi_common.c delete mode 100644 drivers/video/samsung_duallcd/dsim2_tmp/s5p_mipi_dsi_common.h delete mode 100644 drivers/video/samsung_duallcd/dsim2_tmp/s5p_mipi_dsi_lowlevel.c delete mode 100644 drivers/video/samsung_duallcd/dsim2_tmp/s5p_mipi_dsi_lowlevel.h delete mode 100644 drivers/video/samsung_duallcd/ea8061_gamma_l.h delete mode 100644 drivers/video/samsung_duallcd/ea8061_param.h delete mode 100644 drivers/video/samsung_duallcd/extension/Makefile delete mode 100644 drivers/video/samsung_duallcd/extension/cmc623.h delete mode 100644 drivers/video/samsung_duallcd/extension/mdnie.c delete mode 100644 drivers/video/samsung_duallcd/extension/mdnie.h delete mode 100644 drivers/video/samsung_duallcd/extension/regs-mdnie.h delete mode 100644 drivers/video/samsung_duallcd/extension/regs_fimd_lite.h delete mode 100644 drivers/video/samsung_duallcd/extension/s5p_fimd_ext.c delete mode 100644 drivers/video/samsung_duallcd/extension/s5p_fimd_ext.h delete mode 100644 drivers/video/samsung_duallcd/extension/s5p_fimd_lite.c delete mode 100644 drivers/video/samsung_duallcd/extension/s5p_fimd_lite.h delete mode 100644 drivers/video/samsung_duallcd/lcdfreq.c delete mode 100644 drivers/video/samsung_duallcd/ld9040.c delete mode 100644 drivers/video/samsung_duallcd/ld9042_panel.h delete mode 100644 drivers/video/samsung_duallcd/ld9042_volt_tbl.h delete mode 100644 drivers/video/samsung_duallcd/logo_rgb24.h delete mode 100644 drivers/video/samsung_duallcd/mdnie.c delete mode 100644 drivers/video/samsung_duallcd/mdnie.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_color_tone.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_color_tone_4210.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_dmb.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_4412.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_c1m0.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_gc1.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_p2_boe.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_p2_hydis.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_p2_sec.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_p4.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_p4note.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_p8.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_q1.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_table_u1.h delete mode 100644 drivers/video/samsung_duallcd/mdnie_tunning.c delete mode 100644 drivers/video/samsung_duallcd/nt35560.c delete mode 100644 drivers/video/samsung_duallcd/nt35560.h delete mode 100644 drivers/video/samsung_duallcd/s3cfb.h delete mode 100644 drivers/video/samsung_duallcd/s3cfb2.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb2.h delete mode 100644 drivers/video/samsung_duallcd/s3cfb2_fimd4x.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb2_fimd5x.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb2_fimd6x.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb2_lte480wv.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb2_tl2796.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_ams369fg06.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_dummymipilcd.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_ea8061.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_fimd6x.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_ht101hd1.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_ielcd.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_ielcd.h delete mode 100644 drivers/video/samsung_duallcd/s3cfb_lms501kf03.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_lte480wv.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_main.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_mdnie.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_mdnie.h delete mode 100644 drivers/video/samsung_duallcd/s3cfb_ops.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_s6c1372.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_s6e39a0.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_s6e63m0.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_s6e8aa0.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_s6e8ab0.c delete mode 100644 drivers/video/samsung_duallcd/s3cfb_wa101s.c delete mode 100644 drivers/video/samsung_duallcd/s5p-dsim.c delete mode 100644 drivers/video/samsung_duallcd/s5p-dsim.h delete mode 100644 drivers/video/samsung_duallcd/s5p_dsim_lowlevel.c delete mode 100644 drivers/video/samsung_duallcd/s5p_dsim_lowlevel.h delete mode 100644 drivers/video/samsung_duallcd/s6d6aa1.c delete mode 100644 drivers/video/samsung_duallcd/s6dr171.c delete mode 100644 drivers/video/samsung_duallcd/s6dr171_param.h delete mode 100644 drivers/video/samsung_duallcd/s6e63m0_gamma_grande.h delete mode 100644 drivers/video/samsung_duallcd/s6e63m0_gamma_l.h delete mode 100644 drivers/video/samsung_duallcd/s6e63m0_param.h delete mode 100644 drivers/video/samsung_duallcd/s6e63m0_volt_tbl.h delete mode 100644 drivers/video/samsung_duallcd/s6e8aa0_gamma_c1m0.h delete mode 100644 drivers/video/samsung_duallcd/s6e8aa0_gamma_l.h delete mode 100644 drivers/video/samsung_duallcd/s6e8aa0_gamma_midas.h delete mode 100644 drivers/video/samsung_duallcd/s6e8aa0_gamma_q1.h delete mode 100644 drivers/video/samsung_duallcd/s6e8aa0_param.h delete mode 100644 drivers/video/samsung_duallcd/s6e8aa0_volt_tbl.h delete mode 100644 drivers/video/samsung_duallcd/s6e8aa1.c delete mode 100644 drivers/video/samsung_duallcd/s6e8aa1_param.h delete mode 100644 drivers/video/samsung_duallcd/s6e8ab0_gamma.h delete mode 100644 drivers/video/samsung_duallcd/s6e8ab0_param.h delete mode 100644 drivers/video/samsung_duallcd/s6e8ab0_volt_tbl.h delete mode 100644 drivers/video/samsung_duallcd/smart_dimming.c delete mode 100644 drivers/video/samsung_duallcd/smart_dimming.h delete mode 100644 drivers/video/samsung_duallcd/smart_dimming_ld9042.c delete mode 100644 drivers/video/samsung_duallcd/smart_dimming_ld9042.h delete mode 100644 drivers/video/samsung_duallcd/smart_dimming_s6e63m0.c delete mode 100644 drivers/video/samsung_duallcd/smart_dimming_s6e63m0.h delete mode 100644 drivers/video/samsung_duallcd/smart_dimming_s6e8ab0.c delete mode 100644 drivers/video/samsung_duallcd/smart_dimming_s6e8ab0.h delete mode 100644 drivers/video/samsung_duallcd/smart_mtp_2p2_gamma.h delete mode 100644 drivers/video/samsung_duallcd/smart_mtp_s6e63m0.c delete mode 100644 drivers/video/samsung_duallcd/smart_mtp_s6e63m0.h create mode 100644 drivers/zorro/.gitignore diff --git a/arch/arm/configs/cyanogenmod_i9300_defconfig b/arch/arm/configs/cyanogenmod_i9300_defconfig index de2cf0e..b3d2b95 100644 --- a/arch/arm/configs/cyanogenmod_i9300_defconfig +++ b/arch/arm/configs/cyanogenmod_i9300_defconfig @@ -149,7 +149,7 @@ CONFIG_HAVE_OPROFILE=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_USE_GENERIC_SMP_HELPERS=y -CONFIG_HAVE_DMA_CONTIGUOUS=n +CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y @@ -340,7 +340,7 @@ CONFIG_S5P_SYSTEM_MMU=y CONFIG_S5P_SYSTEM_MMU_REFCOUNT=y # CONFIG_S5P_SYSTEM_MMU_DEBUG is not set CONFIG_IOVMM=y -CONFIG_IOMMU_EXYNOS4_API=n +CONFIG_IOMMU_EXYNOS4_API=y CONFIG_S3C_DEV_FIMC=y CONFIG_S5P_DEV_MFC=y CONFIG_S5P_DEV_TVOUT=y @@ -1400,8 +1400,8 @@ CONFIG_BCM4334=y # CONFIG_BCM4335 is not set # CONFIG_BCM43241 is not set CONFIG_BROADCOM_WIFI=y -CONFIG_BCMDHD_FW_PATH="/system/etc/firmware/fw_bcmdhd.bin" -CONFIG_BCMDHD_NVRAM_PATH="/system/etc/wifi/bcmdhd.cal" +#CONFIG_BCMDHD_FW_PATH="/system/etc/firmware/fw_bcmdhd.bin" +#CONFIG_BCMDHD_NVRAM_PATH="/system/etc/wifi/bcmdhd.cal" CONFIG_BROADCOM_WIFI_RESERVED_MEM=y CONFIG_WLAN_REGION_CODE=100 # CONFIG_HOSTAP is not set @@ -2104,7 +2104,7 @@ CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set # CONFIG_USB_S2255 is not set -CONFIG_MALI_400MP_UMP=n +CONFIG_MALI_400MP_UMP=y CONFIG_VIDEO_SAMSUNG=y CONFIG_VIDEO_SAMSUNG_V4L2=y CONFIG_VIDEO_FIMC=y @@ -2190,16 +2190,16 @@ CONFIG_SAMSUNG_WORKAROUND_HPD_GLANCE=y # # CONFIG_MALI_VER_BEFORE_R3P2 is not set # CONFIG_DRM is not set -CONFIG_ION=n -CONFIG_ION_EXYNOS=n +CONFIG_ION=y +CONFIG_ION_EXYNOS=y CONFIG_ION_EXYNOS_CONTIGHEAP_SIZE=71680 # CONFIG_ION_EXYNOS_CONTIGHEAP_DEBUG is not set -CONFIG_MALI400=n -CONFIG_MALI_VER_R3P2=n +CONFIG_MALI400=y +CONFIG_MALI_VER_R3P2=y # CONFIG_MALI400_DEBUG is not set # CONFIG_MALI400_PROFILING is not set -CONFIG_MALI_DVFS=n -CONFIG_MALI400_UMP=n +CONFIG_MALI_DVFS=y +CONFIG_MALI400_UMP=y # CONFIG_MALI_SHARED_INTERRUPTS is not set # CONFIG_VIDEO_OUTPUT_CONTROL is not set CONFIG_FB=y @@ -2907,6 +2907,7 @@ CONFIG_ACCESSORY=n # CONFIG_EXTCON is not set # CONFIG_BARCODE_EMUL is not set # CONFIG_SAMSUNG_PHONE_TTY is not set +CONFIG_IOMMU_SUPPORT=y # CONFIG_FELICA is not set # CONFIG_AUTHENTEC_VPNCLIENT_INTERCEPTOR is not set diff --git a/drivers/Kconfig b/drivers/Kconfig index 4cc1613..fa3cad2 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -138,4 +138,6 @@ source "drivers/samsung/Kconfig" source "drivers/sensor/Kconfig" +source "drivers/iommu/Kconfig" + endmenu diff --git a/drivers/Makefile b/drivers/Makefile index c63d45c..a2a5eb4 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -127,3 +127,5 @@ obj-$(CONFIG_VIBETONZ) += motor/ obj-$(CONFIG_SENSORS_CORE) += sensor/ obj-$(CONFIG_FM_RADIO) += samsung/ + +obj-$(CONFIG_IOMMU_SUPPORT) += iommu/ diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig new file mode 100644 index 0000000..9eccee4 --- /dev/null +++ b/drivers/iommu/Kconfig @@ -0,0 +1,161 @@ +# IOMMU_API always gets selected by whoever wants it. +config IOMMU_API + bool + +menuconfig IOMMU_SUPPORT + bool "IOMMU Hardware Support" + default y + ---help--- + Say Y here if you want to compile device drivers for IO Memory + Management Units into the kernel. These devices usually allow to + remap DMA requests and/or remap interrupts from other devices on the + system. + +if IOMMU_SUPPORT + +# MSM IOMMU support +config MSM_IOMMU + bool "MSM IOMMU Support" + depends on ARCH_MSM8X60 || ARCH_MSM8960 + select IOMMU_API + help + Support for the IOMMUs found on certain Qualcomm SOCs. + These IOMMUs allow virtualization of the address space used by most + cores within the multimedia subsystem. + + If unsure, say N here. + +config IOMMU_PGTABLES_L2 + def_bool y + depends on MSM_IOMMU && MMU && SMP && CPU_DCACHE_DISABLE=n + +# AMD IOMMU support +config AMD_IOMMU + bool "AMD IOMMU support" + select SWIOTLB + select PCI_MSI + select PCI_ATS + select PCI_PRI + select PCI_PASID + select IOMMU_API + depends on X86_64 && PCI && ACPI + ---help--- + With this option you can enable support for AMD IOMMU hardware in + your system. An IOMMU is a hardware component which provides + remapping of DMA memory accesses from devices. With an AMD IOMMU you + can isolate the the DMA memory of different devices and protect the + system from misbehaving device drivers or hardware. + + You can find out if your system has an AMD IOMMU if you look into + your BIOS for an option to enable it or if you have an IVRS ACPI + table. + +config AMD_IOMMU_STATS + bool "Export AMD IOMMU statistics to debugfs" + depends on AMD_IOMMU + select DEBUG_FS + ---help--- + This option enables code in the AMD IOMMU driver to collect various + statistics about whats happening in the driver and exports that + information to userspace via debugfs. + If unsure, say N. + +config AMD_IOMMU_V2 + tristate "AMD IOMMU Version 2 driver (EXPERIMENTAL)" + depends on AMD_IOMMU && PROFILING && EXPERIMENTAL + select MMU_NOTIFIER + ---help--- + This option enables support for the AMD IOMMUv2 features of the IOMMU + hardware. Select this option if you want to use devices that support + the the PCI PRI and PASID interface. + +# Intel IOMMU support +config DMAR_TABLE + bool + +config INTEL_IOMMU + bool "Support for Intel IOMMU using DMA Remapping Devices" + depends on PCI_MSI && ACPI && (X86 || IA64_GENERIC) + select IOMMU_API + select DMAR_TABLE + help + DMA remapping (DMAR) devices support enables independent address + translations for Direct Memory Access (DMA) from devices. + These DMA remapping devices are reported via ACPI tables + and include PCI device scope covered by these DMA + remapping devices. + +config INTEL_IOMMU_DEFAULT_ON + def_bool y + prompt "Enable Intel DMA Remapping Devices by default" + depends on INTEL_IOMMU + help + Selecting this option will enable a DMAR device at boot time if + one is found. If this option is not selected, DMAR support can + be enabled by passing intel_iommu=on to the kernel. + +config INTEL_IOMMU_BROKEN_GFX_WA + bool "Workaround broken graphics drivers (going away soon)" + depends on INTEL_IOMMU && BROKEN && X86 + ---help--- + Current Graphics drivers tend to use physical address + for DMA and avoid using DMA APIs. Setting this config + option permits the IOMMU driver to set a unity map for + all the OS-visible memory. Hence the driver can continue + to use physical addresses for DMA, at least until this + option is removed in the 2.6.32 kernel. + +config INTEL_IOMMU_FLOPPY_WA + def_bool y + depends on INTEL_IOMMU && X86 + ---help--- + Floppy disk drivers are known to bypass DMA API calls + thereby failing to work when IOMMU is enabled. This + workaround will setup a 1:1 mapping for the first + 16MiB to make floppy (an ISA device) work. + +config IRQ_REMAP + bool "Support for Interrupt Remapping (EXPERIMENTAL)" + depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI && EXPERIMENTAL + select DMAR_TABLE + ---help--- + Supports Interrupt remapping for IO-APIC and MSI devices. + To use x2apic mode in the CPU's which support x2APIC enhancements or + to support platforms with CPU's having > 8 bit APIC ID, say Y. + +config EXYNOS_IOMMU + bool "Exynos IOMMU Support" + depends on ARCH_EXYNOS && EXYNOS_DEV_SYSMMU + select IOMMU_API + help + Support for the IOMMU(System MMU) of Samsung Exynos application + processor family. This enables H/W multimedia accellerators to see + non-linear physical memory chunks as a linear memory in their + address spaces + + If unsure, say N here. +config EXYNOS_IOVMM + bool "IO Virtual Memory Manager for Exynos IOMMUs" + select GENERIC_ALLOCATOR + depends on EXYNOS_IOMMU + default y + help + Supporting the users of Exynos IOMMU for allocating and mapping + an IO virtual memory region with a physical memory region + and managing the allocated virtual memory regions. + +config EXYNOS_IOVMM_ALIGN64K + bool "Let I/O memory region 64KB aligned" + default y + depends on EXYNOS_IOVMM && ARCH_EXYNOS5 + +config EXYNOS_IOMMU_DEBUG + bool "Debugging log for Exynos IOMMU" + depends on EXYNOS_IOMMU + help + Select this to see the detailed log message that shows what + happens in the IOMMU driver + + Say N unless you need kernel log message for IOMMU debugging + +endif # IOMMU_SUPPORT diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile new file mode 100644 index 0000000..b6fcc3e --- /dev/null +++ b/drivers/iommu/Makefile @@ -0,0 +1,12 @@ +obj-$(CONFIG_IOMMU_API) += iommu.o +obj-$(CONFIG_MSM_IOMMU) += msm_iommu.o msm_iommu_dev.o +obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o +obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o +obj-$(CONFIG_DMAR_TABLE) += dmar.o +obj-$(CONFIG_INTEL_IOMMU) += iova.o intel-iommu.o +obj-$(CONFIG_IRQ_REMAP) += intr_remapping.o +obj-$(CONFIG_OMAP_IOMMU) += omap-iommu.o +obj-$(CONFIG_OMAP_IOVMM) += omap-iovmm.o +obj-$(CONFIG_OMAP_IOMMU_DEBUG) += omap-iommu-debug.o +obj-$(CONFIG_EXYNOS_IOMMU) += exynos-iommu.o +obj-$(CONFIG_EXYNOS_IOVMM) += exynos-iovmm.o diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c new file mode 100644 index 0000000..e080220 --- /dev/null +++ b/drivers/iommu/exynos-iommu.c @@ -0,0 +1,1054 @@ +/* linux/drivers/iommu/exynos_iommu.c + * + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifdef CONFIG_EXYNOS_IOMMU_DEBUG +#define DEBUG +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + +/* We does not consider super section mapping (16MB) */ +#define SECT_ORDER 20 +#define LPAGE_ORDER 16 +#define SPAGE_ORDER 12 + +#define SECT_SIZE (1 << SECT_ORDER) +#define LPAGE_SIZE (1 << LPAGE_ORDER) +#define SPAGE_SIZE (1 << SPAGE_ORDER) + +#define SECT_MASK (~(SECT_SIZE - 1)) +#define LPAGE_MASK (~(LPAGE_SIZE - 1)) +#define SPAGE_MASK (~(SPAGE_SIZE - 1)) + +#define lv1ent_fault(sent) (((*(sent) & 3) == 0) || ((*(sent) & 3) == 3)) +#define lv1ent_page(sent) ((*(sent) & 3) == 1) +#define lv1ent_section(sent) ((*(sent) & 3) == 2) + +#define lv2ent_fault(pent) ((*(pent) & 3) == 0) +#define lv2ent_small(pent) ((*(pent) & 2) == 2) +#define lv2ent_large(pent) ((*(pent) & 3) == 1) + +#define section_phys(sent) (*(sent) & SECT_MASK) +#define section_offs(iova) ((iova) & 0xFFFFF) +#define lpage_phys(pent) (*(pent) & LPAGE_MASK) +#define lpage_offs(iova) ((iova) & 0xFFFF) +#define spage_phys(pent) (*(pent) & SPAGE_MASK) +#define spage_offs(iova) ((iova) & 0xFFF) + +#define lv1ent_offset(iova) ((iova) >> SECT_ORDER) +#define lv2ent_offset(iova) (((iova) & 0xFF000) >> SPAGE_ORDER) + +#define NUM_LV1ENTRIES 4096 +#define NUM_LV2ENTRIES 256 + +#define LV2TABLE_SIZE (NUM_LV2ENTRIES * sizeof(long)) + +#define SPAGES_PER_LPAGE (LPAGE_SIZE / SPAGE_SIZE) + +#define lv2table_base(sent) (*(sent) & 0xFFFFFC00) + +#define mk_lv1ent_sect(pa) ((pa) | 2) +#define mk_lv1ent_page(pa) ((pa) | 1) +#define mk_lv2ent_lpage(pa) ((pa) | 1) +#define mk_lv2ent_spage(pa) ((pa) | 2) + +#define CTRL_ENABLE 0x5 +#define CTRL_BLOCK 0x7 +#define CTRL_DISABLE 0x0 + +#define REG_MMU_CTRL 0x000 +#define REG_MMU_CFG 0x004 +#define REG_MMU_STATUS 0x008 +#define REG_MMU_FLUSH 0x00C +#define REG_MMU_FLUSH_ENTRY 0x010 +#define REG_PT_BASE_ADDR 0x014 +#define REG_INT_STATUS 0x018 +#define REG_INT_CLEAR 0x01C + +#define REG_PAGE_FAULT_ADDR 0x024 +#define REG_AW_FAULT_ADDR 0x028 +#define REG_AR_FAULT_ADDR 0x02C +#define REG_DEFAULT_SLAVE_ADDR 0x030 + +#define REG_MMU_VERSION 0x034 + +#define REG_PB0_SADDR 0x04C +#define REG_PB0_EADDR 0x050 +#define REG_PB1_SADDR 0x054 +#define REG_PB1_EADDR 0x058 + +static unsigned long *section_entry(unsigned long *pgtable, unsigned long iova) +{ + return pgtable + lv1ent_offset(iova); +} + +static unsigned long *page_entry(unsigned long *sent, unsigned long iova) +{ + return (unsigned long *)__va(lv2table_base(sent)) + lv2ent_offset(iova); +} + +static unsigned short fault_reg_offset[SYSMMU_FAULTS_NUM] = { + REG_PAGE_FAULT_ADDR, + REG_AR_FAULT_ADDR, + REG_AW_FAULT_ADDR, + REG_DEFAULT_SLAVE_ADDR, + REG_AR_FAULT_ADDR, + REG_AR_FAULT_ADDR, + REG_AW_FAULT_ADDR, + REG_AW_FAULT_ADDR +}; + +static char *sysmmu_fault_name[SYSMMU_FAULTS_NUM] = { + "PAGE FAULT", + "AR MULTI-HIT FAULT", + "AW MULTI-HIT FAULT", + "BUS ERROR", + "AR SECURITY PROTECTION FAULT", + "AR ACCESS PROTECTION FAULT", + "AW SECURITY PROTECTION FAULT", + "AW ACCESS PROTECTION FAULT", + "UNKNOWN FAULT" +}; + +struct exynos_iommu_domain { + struct list_head clients; /* list of sysmmu_drvdata.node */ + unsigned long *pgtable; /* lv1 page table, 16KB */ + short *lv2entcnt; /* free lv2 entry counter for each section */ + spinlock_t lock; /* lock for this structure */ + spinlock_t pgtablelock; /* lock for modifying page table @ pgtable */ +}; + +struct sysmmu_drvdata { + struct list_head node; /* entry of exynos_iommu_domain.clients */ + struct device *sysmmu; /* System MMU's device descriptor */ + struct device *dev; /* Owner of system MMU */ + char *dbgname; + int nsfrs; + void __iomem **sfrbases; + struct clk *clk[2]; + int activations; + rwlock_t lock; + struct iommu_domain *domain; + sysmmu_fault_handler_t fault_handler; + unsigned long pgtable; +}; + +static bool set_sysmmu_active(struct sysmmu_drvdata *data) +{ + /* return true if the System MMU was not active previously + and it needs to be initialized */ + return ++data->activations == 1; +} + +static bool set_sysmmu_inactive(struct sysmmu_drvdata *data) +{ + /* return true if the System MMU is needed to be disabled */ + BUG_ON(data->activations < 1); + return --data->activations == 0; +} + +static bool is_sysmmu_active(struct sysmmu_drvdata *data) +{ + return data->activations > 0; +} + +static void sysmmu_unblock(void __iomem *sfrbase) +{ + __raw_writel(CTRL_ENABLE, sfrbase + REG_MMU_CTRL); +} + +static bool sysmmu_block(void __iomem *sfrbase) +{ + int i = 120; + + __raw_writel(CTRL_BLOCK, sfrbase + REG_MMU_CTRL); + while ((i > 0) && !(__raw_readl(sfrbase + REG_MMU_STATUS) & 1)) + --i; + + if (!(__raw_readl(sfrbase + REG_MMU_STATUS) & 1)) { + sysmmu_unblock(sfrbase); + return false; + } + + return true; +} + +static void __sysmmu_tlb_invalidate(void __iomem *sfrbase) +{ + __raw_writel(0x1, sfrbase + REG_MMU_FLUSH); +} + +static void __sysmmu_tlb_invalidate_entry(void __iomem *sfrbase, + unsigned long iova) +{ + __raw_writel((iova & SPAGE_MASK) | 1, sfrbase + REG_MMU_FLUSH_ENTRY); +} + +static void __sysmmu_set_ptbase(void __iomem *sfrbase, + unsigned long pgd) +{ + __raw_writel(0x1, sfrbase + REG_MMU_CFG); /* 16KB LV1, LRU */ + __raw_writel(pgd, sfrbase + REG_PT_BASE_ADDR); + + __sysmmu_tlb_invalidate(sfrbase); +} + +static void __sysmmu_set_prefbuf(void __iomem *sfrbase, unsigned long base, + unsigned long size, int idx) +{ + __raw_writel(base, sfrbase + REG_PB0_SADDR + idx * 8); + __raw_writel(size - 1 + base, sfrbase + REG_PB0_EADDR + idx * 8); +} + +void exynos_sysmmu_set_prefbuf(struct device *dev, + unsigned long base0, unsigned long size0, + unsigned long base1, unsigned long size1) +{ + struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu); + unsigned long flags; + int i; + + BUG_ON((base0 + size0) <= base0); + BUG_ON((size1 > 0) && ((base1 + size1) <= base1)); + + read_lock_irqsave(&data->lock, flags); + if (!is_sysmmu_active(data)) + goto finish; + + for (i = 0; i < data->nsfrs; i++) { + if ((readl(data->sfrbases[i] + REG_MMU_VERSION) >> 28) == 3) { + if (!sysmmu_block(data->sfrbases[i])) + continue; + + if (size1 == 0) { + if (size0 <= SZ_128K) { + base1 = base0; + size1 = size0; + } else { + size1 = size0 - + ALIGN(size0 / 2, SZ_64K); + size0 = size0 - size1; + base1 = base0 + size0; + } + } + + __sysmmu_set_prefbuf( + data->sfrbases[i], base0, size0, 0); + __sysmmu_set_prefbuf( + data->sfrbases[i], base1, size1, 1); + + sysmmu_unblock(data->sfrbases[i]); + } + } +finish: + read_unlock_irqrestore(&data->lock, flags); +} + +static void __set_fault_handler(struct sysmmu_drvdata *data, + sysmmu_fault_handler_t handler) +{ + unsigned long flags; + + write_lock_irqsave(&data->lock, flags); + data->fault_handler = handler; + write_unlock_irqrestore(&data->lock, flags); +} + +void exynos_sysmmu_set_fault_handler(struct device *dev, + sysmmu_fault_handler_t handler) +{ + struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu); + + __set_fault_handler(data, handler); +} + +static int default_fault_handler(enum exynos_sysmmu_inttype itype, + unsigned long pgtable_base, unsigned long fault_addr) +{ + unsigned long *ent; + + if ((itype >= SYSMMU_FAULTS_NUM) || (itype < SYSMMU_PAGEFAULT)) + itype = SYSMMU_FAULT_UNKNOWN; + + pr_err("%s occured at 0x%lx(Page table base: 0x%lx)\n", + sysmmu_fault_name[itype], fault_addr, pgtable_base); + + ent = section_entry(__va(pgtable_base), fault_addr); + pr_err("\tLv1 entry: 0x%lx\n", *ent); + + if (lv1ent_page(ent)) { + ent = page_entry(ent, fault_addr); + pr_err("\t Lv2 entry: 0x%lx\n", *ent); + } + + pr_err("Generating Kernel OOPS... because it is unrecoverable.\n"); + + BUG(); + + return 0; +} + +static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id) +{ + /* SYSMMU is in blocked when interrupt occurred. */ + struct sysmmu_drvdata *data = dev_id; + struct resource *irqres; + struct platform_device *pdev; + enum exynos_sysmmu_inttype itype; + unsigned long addr = -1; + + int i, ret = -ENOSYS; + + read_lock(&data->lock); + + WARN_ON(!is_sysmmu_active(data)); + + pdev = to_platform_device(data->sysmmu); + for (i = 0; i < (pdev->num_resources / 2); i++) { + irqres = platform_get_resource(pdev, IORESOURCE_IRQ, i); + if (irqres && ((int)irqres->start == irq)) + break; + } + + if (i == pdev->num_resources) { + itype = SYSMMU_FAULT_UNKNOWN; + } else { + itype = (enum exynos_sysmmu_inttype) + __ffs(__raw_readl(data->sfrbases[i] + REG_INT_STATUS)); + if (WARN_ON(!((itype >= 0) && (itype < SYSMMU_FAULT_UNKNOWN)))) + itype = SYSMMU_FAULT_UNKNOWN; + else + addr = __raw_readl( + data->sfrbases[i] + fault_reg_offset[itype]); + } + + if (data->domain) + ret = report_iommu_fault(data->domain, data->dev, + addr, itype); + + if ((ret == -ENOSYS) && data->fault_handler) { + unsigned long base = data->pgtable; + if (itype != SYSMMU_FAULT_UNKNOWN) + base = __raw_readl( + data->sfrbases[i] + REG_PT_BASE_ADDR); + ret = data->fault_handler(itype, base, addr); + } + + if (!ret && (itype != SYSMMU_FAULT_UNKNOWN)) + __raw_writel(1 << itype, data->sfrbases[i] + REG_INT_CLEAR); + else + dev_dbg(data->sysmmu, "(%s) %s is not handled.\n", + data->dbgname, sysmmu_fault_name[itype]); + + if (itype != SYSMMU_FAULT_UNKNOWN) + sysmmu_unblock(data->sfrbases[i]); + + read_unlock(&data->lock); + + return IRQ_HANDLED; +} + +static bool __exynos_sysmmu_disable(struct sysmmu_drvdata *data) +{ + unsigned long flags; + bool disabled = false; + int i; + + write_lock_irqsave(&data->lock, flags); + + if (!set_sysmmu_inactive(data)) + goto finish; + + for (i = 0; i < data->nsfrs; i++) + __raw_writel(CTRL_DISABLE, data->sfrbases[i] + REG_MMU_CTRL); + + if (data->clk[1]) + clk_disable(data->clk[1]); + if (data->clk[0]) + clk_disable(data->clk[0]); + + disabled = true; + data->pgtable = 0; + data->domain = NULL; +finish: + write_unlock_irqrestore(&data->lock, flags); + + if (disabled) + dev_dbg(data->sysmmu, "(%s) Disabled\n", data->dbgname); + else + dev_dbg(data->sysmmu, "(%s) %d times left to be disabled\n", + data->dbgname, data->activations); + + return disabled; +} + +/* __exynos_sysmmu_enable: Enables System MMU + * + * returns -error if an error occurred and System MMU is not enabled, + * 0 if the System MMU has been just enabled and 1 if System MMU was already + * enabled before. + */ +static int __exynos_sysmmu_enable(struct sysmmu_drvdata *data, + unsigned long pgtable, struct iommu_domain *domain) +{ + int i, ret = 0; + unsigned long flags; + + write_lock_irqsave(&data->lock, flags); + + if (!set_sysmmu_active(data)) { + if (WARN_ON(pgtable != data->pgtable)) { + ret = -EBUSY; + set_sysmmu_inactive(data); + } else { + ret = 1; + } + + dev_dbg(data->sysmmu, "(%s) Already enabled\n", data->dbgname); + goto finish; + } + + if (data->clk[0]) + clk_enable(data->clk[0]); + if (data->clk[1]) + clk_enable(data->clk[1]); + + data->pgtable = pgtable; + + for (i = 0; i < data->nsfrs; i++) { + __sysmmu_set_ptbase(data->sfrbases[i], pgtable); + + if ((readl(data->sfrbases[i] + REG_MMU_VERSION) >> 28) == 3) { + /* System MMU version is 3.x */ + __raw_writel((1 << 12) | (2 << 28), + data->sfrbases[i] + REG_MMU_CFG); + __sysmmu_set_prefbuf(data->sfrbases[i], 0, -1, 0); + __sysmmu_set_prefbuf(data->sfrbases[i], 0, -1, 1); + } + + __raw_writel(CTRL_ENABLE, data->sfrbases[i] + REG_MMU_CTRL); + } + + data->domain = domain; + + dev_dbg(data->sysmmu, "(%s) Enabled\n", data->dbgname); +finish: + write_unlock_irqrestore(&data->lock, flags); + + return ret; +} + +int exynos_sysmmu_enable(struct device *dev, unsigned long pgtable) +{ + struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu); + int ret; + + BUG_ON(!memblock_is_memory(pgtable)); + + ret = pm_runtime_get_sync(data->sysmmu); + if (ret < 0) { + dev_dbg(data->sysmmu, "(%s) Failed to enable\n", data->dbgname); + return ret; + } + + ret = __exynos_sysmmu_enable(data, pgtable, NULL); + if (WARN_ON(ret < 0)) { + pm_runtime_put(data->sysmmu); + dev_err(data->sysmmu, + "(%s) Already enabled with page table %#lx\n", + data->dbgname, data->pgtable); + } else { + data->dev = dev; + } + + return ret; +} + +bool exynos_sysmmu_disable(struct device *dev) +{ + struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu); + bool disabled; + + disabled = __exynos_sysmmu_disable(data); + pm_runtime_put(data->sysmmu); + + return disabled; +} + +static void sysmmu_tlb_invalidate_entry(struct device *dev, unsigned long iova) +{ + unsigned long flags; + struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu); + + read_lock_irqsave(&data->lock, flags); + + if (is_sysmmu_active(data)) { + int i; + for (i = 0; i < data->nsfrs; i++) { + if (sysmmu_block(data->sfrbases[i])) { + __sysmmu_tlb_invalidate_entry( + data->sfrbases[i], iova); + sysmmu_unblock(data->sfrbases[i]); + } + } + } else { + dev_dbg(data->sysmmu, + "(%s) Disabled. Skipping invalidating TLB.\n", + data->dbgname); + } + + read_unlock_irqrestore(&data->lock, flags); +} + +void exynos_sysmmu_tlb_invalidate(struct device *dev) +{ + unsigned long flags; + struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu); + + read_lock_irqsave(&data->lock, flags); + + if (is_sysmmu_active(data)) { + int i; + for (i = 0; i < data->nsfrs; i++) { + if (sysmmu_block(data->sfrbases[i])) { + __sysmmu_tlb_invalidate(data->sfrbases[i]); + sysmmu_unblock(data->sfrbases[i]); + } + } + } else { + dev_dbg(data->sysmmu, + "(%s) Disabled. Skipping invalidating TLB.\n", + data->dbgname); + } + + read_unlock_irqrestore(&data->lock, flags); +} + +static int exynos_sysmmu_probe(struct platform_device *pdev) +{ + int i, ret; + struct device *dev; + struct sysmmu_drvdata *data; + + dev = &pdev->dev; + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) { + dev_dbg(dev, "Not enough memory\n"); + ret = -ENOMEM; + goto err_alloc; + } + + ret = dev_set_drvdata(dev, data); + if (ret) { + dev_dbg(dev, "Unabled to initialize driver data\n"); + goto err_init; + } + + data->nsfrs = pdev->num_resources / 2; + data->sfrbases = kmalloc(sizeof(*data->sfrbases) * data->nsfrs, + GFP_KERNEL); + if (data->sfrbases == NULL) { + dev_dbg(dev, "Not enough memory\n"); + ret = -ENOMEM; + goto err_init; + } + + for (i = 0; i < data->nsfrs; i++) { + struct resource *res; + res = platform_get_resource(pdev, IORESOURCE_MEM, i); + if (!res) { + dev_dbg(dev, "Unable to find IOMEM region\n"); + ret = -ENOENT; + goto err_res; + } + + data->sfrbases[i] = ioremap(res->start, resource_size(res)); + if (!data->sfrbases[i]) { + dev_dbg(dev, "Unable to map IOMEM @ PA:%#x\n", + res->start); + ret = -ENOENT; + goto err_res; + } + } + + for (i = 0; i < data->nsfrs; i++) { + ret = platform_get_irq(pdev, i); + if (ret <= 0) { + dev_dbg(dev, "Unable to find IRQ resource\n"); + goto err_irq; + } + + ret = request_irq(ret, exynos_sysmmu_irq, 0, + dev_name(dev), data); + if (ret) { + dev_dbg(dev, "Unabled to register interrupt handler\n"); + goto err_irq; + } + } + + if (dev_get_platdata(dev)) { + char *deli, *beg; + struct sysmmu_platform_data *platdata = dev_get_platdata(dev); + + beg = platdata->clockname; + + for (deli = beg; (*deli != '\0') && (*deli != ','); deli++) + /* NOTHING */; + + if (*deli == '\0') + deli = NULL; + else + *deli = '\0'; + + data->clk[0] = clk_get(dev, beg); + if (IS_ERR(data->clk[0])) { + data->clk[0] = NULL; + dev_dbg(dev, "No clock descriptor registered\n"); + } + + if (data->clk[0] && deli) { + *deli = ','; + data->clk[1] = clk_get(dev, deli + 1); + if (IS_ERR(data->clk[1])) + data->clk[1] = NULL; + } + + data->dbgname = platdata->dbgname; + } + + data->sysmmu = dev; + rwlock_init(&data->lock); + INIT_LIST_HEAD(&data->node); + + __set_fault_handler(data, &default_fault_handler); + + if (dev->parent) + pm_runtime_enable(dev); + + dev_dbg(dev, "(%s) Initialized\n", data->dbgname); + return 0; +err_irq: + while (i-- > 0) { + int irq; + + irq = platform_get_irq(pdev, i); + free_irq(irq, data); + } +err_res: + while (data->nsfrs-- > 0) + iounmap(data->sfrbases[data->nsfrs]); + kfree(data->sfrbases); +err_init: + kfree(data); +err_alloc: + dev_err(dev, "Failed to initialize\n"); + return ret; +} + +static struct platform_driver exynos_sysmmu_driver = { + .probe = exynos_sysmmu_probe, + .driver = { + .owner = THIS_MODULE, + .name = "exynos-sysmmu", + } +}; + +static inline void pgtable_flush(void *vastart, void *vaend) +{ + dmac_flush_range(vastart, vaend); + outer_flush_range(virt_to_phys(vastart), + virt_to_phys(vaend)); +} + +static int exynos_iommu_domain_init(struct iommu_domain *domain) +{ + struct exynos_iommu_domain *priv; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->pgtable = (unsigned long *)__get_free_pages( + GFP_KERNEL | __GFP_ZERO, 2); + if (!priv->pgtable) + goto err_pgtable; + + priv->lv2entcnt = (short *)__get_free_pages( + GFP_KERNEL | __GFP_ZERO, 1); + if (!priv->lv2entcnt) + goto err_counter; + + pgtable_flush(priv->pgtable, priv->pgtable + NUM_LV1ENTRIES); + + spin_lock_init(&priv->lock); + spin_lock_init(&priv->pgtablelock); + INIT_LIST_HEAD(&priv->clients); + + domain->priv = priv; + return 0; + +err_counter: + free_pages((unsigned long)priv->pgtable, 2); +err_pgtable: + kfree(priv); + return -ENOMEM; +} + +static void exynos_iommu_domain_destroy(struct iommu_domain *domain) +{ + struct exynos_iommu_domain *priv = domain->priv; + struct sysmmu_drvdata *data; + unsigned long flags; + int i; + + WARN_ON(!list_empty(&priv->clients)); + + spin_lock_irqsave(&priv->lock, flags); + + list_for_each_entry(data, &priv->clients, node) { + while (!exynos_sysmmu_disable(data->dev)) + ; /* until System MMU is actually disabled */ + } + + spin_unlock_irqrestore(&priv->lock, flags); + + for (i = 0; i < NUM_LV1ENTRIES; i++) + if (lv1ent_page(priv->pgtable + i)) + kfree(__va(lv2table_base(priv->pgtable + i))); + + free_pages((unsigned long)priv->pgtable, 2); + free_pages((unsigned long)priv->lv2entcnt, 1); + kfree(domain->priv); + domain->priv = NULL; +} + +static int exynos_iommu_attach_device(struct iommu_domain *domain, + struct device *dev) +{ + struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu); + struct exynos_iommu_domain *priv = domain->priv; + unsigned long flags; + int ret; + + ret = pm_runtime_get_sync(data->sysmmu); + if (ret < 0) + return ret; + + ret = 0; + + spin_lock_irqsave(&priv->lock, flags); + + ret = __exynos_sysmmu_enable(data, __pa(priv->pgtable), domain); + + if (ret == 0) { + /* 'data->node' must not be appeared in priv->clients */ + BUG_ON(!list_empty(&data->node)); + data->dev = dev; + list_add_tail(&data->node, &priv->clients); + } + + spin_unlock_irqrestore(&priv->lock, flags); + + if (ret < 0) { + dev_err(dev, "%s: Failed to attach IOMMU with pgtable %#lx\n", + __func__, __pa(priv->pgtable)); + pm_runtime_put(data->sysmmu); + } else if (ret > 0) { + dev_dbg(dev, "%s: IOMMU with pgtable 0x%lx already attached\n", + __func__, __pa(priv->pgtable)); + } else { + dev_dbg(dev, "%s: Attached new IOMMU with pgtable 0x%lx\n", + __func__, __pa(priv->pgtable)); + } + + return ret; +} + +static void exynos_iommu_detach_device(struct iommu_domain *domain, + struct device *dev) +{ + struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu); + struct exynos_iommu_domain *priv = domain->priv; + struct list_head *pos; + unsigned long flags; + bool found = false; + + spin_lock_irqsave(&priv->lock, flags); + + list_for_each(pos, &priv->clients) { + if (list_entry(pos, struct sysmmu_drvdata, node) == data) { + found = true; + break; + } + } + + if (!found) + goto finish; + + if (__exynos_sysmmu_disable(data)) { + dev_dbg(dev, "%s: Detached IOMMU with pgtable %#lx\n", + __func__, __pa(priv->pgtable)); + list_del(&data->node); + INIT_LIST_HEAD(&data->node); + + } else { + dev_dbg(dev, "%s: Detaching IOMMU with pgtable %#lx delayed", + __func__, __pa(priv->pgtable)); + } + +finish: + spin_unlock_irqrestore(&priv->lock, flags); + + if (found) + pm_runtime_put(data->sysmmu); +} + +static unsigned long *alloc_lv2entry(unsigned long *sent, unsigned long iova, + short *pgcounter) +{ + if (lv1ent_fault(sent)) { + unsigned long *pent; + + pent = kzalloc(LV2TABLE_SIZE, GFP_ATOMIC); + BUG_ON((unsigned long)pent & (LV2TABLE_SIZE - 1)); + if (!pent) + return NULL; + + *sent = mk_lv1ent_page(__pa(pent)); + *pgcounter = NUM_LV2ENTRIES; + pgtable_flush(pent, pent + NUM_LV2ENTRIES); + pgtable_flush(sent, sent + 1); + } + + return page_entry(sent, iova); +} + +static int lv1set_section(unsigned long *sent, phys_addr_t paddr, short *pgcnt) +{ + if (lv1ent_section(sent)) + return -EADDRINUSE; + + if (lv1ent_page(sent)) { + if (*pgcnt != NUM_LV2ENTRIES) + return -EADDRINUSE; + + kfree(page_entry(sent, 0)); + + *pgcnt = 0; + } + + *sent = mk_lv1ent_sect(paddr); + + pgtable_flush(sent, sent + 1); + + return 0; +} + +static int lv2set_page(unsigned long *pent, phys_addr_t paddr, size_t size, + short *pgcnt) +{ + if (size == SPAGE_SIZE) { + if (!lv2ent_fault(pent)) + return -EADDRINUSE; + + *pent = mk_lv2ent_spage(paddr); + pgtable_flush(pent, pent + 1); + *pgcnt -= 1; + } else { /* size == LPAGE_SIZE */ + int i; + for (i = 0; i < SPAGES_PER_LPAGE; i++, pent++) { + if (!lv2ent_fault(pent)) { + memset(pent, 0, sizeof(*pent) * i); + return -EADDRINUSE; + } + + *pent = mk_lv2ent_lpage(paddr); + } + pgtable_flush(pent - SPAGES_PER_LPAGE, pent); + *pgcnt -= SPAGES_PER_LPAGE; + } + + return 0; +} + +static int exynos_iommu_map(struct iommu_domain *domain, unsigned long iova, + phys_addr_t paddr, size_t size, int prot) +{ + struct exynos_iommu_domain *priv = domain->priv; + unsigned long *entry; + unsigned long flags; + int ret = -ENOMEM; + + BUG_ON(priv->pgtable == NULL); + + spin_lock_irqsave(&priv->pgtablelock, flags); + + entry = section_entry(priv->pgtable, iova); + + if (size == SECT_SIZE) { + ret = lv1set_section(entry, paddr, + &priv->lv2entcnt[lv1ent_offset(iova)]); + } else { + unsigned long *pent; + + pent = alloc_lv2entry(entry, iova, + &priv->lv2entcnt[lv1ent_offset(iova)]); + + if (!pent) + ret = -ENOMEM; + else + ret = lv2set_page(pent, paddr, size, + &priv->lv2entcnt[lv1ent_offset(iova)]); + } + + if (ret) { + pr_debug("%s: Failed to map iova 0x%lx/0x%x bytes\n", + __func__, iova, size); + } + + spin_unlock_irqrestore(&priv->pgtablelock, flags); + + return ret; +} + +static size_t exynos_iommu_unmap(struct iommu_domain *domain, + unsigned long iova, size_t size) +{ + struct exynos_iommu_domain *priv = domain->priv; + struct sysmmu_drvdata *data; + unsigned long flags; + unsigned long *ent; + + BUG_ON(priv->pgtable == NULL); + + spin_lock_irqsave(&priv->pgtablelock, flags); + + ent = section_entry(priv->pgtable, iova); + + if (lv1ent_section(ent)) { + BUG_ON(size < SECT_SIZE); + + *ent = 0; + pgtable_flush(ent, ent + 1); + size = SECT_SIZE; + goto done; + } + + if (unlikely(lv1ent_fault(ent))) { + if (size > SECT_SIZE) + size = SECT_SIZE; + goto done; + } + + /* lv1ent_page(sent) == true here */ + + ent = page_entry(ent, iova); + + if (unlikely(lv2ent_fault(ent))) { + size = SPAGE_SIZE; + goto done; + } + + if (lv2ent_small(ent)) { + *ent = 0; + size = SPAGE_SIZE; + priv->lv2entcnt[lv1ent_offset(iova)] += 1; + goto done; + } + + /* lv1ent_large(ent) == true here */ + BUG_ON(size < LPAGE_SIZE); + + memset(ent, 0, sizeof(*ent) * SPAGES_PER_LPAGE); + + size = LPAGE_SIZE; + priv->lv2entcnt[lv1ent_offset(iova)] += SPAGES_PER_LPAGE; +done: + spin_unlock_irqrestore(&priv->pgtablelock, flags); + + spin_lock_irqsave(&priv->lock, flags); + list_for_each_entry(data, &priv->clients, node) + sysmmu_tlb_invalidate_entry(data->dev, iova); + spin_unlock_irqrestore(&priv->lock, flags); + + + return size; +} + +static phys_addr_t exynos_iommu_iova_to_phys(struct iommu_domain *domain, + unsigned long iova) +{ + struct exynos_iommu_domain *priv = domain->priv; + unsigned long *entry; + unsigned long flags; + phys_addr_t phys = 0; + + spin_lock_irqsave(&priv->pgtablelock, flags); + + entry = section_entry(priv->pgtable, iova); + + if (lv1ent_section(entry)) { + phys = section_phys(entry) + section_offs(iova); + } else if (lv1ent_page(entry)) { + entry = page_entry(entry, iova); + + if (lv2ent_large(entry)) + phys = lpage_phys(entry) + lpage_offs(iova); + else if (lv2ent_small(entry)) + phys = spage_phys(entry) + spage_offs(iova); + } + + spin_unlock_irqrestore(&priv->pgtablelock, flags); + + return phys; +} + +static struct iommu_ops exynos_iommu_ops = { + .domain_init = &exynos_iommu_domain_init, + .domain_destroy = &exynos_iommu_domain_destroy, + .attach_dev = &exynos_iommu_attach_device, + .detach_dev = &exynos_iommu_detach_device, + .map = &exynos_iommu_map, + .unmap = &exynos_iommu_unmap, + .iova_to_phys = &exynos_iommu_iova_to_phys, + .pgsize_bitmap = SECT_SIZE | LPAGE_SIZE | SPAGE_SIZE, +}; + +static int __init exynos_iommu_init(void) +{ + int ret; + + ret = platform_driver_register(&exynos_sysmmu_driver); + + if (ret == 0) + bus_set_iommu(&platform_bus_type, &exynos_iommu_ops); + + return ret; +} +subsys_initcall(exynos_iommu_init); diff --git a/drivers/iommu/exynos-iovmm.c b/drivers/iommu/exynos-iovmm.c new file mode 100644 index 0000000..bc78722 --- /dev/null +++ b/drivers/iommu/exynos-iovmm.c @@ -0,0 +1,510 @@ +/* linux/arch/arm/plat-s5p/s5p_iovmm.c + * + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifdef CONFIG_EXYNOS_IOMMU_DEBUG +#define DEBUG +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define IOVA_START 0xC0000000 +#define IOVM_SIZE (SZ_1G - SZ_4K) /* last 4K is for error values */ + +struct s5p_vm_region { + struct list_head node; + dma_addr_t start; + size_t size; +}; + +struct s5p_iovmm { + struct list_head node; /* element of s5p_iovmm_list */ + struct rcu_head rcu; + struct iommu_domain *domain; + struct device *dev; + struct gen_pool *vmm_pool; + struct list_head regions_list; /* list of s5p_vm_region */ + atomic_t activations; + int num_setup; + spinlock_t lock; +}; + +static LIST_HEAD(s5p_iovmm_list); + +static struct s5p_iovmm *find_iovmm(struct device *dev) +{ + struct s5p_iovmm *vmm; + + list_for_each_entry(vmm, &s5p_iovmm_list, node) + if ((vmm->dev == dev) && (vmm->num_setup > 0)) + return vmm; + + return NULL; +} + +static struct s5p_vm_region *find_region(struct s5p_iovmm *vmm, dma_addr_t iova) +{ + struct s5p_vm_region *region; + + list_for_each_entry(region, &vmm->regions_list, node) + if (region->start == iova) + return region; + + return NULL; +} + +int iovmm_setup(struct device *dev) +{ + struct s5p_iovmm *vmm = NULL; + struct list_head *pos; + int ret; + + list_for_each(pos, &s5p_iovmm_list) { + vmm = list_entry(pos, struct s5p_iovmm, node); + if (vmm->dev == dev) { + struct s5p_iovmm *rcu_vmm; + + rcu_vmm = kmalloc(sizeof(*rcu_vmm), GFP_KERNEL); + if (rcu_vmm == NULL) + return -ENOMEM; + + memcpy(rcu_vmm, vmm, sizeof(*vmm)); + rcu_vmm->num_setup++; + list_replace_rcu(&vmm->node, &rcu_vmm->node); + + kfree(vmm); + + return 0; + } + } + + vmm = kzalloc(sizeof(*vmm), GFP_KERNEL); + if (!vmm) { + ret = -ENOMEM; + goto err_setup_alloc; + } + + vmm->vmm_pool = gen_pool_create(PAGE_SHIFT, -1); + if (!vmm->vmm_pool) { + ret = -ENOMEM; + goto err_setup_genalloc; + } + + /* (1GB - 4KB) addr space from 0xC0000000 */ + ret = gen_pool_add(vmm->vmm_pool, IOVA_START, IOVM_SIZE, -1); + if (ret) + goto err_setup_domain; + + vmm->domain = iommu_domain_alloc(&platform_bus_type); + if (!vmm->domain) { + ret = -ENOMEM; + goto err_setup_domain; + } + + vmm->dev = dev; + vmm->num_setup = 1; + + spin_lock_init(&vmm->lock); + + INIT_LIST_HEAD(&vmm->node); + INIT_LIST_HEAD(&vmm->regions_list); + atomic_set(&vmm->activations, 0); + + list_add_rcu(&vmm->node, &s5p_iovmm_list); + + dev_dbg(dev, "IOVMM: Created %#x B IOVMM from %#x.\n", + IOVM_SIZE, IOVA_START); + + return 0; +err_setup_domain: + gen_pool_destroy(vmm->vmm_pool); +err_setup_genalloc: + kfree(vmm); +err_setup_alloc: + dev_dbg(dev, "IOVMM: Failed to create IOVMM (%d)\n", ret); + return ret; +} + +static void iovmm_destroy(struct rcu_head *rcu) +{ + struct s5p_iovmm *vmm = container_of(rcu, struct s5p_iovmm, rcu); + struct list_head *pos, *tmp; + + while (WARN_ON(atomic_dec_return(&vmm->activations) > 0)) + iommu_detach_device(vmm->domain, vmm->dev); + + iommu_domain_free(vmm->domain); + + WARN_ON(!list_empty(&vmm->regions_list)); + + list_for_each_safe(pos, tmp, &vmm->regions_list) { + struct s5p_vm_region *region; + + region = list_entry(pos, struct s5p_vm_region, node); + + /* No need to unmap the region because + * iommu_domain_free() frees the page table */ + gen_pool_free(vmm->vmm_pool, region->start, + region->size); + + kfree(list_entry(pos, struct s5p_vm_region, node)); + } + + gen_pool_destroy(vmm->vmm_pool); + + dev_dbg(vmm->dev, "IOVMM: Removed IOVMM\n"); + + kfree(vmm); +} + +void iovmm_cleanup(struct device *dev) +{ + struct s5p_iovmm *vmm, *n; + + list_for_each_entry_safe(vmm, n, &s5p_iovmm_list, node) { + if (vmm->dev == dev) { + struct s5p_iovmm *rcu_vmm = NULL; + + while (rcu_vmm == NULL) /* should success */ + rcu_vmm = kmalloc(sizeof(*rcu_vmm), GFP_ATOMIC); + + memcpy(rcu_vmm, vmm, sizeof(*vmm)); + rcu_vmm->num_setup--; + list_replace_rcu(&vmm->node, &rcu_vmm->node); + + kfree(vmm); + + if (rcu_vmm->num_setup == 0) { + list_del_rcu(&rcu_vmm->node); + call_rcu(&rcu_vmm->rcu, iovmm_destroy); + } + + return; + } + } + + WARN(true, "%s: No IOVMM exist for %s\n", __func__, dev_name(dev)); +} + +int iovmm_activate(struct device *dev) +{ + struct s5p_iovmm *vmm; + int ret = 0; + + rcu_read_lock(); + + vmm = find_iovmm(dev); + if (WARN_ON(!vmm)) { + rcu_read_unlock(); + return -EINVAL; + } + + ret = iommu_attach_device(vmm->domain, vmm->dev); + if (!ret) + atomic_inc(&vmm->activations); + + rcu_read_unlock(); + + return ret; +} + +void iovmm_deactivate(struct device *dev) +{ + struct s5p_iovmm *vmm; + + rcu_read_lock(); + + vmm = find_iovmm(dev); + if (WARN_ON(!vmm)) { + rcu_read_unlock(); + return; + } + + iommu_detach_device(vmm->domain, vmm->dev); + + atomic_add_unless(&vmm->activations, -1, 0); + + rcu_read_unlock(); +} + +dma_addr_t iovmm_map(struct device *dev, struct scatterlist *sg, off_t offset, + size_t size) +{ + off_t start_off; + dma_addr_t addr, start = 0; + size_t mapped_size = 0; + struct s5p_vm_region *region; + struct s5p_iovmm *vmm; + int order; + unsigned long flags; +#ifdef CONFIG_EXYNOS_IOVMM_ALIGN64K + size_t iova_size = 0; +#endif + + rcu_read_lock(); + + vmm = find_iovmm(dev); + if (WARN_ON(!vmm)) + goto err_map_nomem; + + for (; sg_dma_len(sg) < offset; sg = sg_next(sg)) + offset -= sg_dma_len(sg); + + start_off = offset_in_page(sg_phys(sg) + offset); + size = PAGE_ALIGN(size + start_off); + + order = __fls(min_t(size_t, size, SZ_1M)); + + region = kmalloc(sizeof(*region), GFP_KERNEL); + if (!region) + goto err_map_nomem; + + INIT_LIST_HEAD(®ion->node); + + spin_lock_irqsave(&vmm->lock, flags); + +#ifdef CONFIG_EXYNOS_IOVMM_ALIGN64K + iova_size = ALIGN(size, SZ_64K); + start = (dma_addr_t)gen_pool_alloc_aligned(vmm->vmm_pool, iova_size, + order); +#else + start = (dma_addr_t)gen_pool_alloc_aligned(vmm->vmm_pool, size, order); +#endif + if (!start) + goto err_map_nomem_lock; + + addr = start; + do { + phys_addr_t phys; + size_t len; + + phys = sg_phys(sg); + len = sg_dma_len(sg); + + if (offset > 0) { + len -= offset; + phys += offset; + offset = 0; + } + + if (offset_in_page(phys)) { + len += offset_in_page(phys); + phys = round_down(phys, PAGE_SIZE); + } + + len = PAGE_ALIGN(len); + + if (len > (size - mapped_size)) + len = size - mapped_size; + + if (iommu_map(vmm->domain, addr, phys, len, 0)) + break; + + addr += len; + mapped_size += len; + } while ((sg = sg_next(sg)) && (mapped_size < size)); + + BUG_ON(mapped_size > size); + + if (mapped_size < size) + goto err_map_map; + +#ifdef CONFIG_EXYNOS_IOVMM_ALIGN64K + if (iova_size != size) { + addr = start + size; + size = iova_size; + + for (; addr < start + size; addr += PAGE_SIZE) { + if (iommu_map(vmm->domain, addr, + page_to_phys(ZERO_PAGE(0)), PAGE_SIZE, 0)) + goto err_map_map; + + mapped_size += PAGE_SIZE; + } + } +#endif + + region->start = start + start_off; + region->size = size; + + list_add(®ion->node, &vmm->regions_list); + + spin_unlock_irqrestore(&vmm->lock, flags); + + dev_dbg(dev, "IOVMM: Allocated VM region @ %#x/%#X bytes.\n", + region->start, region->size); + + rcu_read_unlock(); + + return region->start; + +err_map_map: + iommu_unmap(vmm->domain, start, mapped_size); + gen_pool_free(vmm->vmm_pool, start, size); +err_map_nomem_lock: + spin_unlock_irqrestore(&vmm->lock, flags); + kfree(region); +err_map_nomem: + dev_dbg(dev, "IOVMM: Failed to allocated VM region for %#x bytes.\n", + size); + rcu_read_unlock(); + + return (dma_addr_t)0; +} + +void iovmm_unmap(struct device *dev, dma_addr_t iova) +{ + struct s5p_vm_region *region; + struct s5p_iovmm *vmm; + unsigned long flags; + size_t unmapped_size; + + rcu_read_lock(); + + vmm = find_iovmm(dev); + + if (WARN_ON(!vmm)) { + rcu_read_unlock(); + return; + } + + spin_lock_irqsave(&vmm->lock, flags); + + region = find_region(vmm, iova); + if (WARN_ON(!region)) + goto err_region_not_found; + + region->start = round_down(region->start, PAGE_SIZE); + + gen_pool_free(vmm->vmm_pool, region->start, region->size); + list_del(®ion->node); + + unmapped_size = iommu_unmap(vmm->domain, region->start, region->size); + + WARN_ON(unmapped_size != region->size); + dev_dbg(dev, "IOVMM: Unmapped %#x bytes from %#x.\n", + unmapped_size, region->start); + + kfree(region); +err_region_not_found: + spin_unlock_irqrestore(&vmm->lock, flags); + + rcu_read_unlock(); +} + +int iovmm_map_oto(struct device *dev, phys_addr_t phys, size_t size) +{ + struct s5p_vm_region *region; + struct s5p_iovmm *vmm; + unsigned long flags; + int ret; + + rcu_read_lock(); + + vmm = find_iovmm(dev); + if (WARN_ON(!vmm)) { + ret = -EINVAL; + goto err_map_nomem; + } + + region = kmalloc(sizeof(*region), GFP_KERNEL); + if (!region) { + ret = -ENOMEM; + goto err_map_nomem; + } + + if (WARN_ON((phys + size) >= IOVA_START)) { + dev_err(dev, + "Unable to create one to one mapping for %#x @ %#x\n", + size, phys); + ret = -EINVAL; + goto err_out_of_memory; + } + + if (WARN_ON(phys & ~PAGE_MASK)) + phys = round_down(phys, PAGE_SIZE); + + spin_lock_irqsave(&vmm->lock, flags); + + ret = iommu_map(vmm->domain, (dma_addr_t)phys, phys, size, 0); + if (ret < 0) + goto err_map_failed; + + region->start = (dma_addr_t)phys; + region->size = size; + INIT_LIST_HEAD(®ion->node); + + list_add(®ion->node, &vmm->regions_list); + + spin_unlock_irqrestore(&vmm->lock, flags); + + rcu_read_unlock(); + + return 0; + +err_map_failed: + spin_unlock_irqrestore(&vmm->lock, flags); +err_out_of_memory: + kfree(region); +err_map_nomem: + rcu_read_unlock(); + + return ret; +} + +void iovmm_unmap_oto(struct device *dev, phys_addr_t phys) +{ + struct s5p_vm_region *region; + struct s5p_iovmm *vmm; + unsigned long flags; + size_t unmapped_size; + + rcu_read_lock(); + + vmm = find_iovmm(dev); + if (WARN_ON(!vmm)) { + rcu_read_unlock(); + return; + } + + if (WARN_ON(phys & ~PAGE_MASK)) + phys = round_down(phys, PAGE_SIZE); + + spin_lock_irqsave(&vmm->lock, flags); + + region = find_region(vmm, (dma_addr_t)phys); + if (WARN_ON(!region)) + goto err_region_not_found; + + list_del(®ion->node); + + unmapped_size = iommu_unmap(vmm->domain, region->start, region->size); + + WARN_ON(unmapped_size != region->size); + dev_dbg(dev, "IOVMM: Unmapped %#x bytes from %#x.\n", + unmapped_size, region->start); + + kfree(region); +err_region_not_found: + spin_unlock_irqrestore(&vmm->lock, flags); + + rcu_read_unlock(); +} diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c new file mode 100644 index 0000000..2198b2d --- /dev/null +++ b/drivers/iommu/iommu.c @@ -0,0 +1,343 @@ +/* + * Copyright (C) 2007-2008 Advanced Micro Devices, Inc. + * Author: Joerg Roedel + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define pr_fmt(fmt) "%s: " fmt, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include + +static ssize_t show_iommu_group(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned int groupid; + + if (iommu_device_group(dev, &groupid)) + return 0; + + return sprintf(buf, "%u", groupid); +} +static DEVICE_ATTR(iommu_group, S_IRUGO, show_iommu_group, NULL); + +static int add_iommu_group(struct device *dev, void *data) +{ + unsigned int groupid; + + if (iommu_device_group(dev, &groupid) == 0) + return device_create_file(dev, &dev_attr_iommu_group); + + return 0; +} + +static int remove_iommu_group(struct device *dev) +{ + unsigned int groupid; + + if (iommu_device_group(dev, &groupid) == 0) + device_remove_file(dev, &dev_attr_iommu_group); + + return 0; +} + +static int iommu_device_notifier(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct device *dev = data; + + if (action == BUS_NOTIFY_ADD_DEVICE) + return add_iommu_group(dev, NULL); + else if (action == BUS_NOTIFY_DEL_DEVICE) + return remove_iommu_group(dev); + + return 0; +} + +static struct notifier_block iommu_device_nb = { + .notifier_call = iommu_device_notifier, +}; + +static void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops) +{ + bus_register_notifier(bus, &iommu_device_nb); + bus_for_each_dev(bus, NULL, NULL, add_iommu_group); +} + +/** + * bus_set_iommu - set iommu-callbacks for the bus + * @bus: bus. + * @ops: the callbacks provided by the iommu-driver + * + * This function is called by an iommu driver to set the iommu methods + * used for a particular bus. Drivers for devices on that bus can use + * the iommu-api after these ops are registered. + * This special function is needed because IOMMUs are usually devices on + * the bus itself, so the iommu drivers are not initialized when the bus + * is set up. With this function the iommu-driver can set the iommu-ops + * afterwards. + */ +int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops) +{ + if (bus->iommu_ops != NULL) + return -EBUSY; + + bus->iommu_ops = ops; + + /* Do IOMMU specific setup for this bus-type */ + iommu_bus_init(bus, ops); + + return 0; +} +EXPORT_SYMBOL_GPL(bus_set_iommu); + +bool iommu_present(struct bus_type *bus) +{ + return bus->iommu_ops != NULL; +} +EXPORT_SYMBOL_GPL(iommu_present); + +/** + * iommu_set_fault_handler() - set a fault handler for an iommu domain + * @domain: iommu domain + * @handler: fault handler + * + * This function should be used by IOMMU users which want to be notified + * whenever an IOMMU fault happens. + * + * The fault handler itself should return 0 on success, and an appropriate + * error code otherwise. + */ +void iommu_set_fault_handler(struct iommu_domain *domain, + iommu_fault_handler_t handler) +{ + BUG_ON(!domain); + + domain->handler = handler; +} +EXPORT_SYMBOL_GPL(iommu_set_fault_handler); + +struct iommu_domain *iommu_domain_alloc(struct bus_type *bus) +{ + struct iommu_domain *domain; + int ret; + + if (bus == NULL || bus->iommu_ops == NULL) + return NULL; + + domain = kzalloc(sizeof(*domain), GFP_KERNEL); + if (!domain) + return NULL; + + domain->ops = bus->iommu_ops; + + ret = domain->ops->domain_init(domain); + if (ret) + goto out_free; + + return domain; + +out_free: + kfree(domain); + + return NULL; +} +EXPORT_SYMBOL_GPL(iommu_domain_alloc); + +void iommu_domain_free(struct iommu_domain *domain) +{ + if (likely(domain->ops->domain_destroy != NULL)) + domain->ops->domain_destroy(domain); + + kfree(domain); +} +EXPORT_SYMBOL_GPL(iommu_domain_free); + +int iommu_attach_device(struct iommu_domain *domain, struct device *dev) +{ + if (unlikely(domain->ops->attach_dev == NULL)) + return -ENODEV; + + return domain->ops->attach_dev(domain, dev); +} +EXPORT_SYMBOL_GPL(iommu_attach_device); + +void iommu_detach_device(struct iommu_domain *domain, struct device *dev) +{ + if (unlikely(domain->ops->detach_dev == NULL)) + return; + + domain->ops->detach_dev(domain, dev); +} +EXPORT_SYMBOL_GPL(iommu_detach_device); + +phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, + unsigned long iova) +{ + if (unlikely(domain->ops->iova_to_phys == NULL)) + return 0; + + return domain->ops->iova_to_phys(domain, iova); +} +EXPORT_SYMBOL_GPL(iommu_iova_to_phys); + +int iommu_domain_has_cap(struct iommu_domain *domain, + unsigned long cap) +{ + if (unlikely(domain->ops->domain_has_cap == NULL)) + return 0; + + return domain->ops->domain_has_cap(domain, cap); +} +EXPORT_SYMBOL_GPL(iommu_domain_has_cap); + +int iommu_map(struct iommu_domain *domain, unsigned long iova, + phys_addr_t paddr, size_t size, int prot) +{ + unsigned long orig_iova = iova; + unsigned int min_pagesz; + size_t orig_size = size; + int ret = 0; + + if (unlikely(domain->ops->map == NULL)) + return -ENODEV; + + /* find out the minimum page size supported */ + min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap); + + /* + * both the virtual address and the physical one, as well as + * the size of the mapping, must be aligned (at least) to the + * size of the smallest page supported by the hardware + */ + if (!IS_ALIGNED(iova | paddr | size, min_pagesz)) { + pr_err("unaligned: iova 0x%lx pa 0x%lx size 0x%lx min_pagesz " + "0x%x\n", iova, (unsigned long)paddr, + (unsigned long)size, min_pagesz); + return -EINVAL; + } + + pr_debug("map: iova 0x%lx pa 0x%lx size 0x%lx\n", iova, + (unsigned long)paddr, (unsigned long)size); + + while (size) { + unsigned long pgsize, addr_merge = iova | paddr; + unsigned int pgsize_idx; + + /* Max page size that still fits into 'size' */ + pgsize_idx = __fls(size); + + /* need to consider alignment requirements ? */ + if (likely(addr_merge)) { + /* Max page size allowed by both iova and paddr */ + unsigned int align_pgsize_idx = __ffs(addr_merge); + + pgsize_idx = min(pgsize_idx, align_pgsize_idx); + } + + /* build a mask of acceptable page sizes */ + pgsize = (1UL << (pgsize_idx + 1)) - 1; + + /* throw away page sizes not supported by the hardware */ + pgsize &= domain->ops->pgsize_bitmap; + + /* make sure we're still sane */ + BUG_ON(!pgsize); + + /* pick the biggest page */ + pgsize_idx = __fls(pgsize); + pgsize = 1UL << pgsize_idx; + + pr_debug("mapping: iova 0x%lx pa 0x%lx pgsize %lu\n", iova, + (unsigned long)paddr, pgsize); + + ret = domain->ops->map(domain, iova, paddr, pgsize, prot); + if (ret) + break; + + iova += pgsize; + paddr += pgsize; + size -= pgsize; + } + + /* unroll mapping in case something went wrong */ + if (ret) + iommu_unmap(domain, orig_iova, orig_size - size); + + return ret; +} +EXPORT_SYMBOL_GPL(iommu_map); + +size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size) +{ + size_t unmapped_page, unmapped = 0; + unsigned int min_pagesz; + + if (unlikely(domain->ops->unmap == NULL)) + return -ENODEV; + + /* find out the minimum page size supported */ + min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap); + + /* + * The virtual address, as well as the size of the mapping, must be + * aligned (at least) to the size of the smallest page supported + * by the hardware + */ + if (!IS_ALIGNED(iova | size, min_pagesz)) { + pr_err("unaligned: iova 0x%lx size 0x%lx min_pagesz 0x%x\n", + iova, (unsigned long)size, min_pagesz); + return -EINVAL; + } + + pr_debug("unmap this: iova 0x%lx size 0x%lx\n", iova, + (unsigned long)size); + + /* + * Keep iterating until we either unmap 'size' bytes (or more) + * or we hit an area that isn't mapped. + */ + while (unmapped < size) { + size_t left = size - unmapped; + + unmapped_page = domain->ops->unmap(domain, iova, left); + if (!unmapped_page) + break; + + pr_debug("unmapped: iova 0x%lx size %lx\n", iova, + (unsigned long)unmapped_page); + + iova += unmapped_page; + unmapped += unmapped_page; + } + + return unmapped; +} +EXPORT_SYMBOL_GPL(iommu_unmap); + +int iommu_device_group(struct device *dev, unsigned int *groupid) +{ + if (iommu_present(dev->bus) && dev->bus->iommu_ops->device_group) + return dev->bus->iommu_ops->device_group(dev, groupid); + + return -ENODEV; +} +EXPORT_SYMBOL_GPL(iommu_device_group); diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig index 0f22722..6995940 100644 --- a/drivers/media/Kconfig +++ b/drivers/media/Kconfig @@ -114,13 +114,4 @@ source "drivers/media/radio/Kconfig" source "drivers/media/dvb/Kconfig" -# -# TDMB drivers -# - -source "drivers/media/tdmb/Kconfig" - -# ISDBT -source "drivers/media/isdbt/Kconfig" - endif # MEDIA_SUPPORT diff --git a/drivers/media/Makefile b/drivers/media/Makefile index 7f8a1cc..64755c9 100644 --- a/drivers/media/Makefile +++ b/drivers/media/Makefile @@ -12,5 +12,3 @@ obj-y += common/ rc/ video/ obj-$(CONFIG_VIDEO_DEV) += radio/ obj-$(CONFIG_DVB_CORE) += dvb/ -obj-$(CONFIG_TDMB) += tdmb/ -obj-$(CONFIG_ISDBT) += isdbt/ diff --git a/drivers/media/isdbt/Kconfig b/drivers/media/isdbt/Kconfig deleted file mode 100644 index d4fb1a6..0000000 --- a/drivers/media/isdbt/Kconfig +++ /dev/null @@ -1,14 +0,0 @@ -config ISDBT - bool "isdbt" - -choice - depends on ISDBT - prompt "isdbt one-seg driver" - default ISDBT_FC8150 - - config ISDBT_FC8150 - bool "ISDBT_FC8150" - - config ISDBT_FC8100 - bool "ISDBT_FC8100" -endchoice diff --git a/drivers/media/isdbt/Makefile b/drivers/media/isdbt/Makefile deleted file mode 100644 index c328411..0000000 --- a/drivers/media/isdbt/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# -# Makefile for the kernel character device drivers. -# - - -#obj-$(CONFIG_ISDBT_FC8100) += isdbt.o -obj-$(CONFIG_ISDBT_FC8100) += fc8100/ -obj-$(CONFIG_ISDBT) += fc8150/ diff --git a/drivers/media/isdbt/fc8100/KLlist.c b/drivers/media/isdbt/fc8100/KLlist.c deleted file mode 100644 index 29ace3d..0000000 --- a/drivers/media/isdbt/fc8100/KLlist.c +++ /dev/null @@ -1,285 +0,0 @@ -#include "LKlist.h" - -position LKAdvanceList(listptr alist) - /* Move current to the succeeding element. */ -{ - if (alist->current) { - if (alist->icurrent == alist->n) - alist->icurrent = 1; - else - ++alist->icurrent; - } - alist->current = alist->current->next; - return((int)alist->current); -} - - -position LKReverseList(listptr alist) /* Move current to the preceeding element. */ -{ - if (alist->current) { - if (alist->icurrent == 1) - alist->icurrent = alist->n; - else - --alist->icurrent; - } - alist->current = alist->current->prior; - return((int)alist->current); -} - - -position LKGotoInList(listptr alist, position i) - /* Set current to the ith list element. */ -{ - position k; - - alist->current = alist->head; - /* Closer to the tail or head? */ - if ((i - 1) < (alist->n - i)) { -/* Head : traverse forward. */ - for (k = 1; k <= i - 1; k++) - alist->current = alist->current->next; - } else { -/* Tail : traverse backward. */ - for (k = alist->n; k >= i; k--) - alist->current = alist->current->prior; - } - - alist->icurrent = i; - return((int)alist->current); -} - - -void LKGetFromList(listptr alist, position i, void *data) -/* Retrieve the current list element from the list into data. */ -{ - if (i <= alist->n) { - LKGotoInList(alist, i); -#if 0 - memmove(data, alist->current->data, alist->elSize); -#else - data = alist->current->data; -#endif - - } - return; -} - - -void LKPutInList(listptr alist, position i, void *data) -/* Update the current list element with data */ -{ - if (i <= alist->n) { - LKGotoInList(alist, i); - memmove(alist->current->data, data, alist->elSize); - } - return; -} - - -position LKSearchList(listptr alist, void *data) -{ - int i; - int a, b; - - a = data; - - LKGotoInList(alist, 1); - for (i = 0; i < (alist->n); i++) { - b = alist->current->data; - - if (b == a) - return alist->icurrent; - - LKAdvanceList(alist); - } - - if (alist->icurrent == 1) - return 0; -} - -int LKInsertAfterInList(listptr alist, position i, void *data) -/* Inserts a new list element following the current element. */ -{ - nodeptr p; - - if ((alist->head == NULL) || (i <= alist->n)) { - if ((p = malloc(sizeof(listnode))) == NULL) { - fprintf(stderr, "list.c: LKInsertAfterInList: malloc() [1] failed\n"); - return(-1); - } else { -#if 0 - if ((p->data = (void *) malloc(alist->elSize)) == NULL) { - fprintf(stderr, "list.c: LKInsertAfterInList: malloc() [2] failed\n"); - return(-1); - } else -#endif - { -#if 0 - memmove(p->data, data, alist->elSize); -#else - p->data = data; -#endif - if (alist->head == NULL) { -/* Empty list. */ - alist->head = p; - alist->icurrent = 1; - p->next = p; - p->prior = p; - } else { /* Adjust the linkage */ - LKGotoInList(alist, i); - alist->current->next->prior = p; - p->next = alist->current->next; - p->prior = alist->current; - alist->current->next = p; - ++alist->icurrent; - } - alist->current = p; - ++alist->n; - } - } - } - return(1); -} - -int LKInsertBeforeInList(listptr alist, position i, void *data) -/* Inserts a new list element preceeding the current element. */ -{ - int result = 0; - - if ((alist->head == NULL) || (i <= alist->n)) { -/* Is list not empty? */ - if (alist->head != NULL) { - LKGotoInList(alist, i); - alist->current = alist->current->prior; - --alist->icurrent; - if (alist->icurrent == 0) { /* check for head */ - alist->icurrent = alist->n; - } - } - result = LKInsertAfterInList(alist, alist->icurrent, data); - /* used to be i not alist->icurrent */ - - if (alist->current->next == alist->head) { - /* Is insertion at list head? */ - alist->head = alist->current; - alist->icurrent = 1; - } - } - return(result); -} - - -void LKDeleteFromList(listptr alist, position i) -/* Delete the current element. */ -{ - nodeptr precurrent; - - if ((alist->head != NULL) & (i <= alist->n)) { - LKGotoInList(alist, i); - precurrent = alist->current; - - -/* Relink list to exclude the node to be deleted. */ - alist->current->prior->next = alist->current->next; - alist->current->next->prior = alist->current->prior; - - /* Is tail node to be deleted? */ - - if (precurrent->next == alist->head) - alist->icurrent = 1; - alist->current = alist->current->next; - if (alist->n == 1) { - alist->head = NULL; - } else if (alist->head == precurrent) { - alist->head = alist->current; - } - --alist->n; -#if 0 - free(precurrent->data); -#endif - free(precurrent); - precurrent = NULL; - } - return; -} - - -position LKCurrent(listptr alist) - /* Return the position of current. */ -{ - return(alist->icurrent); -} - - -position LKLastInList(listptr alist) - /* Return the current list size. */ -{ - return(alist->n); -} - - -int LKCreateList(linklist, space) - /* Initialize package before first use. */ - listptr *linklist; - position space; -{ - listptr alist; - if ((alist = (listptr) malloc(sizeof(list))) == NULL) { - fprintf(stderr, "list.c: LKCreateList: malloc() failed\n"); - return(-1); - } else { - alist->head = NULL; - alist->current = NULL; - alist->n = 0; - alist->icurrent = 0; - alist->elSize = space; - *linklist = alist; - } - return(1); -} - -void LKClearList(listptr alist) - /* Reset the list to empty. */ -{ - nodeptr prehead, q; - - prehead = alist->head; -/* Is the list not empty? */ - if (alist->head != NULL) { - do { - q = alist->head; - alist->head = alist->head->next; - free(q->data); - free(q); - } while (alist->head != prehead); - } - - /* Reinitialize the list. */ - alist->head = NULL; - alist->current = NULL; - alist->n = 0; - alist->icurrent = 0; - return; -} - - -int LKEmptyList(listptr alist) - /* Is the list Empty? */ -{ - if (alist->head == NULL) { - return((int) NULL); - } - return 1; -} - - - -void LKZapList(listptr *alist) - /* Reset the list to empty. */ -{ - - LKClearList(*alist); - free(*alist); - *alist = NULL; - return; -} diff --git a/drivers/media/isdbt/fc8100/LKlist.h b/drivers/media/isdbt/fc8100/LKlist.h deleted file mode 100644 index b895866..0000000 --- a/drivers/media/isdbt/fc8100/LKlist.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef LKLIST_INC -#define LKLIST_INC - -#include -#include -#include - -typedef int position; - -typedef struct node *nodeptr; -typedef struct node { - void *data; - nodeptr next; - nodeptr prior; -} listnode; - -typedef struct listrec *listptr; -typedef struct listrec { - nodeptr head; - nodeptr current; - position elSize; - position n; - position icurrent; -} list; - -position LKAdvanceList(listptr); -void LKClearList(listptr); -int LKCreateList(listptr*, position); -position LKCurrent(listptr); -void LKDeleteFromList(listptr, position); -int LKEmptyList(listptr); -void LKGetFromList(listptr, position, void *); -position LKGotoInList(listptr, position); -int LKInsertAfterInList(listptr, position, void *); -int LKInsertBeforeInList(listptr, position, void *); -position LKSearchList(listptr, void *); -position LKLastInList(listptr); -void LKPutInList(listptr, position, void *); -position LKReverseList(listptr); -void LKZapList(listptr *); - - -#endif -/* LKLIST_INC */ diff --git a/drivers/media/isdbt/fc8100/Makefile b/drivers/media/isdbt/fc8100/Makefile deleted file mode 100644 index c525531..0000000 --- a/drivers/media/isdbt/fc8100/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -#fci driver - -obj-$(CONFIG_ISDBT_FC8100) := isdbt.o -isdbt-objs := fc8100.o bbm.o fc8100_bb.o fci_tun.o fci_hal.o fci_i2c.o fc8100_isr.o fc8100_tun.o fc8100_i2c.o fci_oal.o - -#KDIR := /home/android/workspace/S5PC100/kernel -#KDIR := /usr/src/linux-headers-2.6.31-14-generic -PWD := $(shell pwd) - -all: - $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules -clean: - rm -rf *.ko - rm -rf *.mod.* - rm -rf .*.cmd - rm -rf *.o diff --git a/drivers/media/isdbt/fc8100/bbm.c b/drivers/media/isdbt/fc8100/bbm.c deleted file mode 100644 index c171281..0000000 --- a/drivers/media/isdbt/fc8100/bbm.c +++ /dev/null @@ -1,237 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : bbm.c - - Description : API of dmb baseband module - - History : - ---------------------------------------------------------------------- - 2009/11/28 jason initial -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_hal.h" -#include "fci_tun.h" -#include "fc8100_bb.h" -#include "fc8100_isr.h" - -int BBM_RESET(HANDLE hDevice) -{ - int res; - - res = fc8100_reset(hDevice); - - return res; -} - -int BBM_PROBE(HANDLE hDevice) -{ - int res; - - res = fc8100_probe(hDevice); - - return res; -} - -int BBM_INIT(HANDLE hDevice) -{ - int res; - - res = fc8100_init(hDevice); - - return res; -} - -int BBM_DEINIT(HANDLE hDevice) -{ - int res; - - res = fc8100_deinit(hDevice); - - return res; -} - -int BBM_READ(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = bbm_read(hDevice, addr, data); - - return res; -} - -int BBM_BYTE_READ(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = bbm_byte_read(hDevice, addr, data); - - return res; -} - -int BBM_WORD_READ(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - - res = bbm_word_read(hDevice, addr, data); - - return res; -} - -int BBM_LONG_READ(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - - res = bbm_long_read(hDevice, addr, data); - - return BBM_OK; -} - -int BBM_BULK_READ(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res; - - res = bbm_bulk_read(hDevice, addr, data, size); - - return res; -} - -int BBM_WRITE(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = bbm_write(hDevice, addr, data); - - return res; -} - -int BBM_BYTE_WRITE(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = bbm_byte_write(hDevice, addr, data); - - return res; -} - -int BBM_WORD_WRITE(HANDLE hDevice, u16 addr, u16 data) -{ - int res; - - res = bbm_word_write(hDevice, addr, data); - - return res; -} - -int BBM_LONG_WRITE(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - - res = bbm_long_write(hDevice, addr, data); - - return res; -} - -int BBM_BULK_WRITE(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res; - - res = bbm_bulk_write(hDevice, addr, data, size); - - return res; -} - -int BBM_TUNER_READ(HANDLE hDevice, u8 addr, u8 alen, u8 *buffer, u8 len) -{ - int res; - - res = tuner_i2c_read(hDevice, addr, alen, buffer, len); - - return res; -} - -int BBM_TUNER_WRITE(HANDLE hDevice, u8 addr, u8 alen, u8 *buffer, u8 len) -{ - int res; - - res = tuner_i2c_write(hDevice, addr, alen, buffer, len); - - return res; -} - -int BBM_TUNER_SET_FREQ(HANDLE hDevice, u8 ch_num) -{ - int res = BBM_OK; - - res = tuner_set_freq(hDevice, ch_num); - - return res; -} - -int BBM_TUNER_GET_RSSI(HANDLE hDevice, s32 *rssi) -{ - int res = BBM_OK; - - res = tuner_get_rssi(hDevice, rssi); - - return res; -} - -int BBM_TUNER_SELECT(HANDLE hDevice, u32 product, u32 band) -{ - int res = BBM_OK; - - res = tuner_select(hDevice, product, band); - - return res; -} - -int BBM_TUNER_DESELECT(HANDLE hDevice) -{ - int res = BBM_OK; - - res = tuner_deselect(hDevice); - - return res; -} - -int BBM_HOSTIF_SELECT(HANDLE hDevice, u8 hostif) -{ - int res = BBM_NOK; - - res = bbm_hostif_select(hDevice, hostif); - - return res; -} - -int BBM_HOSTIF_DESELECT(HANDLE hDevice) -{ - int res = BBM_NOK; - - res = bbm_hostif_deselect(hDevice); - - return res; -} - -int BBM_CALLBACK_REGISTER(u32 userdata, int (*callback)(u32 userdata, u8 *data, int length)) -{ - gUserData = userdata; - pCallback = callback; - - return BBM_OK; -} - -int BBM_CALLBACK_DEREGISTER(HANDLE hDevice) -{ - gUserData = 0; - pCallback = NULL; - - return BBM_OK; -} - -void BBM_ISR(HANDLE hDevice) -{ - fc8100_isr(hDevice); -} diff --git a/drivers/media/isdbt/fc8100/bbm.h b/drivers/media/isdbt/fc8100/bbm.h deleted file mode 100644 index a2a0cac..0000000 --- a/drivers/media/isdbt/fc8100/bbm.h +++ /dev/null @@ -1,61 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : bbm.h - - Description : API of dmb baseband module - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#ifndef __BBM_H__ -#define __BBM_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define DRIVER_VER "VER 1.0" - -#define BBM_HPI 0 /* EBI2 */ -#define BBM_SPI 1 /* SPI */ -#define BBM_I2C 2 /* I2C+TSIF */ - -extern int BBM_RESET(HANDLE hDevice); -extern int BBM_PROBE(HANDLE hDevice); -extern int BBM_INIT(HANDLE hDevice); -extern int BBM_DEINIT(HANDLE hDevice); - -extern int BBM_READ(HANDLE hDevice, u16 addr, u8 *data); -extern int BBM_BYTE_READ(HANDLE hDevice, u16 addr, u8 *data); -extern int BBM_WORD_READ(HANDLE hDevice, u16 addr, u16 *data); -extern int BBM_LONG_READ(HANDLE hDevice, u16 addr, u32 *data); -extern int BBM_BULK_READ(HANDLE hDevice, u16 addr, u8 *data, u16 size); -extern int BBM_WRITE(HANDLE hDevice, u16 addr, u8 data); -extern int BBM_BYTE_WRITE(HANDLE hDevice, u16 addr, u8 data); -extern int BBM_WORD_WRITE(HANDLE hDevice, u16 addr, u16 data); -extern int BBM_LONG_WRITE(HANDLE hDevice, u16 addr, u32 data); -extern int BBM_BULK_WRITE(HANDLE hDevice, u16 addr, u8 *data, u16 size); - -extern int BBM_TUNER_READ(HANDLE hDevice, u8 addr, u8 alen, u8 *buffer, u8 len); -extern int BBM_TUNER_WRITE(HANDLE hDevice, u8 addr, u8 alen, u8 *buffer, u8 len); -extern int BBM_TUNER_SET_FREQ(HANDLE hDevice, u8 ch_num); -extern int BBM_TUNER_GET_RSSI(HANDLE hDevice, s32 *rssi); -extern int BBM_TUNER_SELECT(HANDLE hDevice, u32 product, u32 band); -extern int BBM_TUNER_DESELECT(HANDLE hDevice); - -extern void BBM_ISR(HANDLE hDevice); - -extern int BBM_HOSTIF_SELECT(HANDLE hDevice, u8 hostif); -extern int BBM_HOSTIF_DESELECT(HANDLE hDevice); - -extern int BBM_CALLBACK_REGISTER(u32 userdata, int (*callback)(u32 userdata, u8 *data, int length)); -extern int BBM_CALLBACK_DEREGISTER(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif /* __BBM_H__ */ diff --git a/drivers/media/isdbt/fc8100/fc8100.c b/drivers/media/isdbt/fc8100/fc8100.c deleted file mode 100644 index 1d4a7a3..0000000 --- a/drivers/media/isdbt/fc8100/fc8100.c +++ /dev/null @@ -1,271 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include "fc8100.h" -#include "bbm.h" -#include "fci_oal.h" - -#define FC8100_NAME "isdbt" - -int dmb_open (struct inode *inode, struct file *filp); -loff_t dmb_llseek (struct file *filp, loff_t off, int whence); -ssize_t dmb_read (struct file *filp, char *buf, size_t count, loff_t *f_pos); -ssize_t dmb_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos); -static long dmb_ioctl (struct file *filp, unsigned int cmd, unsigned long arg); -int dmb_release (struct inode *inode, struct file *filp); - -/* GPIO Setting */ -void dmb_hw_setting(void); -void dmb_hw_init(void); -void dmb_hw_deinit(void); - -static struct file_operations dmb_fops = { - .owner = THIS_MODULE, - .llseek = dmb_llseek, - .read = dmb_read, - .write = dmb_write, - .unlocked_ioctl = dmb_ioctl, - .open = dmb_open, - .release = dmb_release, -}; - -static struct miscdevice fc8100_misc_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = FC8100_NAME, - .fops = &dmb_fops, -}; - -int dmb_open (struct inode *inode, struct file *filp) -{ - int num = MINOR(inode->i_rdev); - - /* ISDBT PWR ENABLE FOR I2C*/ - dmb_hw_setting(); - dmb_hw_init(); - - PRINTF(0, "dmb open -> minor : %d\n", num); - - return 0; -} - -loff_t dmb_llseek (struct file *filp, loff_t off, int whence) -{ - PRINTF(0, "dmb llseek -> off : %08X, whence : %08X\n", off, whence); - return 0x23; -} - -ssize_t dmb_read (struct file *filp, char *buf, size_t count, loff_t *f_pos) -{ - PRINTF(0, "dmb read -> buf : %08X, count : %08X \n", buf, count); - return 0x33; -} - -ssize_t dmb_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos) -{ - PRINTF(0, "dmb write -> buf : %08X, count : %08X \n", buf, count); - return 0x43; -} - -static long dmb_ioctl (struct file *filp, unsigned int cmd, unsigned long arg) -{ - s32 res = BBM_NOK; - int status = 0; - int status_usr = 0; - ioctl_info info; - int size; - - if (_IOC_TYPE(cmd) != IOCTL_MAGIC) - return -EINVAL; - if (_IOC_NR(cmd) >= IOCTL_MAXNR) - return -EINVAL; - - size = _IOC_SIZE(cmd); - - switch (cmd) { - case IOCTL_DMB_RESET: - res = BBM_RESET(0); - break; - case IOCTL_DMB_INIT: - res = BBM_INIT(0); - break; - case IOCTL_DMB_BYTE_READ: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_BYTE_READ(0, (u16)info.buff[0], (u8 *)(&info.buff[1])); - status_usr = copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_DMB_WORD_READ: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_WORD_READ(0, (u16)info.buff[0], (u16 *)(&info.buff[1])); - status_usr = copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_DMB_LONG_READ: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_LONG_READ(0, (u16)info.buff[0], (u32 *)(&info.buff[1])); - status_usr = copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_DMB_BULK_READ: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_BULK_READ(0, (u16)info.buff[0], (u8 *)(&info.buff[2]), info.buff[1]); - status_usr = copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_DMB_BYTE_WRITE: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_BYTE_WRITE(0, (u16)info.buff[0], (u8)info.buff[1]); - break; - case IOCTL_DMB_WORD_WRITE: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_WORD_WRITE(0, (u16)info.buff[0], (u16)info.buff[1]); - break; - case IOCTL_DMB_LONG_WRITE: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_LONG_WRITE(0, (u16)info.buff[0], (u32)info.buff[1]); - break; - case IOCTL_DMB_BULK_WRITE: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_BULK_WRITE(0, (u16)info.buff[0], (u8 *)(&info.buff[2]), info.buff[1]); - break; - case IOCTL_DMB_TUNER_SELECT: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_TUNER_SELECT(0, (u32)info.buff[0], 0); - break; - case IOCTL_DMB_TUNER_READ: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_TUNER_READ(0, (u8)info.buff[0], (u8)info.buff[1], (u8 *)(&info.buff[3]), (u8)info.buff[2]); - status_usr = copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_DMB_TUNER_WRITE: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_TUNER_WRITE(0, (u8)info.buff[0], (u8)info.buff[1], (u8 *)(&info.buff[3]), (u8)info.buff[2]); - break; - case IOCTL_DMB_TUNER_SET_FREQ: - status = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_TUNER_SET_FREQ(0, (u8)info.buff[0]); - break; - case IOCTL_DMB_POWER_ON: - PRINTF(0, "DMB_POWER_ON enter..\n"); - dmb_hw_init(); - break; - case IOCTL_DMB_POWER_OFF: - PRINTF(0, "DMB_POWER_OFF enter..\n"); - dmb_hw_deinit(); - break; - } - if ((status < 0) || (status_usr < 0)) { - PRINTF(0, " copy to user or copy from user : ERROR..\n"); - return -EINVAL; - } - - /* return status */ - if (res < 0) - res = -BBM_NOK; - else - res = BBM_OK; - - return res; -} - -int dmb_release(struct inode *inode, struct file *filp) -{ - /* ISDBT PWR ENABLE FOR I2C*/ - PRINTF(0, "dmb release\n"); - return 0; -} - -void dmb_hw_setting(void) -{ - s3c_gpio_cfgpin(GPIO_ISDBT_SDA_28V, S3C_GPIO_INPUT); - s3c_gpio_setpull(GPIO_ISDBT_SDA_28V, S3C_GPIO_PULL_NONE); - s3c_gpio_cfgpin(GPIO_ISDBT_SCL_28V, S3C_GPIO_INPUT); - s3c_gpio_setpull(GPIO_ISDBT_SCL_28V, S3C_GPIO_PULL_NONE); - s3c_gpio_cfgpin(GPIO_ISDBT_PWR_EN, S3C_GPIO_OUTPUT); - gpio_set_value(GPIO_ISDBT_PWR_EN, GPIO_LEVEL_LOW); - s3c_gpio_cfgpin(GPIO_ISDBT_RST, S3C_GPIO_OUTPUT); - gpio_set_value(GPIO_ISDBT_RST, GPIO_LEVEL_HIGH); -} - -void dmb_init_hw_setting(void) -{ - s3c_gpio_cfgpin(GPIO_ISDBT_SDA_28V, S3C_GPIO_INPUT); - s3c_gpio_setpull(GPIO_ISDBT_SDA_28V, S3C_GPIO_PULL_NONE); - s3c_gpio_cfgpin(GPIO_ISDBT_SCL_28V, S3C_GPIO_INPUT); - s3c_gpio_setpull(GPIO_ISDBT_SCL_28V, S3C_GPIO_PULL_NONE); - s3c_gpio_cfgpin(GPIO_ISDBT_PWR_EN, S3C_GPIO_OUTPUT); - gpio_set_value(GPIO_ISDBT_PWR_EN, GPIO_LEVEL_LOW); - s3c_gpio_cfgpin(GPIO_ISDBT_RST, S3C_GPIO_OUTPUT); - gpio_set_value(GPIO_ISDBT_RST, GPIO_LEVEL_LOW); -} - -void dmb_hw_init(void) -{ - mdelay(1); - gpio_set_value(GPIO_ISDBT_PWR_EN, GPIO_LEVEL_HIGH); - mdelay(1); - gpio_set_value(GPIO_ISDBT_RST, GPIO_LEVEL_HIGH); - mdelay(100); -} - -void dmb_hw_deinit(void) -{ - mdelay(1); - gpio_set_value(GPIO_ISDBT_RST, GPIO_LEVEL_LOW); - mdelay(1); - gpio_set_value(GPIO_ISDBT_PWR_EN, GPIO_LEVEL_LOW); - mdelay(100); -} - - -int dmb_init(void) -{ - int result; - - PRINTF(0, "dmb dmb_init\n"); - - dmb_init_hw_setting(); -/* - dmb_hw_init(); -*/ - /*misc device registration*/ - result = misc_register(&fc8100_misc_device); - - if (result < 0) - return result; - - BBM_HOSTIF_SELECT(0, BBM_I2C); - - dmb_hw_deinit(); - - return 0; -} - -void dmb_exit(void) -{ - PRINTF(0, "dmb dmb_exit\n"); - - BBM_HOSTIF_DESELECT(0); - dmb_hw_deinit(); - - /*misc device deregistration*/ - misc_deregister(&fc8100_misc_device); -} - -module_init(dmb_init); -module_exit(dmb_exit); - -MODULE_LICENSE("Dual BSD/GPL"); diff --git a/drivers/media/isdbt/fc8100/fc8100.h b/drivers/media/isdbt/fc8100/fc8100.h deleted file mode 100644 index ceffe83..0000000 --- a/drivers/media/isdbt/fc8100/fc8100.h +++ /dev/null @@ -1,66 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : bbm.c - - Description : API of dmb baseband module - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#ifndef __DMB_H__ -#define __DMB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fci_types.h" - -#define MAX_OPEN_NUM 8 - -#define IOCTL_MAGIC 't' - -typedef struct { - unsigned long size; - unsigned long buff[128]; -} ioctl_info; - -#define IOCTL_MAXNR 22 - -#define IOCTL_DMB_RESET _IO(IOCTL_MAGIC, 0) -#define IOCTL_DMB_PROBE _IO(IOCTL_MAGIC, 1) -#define IOCTL_DMB_INIT _IO(IOCTL_MAGIC, 2) -#define IOCTL_DMB_DEINIT _IO(IOCTL_MAGIC, 3) - -#define IOCTL_DMB_BYTE_READ _IOWR(IOCTL_MAGIC, 4, ioctl_info) -#define IOCTL_DMB_WORD_READ _IOWR(IOCTL_MAGIC, 5, ioctl_info) -#define IOCTL_DMB_LONG_READ _IOWR(IOCTL_MAGIC, 6, ioctl_info) -#define IOCTL_DMB_BULK_READ _IOWR(IOCTL_MAGIC, 7, ioctl_info) - -#define IOCTL_DMB_BYTE_WRITE _IOW(IOCTL_MAGIC, 8, ioctl_info) -#define IOCTL_DMB_WORD_WRITE _IOW(IOCTL_MAGIC, 9, ioctl_info) -#define IOCTL_DMB_LONG_WRITE _IOW(IOCTL_MAGIC, 10, ioctl_info) -#define IOCTL_DMB_BULK_WRITE _IOW(IOCTL_MAGIC, 11, ioctl_info) - -#define IOCTL_DMB_TUNER_READ _IOWR(IOCTL_MAGIC, 12, ioctl_info) -#define IOCTL_DMB_TUNER_WRITE _IOW(IOCTL_MAGIC, 13, ioctl_info) - -#define IOCTL_DMB_TUNER_SET_FREQ _IOW(IOCTL_MAGIC, 14, ioctl_info) -#define IOCTL_DMB_TUNER_SELECT _IOW(IOCTL_MAGIC, 15, ioctl_info) -#define IOCTL_DMB_TUNER_DESELECT _IO(IOCTL_MAGIC, 16) -#define IOCTL_DMB_TUNER_GET_RSSI _IOWR(IOCTL_MAGIC, 17, ioctl_info) - -#define IOCTL_DMB_HOSTIF_SELECT _IOW(IOCTL_MAGIC, 18, ioctl_info) -#define IOCTL_DMB_HOSTIF_DESELECT _IO(IOCTL_MAGIC, 19) - -#define IOCTL_DMB_POWER_ON _IO(IOCTL_MAGIC, 20) -#define IOCTL_DMB_POWER_OFF _IO(IOCTL_MAGIC, 21) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fc8100_bb.c b/drivers/media/isdbt/fc8100/fc8100_bb.c deleted file mode 100644 index 4e18ff7..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_bb.c +++ /dev/null @@ -1,204 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_bb.c - - Description : API of dmb baseband module - - History : - ---------------------------------------------------------------------- - 2009/09/29 bruce initial -*******************************************************************************/ -#include "fci_types.h" -#include "fci_oal.h" -#include "fc8100_regs.h" -#include "fci_hal.h" - -#define BB_SW_RESET_USE 1 /* 0: NOT USE 1. USE */ - -/* -select BB Xtal frequency -16Mhz: 16000 18Mhz:18000 19.2Mhz:19200 24Mhz:24000 -26Mhz:26000 32Mhz:32000 40Mhz:40000 -*/ -#define FC8100_FREQ_XTAL_BB 26000 - -static int fc8100_bb_pll_set(HANDLE hDevice, u32 xtal) -{ - int res = BBM_NOK; - - if (BB_SW_RESET_USE) { - res = bbm_write(hDevice, BBM_SYSRST, 0x01); /* System Reset */ - if (res) - return res; - msWait(10); - } - - switch (xtal) { - case 16000: - res = bbm_write(hDevice, BBM_PLL0 , 0x0F); /* PLL 16MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL1, 0x50); /* PLL 16MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL2, 0xBF); /* PLL 16MHz Setting */ - break; - case 18000: - res = bbm_write(hDevice, BBM_PLL0, 0x11); /* PLL 18MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL1, 0x50); /* PLL 18MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL2, 0xBF); /* PLL 18MHz Setting */ - break; - case 19200: - res = bbm_write(hDevice, BBM_PLL0, 0x09); /* PLL 19.2MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL1, 0x50); /* PLL 19.2MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL2, 0x63); /* PLL 19.2MHz Setting */ - break; - case 24000: - res = bbm_write(hDevice, BBM_PLL0, 0x17); /* PLL 24MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL1, 0x50); /* PLL 24MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL2, 0xBF); /* PLL 24MHz Setting */ - break; - case 26000: - res = bbm_write(hDevice, BBM_PLL0, 0x19); /* PLL 26MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL1, 0x50); /* PLL 26MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL2, 0xBF); /* PLL 26MHz Setting */ - break; - case 32000: - res = bbm_write(hDevice, BBM_PLL0, 0x1F); /* PLL 32MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL1, 0x50); /* PLL 32MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL2, 0xBF); /* PLL 32MHz Setting */ - break; - case 40000: - res = bbm_write(hDevice, BBM_PLL0, 0x27); /* PLL 40MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL1, 0x30); /* PLL 40MHz Setting */ - res |= bbm_write(hDevice, BBM_PLL2, 0x9F); /* PLL 40MHz Setting */ - break; - default: - return BBM_NOK; - break; - } - - return res; -} - -static int fc8100_ofdm_Init(HANDLE hDevice) -{ - int res = BBM_NOK; -#if defined(CONFIG_VIDEO_TSI) - /* General Setting */ - res = bbm_write(hDevice,BBM_INCTRL, 0x03); // IF Low injenction - res |= bbm_write(hDevice,BBM_OUTCTRL0 , 0x28); // TS Setting 0x28 - res |= bbm_write(hDevice,BBM_OUTCTRL1, 0x11); // TS Serial Out - res |= bbm_write(hDevice,BBM_GPIOSEL1, 0xA0); // PCKETERR, LOCK out - res |= bbm_write(hDevice,BBM_RSEPER, BER_PACKET_SIZE); // BER counter update period @ 256 TSP - res |= bbm_write(hDevice,BBM_RSERST, 0x01); // reset for BER counter change - res |= bbm_write(hDevice,BBM_THRURS, 0x00); // Pst-Rs -#else - /* General Setting */ - res = bbm_write(hDevice, BBM_INCTRL, 0x03); /* IF Low injenction */ - /* - data clock always on : 0x28 - data clock vaild pkt on : 0x2D - fci default : 0x28 - modify for c210_spi : 0x2D - */ - res |= bbm_write(hDevice, BBM_OUTCTRL0 , 0x2D); /* TS Setting 0x28 */ - - /* cs active low :0x12 - cs active high :0x10 - fci default : 0x10 - modify for c210_spi(only active low) : 0x12 - */ - res |= bbm_write(hDevice, BBM_OUTCTRL1, 0x12); /* TS Serial Out */ - res |= bbm_write(hDevice, BBM_GPIOSEL1, 0xA0); /* PCKETERR, LOCK out */ - res |= bbm_write(hDevice, BBM_RSEPER, BER_PACKET_SIZE); /* BER counter update period @ 256 TSP */ - res |= bbm_write(hDevice, BBM_RSERST, 0x01); /* reset for BER counter change */ - res |= bbm_write(hDevice, BBM_THRURS, 0x00); /* Pst-Rs */ -#endif - /* AGC */ - res |= bbm_write(hDevice, BBM_AGTIME, 0x0E); /* Sync. Speed */ - res |= bbm_write(hDevice, BBM_AGREF1, 0x40); /* Sensitivity */ - - /* Digital AGC Setting */ - res |= bbm_write(hDevice, BBM_DAM3REF0, 0x00); /* multipath measure */ - res |= bbm_write(hDevice, BBM_DAM3REF1, 0x80); /* multipath measure */ - res |= bbm_write(hDevice, BBM_DALPG, 0x01); /* Shadowing */ - - /* Sync. */ - res |= bbm_write(hDevice, BBM_SYATTH, 0x58); /*Sync. Speed */ - res |= bbm_write(hDevice, BBM_SYSW2, 0x4E); /* Move Ini. Window Pos. (64point) */ - - /* TMCC */ - res |= bbm_write(hDevice, BBM_TMCTRL1, 0xEB); /* Sync. Speed ([7:5] default) */ - res |= bbm_write(hDevice, BBM_TMCTRL2, 0x60); /* Avoid Count Down Error */ - - /* CF Setting */ - res |= bbm_write(hDevice, BBM_FTCTRL, 0x33); /* TU6 & Multipath */ - res |= bbm_write(hDevice, BBM_EQCONF, 0x08); /* Sensitivity */ - - /* De-Noise Filter */ - res |= bbm_write(hDevice, BBM_EQCTRL, 0x14); /* DNF Ini Setting */ - res |= bbm_write(hDevice, BBM_GNFCNT1, 0xE4); /* DNF On/Off Setting */ - res |= bbm_write(hDevice, BBM_WINPTMN, 0x09); /* 12point from Symbol Head */ - res |= bbm_write(hDevice, BBM_IFCTRL, 0x11); /* for Clip */ - - /* Window Position for 2path Raylength */ - res |= bbm_write(hDevice, BBM_WINCTRL1, 0x24); /* Window Position */ - res |= bbm_write(hDevice, BBM_WINCTRL2_1, 0x42); /* move limit & timing */ - - /* GI */ - res |= bbm_write(hDevice, BBM_GICCNT1, 0x77); /* m Up/Dn count slow */ - res |= bbm_write(hDevice, BBM_WINTHTR, 0x0B); /* Pst-Ghost DU=5dB */ - /* Ghost */ - res |= bbm_write(hDevice, BBM_GNFSNTH, 0x04); /* Pst-Ghost 11dB */ - res |= bbm_write(hDevice, BBM_GNFCNT2, 0x0A); /* Skip for 6path Multipath*/ - res |= bbm_write(hDevice, BBM_WINCTRL, 0x35); /* Pre-Ghost 13dB */ - res |= bbm_write(hDevice, BBM_IFUN, 0x02); /* Clp Off */ - - /* Switch Interpolation */ - res |= bbm_write(hDevice, BBM_EQSI1, 0x3E); /* Fav with 512symbol */ - res |= bbm_write(hDevice, BBM_EQSI2, 0x10); /* Threshold */ - - /* External LNA Control */ - res |= bbm_write(hDevice, BBM_GPIOSEL0, 0x01); - res |= bbm_write(hDevice, BBM_AWCTRL, 0x2D); - res |= bbm_write(hDevice, BBM_AWONTH, 0x20); /* LNA On CNR = 9sB */ - res |= bbm_write(hDevice, BBM_AWOFFTH, 0x10); /* LNA Off CNR+13dB */ - res |= bbm_write(hDevice, BBM_AWAGCTH, 0x01); - - res |= bbm_write(hDevice, BBM_SYSRST, 0x02); /* S/W Reset */ - - return res; -} - -int fc8100_reset(HANDLE hDevice) -{ - int res = BBM_NOK; - res = bbm_write(hDevice, BBM_SYSRST, 0x02); - return res; -} - -int fc8100_probe(HANDLE hDevice) -{ - int res = BBM_NOK; - u8 ver; - - res = bbm_read(hDevice, BBM_VERSION, &ver); - - if (ver != 0x41) - res = BBM_NOK ; - - return res; -} - -int fc8100_init(HANDLE hDevice) -{ - int res = BBM_NOK; - - res = fc8100_bb_pll_set(hDevice, FC8100_FREQ_XTAL_BB); - res |= fc8100_ofdm_Init(hDevice); - - return res; -} - -int fc8100_deinit(HANDLE hDevice) -{ - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8100/fc8100_bb.h b/drivers/media/isdbt/fc8100/fc8100_bb.h deleted file mode 100644 index db7a414..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_bb.h +++ /dev/null @@ -1,29 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_bb.h - - Description : baseband header file - - History : - ---------------------------------------------------------------------- - 2009/09/29 bruce initial -*******************************************************************************/ - -#ifndef __FC8100_BB_H__ -#define __FC8100_BB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8100_reset(HANDLE hDevice); -extern int fc8100_probe(HANDLE hDevice); -extern int fc8100_init(HANDLE hDevice); -extern int fc8100_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fc8100_i2c.c b/drivers/media/isdbt/fc8100/fc8100_i2c.c deleted file mode 100644 index 7f189f0..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_i2c.c +++ /dev/null @@ -1,349 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_i2c.c - - Description : fc8100 host interface - - History : - ---------------------------------------------------------------------- - 2009/09/29 bruce initial -*******************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "fci_types.h" -#include "fci_oal.h" - -#define FC8100_I2C_ADDR 0x77 -#define I2C_M_FCIRD 1 -#define I2C_M_FCIWR 0 -#define I2C_MAX_SEND_LENGTH 300 - -struct i2c_ts_driver{ - struct i2c_client *client; - struct input_dev *input_dev; - struct work_struct work; -}; - -struct i2c_client *fc8100_i2c; - -struct i2c_driver fc8100_i2c_driver; - -static int i2c_bb_read(HANDLE hDevice, u16 addr, u8 *data, u16 length); - -static int fc8100_i2c_probe(struct i2c_client *i2c_client, - const struct i2c_device_id *id) -{ - fc8100_i2c = i2c_client; - i2c_set_clientdata(i2c_client, NULL); - - return 0; -} - -static int fc8100_remove(struct i2c_client *client) -{ - return 0; -} - -static const struct i2c_device_id fc8100_id[] = { - { "isdbti2c", 0 }, - { }, -}; - -struct i2c_driver fc8100_i2c_driver = { - .driver = { - .name = "fc8100_i2c", - .owner = THIS_MODULE, - }, - .probe = fc8100_i2c_probe, - .remove = fc8100_remove, - .id_table = fc8100_id, -}; - -static int i2c_init(void) -{ - int res; - - printk("fc8100_i2c_drv_init ENTER...\n"); - fc8100_i2c = kzalloc(sizeof(struct i2c_ts_driver), GFP_KERNEL); - - if (fc8100_i2c == NULL) - return -ENOMEM; - - res = i2c_add_driver(&fc8100_i2c_driver); - - return res; -} - -static int i2c_deinit(void) -{ - printk("fc8100_i2c_drv_deinit ENTER...\n"); - - i2c_del_driver(&fc8100_i2c_driver); - - return 0; -} - -static int i2c_bb_read(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - struct i2c_msg rmsg[2]; - unsigned char i2c_data[1]; - - rmsg[0].addr = fc8100_i2c->addr; - rmsg[0].flags = I2C_M_FCIWR; - rmsg[0].len = 1; - rmsg[0].buf = i2c_data; - i2c_data[0] = addr & 0xff; - - rmsg[1].addr = fc8100_i2c->addr; - rmsg[1].flags = I2C_M_FCIRD; - rmsg[1].len = length; - rmsg[1].buf = data; - res = i2c_transfer(fc8100_i2c->adapter, &rmsg[0], 2); - - /* return status */ - if (res >= 0) - res = 0; - - return res; -} - -static int i2c_bb_write(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - struct i2c_msg wmsg; - unsigned char i2c_data[I2C_MAX_SEND_LENGTH]; - - if (length+1 > I2C_MAX_SEND_LENGTH) { - printk(".......error"); - return -ENODEV; - } - wmsg.addr = fc8100_i2c->addr; - wmsg.flags = I2C_M_FCIWR; - wmsg.len = length + 1; - wmsg.buf = i2c_data; - - i2c_data[0] = addr & 0xff; - memcpy(&i2c_data[1], data, length); - - res = i2c_transfer(fc8100_i2c->adapter, &wmsg, 1); - - /* return status */ - if (res >= 0) - res = 0; - - return res; -} - -static int i2c_rf_read(HANDLE hDevice, u8 addr, u8 *data, u8 length) -{ - int res; - struct i2c_msg rmsg[3]; - unsigned char i2c_rp_data[2]; - unsigned char i2c_data[1]; - - /* printk("i2c_rf_read ENTER addr : %x, length : %d\n", addr, length); */ - rmsg[0].addr = fc8100_i2c->addr; - rmsg[0].flags = I2C_M_FCIWR; - rmsg[0].len = 2; - rmsg[0].buf = i2c_rp_data; - i2c_rp_data[0] = 0x02; - i2c_rp_data[1] = 0x01; - - rmsg[1].addr = fc8100_i2c->addr; - rmsg[1].flags = I2C_M_FCIWR; - rmsg[1].len = 1; - rmsg[1].buf = i2c_data; - i2c_data[0] = addr & 0xff; - - rmsg[2].addr = fc8100_i2c->addr; - rmsg[2].flags = I2C_M_FCIRD; - rmsg[2].len = length; - rmsg[2].buf = data; - - res = i2c_transfer(fc8100_i2c->adapter, &rmsg[0], 3); - /* printk("i2c_rf_read data : %x\n", data[0]); */ - - /* return status */ - if (res >= 0) - res = 0; - - return res; -} - -static int i2c_rf_write(HANDLE hDevice, u8 addr, u8 *data, u8 length) -{ - int res; - struct i2c_msg wmsg[2]; - unsigned char i2c_rp_data[2]; - unsigned char i2c_data[I2C_MAX_SEND_LENGTH]; - - /* printk("i2c_rf_write ENTER addr : %x, data : %x, length : %d\n", addr, data[0], length); */ - if (length+1 > I2C_MAX_SEND_LENGTH) { - printk(".......error"); - return -ENODEV; - } - - wmsg[0].addr = fc8100_i2c->addr; - wmsg[0].flags = I2C_M_FCIWR; - wmsg[0].len = 2; - wmsg[0].buf = i2c_rp_data; - i2c_rp_data[0] = 0x02; - i2c_rp_data[1] = 0x01; - - wmsg[1].addr = fc8100_i2c->addr; - wmsg[1].flags = I2C_M_FCIWR; - wmsg[1].len = length+1; - wmsg[1].buf = i2c_data; - i2c_data[0] = addr & 0xff; - memcpy(&i2c_data[1], data, length); - - res = i2c_transfer(fc8100_i2c->adapter, &wmsg[0], 2); - - /* return status */ - if (res >= 0) - res = 0; - - return res; -} - -int fc8100_i2c_init(HANDLE hDevice, u16 param1, u16 param2) -{ - int res; - - res = i2c_init(); - - return res; -} - -int fc8100_i2c_byteread(HANDLE hDevice, u16 addr, u8 *data) -{ - int res = BBM_NOK; - - /* PRINTF(0, "fc8100_i2c_byteread 0x%x\n", addr); */ - res = i2c_bb_read(hDevice, addr, (u8 *)data, 1); - - return res; -} - -int fc8100_i2c_wordread(HANDLE hDevice, u16 addr, u16 *data) -{ - int res = BBM_NOK; - - /* PRINTF(0, "fc8100_i2c_wordread 0x%x\n", addr); */ - res = i2c_bb_read(hDevice, addr, (u8 *)data, 2); - - return res; -} - -int fc8100_i2c_longread(HANDLE hDevice, u16 addr, u32 *data) -{ - int res = BBM_NOK; - - /* PRINTF(0, "fc8100_i2c_longread 0x%x\n", addr); */ - res = i2c_bb_read(hDevice, addr, (u8 *)data, 4); - - return res; -} - -int fc8100_i2c_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res = BBM_NOK; - - /* PRINTF(0, "fc8100_i2c_bulkread 0x%x\n", addr); */ - res = i2c_bb_read(hDevice, addr, (u8 *)data, size); - - return res; -} - -int fc8100_i2c_bytewrite(HANDLE hDevice, u16 addr, u8 data) -{ - int res = BBM_NOK; - - res = i2c_bb_write(hDevice, addr, (u8 *)&data, 1); - - return res; -} - -int fc8100_i2c_wordwrite(HANDLE hDevice, u16 addr, u16 data) -{ - int res = BBM_NOK; - - res = i2c_bb_write(hDevice, addr, (u8 *)&data, 2); - - return res; -} - -int fc8100_i2c_longwrite(HANDLE hDevice, u16 addr, u32 data) -{ - int res = BBM_NOK; - - res = i2c_bb_write(hDevice, addr, (u8 *)&data, 4); - - return res; -} - -int fc8100_i2c_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res = BBM_NOK; - - res = i2c_bb_write(hDevice, addr, (u8 *)&data, size); - - return res; -} - -int fc8100_i2c_dataread(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res = BBM_NOK; - - return res; -} - -int fc8100_rf_bulkread(HANDLE hDevice, u8 addr, u8 *data, u8 size) -{ - int res = BBM_NOK; - - res = i2c_rf_read(hDevice, addr, (u8 *)data, size); - - return res; -} - -int fc8100_rf_bulkwrite(HANDLE hDevice, u8 addr, u8 *data, u8 size) -{ - int res = BBM_NOK; - - res = i2c_rf_write(hDevice, addr, (u8 *)data, size); - - return res; -} - -int fc8100_i2c_deinit(HANDLE hDevice) -{ - int res = BBM_NOK; - - res = i2c_deinit(); - - return res; -} - -int fc8100_spi_init(HANDLE hDevice, u16 param1, u16 param2) -{ - - return BBM_OK; -} - -int fc8100_spi_dataread(HANDLE hDevice, u16 addr, u8 *pBuf, u16 nLength) -{ - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8100/fc8100_i2c.h b/drivers/media/isdbt/fc8100/fc8100_i2c.h deleted file mode 100644 index 3bd2a13..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_i2c.h +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_i2c.h - - Description : API of dmb baseband module - - History : - ---------------------------------------------------------------------- - 2009/10/01 bruce initial -*******************************************************************************/ - -#ifndef __FC8100_I2C__ -#define __FC8100_I2C__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8100_i2c_init(HANDLE hDevice, u16 param1, u16 param2); - -extern int fc8100_i2c_byteread(HANDLE hDevice, u16 param1, u8 *param2); -extern int fc8100_i2c_wordread(HANDLE hDevice, u16 param1, u16 *param2); -extern int fc8100_i2c_longread(HANDLE hDevice, u16 param1, u32 *param2); -extern int fc8100_i2c_bulkread(HANDLE hDevice, u16 param1, u8 *param2, u16 param3); -extern int fc8100_i2c_bytewrite(HANDLE hDevice, u16 param1, u8 param2); -extern int fc8100_i2c_wordwrite(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8100_i2c_longwrite(HANDLE hDevice, u16 param1, u32 param2); -extern int fc8100_i2c_bulkwrite(HANDLE hDevice, u16 param1, u8 *param2, u16 param3); - -extern int fc8100_i2c_deinit(HANDLE hDevice); - -extern int fc8100_rf_bulkread(HANDLE hDevice, u8 addr, u8 *data, u8 len); -extern int fc8100_rf_bulkwrite(HANDLE hDevice, u8 addr, u8 *data, u8 len); - -extern int fc8100_spi_init(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8100_spi_dataread(HANDLE hDevice, u16 addr, u8 *pBuf, u16 nLength); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fc8100_isr.c b/drivers/media/isdbt/fc8100/fc8100_isr.c deleted file mode 100644 index 5b6d6a3..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_isr.c +++ /dev/null @@ -1,27 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_isr.c - - Description : fc8100 interrupt service routine - - History : - ---------------------------------------------------------------------- - 2009/12/11 ckw initial -*******************************************************************************/ -#include "fci_types.h" -#include "fci_hal.h" - -u32 gUserData; -int (*pCallback)(u32 userdata, u8 *data, int length) = NULL; - -u8 dmbBuffer[188*4]; - -void fc8100_isr(HANDLE hDevice) -{ - - bbm_data(hDevice, 0, &dmbBuffer[0], 188*2); - - if (pCallback) - (*pCallback)(gUserData, &dmbBuffer[0], 188); -} diff --git a/drivers/media/isdbt/fc8100/fc8100_isr.h b/drivers/media/isdbt/fc8100/fc8100_isr.h deleted file mode 100644 index 9d6e59b..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_isr.h +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_isr.c - - Description : API of dmb baseband module - - History : - ---------------------------------------------------------------------- - 2009/12/11 ckw initial -*******************************************************************************/ - -#ifndef __FC8000_ISR__ -#define __FC8000_ISR__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fci_types.h" - -extern u32 gUserData; -extern int (*pCallback)(u32 userdata, u8 *data, int length); - -extern void fc8100_isr(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fc8100_regs.h b/drivers/media/isdbt/fc8100/fc8100_regs.h deleted file mode 100644 index 08b7b7e..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_regs.h +++ /dev/null @@ -1,337 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_regs.h - - Description : RF & baseband registermap header file - - History : - ---------------------------------------------------------------------- - 2009/09/29 bruce initial -*******************************************************************************/ - -#ifndef __FC8100_REGS_H__ -#define __FC8100_REGS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------- - FC8100 COMMON DEFINTION -----------------------------------------------------*/ -#define BER_PACKET_SIZE 1 /* // 256 PACKET PERIOD */ - - -/*---------------------------------------------------- - FC8100 RF REGISTER MAP -----------------------------------------------------*/ - -/* // -- CONTROL -- */ -#define RF_MODULE_RESET 0x00 -#define RF_TUNER_CHIP_ID 0x01 -#define RF_MODE_CTL 0x02 -#define RF_MANUAL_CTL 0x03 -#define RF_STBY_ACTIVE1 0x04 -#define RF_STBY_ACTIVE2 0x05 -#define RF_STBY_ACTIVE3 0x06 -#define RF_STBY_ACTIVE4 0x07 - -/* // -- VCO -- */ -#define RF_VCO_MODE 0x08 -#define RF_LO_BIAS_MODE1 0x09 -#define RF_LO_BIAS_MODE2 0x0A - -/* // -- PLL, LNA&Mixer, CSF, Output Buffer, Bias Top -- */ -#define RF_BIAS_TOP_CTRL 0x0B - -/* //-- PGA, ADC, AGC, Revision Number, LNA, Common Bias, VGA -- */ -#define RF_LNA_ELNA_Control 0x0C -#define RF_PLL_MODE1 0x0D -#define RF_PLL_CTRL1 0x0E -#define RF_ELNA_CONTROL_OFF 0x0F -#define RF_PLL_CTRL3 0x10 -#define RF_ELNA_CONTROL_ON 0x11 -#define RF_PLL_CTRL4 0x12 -#define RF_PLL_CTRL5 0x13 -#define RF_PLL_CTRL6 0x14 -#define RF_PLL_CTRL7 0x15 -#define RF_PLL_K2 0x16 -#define RF_NTARGET_VALUE 0x17 -#define RF_PLL_K1 0x18 -#define RF_PLL_K0 0x19 -#define RF_PLL_N 0x1A -#define RF_ELNA_CONTROL1 0x1B -#define RF_ELNA_CONTROL2 0x1C -#define RF_PLL_CTRL10 0x1D -#define RF_PLL_CTRL11 0x1E -#define RF_DMB_BANK_MONITOR 0x1F -#define RF_LOCK_CTRL0 0x20 -#define RF_LOCK_CTRL1 0x21 -#define RF_BS_CTRL1 0x22 -#define RF_BS_CTRL2 0x23 -#define RF_BS_CTRL3 0x24 -#define RF_BS_CTRL4 0x25 -#define RF_BS_MON1 0x26 -#define RF_BS_MON2 0x27 -#define RF_LNAMIX_CTL 0x28 -#define RF_LNA_ICTRL 0x29 -#define RF_LNAMIX_ICTRL1 0x2A -#define RF_AGC_ELNA 0x2B -#define RF_LNAMIX_ICTRL2 0x2C -#define RF_LNAMIX_ICTRL3 0x2D -#define RF_LNAMIX_ICTRL4 0x2E -#define RF_LNAMIX_ICTRL5 0x2F -#define RF_LNAMIX_ICTRL_MON 0x30 -#define RF_ELNA_GAIN 0x31 -#define RF_CSF_MODE 0x32 -#define RF_CSF_CAPTUNE_MON1 0x33 -#define RF_CSF_CAPTUNE_MON2 0x34 -#define RF_CSFA_I2C_CRNT 0x35 -#define RF_CSF_I2C_CORE_CRNT_AH 0x36 -#define RF_CSF_I2C_OUT_CRNT_AH 0x37 -#define RF_CSF_RX_CRNT 0x38 -#define RF_CSF_PRE_CUR 0x39 -#define RF_CSF_STATE 0x3A -#define RF_ELNA_CONTROL3 0x3B -#define RF_CSF_CAL_CRNT 0x3C -#define RF_CSF_CF_CLK_DIV_LSB 0x3D -#define RF_CSF_CLK_DIV_LSB 0x3E -#define RF_CSF_AUTO_RECAL_PERIOD 0x3F -#define RF_CSF_CAL_MAN1 0x40 -#define RF_CSF_CAL_MAN2 0x41 -#define RF_CSF_AGC_CRNT_LOW 0x42 -#define RF_BG_CTRL0 0x43 -#define RF_PGA_1ST_STATE_CUR 0x44 -#define RF_PGA_2ND_STATE_CUR 0x45 -#define RF_ELNA_CONTROL4 0x46 -#define RF_PGA_MODE 0x47 -#define RF_AGC_COMP_BIAS 0x48 -#define RF_W_FACTOR1 0x49 -#define RF_ADC_BIAS1 0x4A -#define RF_ADC1_BOUT 0x4B -#define RF_W_FACTOR2 0x4C -#define RF_ADC_BIAS2 0x4D -#define RF_ADC2_BOUT 0x4E -#define RF_ADC_BIAS3 0x4F -#define RF_ADC3_BOUT 0x50 -#define RF_ADC4_BOUT 0x51 -#define RF_RFAGC_MODE 0x52 -#define RF_RFAGC_MODE2 0x53 -#define RF_IFAGC_MODE1 0x54 -#define RF_RFAGC_TEST_MODE1 0x55 -#define RF_RFAGC_TEST_MODE2 0x56 -#define RF_IFAGC_TEST_MODE1 0x57 -#define RF_IFAGC_TEST_MODE2 0x58 -#define RF_PD1_MAX 0x59 -#define RF_PD1_MIN 0x5A -#define RF_PD2_MAX 0x5B -#define RF_PD2_MIN 0x5C -#define RF_AGC_CLK_MODE 0x5D -#define RF_RFAGC_WAIT_CLK_LNA1 0x5F -#define RF_RFAGC_WAIT_CLK_LNA2 0x60 -#define RF_RFAGC_WAIT_CLK_RFVGA 0x61 -#define RF_RFAGC_WAIT_CLK_PD_CHANGE 0x62 -#define RF_RFAGC_WAIT_CLK_STDBY 0x63 -#define RF_RFAGC_WAIT_CLK_HOLDAGC 0x64 -#define RF_IFAGC_WAIT_CLK_FILTER 0x65 -#define RF_IFAGC_WAIT_CLK_STBY 0x66 -#define RF_IFAGC_WAIT_CLK_HOLD_OFF 0x67 -#define RF_PGA_AGC_STEP 0x68 -#define RF_RFVGA_L0_MAX 0x69 -#define RF_RFVGA_L0_MIN 0x6A -#define RF_RFVGA_L1_MAX 0x6B -#define RF_RFVGA_L1_MIN 0x6C -#define RF_RFVGA_L2_MAX 0x6D -#define RF_RFVGA_L2_MIN 0x6E -#define RF_RFVGA_L3_MAX 0x6F -#define RF_RFVGA_L3_MIN 0x70 -#define RF_RFVGA_L4_MAX 0x71 -#define RF_RFVGA_L4_MIN 0x72 -#define RF_RFVGA_L5_MAX 0x73 -#define RF_RFVGA_L5_MIN 0x74 -#define RF_RFVGA_L6_MAX 0x75 -#define RF_RFVGA_L6_MIN 0x76 -#define RF_IFAGC_PGA_MAX 0x77 -#define RF_IFAGC_PGA_MIN 0x78 -#define RF_STATE_MONITOR1 0x79 -#define RF_STATE_MONITOR2 0x7A -#define RF_STATE_MONITOR3 0x7B -#define RF_STATE_MONITOR4 0x7C -#define RF_AGC_PD_OFFSET 0x7D -#define RF_AGC_SH_SL 0x7E -#define RF_REVISION_NUMBER 0x7F - - -/* ---------------------------------------------------- - FC8100 BB REGISTER MAP -----------------------------------------------------*/ - -/* // 1. System Control */ -#define BBM_VERSION 0x00 -#define BBM_SYSRST 0x01 - -/* // 2. Serial Bus Control */ -#define BBM_SBCTRL 0x02 -#define BBM_SBADDR 0x03 -#define BBM_INCTRL 0x05 -#define BBM_IOMODE 0x07 -#define BBM_OUTCTRL0 0x08 -#define BBM_OUTCTRL1 0x09 -#define BBM_PLL0 0x0C -#define BBM_PLL1 0x0D -#define BBM_PLL2 0x0E - -/* // 3. INTR */ -#define BBM_INTRPT0 0x11 -#define BBM_INTRPT1 0x12 -#define BBM_INTSEL0 0x14 -#define BBM_INTSEL1 0x15 -#define BBM_INTRST0 0x17 -#define BBM_INTRST1 0x18 -#define BBM_RSINTR 0x19 -#define BBM_INTFORM 0x1C - -/* // 4. LOCK */ -#define BBM_LOCKF 0x1D -#define BBM_GIVEUP 0x1E - -/* // 5. TMCC */ -#define BBM_TMCRNT0 0x20 -#define BBM_TMCRNT1 0x21 -#define BBM_TMCRNT2 0x22 -#define BBM_TMNEXT0 0x26 -#define BBM_TMNEXT1 0x27 -#define BBM_TMMAND0 0x2B -#define BBM_TMMAND1 0x2C -#define BBM_TMMNSW 0x30 -#define BBM_TMFECF 0x31 - -/* // 7. MONITOR */ -#define BBM_STATEF 0x32 -#define BBM_DCDF 0x33 -#define BBM_INPWR0 0x34 -#define BBM_INPWR1 0x35 -#define BBM_AGADAT 0x36 -#define BBM_EQIDAT0 0x38 -#define BBM_EQIDAT1 0x39 -#define BBM_EQQDAT0 0x3A -#define BBM_EQQDAT1 0x3B - -/* // 8. AGC Setup */ -#define BBM_AGTIME 0x40 -#define BBM_AGAVCNT 0x41 -#define BBM_AGTG 0x42 -#define BBM_AGSG 0x43 -#define BBM_AGAINI 0x44 -#define BBM_AGREF0 0x46 -#define BBM_AGREF1 0x47 -#define BBM_AGCTRL 0x4D - -/* // 9. GPIO */ -#define BBM_GPIOSEL0 0x59 -#define BBM_GPIOSEL1 0x5A -#define BBM_GPI 0x5B -#define BBM_GPO 0x5C -#define BBM_PWMSET 0x5D -#define BBM_PWMLV0 0x5E -#define BBM_PWMLV1 0x5F - -/* // 10. Read-Solomon decoder/error counter */ -#define BBM_RSERST 0x60 -#define BBM_RSECNT0 0x61 -#define BBM_RSECNT1 0x62 -#define BBM_RSECNT2 0x63 -#define BBM_RSTCNT0 0x64 -#define BBM_RSTCNT1 0x65 -#define BBM_RSEPER 0x70 - -/* // 11. Block through */ -#define BBM_THRUFD 0x73 -#define BBM_THRUBD 0x74 -#define BBM_PREVTO 0x76 -#define BBM_THRURS 0x77 -#define BBM_THRUDR 0x78 - -/* // 12. Symbo synchronization */ -#define BBM_SYTIME 0xA0 -#define BBM_SYATTH 0xA1 -#define BBM_SYMNTH0 0xA2 -#define BBM_SYMNTH1 0xA3 -#define BBM_SYSW1 0xA4 -#define BBM_SYSW2 0xA5 -#define BBM_SYCTRL1 0xA6 -#define BBM_SYMODE1 0xA7 -#define BBM_SYMODE2 0xA8 -#define BBM_SYMODE3 0xA9 - -/* // 13. Digital AGC */ -#define BBM_DAM2REF0 0xAA -#define BBM_DAM2REF1 0xAB -#define BBM_DAM3REF0 0xAC -#define BBM_DAM3REF1 0xAD -#define BBM_DAAVCNT 0xAE -#define BBM_DALPG 0xAF - -/* // 14. FFT */ -#define BBM_FTCTRL 0xB0 - -/* // 15. TMCC Decoder */ -#define BBM_TMCTRL0 0xBC -#define BBM_TMCTRL1 0xBD -#define BBM_TMCTRL2 0xBE -#define BBM_EQCTRL 0xC0 -#define BBM_EQCONF 0xC1 -#define BBM_PRBSEL 0xC3 -#define BBM_GNFCNT1 0xC4 - -/* // 17. IFFT */ -#define BBM_GNFSNTH 0xC5 -#define BBM_GNFCNT2 0xC7 -#define BBM_WINPTMN 0xC8 -#define BBM_IFCTRL 0xC9 -#define BBM_WINCTRL 0xCA -#define BBM_WINCTRL1 0xCB -#define BBM_WINCTRL2_1 0xCC -#define BBM_WINCTRL2_2 0xCD -#define BBM_WINCTRL2_3 0xCE - -/* // 18. TIME RANGE UNLOCK DETECTION */ -#define BBM_IFUN 0xCF - -/* // 19. Status readout */ -#define BBM_FRLKCNT0 0xD0 -#define BBM_FRLKCNT1 0xD1 -#define BBM_SYLKCNT0 0xD2 -#define BBM_SYLKCNT1 0xD3 -#define BBM_MRLKCNT0 0xD4 -#define BBM_MRLKCNT1 0xD5 -#define BBM_ULSTAT 0xD6 -#define BBM_SELGNF 0xD7 -#define BBM_ERRPWR1 0xD8 -#define BBM_ERRPWR2 0xD9 - -/* // 20. GIC */ -#define BBM_GICCNT1 0xE7 -#define BBM_GICCNT2 0xE8 -#define BBM_WINTHTR 0xE9 -#define BBM_GICOFF 0xEA - -/* // 21. Antenna switching */ -#define BBM_AWCTRL 0xF0 -#define BBM_AWSWTH 0xF1 -#define BBM_AWONTH 0xF2 -#define BBM_AWOFFTH 0xF3 -#define BBM_AWAGCTH 0xF4 -#define BBM_AWAVCE 0xF5 - -/* // 22. SI */ -#define BBM_EQSI1 0xF6 -#define BBM_EQSI2 0xF7 - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fc8100_tun.c b/drivers/media/isdbt/fc8100/fc8100_tun.c deleted file mode 100644 index e9fa291..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_tun.c +++ /dev/null @@ -1,351 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_tun.c - - Description : fc8100 tuner controller - - History : - ---------------------------------------------------------------------- - 2009/09/29 bruce initial -*******************************************************************************/ -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_tun.h" -#include "fc8100_regs.h" -#include "fci_hal.h" - -#define TUN_IF_FREQ 500 /* 500 or 1000 (Khz) */ -/* -select BB Xtal frequency -16Mhz: 16000 18Mhz:18000 19.2Mhz:19200 24Mhz:24000 -26Mhz:26000 32Mhz:32000 40Mhz:40000 -*/ -#define FC8100_FREQ_XTAL_TUNER 26000 /* 26MHz */ -#define DEFAULT_CH_FREQ 617143 /* 37 ch, freq : 617.143Mhz */ -#define CP_BOOT_CURRENT 0 /* 0:250uA 1: 500uA */ - -static int fc8100_write(HANDLE hDevice, u8 addr, u8 data) -{ - int res = BBM_NOK; - - res = tuner_i2c_write(hDevice, addr, 1, &data, 1); - - return res; -} - -static int fc8100_read(HANDLE hDevice, u8 addr, u8 *data) -{ - int res = BBM_NOK; - res = tuner_i2c_read(hDevice, addr, 1, data, 1); - return res; -} - -static int fc8100_tuner_set_init(HANDLE hDevice) -{ - int res = BBM_NOK; - - res = fc8100_write(hDevice, RF_MODULE_RESET, 0x00); - - /* PLL & VCO Setting */ - /* if ghost channel scan occurred, change charge pump currnet 500uA -> 250uA */ - if (CP_BOOT_CURRENT == 1) { - /* 500uA */ - res |= fc8100_write(hDevice, RF_PLL_CTRL4, 0x91); - } else { - /* 250 uA */ - res |= fc8100_write(hDevice, RF_PLL_CTRL4, 0x11); - } - - res |= fc8100_write(hDevice, RF_PLL_CTRL11, 0x00); - res |= fc8100_write(hDevice, RF_PLL_MODE1, 0x40); - res |= fc8100_write(hDevice, RF_LO_BIAS_MODE1, 0x27); - res |= fc8100_write(hDevice, RF_BIAS_TOP_CTRL, 0x19); - res |= fc8100_write(hDevice, RF_PLL_CTRL6, 0x13); - /* LNA & MIX Setting */ - res |= fc8100_write(hDevice, RF_LNA_ICTRL, 0x30); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL1, 0x33); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL2, 0xAF); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL3, 0x06); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL5, 0x00); - /* AGC_ADC Setting */ - res |= fc8100_write(hDevice, RF_ADC_BIAS1, 0xB2); - res |= fc8100_write(hDevice, RF_W_FACTOR1, 0x40); - res |= fc8100_write(hDevice, RF_ADC_BIAS2, 0x32); - res |= fc8100_write(hDevice, RF_W_FACTOR2, 0x40); - res |= fc8100_write(hDevice, RF_PD1_MAX, 0x36); - res |= fc8100_write(hDevice, RF_PD1_MIN, 0x2D); - res |= fc8100_write(hDevice, RF_PD2_MAX, 0x1F); - res |= fc8100_write(hDevice, RF_PD2_MIN, 0x1B); - res |= fc8100_write(hDevice, RF_AGC_CLK_MODE, 0x73); - res |= fc8100_write(hDevice, RF_AGC_PD_OFFSET, 0x88); - res |= fc8100_write(hDevice, RF_RFAGC_WAIT_CLK_RFVGA, 0x28); - res |= fc8100_write(hDevice, RF_RFAGC_WAIT_CLK_PD_CHANGE, 0x1F); - res |= fc8100_write(hDevice, RF_IFAGC_WAIT_CLK_FILTER, 0x14); - res |= fc8100_write(hDevice, RF_RFVGA_L0_MAX, 0x0C); - res |= fc8100_write(hDevice, RF_RFVGA_L1_MAX, 0x0C); - res |= fc8100_write(hDevice, RF_RFVGA_L2_MAX, 0x0C); - res |= fc8100_write(hDevice, RF_RFVGA_L3_MAX, 0x0C); - res |= fc8100_write(hDevice, RF_RFVGA_L4_MAX, 0x0C); - res |= fc8100_write(hDevice, RF_RFVGA_L5_MAX, 0x0C); - res |= fc8100_write(hDevice, RF_RFVGA_L6_MAX, 0x20); - res |= fc8100_write(hDevice, RF_IFAGC_PGA_MAX, 0x78); - res |= fc8100_write(hDevice, RF_IFAGC_PGA_MIN, 0x3c); - res |= fc8100_write(hDevice, RF_LNA_ELNA_Control, 0x11); - - return res; -} - -static int fc8100_tuner_set_filter(HANDLE hDevice, unsigned int xtal) -{ - int res = BBM_NOK; - u8 reg_3D, reg_3E; - float value; - - value = (float)xtal / 1000; - reg_3D = (unsigned char)(value * 5.375f); - reg_3E = (unsigned char)(value * 4.3125f); - - /* Filter Setting for defined x-tal */ - res = fc8100_write(hDevice, RF_IFAGC_TEST_MODE2, 0x50); - res |= fc8100_write(hDevice, RF_CSFA_I2C_CRNT, 0x3F); - res |= fc8100_write(hDevice, RF_CSF_I2C_CORE_CRNT_AH, 0xFF); - res |= fc8100_write(hDevice, RF_CSF_I2C_OUT_CRNT_AH, 0xFF); - res |= fc8100_write(hDevice, RF_CSF_RX_CRNT, 0xEA); - res |= fc8100_write(hDevice, RF_CSF_PRE_CUR, 0x54); - res |= fc8100_write(hDevice, RF_CSF_CAL_CRNT, 0x40); - res |= fc8100_write(hDevice, RF_CSF_CF_CLK_DIV_LSB, reg_3D); - res |= fc8100_write(hDevice, RF_CSF_CLK_DIV_LSB, reg_3E); - res |= fc8100_write(hDevice, RF_CSF_AGC_CRNT_LOW, 0x00); - res |= fc8100_write(hDevice, RF_CSF_MODE, 0x09); - res |= fc8100_write(hDevice, RF_CSF_MODE, 0x01); - - return res; -} - - -/*======================================================= - FUNCTION fc8100_tuner_set_etc - - DESCRIPTION - Set Default Channel - - PARAMETERS - unsigned ing xtal : xtal value, ex)if 32MHz, xtal = 32000 - - DEPENDENCIES - None - - RETURN VALUE - 0 if successful - others if fail - - SIDE EFFECTS - None. - =========================================================*/ -static int fc8100_tuner_set_etc(HANDLE hDevice, unsigned int xtal) -{ - int res = BBM_NOK; - unsigned int f_rf = DEFAULT_CH_FREQ; - unsigned int f_if = TUN_IF_FREQ; - unsigned int f_diff, f_diff_shifted, n_val, k_val; - unsigned int r_val; - unsigned int f_comp; - unsigned int f_lo = f_rf - f_if; - unsigned int f_vco = f_lo * 4; - unsigned char pre_shift_bits, data_0x16; - unsigned char i; - unsigned char filtercal; - - r_val = (f_vco >= 25 * xtal) ? 1 : 2; - f_comp = xtal/r_val; - - pre_shift_bits = 4; - - n_val = f_vco / f_comp; - - f_diff = f_vco - f_comp * n_val; - f_diff_shifted = f_diff << (20 - pre_shift_bits); - k_val = (f_diff_shifted + (f_comp >> (pre_shift_bits+1)))/(f_comp >> pre_shift_bits); - - data_0x16 = ((r_val == 1) ? 0x00 : 0x10) + (unsigned char)(k_val >> 16); - - /* ISDBT_ON_AGC_AUTO_0p1 - for defined x-tal */ - res = fc8100_write(hDevice, RF_MODE_CTL, 0x06); - res |= fc8100_write(hDevice, RF_ADC_BIAS3, 0x80); - res |= fc8100_write(hDevice, RF_RFAGC_MODE, 0xC1); - res |= fc8100_write(hDevice, RF_RFAGC_MODE2, 0x20); - /* Default Channel Setting */ - res |= fc8100_write(hDevice, RF_PLL_K2, data_0x16); - res |= fc8100_write(hDevice, RF_PLL_K1, (unsigned char)(k_val >> 8)); - res |= fc8100_write(hDevice, RF_PLL_K0, (unsigned char)(k_val)); - res |= fc8100_write(hDevice, RF_PLL_N, (unsigned char)(n_val)); - /* Filter Cal */ - res |= fc8100_write(hDevice, RF_CSF_MODE, 0x09); - - msWait(10); - for (i = 0; i < 10; i++) { - fc8100_read(hDevice, RF_CSF_CAPTUNE_MON1, &filtercal); - if ((filtercal & 0xC0) != 0xC0) { - fc8100_write(hDevice, RF_CSF_MODE, 0x09); - msWait(10); - fc8100_write(hDevice, RF_CSF_MODE, 0x01); - } - } - res |= fc8100_write(hDevice, RF_CSF_MODE, 0x01); - - return res; -} - -/*======================================================= - FUNCTION fc8100_tuner_init - - DESCRIPTION - FC8100 RF Tuner Register Init - - PARAMETERS - None - - DEPENDENCIES - None - - RETURN VALUE - 0 if successful. - others if fail. - - SIDE EFFECTS - None. - =========================================================*/ -int fc8100_tuner_init(HANDLE hDevice, u8 band_type) -{ - int res = BBM_NOK; - - res = fc8100_tuner_set_init(hDevice); - res |= fc8100_tuner_set_filter(hDevice, FC8100_FREQ_XTAL_TUNER); - res |= fc8100_tuner_set_etc(hDevice, FC8100_FREQ_XTAL_TUNER); - - return res; -} - -int fc8100_tuner_deinit(HANDLE hDevice) -{ - int res = BBM_NOK; - - return res; -} - -int fc8100_set_freq(HANDLE hDevice, u8 ch_num) -{ - int res = BBM_NOK; - - unsigned int f_diff, f_diff_shifted, n_val, k_val; - unsigned int r_val; - unsigned int f_comp; - unsigned int f_lo; - unsigned int f_vco; - u8 pre_shift_bits, data_0x16; - unsigned int xtal = FC8100_FREQ_XTAL_TUNER; - - unsigned int f_rf; - unsigned int f_if; - - PRINTF(0, "Channel Nummber : %d\n", ch_num); - - f_rf = (ch_num - 13) * 6000 + 473143; - f_if = TUN_IF_FREQ; - - f_lo = f_rf - f_if; - f_vco = f_lo * 4; - - r_val = (f_vco >= 25*xtal) ? 1 : 2; - f_comp = xtal/r_val; - - pre_shift_bits = 4; - - n_val = f_vco / f_comp; - - f_diff = f_vco - f_comp * n_val; - f_diff_shifted = f_diff << (20 - pre_shift_bits); - k_val = (f_diff_shifted + (f_comp >> (pre_shift_bits+1))) / (f_comp >> pre_shift_bits); - - if (f_vco < 2180000) { - res = fc8100_write(hDevice, RF_LO_BIAS_MODE1, 0xE7); - res |= fc8100_write(hDevice, RF_BIAS_TOP_CTRL, 0x99); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL2, 0xBF); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL3, 0x1F); - } else if (f_vco < 2276000) { - res = fc8100_write(hDevice, RF_LO_BIAS_MODE1, 0xE7); - res |= fc8100_write(hDevice, RF_BIAS_TOP_CTRL, 0x99); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL2, 0xAF); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL3, 0x1F); - } else if (f_vco < 2420000) { - res = fc8100_write(hDevice, RF_LO_BIAS_MODE1, 0xE7); - res |= fc8100_write(hDevice, RF_BIAS_TOP_CTRL, 0x99); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL2, 0xAF); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL3, 0x0F); - } else if (f_vco < 2516000) { - res = fc8100_write(hDevice, RF_LO_BIAS_MODE1, 0x27); - res |= fc8100_write(hDevice, RF_BIAS_TOP_CTRL, 0x19); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL2, 0xAF); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL3, 0x06); - } else if (f_vco < 2588000) { - res = fc8100_write(hDevice, RF_LO_BIAS_MODE1, 0x27); - res |= fc8100_write(hDevice, RF_BIAS_TOP_CTRL, 0x19); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL2, 0xA6); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL3, 0x06); - } else if (f_vco < 2636000) { - res = fc8100_write(hDevice, RF_LO_BIAS_MODE1, 0x27); - res |= fc8100_write(hDevice, RF_BIAS_TOP_CTRL, 0x19); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL2, 0xA6); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL3, 0x00); - } else { - res = fc8100_write(hDevice, RF_LO_BIAS_MODE1, 0x27); - res |= fc8100_write(hDevice, RF_BIAS_TOP_CTRL, 0x19); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL2, 0xA0); - res |= fc8100_write(hDevice, RF_LNAMIX_ICTRL3, 0x00); - } - - if (res == BBM_NOK) - return res; - - data_0x16 = ((r_val == 1) ? 0x00 : 0x10) + (unsigned char)(k_val >> 16); - res = fc8100_write(hDevice, RF_PLL_K2, data_0x16); - res |= fc8100_write(hDevice, RF_PLL_K1, (unsigned char)(k_val >> 8)); - res |= fc8100_write(hDevice, RF_PLL_K0, (unsigned char)(k_val)); - res |= fc8100_write(hDevice, RF_PLL_N, (unsigned char)(n_val)); - - if (res) - return res; - - msWait(3); - /* SQSTBY is need */ - bbm_write(hDevice, BBM_SYSRST, 0x02); - - return res; -} - -int fc8100_get_rssi(HANDLE hDevice, s32 *rssi) -{ - int res = BBM_NOK; - u8 LNA, RFVGA, GSF, PGA; - /* float RSSI = 0.0f; */ - s32 K = -73; - - res = fc8100_read(hDevice, 0x79, &LNA); - res |= fc8100_read(hDevice, 0x7A, &RFVGA); - res |= fc8100_read(hDevice, 0x7B, &GSF); - res |= fc8100_read(hDevice, 0x7C, &PGA); - - if (res) { - *rssi = (s32)0xFFFFFFFF; - return res; - } - - /* RSSI = (LNA * 6) + (RFVGA) + ((GSF & 0x7) * 6) - (PGA * 0.25f) + K; */ - - /* *rssi = (RSSI); */ - - *rssi = (LNA * 6) + (RFVGA) + ((GSF & 0x7) * 6) - (PGA >> 2) + K; - - return res; -} diff --git a/drivers/media/isdbt/fc8100/fc8100_tun.h b/drivers/media/isdbt/fc8100/fc8100_tun.h deleted file mode 100644 index 984527c..0000000 --- a/drivers/media/isdbt/fc8100/fc8100_tun.h +++ /dev/null @@ -1,29 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_tun.h - - Description : fc8100 tuner controller header file - - History : - ---------------------------------------------------------------------- - 2009/09/29 bruce initial -*******************************************************************************/ - -#ifndef __FC8100_TUNER__ -#define __FC8100_TUNER__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8100_tuner_init(HANDLE hDevice, u8 band_type); -extern int fc8100_tuner_deinit(HANDLE hDevice); -extern int fc8100_set_freq(HANDLE hDevice, u8 ch_num); -extern int fc8100_get_rssi(HANDLE hDevice, s32 *i32RSSI); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fci_hal.c b/drivers/media/isdbt/fc8100/fci_hal.c deleted file mode 100644 index 952f44e..0000000 --- a/drivers/media/isdbt/fc8100/fci_hal.c +++ /dev/null @@ -1,199 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8100_hal.c - - Description : fc8100 host interface - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "bbm.h" -#include "fci_hal.h" -#include "fc8100_i2c.h" - -typedef struct { - int (*init)(HANDLE hDevice, u16 param1, u16 param2); - - int (*byteread)(HANDLE hDevice, u16 addr, u8 *data); - int (*wordread)(HANDLE hDevice, u16 addr, u16 *data); - int (*longread)(HANDLE hDevice, u16 addr, u32 *data); - int (*bulkread)(HANDLE hDevice, u16 addr, u8 *data, u16 size); - - int (*bytewrite)(HANDLE hDevice, u16 addr, u8 data); - int (*wordwrite)(HANDLE hDevice, u16 addr, u16 data); - int (*longwrite)(HANDLE hDevice, u16 addr, u32 data); - int (*bulkwrite)(HANDLE hDevice, u16 addr, u8 *data, u16 size); - int (*dataread)(HANDLE hDevice, u16 addr, u8 *data, u16 size); - - int (*deinit)(HANDLE hDevice); -} IF_PORT; - -static IF_PORT i2cif = { - &fc8100_i2c_init, - - &fc8100_i2c_byteread, - &fc8100_i2c_wordread, - &fc8100_i2c_longread, - &fc8100_i2c_bulkread, - - &fc8100_i2c_bytewrite, - &fc8100_i2c_wordwrite, - &fc8100_i2c_longwrite, - &fc8100_i2c_bulkwrite, - &fc8100_spi_dataread, - - &fc8100_i2c_deinit -}; - -static IF_PORT *ifport = &i2cif; -static u8 hostif_type = BBM_I2C; - -int bbm_hostif_get(HANDLE hDevice, u8 *hostif) -{ - *hostif = hostif_type; - - return BBM_OK; -} - -int bbm_hostif_select(HANDLE hDevice, u8 hostif) -{ - int res = BBM_OK; - - hostif_type = hostif; - - switch (hostif) { -#if 0 - case BBM_HPI: - ifport = &hpiif; - break; - case BBM_SPI: - ifport = &spiif; - break; -#endif - case BBM_I2C: - ifport = &i2cif; - break; - default: - res = BBM_NOK; - break; - } - - if (res == BBM_OK) - ifport->init(hDevice, 0, 0); - - return res; -} - -int bbm_hostif_deselect(HANDLE hDevice) -{ - int res = BBM_OK; - - ifport->deinit(hDevice); - - hostif_type = 0; - ifport = NULL; - - return res; -} - -int bbm_read(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = ifport->byteread(hDevice, addr, data); - - return res; -} - -int bbm_byte_read(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = ifport->byteread(hDevice, addr, data); - - return res; -} - -int bbm_word_read(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - - res = ifport->wordread(hDevice, addr, data); - - return res; -} - -int bbm_long_read(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - - res = ifport->longread(hDevice, addr, data); - - return res; -} - -int bbm_bulk_read(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - - res = ifport->bulkread(hDevice, addr, data, length); - - return res; -} - -int bbm_write(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = ifport->bytewrite(hDevice, addr, data); - - return res; -} - -int bbm_byte_write(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = ifport->bytewrite(hDevice, addr, data); - - return res; -} - -int bbm_word_write(HANDLE hDevice, u16 addr, u16 data) -{ - int res; - - res = ifport->wordwrite(hDevice, addr, data); - - return res; -} - -int bbm_long_write(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - - res = ifport->longwrite(hDevice, addr, data); - - return res; -} - -int bbm_bulk_write(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - - res = ifport->bulkwrite(hDevice, addr, data, length); - - return res; -} - -int bbm_data(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res = BBM_NOK; - res = ifport->dataread(hDevice, addr, data, length); - return res; -} diff --git a/drivers/media/isdbt/fc8100/fci_hal.h b/drivers/media/isdbt/fc8100/fci_hal.h deleted file mode 100644 index 72634cd..0000000 --- a/drivers/media/isdbt/fc8100/fci_hal.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8000_hal.h - - Description : fc8000 host interface header - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#ifndef __FCI_HAL_H__ -#define __FCI_HAL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int bbm_hostif_select(HANDLE hDevice, u8 hostif); -extern int bbm_hostif_deselect(HANDLE hDevice); -extern int bbm_hostif_get(HANDLE hDevice, u8 *hostif); - -extern int bbm_read(HANDLE hDevice, u16 addr, u8 *data); -extern int bbm_byte_read(HANDLE hDevice, u16 addr, u8 *data); -extern int bbm_word_read(HANDLE hDevice, u16 addr, u16 *data); -extern int bbm_long_read(HANDLE hDevice, u16 addr, u32 *data); -extern int bbm_bulk_read(HANDLE hDevice, u16 addr, u8 *data, u16 length); - -extern int bbm_write(HANDLE hDevice, u16 addr, u8 data); -extern int bbm_byte_write(HANDLE hDevice, u16 addr, u8 data); -extern int bbm_word_write(HANDLE hDevice, u16 addr, u16 data); -extern int bbm_long_write(HANDLE hDevice, u16 addr, u32 data); -extern int bbm_bulk_write(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int bbm_data(HANDLE hDevice, u16 addr, u8 *data, u16 length); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fci_i2c.c b/drivers/media/isdbt/fc8100/fci_i2c.c deleted file mode 100644 index 05c8dc9..0000000 --- a/drivers/media/isdbt/fc8100/fci_i2c.c +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_i2c.c - - Description : fci i2c repeater mapping driver for RF register control - - History : - ---------------------------------------------------------------------- - 2009/09/29 bruce initial -*******************************************************************************/ - -#include "fci_types.h" -#include "fc8100_i2c.h" - -int fci_i2c_init (HANDLE hDevice, int speed, int slaveaddr) -{ - return BBM_OK; -} - -int fci_i2c_deinit (HANDLE hDevice) -{ - return BBM_OK; -} - -int fci_i2c_read(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len) -{ - int res = BBM_NOK; - - res = fc8100_rf_bulkread(hDevice, addr, data, len); - - return res; -} - -int fci_i2c_write(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len) -{ - int res = BBM_NOK; - - res = fc8100_rf_bulkwrite(hDevice, addr, data, len); - - return res; -} diff --git a/drivers/media/isdbt/fc8100/fci_i2c.h b/drivers/media/isdbt/fc8100/fci_i2c.h deleted file mode 100644 index 816a6fc..0000000 --- a/drivers/media/isdbt/fc8100/fci_i2c.h +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_i2c.h - - Description : fci i2c driver header - - History : - ---------------------------------------------------------------------- - 2009/09/11 jason initial -*******************************************************************************/ - -#ifndef __FCI_I2C_H__ -#define __FCI_I2C_H__ - -#include "fci_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fci_i2c_init(HANDLE hDevice, int speed, int slaveaddr); -extern int fci_i2c_deinit(HANDLE hDevice); -extern int fci_i2c_read(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len); -extern int fci_i2c_write(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fci_oal.c b/drivers/media/isdbt/fc8100/fci_oal.c deleted file mode 100644 index ba77ce6..0000000 --- a/drivers/media/isdbt/fc8100/fci_oal.c +++ /dev/null @@ -1,34 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_oal.c - - Description : OS Adaptation Layer - - History : - ---------------------------------------------------------------------- - 2009/09/13 jason initial -*******************************************************************************/ - -#include -#include - -#include "fci_types.h" - -void PRINTF(HANDLE hDevice, char *fmt, ...) -{ - va_list ap; - char str[256]; - - va_start(ap, fmt); - vsprintf(str, fmt, ap); - - printk("%s", str); - - va_end(ap); -} - -void msWait(int ms) -{ - msleep(ms); -} diff --git a/drivers/media/isdbt/fc8100/fci_oal.h b/drivers/media/isdbt/fc8100/fci_oal.h deleted file mode 100644 index 557b21f..0000000 --- a/drivers/media/isdbt/fc8100/fci_oal.h +++ /dev/null @@ -1,27 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_oal.h - - Description : OS Adatation Layer header - - History : - ---------------------------------------------------------------------- - 2009/09/13 jason initial -*******************************************************************************/ - -#ifndef __FCI_OAL_H__ -#define __FCI_OAL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern void PRINTF(HANDLE hDevice, char *fmt, ...); -extern void msWait(int ms); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fci_tun.c b/drivers/media/isdbt/fc8100/fci_tun.c deleted file mode 100644 index f4cd5a5..0000000 --- a/drivers/media/isdbt/fc8100/fci_tun.c +++ /dev/null @@ -1,162 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : tuner.c - - Description : tuner driver - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_hal.h" -#include "fci_tun.h" -#include "fci_i2c.h" -#include "fc8100_regs.h" -#include "fc8100_tun.h" - -#define FC8100_TUNER_ADDR 0x56 - -static u8 tuner_addr = FC8100_TUNER_ADDR; -static band_type tuner_band = ISDBT_1_SEG_TYPE; - -typedef struct { - int (*init)(HANDLE hDevice, int speed, int slaveaddr); - int (*read)(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len); - int (*write)(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len); - int (*deinit)(HANDLE hDevice); -} I2C_DRV; - -static I2C_DRV fcii2c = { - &fci_i2c_init, - &fci_i2c_read, - &fci_i2c_write, - &fci_i2c_deinit -}; - -typedef struct { - int (*init)(HANDLE hDevice, u8 band); - int (*set_freq)(HANDLE hDevice, u8 ch_num); - int (*get_rssi)(HANDLE hDevice, s32 *rssi); - int (*deinit)(HANDLE hDevice); -} TUNER_DRV; - -static TUNER_DRV fc8100_tuner = { - &fc8100_tuner_init, - &fc8100_set_freq, - &fc8100_get_rssi, - &fc8100_tuner_deinit -}; - -static I2C_DRV *tuner_ctrl = &fcii2c; -static TUNER_DRV *tuner = &fc8100_tuner; - -int tuner_ctrl_select(HANDLE hDevice, i2c_type type) -{ - int res = BBM_OK; - - switch (type) { - case FCI_I2C_TYPE: - tuner_ctrl = &fcii2c; - break; - default: - res = BBM_NOK; - break; - } - if (res) - return BBM_NOK; - - res = tuner_ctrl->init(hDevice, 400, 0); - - return res; -} - -int tuner_i2c_read(HANDLE hDevice, u8 addr, u8 alen, u8 *data, u8 len) -{ - int res = BBM_OK; - - res = tuner_ctrl->read(hDevice, tuner_addr, addr, alen, data, len); - - return res; -} - -int tuner_i2c_write(HANDLE hDevice, u8 addr, u8 alen, u8 *data, u8 len) -{ - int res = BBM_OK; - - res = tuner_ctrl->write(hDevice, tuner_addr, addr, alen, data, len); - - return res; -} - -int tuner_type(HANDLE hDevice, u32 *type) -{ - *type = tuner_band; - - return BBM_OK; -} - -int tuner_set_freq(HANDLE hDevice, u8 ch_num) -{ - int res = BBM_NOK; - - if (tuner == NULL) { - PRINTF(NULL, "TUNER NULL ERROR \r\n"); - return BBM_NOK; - } - - res = tuner->set_freq(hDevice, ch_num); - if (res != BBM_OK) { - PRINTF(NULL, "TUNER res ERROR \r\n"); - return BBM_NOK; - } - - return res; -} - -int tuner_select(HANDLE hDevice, u32 product, u32 band) -{ - int res = BBM_OK; - - switch (product) { - case FC8100_TUNER: - tuner_band = band; - tuner_addr = FC8100_TUNER_ADDR; - tuner = &fc8100_tuner; - res = tuner_ctrl_select(hDevice, FCI_I2C_TYPE); - PRINTF(0, "FC8100 Tuner Select\n"); - break; - default: - res = BBM_NOK; - break; - } - - if (tuner == NULL || res) { - PRINTF(NULL, "[ERROR] Can not supported Tuner(%d,%d)\n\r", product, band); - return BBM_NOK; - } - - res = tuner->init(hDevice, band); - PRINTF(NULL, "TUNER_SELECT(%s) \n\r", res == BBM_OK ? "SUCCESS" : "FAIL"); - - return res; -} - -int tuner_deselect(HANDLE hDevice) -{ - int res = BBM_OK; - - return res; -} - -int tuner_get_rssi(HANDLE hDevice, s32 *rssi) -{ - int res = BBM_OK; - - res = tuner->get_rssi(hDevice, rssi); - - return res; -} diff --git a/drivers/media/isdbt/fc8100/fci_tun.h b/drivers/media/isdbt/fc8100/fci_tun.h deleted file mode 100644 index f4594f2..0000000 --- a/drivers/media/isdbt/fc8100/fci_tun.h +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : tuner.h - - Description : tuner control driver header - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#ifndef __TUNER_H__ -#define __TUNER_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fci_types.h" -#include "bbm.h" - -typedef enum { - FCI_I2C_TYPE = 0, - ADI_I2C_TYPE -} i2c_type; - -typedef enum { - BAND3_TYPE = 0, - LBAND_TYPE, - ISDBT_1_SEG_TYPE, - FM_TYPE -} band_type; - -typedef enum { - FC8000_TUNER = 0, - FC2507_TUNER, - FC2580_TUNER, - FC8100_TUNER -} product_type; - - -extern int tuner_i2c_init(HANDLE hDevice, int speed, int slaveaddr); -extern int tuner_i2c_read(HANDLE hDevice, u8 addr, u8 alen, u8 *data, u8 len); -extern int tuner_i2c_write(HANDLE hDevice, u8 addr, u8 alen, u8 *data, u8 len); - -extern int tuner_select(HANDLE hDevice, u32 product, u32 band); -extern int tuner_deselect(HANDLE hDevice); -extern int tuner_set_freq(HANDLE hDevice, u8 ch_num); -extern int tuner_get_rssi(HANDLE hDevice, s32 *rssi); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8100/fci_types.h b/drivers/media/isdbt/fc8100/fci_types.h deleted file mode 100644 index b36626d..0000000 --- a/drivers/media/isdbt/fc8100/fci_types.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_types.h - - Description : - - History : - ---------------------------------------------------------------------- - 2009/08/31 jason initial -*******************************************************************************/ - -#ifndef __FCI_TYPES_H__ -#define __FCI_TYPES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef HANDLE -typedef int HANDLE; -#endif - -#define s8 char -#define s16 short int -#define s32 int - -#define u8 unsigned char -#define u16 unsigned short -#define u32 unsigned int - -#define TRUE 1 -#define FALSE 0 - -#ifndef NULL -#define NULL 0 -#endif - -#define BBM_OK 0 -#define BBM_NOK 1 - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/Makefile b/drivers/media/isdbt/fc8150/Makefile deleted file mode 100644 index baf3d0e..0000000 --- a/drivers/media/isdbt/fc8150/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -obj-y += bbm.o -obj-y += fc8150.o -obj-y += fc8150_bb.o -obj-y += fc8150_hpi.o -obj-y += fc8150_i2c.o -obj-y += fc8150_isr.o -obj-y += fc8150_ppi.o -obj-y += fc8150_spi.o -obj-y += fc8150_spib.o -obj-y += fc8150_tun.o -obj-y += fci_bypass.o -obj-y += fci_hal.o -obj-y += fci_i2c.o -obj-y += fci_oal.o -obj-y += fci_ringbuffer.o -obj-y += fci_tun.o - -#ccflags-y += -Idrivers/media/isdbt diff --git a/drivers/media/isdbt/fc8150/bbm.c b/drivers/media/isdbt/fc8150/bbm.c deleted file mode 100644 index c9ad7b0..0000000 --- a/drivers/media/isdbt/fc8150/bbm.c +++ /dev/null @@ -1,287 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : bbm.c - - Description : API of 1-SEG baseband module - -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_tun.h" -#include "fci_hal.h" -#include "fc8150_bb.h" -#include "fc8150_isr.h" - -int BBM_RESET(HANDLE hDevice) -{ - int res; - - res = fc8150_reset(hDevice); - - return res; -} - -int BBM_PROBE(HANDLE hDevice) -{ - int res; - - res = fc8150_probe(hDevice); - - return res; -} - -int BBM_INIT(HANDLE hDevice) -{ - int res; - - res = fc8150_init(hDevice); - - return res; -} - -int BBM_DEINIT(HANDLE hDevice) -{ - int res; - - res = fc8150_deinit(hDevice); - - return res; -} - -int BBM_READ(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = bbm_read(hDevice, addr, data); - - return res; -} - -int BBM_BYTE_READ(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = bbm_byte_read(hDevice, addr, data); - - return res; -} - -int BBM_WORD_READ(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - - res = bbm_word_read(hDevice, addr, data); - - return res; -} - -int BBM_LONG_READ(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - - res = bbm_long_read(hDevice, addr, data); - - return BBM_OK; -} - -int BBM_BULK_READ(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res; - - res = bbm_bulk_read(hDevice, addr, data, size); - - return res; -} - -int BBM_DATA(HANDLE hDevice, u16 addr, u8 *data, u32 size) -{ - int res; - - res = bbm_data(hDevice, addr, data, size); - - return res; -} - -int BBM_WRITE(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = bbm_write(hDevice, addr, data); - - return res; -} - -int BBM_BYTE_WRITE(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = bbm_byte_write(hDevice, addr, data); - - return res; -} - -int BBM_WORD_WRITE(HANDLE hDevice, u16 addr, u16 data) -{ - int res; - - res = bbm_word_write(hDevice, addr, data); - - return res; -} - -int BBM_LONG_WRITE(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - - res = bbm_long_write(hDevice, addr, data); - - return res; -} - -int BBM_BULK_WRITE(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res; - - res = bbm_bulk_write(hDevice, addr, data, size); - - return res; -} - -int BBM_I2C_INIT(HANDLE hDevice, u32 type) -{ - int res; - - res = tuner_ctrl_select(hDevice, type); - - return res; -} - -int BBM_I2C_DEINIT(HANDLE hDevice) -{ - int res; - - res = tuner_ctrl_deselect(hDevice); - - return res; -} - -int BBM_TUNER_READ(HANDLE hDevice, u8 addr, u8 alen, u8 *buffer, u8 len) -{ - int res; - - res = tuner_i2c_read(hDevice, addr, alen, buffer, len); - - return res; -} - -int BBM_TUNER_WRITE(HANDLE hDevice, u8 addr, u8 alen, u8 *buffer, u8 len) -{ - int res; - - res = tuner_i2c_write(hDevice, addr, alen, buffer, len); - - return res; -} - -int BBM_TUNER_SET_FREQ(HANDLE hDevice, u32 freq) -{ - int res; - - res = tuner_set_freq(hDevice, freq); - - return res; -} - -int BBM_TUNER_SELECT(HANDLE hDevice, u32 product, u32 band) -{ - int res; - - res = tuner_select(hDevice, product, band); - - return res; -} - -int BBM_TUNER_DESELECT(HANDLE hDevice) -{ - int res; - - res = tuner_deselect(hDevice); - - return res; -} - -int BBM_TUNER_GET_RSSI(HANDLE hDevice, s32 *rssi) -{ - int res; - - res = tuner_get_rssi(hDevice, rssi); - - return res; -} - -int BBM_SCAN_STATUS(HANDLE hDevice) -{ - int res; - - res = fc8150_scan_status(hDevice); - - return res; -} - -void BBM_ISR(HANDLE hDevice) -{ - fc8150_isr(hDevice); -} - -int BBM_HOSTIF_SELECT(HANDLE hDevice, u8 hostif) -{ - int res; - - res = bbm_hostif_select(hDevice, hostif); - - return res; -} - -int BBM_HOSTIF_DESELECT(HANDLE hDevice) -{ - int res; - - res = bbm_hostif_deselect(hDevice); - - return res; -} - -int BBM_TS_CALLBACK_REGISTER(u32 userdata - , int (*callback)(u32 userdata, u8 *data, int length)) -{ - gTSUserData = userdata; - pTSCallback = callback; - - return BBM_OK; -} - -int BBM_TS_CALLBACK_DEREGISTER(void) -{ - gTSUserData = 0; - pTSCallback = NULL; - - return BBM_OK; -} - -int BBM_AC_CALLBACK_REGISTER(u32 userData - , int (*callback)(u32 userdata, u8 *data, int length)) -{ - gACUserData = userData; - pACCallback = callback; - - return BBM_OK; -} - -int BBM_AC_CALLBACK_DEREGISTER(void) -{ - gACUserData = 0; - pACCallback = NULL; - - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/bbm.h b/drivers/media/isdbt/fc8150/bbm.h deleted file mode 100644 index 2543681..0000000 --- a/drivers/media/isdbt/fc8150/bbm.h +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : bbm.h - - Description : API of 1-SEG baseband module - -*******************************************************************************/ -#ifndef __BBM_H__ -#define __BBM_H__ - -#include "fci_types.h" - -#define DRIVER_VER "VER 2.20.1" - -#ifdef __cplusplus -extern "C" { -#endif - -extern int BBM_RESET(HANDLE hDevice); -extern int BBM_PROBE(HANDLE hDevice); -extern int BBM_INIT(HANDLE hDevice); -extern int BBM_DEINIT(HANDLE hDevice); -extern int BBM_READ(HANDLE hDevice, u16 addr, u8 *data); -extern int BBM_BYTE_READ(HANDLE hDevice, u16 addr, u8 *data); -extern int BBM_WORD_READ(HANDLE hDevice, u16 addr, u16 *data); -extern int BBM_LONG_READ(HANDLE hDevice, u16 addr, u32 *data); -extern int BBM_BULK_READ(HANDLE hDevice, u16 addr, u8 *data, u16 size); -extern int BBM_DATA(HANDLE hDevice, u16 addr, u8 *data, u32 size); -extern int BBM_WRITE(HANDLE hDevice, u16 addr, u8 data); -extern int BBM_BYTE_WRITE(HANDLE hDevice, u16 addr, u8 data); -extern int BBM_WORD_WRITE(HANDLE hDevice, u16 addr, u16 data); -extern int BBM_LONG_WRITE(HANDLE hDevice, u16 addr, u32 data); -extern int BBM_BULK_WRITE(HANDLE hDevice, u16 addr, u8 *data, u16 size); -extern int BBM_I2C_INIT(HANDLE hDevice, u32 type); -extern int BBM_I2C_DEINIT(HANDLE hDevice); -extern int BBM_TUNER_SELECT(HANDLE hDevice, u32 product, u32 band); -extern int BBM_TUNER_DESELECT(HANDLE hDevice); -extern int BBM_TUNER_READ(HANDLE hDevice, u8 addr - , u8 alen, u8 *buffer, u8 len); -extern int BBM_TUNER_WRITE(HANDLE hDevice, u8 addr - , u8 alen, u8 *buffer, u8 len); -extern int BBM_TUNER_SET_FREQ(HANDLE hDevice, u32 freq); -extern int BBM_TUNER_GET_RSSI(HANDLE hDevice, s32 *rssi); -extern int BBM_SCAN_STATUS(HANDLE hDevice); -extern int BBM_HOSTIF_SELECT(HANDLE hDevice, u8 hostif); -extern int BBM_HOSTIF_DESELECT(HANDLE hDevice); -extern int BBM_TS_CALLBACK_REGISTER(u32 userdata - , int (*callback)(u32 userdata, u8 *data, int length)); -extern int BBM_TS_CALLBACK_DEREGISTER(void); -extern int BBM_AC_CALLBACK_REGISTER(u32 userData - , int (*callback)(u32 userdata, u8 *data, int length)); -extern int BBM_AC_CALLBACK_DEREGISTER(void); -extern void BBM_ISR(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif /* __BBM_H__ */ diff --git a/drivers/media/isdbt/fc8150/fc8150.c b/drivers/media/isdbt/fc8150/fc8150.c deleted file mode 100644 index f6b829f..0000000 --- a/drivers/media/isdbt/fc8150/fc8150.c +++ /dev/null @@ -1,525 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include "fc8150.h" -#include "bbm.h" -#include "fci_oal.h" -#include "fci_tun.h" -#include "fc8150_regs.h" -#include "fc8150_isr.h" -#include "fci_hal.h" - -struct ISDBT_INIT_INFO_T *hInit; - -#define RING_BUFFER_SIZE (128 * 1024) /* kmalloc max 128k */ - -/* GPIO(RESET & INTRRUPT) Setting */ -#define FC8150_NAME "isdbt" - -/* -#define GPIO_ISDBT_IRQ 0x24 -#define GPIO_ISDBT_PWR_EN 1 -#define GPIO_ISDBT_RST 2 -*/ -#define GPIO_ISDBT_IRQ_FC8150 EXYNOS4_GPC0(4) -#define GPIO_ISDBT_PWR_EN_FC8150 EXYNOS4_GPC0(2) -#define GPIO_ISDBT_RST_FC8150 EXYNOS4_GPC0(0) - -static DECLARE_WAIT_QUEUE_HEAD(isdbt_isr_wait); - -static u8 isdbt_isr_sig; -static struct task_struct *isdbt_kthread; - -static irqreturn_t isdbt_irq(int irq, void *dev_id) -{ - isdbt_isr_sig = 1; - wake_up_interruptible(&isdbt_isr_wait); - - return IRQ_HANDLED; -} - -int isdbt_hw_setting(void) -{ - int err; - PRINTF(0, "isdbt_hw_setting\n"); - - err = gpio_request(GPIO_ISDBT_PWR_EN_FC8150, "isdbt_en"); - if (err) { - PRINTF(0, "isdbt_hw_setting: Couldn't request isdbt_en\n"); - goto gpio_isdbt_en; - } - gpio_direction_output(GPIO_ISDBT_PWR_EN_FC8150, 0); - - err = gpio_request(GPIO_ISDBT_RST_FC8150, "isdbt_rst"); - if (err) { - PRINTF(0, "isdbt_hw_setting: Couldn't request isdbt_rst\n"); - goto gpio_isdbt_rst; - } - gpio_direction_output(GPIO_ISDBT_RST_FC8150, 1); - - err = gpio_request(GPIO_ISDBT_IRQ_FC8150, "isdbt_irq"); - if (err) { - PRINTF(0, "isdbt_hw_setting: Couldn't request isdbt_irq\n"); - goto gpio_isdbt_rst; - } - gpio_direction_input(GPIO_ISDBT_IRQ_FC8150); - - err = request_irq(gpio_to_irq(GPIO_ISDBT_IRQ_FC8150), isdbt_irq - , IRQF_DISABLED | IRQF_TRIGGER_RISING, FC8150_NAME, NULL); - - if (err < 0) { - PRINTF(0, "isdbt_hw_setting: couldn't request gpio"); - PRINTF(0, "interrupt %d reason(%d)\n" - , gpio_to_irq(GPIO_ISDBT_IRQ_FC8150), err); - goto request_isdbt_irq; - } - return 0; -request_isdbt_irq: - gpio_free(GPIO_ISDBT_IRQ_FC8150); -gpio_isdbt_rst: - gpio_free(GPIO_ISDBT_PWR_EN_FC8150); -gpio_isdbt_en: - return err; -} - -/*POWER_ON & HW_RESET & INTERRUPT_CLEAR */ -void isdbt_hw_init(void) -{ - PRINTF(0, "isdbt_hw_init\n"); - gpio_set_value(GPIO_ISDBT_PWR_EN_FC8150, 1); - gpio_set_value(GPIO_ISDBT_RST_FC8150, 1); - mdelay(5); - gpio_set_value(GPIO_ISDBT_RST_FC8150, 0); - mdelay(1); - gpio_set_value(GPIO_ISDBT_RST_FC8150, 1); -} - -/*POWER_OFF */ -void isdbt_hw_deinit(void) -{ - PRINTF(0, "isdbt_hw_deinit\n"); - gpio_set_value(GPIO_ISDBT_PWR_EN_FC8150, 0); -} - -int data_callback(u32 hDevice, u8 *data, int len) -{ - struct ISDBT_INIT_INFO_T *hInit; - struct list_head *temp; - hInit = (struct ISDBT_INIT_INFO_T *)hDevice; - - list_for_each(temp, &(hInit->hHead)) - { - struct ISDBT_OPEN_INFO_T *hOpen; - - hOpen = list_entry(temp, struct ISDBT_OPEN_INFO_T, hList); - - if (hOpen->isdbttype == TS_TYPE) { - if (fci_ringbuffer_free(&hOpen->RingBuffer) < (len+2)) { - /*PRINTF(hDevice, "f"); */ - return 0; - } - - FCI_RINGBUFFER_WRITE_BYTE(&hOpen->RingBuffer, len >> 8); - FCI_RINGBUFFER_WRITE_BYTE(&hOpen->RingBuffer, - len & 0xff); - - fci_ringbuffer_write(&hOpen->RingBuffer, data, len); - - wake_up_interruptible(&(hOpen->RingBuffer.queue)); - } - } - - return 0; -} - -static int isdbt_thread(void *hDevice) -{ - static DEFINE_MUTEX(thread_lock); - - struct ISDBT_INIT_INFO_T *hInit = (struct ISDBT_INIT_INFO_T *)hDevice; - - set_user_nice(current, -20); - - PRINTF(hInit, "isdbt_kthread enter\n"); - - BBM_TS_CALLBACK_REGISTER((u32)hInit, data_callback); - - while (1) { - wait_event_interruptible(isdbt_isr_wait, - isdbt_isr_sig || kthread_should_stop()); - - isdbt_isr_sig = 0; - - BBM_ISR(hInit); - - if (kthread_should_stop()) - break; - } - - BBM_TS_CALLBACK_DEREGISTER(); - - PRINTF(hInit, "isdbt_kthread exit\n"); - - return 0; -} - -const struct file_operations isdbt_fops = { - .owner = THIS_MODULE, - .unlocked_ioctl = isdbt_ioctl, - .open = isdbt_open, - .read = isdbt_read, - .release = isdbt_release, -}; - -static struct miscdevice fc8150_misc_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = FC8150_NAME, - .fops = &isdbt_fops, -}; - -int isdbt_open(struct inode *inode, struct file *filp) -{ - struct ISDBT_OPEN_INFO_T *hOpen; - - PRINTF(hInit, "isdbt open\n"); - - hOpen = kmalloc(sizeof(struct ISDBT_OPEN_INFO_T), GFP_KERNEL); - - hOpen->buf = kmalloc(RING_BUFFER_SIZE, GFP_KERNEL); - hOpen->isdbttype = 0; - - list_add(&(hOpen->hList), &(hInit->hHead)); - - hOpen->hInit = (HANDLE *)hInit; - - if (hOpen->buf == NULL) { - PRINTF(hInit, "ring buffer malloc error\n"); - return -ENOMEM; - } - - fci_ringbuffer_init(&hOpen->RingBuffer, hOpen->buf, RING_BUFFER_SIZE); - - filp->private_data = hOpen; - - return 0; -} - -ssize_t isdbt_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) -{ - s32 avail; - s32 non_blocking = filp->f_flags & O_NONBLOCK; - struct ISDBT_OPEN_INFO_T *hOpen - = (struct ISDBT_OPEN_INFO_T *)filp->private_data; - struct fci_ringbuffer *cibuf = &hOpen->RingBuffer; - ssize_t len; - - if (!cibuf->data || !count) { - /*PRINTF(hInit, " return 0\n"); */ - return 0; - } - - if (non_blocking && (fci_ringbuffer_empty(cibuf))) { - /*PRINTF(hInit, "return EWOULDBLOCK\n"); */ - return -EWOULDBLOCK; - } - - if (wait_event_interruptible(cibuf->queue, - !fci_ringbuffer_empty(cibuf))) { - PRINTF(hInit, "return ERESTARTSYS\n"); - return -ERESTARTSYS; - } - - avail = fci_ringbuffer_avail(cibuf); - - if (avail < 4) { - PRINTF(hInit, "return 00\n"); - return 0; - } - - len = FCI_RINGBUFFER_PEEK(cibuf, 0) << 8; - len |= FCI_RINGBUFFER_PEEK(cibuf, 1); - - if (avail < len + 2 || count < len) { - PRINTF(hInit, "return EINVAL\n"); - return -EINVAL; - } - - FCI_RINGBUFFER_SKIP(cibuf, 2); - - return fci_ringbuffer_read_user(cibuf, buf, len); -} - -int isdbt_release(struct inode *inode, struct file *filp) -{ - struct ISDBT_OPEN_INFO_T *hOpen; - - PRINTF(hInit, "isdbt_release\n"); - - hOpen = filp->private_data; - - hOpen->isdbttype = 0; - - list_del(&(hOpen->hList)); - kfree(hOpen->buf); - kfree(hOpen); - - return 0; -} - -int fc8150_if_test(void) -{ - int res = 0; - int i; - u16 wdata = 0; - u32 ldata = 0; - u8 data = 0; - u8 temp = 0; - - PRINTF(0, "fc8150_if_test Start!!!\n"); - for (i = 0 ; i < 100 ; i++) { - BBM_BYTE_WRITE(0, 0xa4, i & 0xff); - BBM_BYTE_READ(0, 0xa4, &data); - if ((i & 0xff) != data) { - PRINTF(0, "fc8150_if_btest! i=0x%x, data=0x%x\n" - , i & 0xff, data); - res = 1; - } - } - - for (i = 0 ; i < 100 ; i++) { - BBM_WORD_WRITE(0, 0xa4, i & 0xffff); - BBM_WORD_READ(0, 0xa4, &wdata); - if ((i & 0xffff) != wdata) { - PRINTF(0, "fc8150_if_wtest! i=0x%x, data=0x%x\n" - , i & 0xffff, wdata); - res = 1; - } - } - - for (i = 0 ; i < 100 ; i++) { - BBM_LONG_WRITE(0, 0xa4, i & 0xffffffff); - BBM_LONG_READ(0, 0xa4, &ldata); - if ((i & 0xffffffff) != ldata) { - PRINTF(0, "fc8150_if_ltest! i=0x%x, data=0x%x\n" - , i & 0xffffffff, ldata); - res = 1; - } - } - - for (i = 0 ; i < 100 ; i++) { - temp = i & 0xff; - BBM_TUNER_WRITE(NULL, 0x52, 0x01, &temp, 0x01); - BBM_TUNER_READ(NULL, 0x52, 0x01, &data, 0x01); - if ((i & 0xff) != data) - PRINTF(0, "FC8150 tuner test (0x%x,0x%x)\n" - , i & 0xff, data); - } - - PRINTF(0, "fc8150_if_test End!!!\n"); - - return res; -} - - -long isdbt_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - s32 res = BBM_NOK; - s32 err = 0; - s32 size = 0; - struct ISDBT_OPEN_INFO_T *hOpen; - - struct ioctl_info info; - - if (_IOC_TYPE(cmd) != IOCTL_MAGIC) - return -EINVAL; - if (_IOC_NR(cmd) >= IOCTL_MAXNR) - return -EINVAL; - - hOpen = filp->private_data; - - size = _IOC_SIZE(cmd); - - switch (cmd) { - case IOCTL_ISDBT_RESET: - res = BBM_RESET(hInit); - break; - case IOCTL_ISDBT_INIT: - res = BBM_I2C_INIT(hInit, FCI_I2C_TYPE); - res |= BBM_PROBE(hInit); - if (res) { - PRINTF(hInit, "FC8150 Initialize Fail\n"); - break; - } - res |= BBM_INIT(hInit); - break; - case IOCTL_ISDBT_BYTE_READ: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_BYTE_READ(hInit, (u16)info.buff[0] - , (u8 *)(&info.buff[1])); - err |= copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_ISDBT_WORD_READ: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_WORD_READ(hInit, (u16)info.buff[0] - , (u16 *)(&info.buff[1])); - err |= copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_ISDBT_LONG_READ: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_LONG_READ(hInit, (u16)info.buff[0] - , (u32 *)(&info.buff[1])); - err |= copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_ISDBT_BULK_READ: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_BULK_READ(hInit, (u16)info.buff[0] - , (u8 *)(&info.buff[2]), info.buff[1]); - err |= copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_ISDBT_BYTE_WRITE: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_BYTE_WRITE(hInit, (u16)info.buff[0] - , (u8)info.buff[1]); - break; - case IOCTL_ISDBT_WORD_WRITE: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_WORD_WRITE(hInit, (u16)info.buff[0] - , (u16)info.buff[1]); - break; - case IOCTL_ISDBT_LONG_WRITE: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_LONG_WRITE(hInit, (u16)info.buff[0] - , (u32)info.buff[1]); - break; - case IOCTL_ISDBT_BULK_WRITE: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_BULK_WRITE(hInit, (u16)info.buff[0] - , (u8 *)(&info.buff[2]), info.buff[1]); - break; - case IOCTL_ISDBT_TUNER_READ: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_TUNER_READ(hInit, (u8)info.buff[0] - , (u8)info.buff[1], (u8 *)(&info.buff[3]) - , (u8)info.buff[2]); - err |= copy_to_user((void *)arg, (void *)&info, size); - break; - case IOCTL_ISDBT_TUNER_WRITE: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_TUNER_WRITE(hInit, (u8)info.buff[0] - , (u8)info.buff[1], (u8 *)(&info.buff[3]) - , (u8)info.buff[2]); - break; - case IOCTL_ISDBT_TUNER_SET_FREQ: - { - u32 f_rf; - err = copy_from_user((void *)&info, (void *)arg, size); - - f_rf = ((u32)info.buff[0] - 13) * 6000 + 473143; - res = BBM_TUNER_SET_FREQ(hInit, f_rf); - } - break; - case IOCTL_ISDBT_TUNER_SELECT: - err = copy_from_user((void *)&info, (void *)arg, size); - res = BBM_TUNER_SELECT(hInit, (u32)info.buff[0], 0); - break; - case IOCTL_ISDBT_TS_START: - hOpen->isdbttype = TS_TYPE; - break; - case IOCTL_ISDBT_TS_STOP: - hOpen->isdbttype = 0; - break; - case IOCTL_ISDBT_POWER_ON: - isdbt_hw_init(); - break; - case IOCTL_ISDBT_POWER_OFF: - isdbt_hw_deinit(); - break; - case IOCTL_ISDBT_SCAN_STATUS: - res = BBM_SCAN_STATUS(hInit); - break; - default: - PRINTF(hInit, "isdbt ioctl error!\n"); - res = BBM_NOK; - break; - } - - if (err < 0) { - PRINTF(hInit, "copy to/from user fail : %d", err); - res = BBM_NOK; - } - return res; -} - -int isdbt_init(void) -{ - s32 res; - - PRINTF(hInit, "isdbt_init\n"); - - res = misc_register(&fc8150_misc_device); - - if (res < 0) { - PRINTF(hInit, "isdbt init fail : %d\n", res); - return res; - } - - isdbt_hw_setting(); - - isdbt_hw_init(); - - hInit = kmalloc(sizeof(struct ISDBT_INIT_INFO_T), GFP_KERNEL); - - res = BBM_HOSTIF_SELECT(hInit, BBM_SPI); - - if (res) - PRINTF(hInit, "isdbt host interface select fail!\n"); - - isdbt_hw_deinit(); - - if (!isdbt_kthread) { - PRINTF(hInit, "kthread run\n"); - isdbt_kthread = kthread_run(isdbt_thread - , (void *)hInit, "isdbt_thread"); - } - - INIT_LIST_HEAD(&(hInit->hHead)); - - return 0; -} - -void isdbt_exit(void) -{ - PRINTF(hInit, "isdbt isdbt_exit\n"); - - free_irq(gpio_to_irq(GPIO_ISDBT_IRQ_FC8150), NULL); - gpio_free(GPIO_ISDBT_IRQ_FC8150); - gpio_free(GPIO_ISDBT_RST_FC8150); - gpio_free(GPIO_ISDBT_PWR_EN_FC8150); - - kthread_stop(isdbt_kthread); - isdbt_kthread = NULL; - - BBM_HOSTIF_DESELECT(hInit); - - isdbt_hw_deinit(); - - misc_deregister(&fc8150_misc_device); - - kfree(hInit); -} - -module_init(isdbt_init); -module_exit(isdbt_exit); - -MODULE_LICENSE("Dual BSD/GPL"); diff --git a/drivers/media/isdbt/fc8150/fc8150.h b/drivers/media/isdbt/fc8150/fc8150.h deleted file mode 100644 index 787cc0f..0000000 --- a/drivers/media/isdbt/fc8150/fc8150.h +++ /dev/null @@ -1,120 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : bbm.c - - Description : API of dmb baseband module - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#ifndef __ISDBT_H__ -#define __ISDBT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#include "fci_types.h" -#include "fci_ringbuffer.h" - -#define CTL_TYPE 0 -#define TS_TYPE 1 - -#define MAX_OPEN_NUM 8 - -#define IOCTL_MAGIC 't' - -struct ioctl_info { - unsigned long size; - unsigned long buff[128]; -}; - -#define IOCTL_MAXNR 25 - -#define IOCTL_ISDBT_RESET \ - _IO(IOCTL_MAGIC, 0) -#define IOCTL_ISDBT_PROBE \ - _IO(IOCTL_MAGIC, 1) -#define IOCTL_ISDBT_INIT \ - _IO(IOCTL_MAGIC, 2) -#define IOCTL_ISDBT_DEINIT \ - _IO(IOCTL_MAGIC, 3) - -#define IOCTL_ISDBT_BYTE_READ \ - _IOWR(IOCTL_MAGIC, 4, struct ioctl_info) -#define IOCTL_ISDBT_WORD_READ \ - _IOWR(IOCTL_MAGIC, 5, struct ioctl_info) -#define IOCTL_ISDBT_LONG_READ \ - _IOWR(IOCTL_MAGIC, 6, struct ioctl_info) -#define IOCTL_ISDBT_BULK_READ \ - _IOWR(IOCTL_MAGIC, 7, struct ioctl_info) - -#define IOCTL_ISDBT_BYTE_WRITE \ - _IOW(IOCTL_MAGIC, 8, struct ioctl_info) -#define IOCTL_ISDBT_WORD_WRITE \ - _IOW(IOCTL_MAGIC, 9, struct ioctl_info) -#define IOCTL_ISDBT_LONG_WRITE \ - _IOW(IOCTL_MAGIC, 10, struct ioctl_info) -#define IOCTL_ISDBT_BULK_WRITE \ - _IOW(IOCTL_MAGIC, 11, struct ioctl_info) - -#define IOCTL_ISDBT_TUNER_READ \ - _IOWR(IOCTL_MAGIC, 12, struct ioctl_info) -#define IOCTL_ISDBT_TUNER_WRITE \ - _IOW(IOCTL_MAGIC, 13, struct ioctl_info) - -#define IOCTL_ISDBT_TUNER_SET_FREQ \ - _IOW(IOCTL_MAGIC, 14, struct ioctl_info) -#define IOCTL_ISDBT_TUNER_SELECT \ - _IOW(IOCTL_MAGIC, 15, struct ioctl_info) -#define IOCTL_ISDBT_TUNER_DESELECT \ - _IO(IOCTL_MAGIC, 16) - -#define IOCTL_ISDBT_SCAN_STATUS \ - _IO(IOCTL_MAGIC, 17) -#define IOCTL_ISDBT_TS_START \ - _IO(IOCTL_MAGIC, 18) -#define IOCTL_ISDBT_TS_STOP \ - _IO(IOCTL_MAGIC, 19) - -#define IOCTL_ISDBT_TUNER_GET_RSSI \ - _IOWR(IOCTL_MAGIC, 20, struct ioctl_info) - -#define IOCTL_ISDBT_HOSTIF_SELECT \ - _IOW(IOCTL_MAGIC, 21, struct ioctl_info) -#define IOCTL_ISDBT_HOSTIF_DESELECT \ - _IO(IOCTL_MAGIC, 22) - -#define IOCTL_ISDBT_POWER_ON \ - _IO(IOCTL_MAGIC, 23) -#define IOCTL_ISDBT_POWER_OFF \ - _IO(IOCTL_MAGIC, 24) - -struct ISDBT_OPEN_INFO_T { - HANDLE *hInit; - struct list_head hList; - struct fci_ringbuffer RingBuffer; - u8 *buf; - u8 isdbttype; -}; - -struct ISDBT_INIT_INFO_T { - struct list_head hHead; -}; - -extern int isdbt_open(struct inode *inode, struct file *filp); -extern long isdbt_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); -extern int isdbt_release(struct inode *inode, struct file *filp); -extern ssize_t isdbt_read(struct file *filp - , char *buf, size_t count, loff_t *f_pos); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_bb.c b/drivers/media/isdbt/fc8150/fc8150_bb.c deleted file mode 100644 index e696716..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_bb.c +++ /dev/null @@ -1,789 +0,0 @@ -/***************************************************************************** - - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_bb.c - - Description : API of 1-SEG baseband module - -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_hal.h" -#include "fci_tun.h" -#include "fc8150_regs.h" - -static u8 filter_coef_6M[7][16] = { - { 0x00, 0x00, 0x00, 0x07, 0x0f, 0x01, 0x03, 0x04 - , 0x01, 0x19, 0x14, 0x18, 0x0a, 0x26, 0x40, 0x4a}, - /*xtal_in : 24,16,32 (adc clk = 4.0000)*/ - { 0x00, 0x07, 0x07, 0x00, 0x01, 0x03, 0x03, 0x01 - , 0x1c, 0x17, 0x16, 0x1e, 0x10, 0x27, 0x3b, 0x43}, - /*xtal_in : 26 (adc clk = 4.3333)*/ - { 0x00, 0x07, 0x07, 0x00, 0x01, 0x03, 0x03, 0x00 - , 0x1b, 0x16, 0x16, 0x1f, 0x11, 0x27, 0x3a, 0x41}, - /*xtal_in : 27,18 (adc clk = 4.5000)*/ - { 0x00, 0x00, 0x07, 0x07, 0x00, 0x02, 0x03, 0x03 - , 0x1f, 0x18, 0x14, 0x1a, 0x0c, 0x26, 0x3e, 0x47}, - /*xtal_in : 16.384, 24.576 (adc clk = 4.0960)*/ - { 0x00, 0x07, 0x07, 0x00, 0x02, 0x03, 0x02, 0x0f - , 0x1a, 0x16, 0x18, 0x02, 0x13, 0x27, 0x38, 0x3e}, - /*xtal_in : 19.2, 38.4 (adc clk = 4.8000)*/ - { 0x00, 0x07, 0x07, 0x00, 0x01, 0x03, 0x03, 0x00 - , 0x1b, 0x16, 0x16, 0x1f, 0x11, 0x27, 0x3a, 0x41}, - /*xtal_in : 27.12 (adc clk = 4.5200)*/ - { 0x00, 0x07, 0x07, 0x00, 0x02, 0x03, 0x03, 0x00 - , 0x1a, 0x16, 0x17, 0x01, 0x12, 0x27, 0x39, 0x3f} - /*xtal_in : 37.4 (adc clk = 4.6750)*/ -}; - -#if 0 -static u8 filter_coef_7M[7][16] = { - { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x04, 0x05 - , 0x1f, 0x15, 0x12, 0x01, 0x22, 0x45, 0x55}, - /*xtal_in : 24,16,32 (adc clk = 4.0000)*/ - { 0x00, 0x00, 0x00, 0x07, 0x0e, 0x0f, 0x02, 0x05, 0x04 - , 0x1c, 0x14, 0x14, 0x05, 0x24, 0x43, 0x50}, - /*xtal_in : 26 (adc clk = 4.3333)*/ - { 0x00, 0x00, 0x00, 0x07, 0x0f, 0x00, 0x03, 0x05, 0x02 - , 0x1b, 0x14, 0x16, 0x07, 0x25, 0x42, 0x4d}, - /*xtal_in : 27,18 (adc clk = 4.5000)*/ - { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x01, 0x04, 0x05 - , 0x1e, 0x15, 0x13, 0x02, 0x23, 0x44, 0x53}, - /*xtal_in : 16.384, 24.576 (adc clk = 4.0960)*/ - { 0x00, 0x00, 0x07, 0x07, 0x00, 0x02, 0x04, 0x03, 0x1f - , 0x18, 0x14, 0x1a, 0x0c, 0x26, 0x3e, 0x47}, - /*xtal_in : 19.2, 38.4 (adc clk = 4.8000)*/ - { 0x00, 0x00, 0x00, 0x07, 0x0f, 0x00, 0x03, 0x05, 0x02 - , 0x1b, 0x14, 0x16, 0x07, 0x25, 0x41, 0x4d}, - /*xtal_in : 27.12 (adc clk = 4.5200)*/ - { 0x00, 0x00, 0x00, 0x07, 0x0f, 0x01, 0x03, 0x04, 0x00 - , 0x19, 0x14, 0x18, 0x0a, 0x26, 0x3f, 0x4a} - /*xtal_in : 37.4 (adc clk = 4.6750)*/ -}; - -static u8 filter_coef_8M[7][16] = { - { 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, 0x0d, 0x0f, 0x05 - , 0x06, 0x1d, 0x10, 0xf6, 0x1a, 0x4b, 0x62}, - /*xtal_in : 24,16,32 (adc clk = 4.0000)*/ - { 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x0e, 0x02, 0x06 - , 0x04, 0x19, 0x10, 0xfb, 0x1e, 0x48, 0x5b}, - /*xtal_in : 26 (adc clk = 4.3333)*/ - { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x03, 0x05 - , 0x00, 0x16, 0x11, 0xff, 0x21, 0x46, 0x56}, - /*xtal_in : 27,18 (adc clk = 4.5000)*/ - { 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x0d, 0x00, 0x05 - , 0x06, 0x1c, 0x10, 0xf7, 0x1b, 0x4a, 0x60}, - /*xtal_in : 16.384, 24.576 (adc clk = 4.0960)*/ - { 0x00, 0x00, 0x00, 0x07, 0x0e, 0x0f, 0x01, 0x05, 0x04 - , 0x1d, 0x14, 0x13, 0x04, 0x23, 0x44, 0x51}, - /*xtal_in : 19.2, 38.4 (adc clk = 4.8000)*/ - { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x04, 0x05 - , 0x00, 0x16, 0x12, 0x00, 0x21, 0x46, 0x56}, - /*xtal_in : 27.12 (adc clk = 4.5200)*/ - { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x01, 0x04, 0x05 - , 0x1e, 0x15, 0x13, 0x02, 0x23, 0x44, 0x53} - /*xtal_in : 37.4 (adc clk = 4.6750)*/ -}; -#endif - -static void fc8150_clock_mode(HANDLE hDevice) -{ - int i; - -#if (BBM_XTAL_FREQ == 16000) - bbm_write(hDevice, 0x0016, 0); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x30a4); - - bbm_long_write(hDevice, 0x103c, 0x1f800000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x10); - bbm_write(hDevice, 0x2008, 0x41); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[0][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x30a4); - - bbm_long_write(hDevice, 0x103c, 0x1b000000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xbd); - bbm_write(hDevice, 0x2008, 0xa1); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[0][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3ae1); - - bbm_long_write(hDevice, 0x103c, 0x17a00000); - - bbm_write(hDevice, 0x200a, 0x05); - bbm_write(hDevice, 0x2009, 0x6b); - bbm_write(hDevice, 0x2008, 0x01); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[0][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 16384) - bbm_write(hDevice, 0x0016, 0); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x2f80); - - bbm_long_write(hDevice, 0x103c, 0x20418937); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0xf7); - bbm_write(hDevice, 0x2008, 0xdf); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[3][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x2f80); - - bbm_long_write(hDevice, 0x103c, 0x1ba5e354); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xa1); - bbm_write(hDevice, 0x2008, 0x2f); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[3][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3980); - - bbm_long_write(hDevice, 0x103c, 0x183126e9); - - bbm_write(hDevice, 0x200a, 0x05); - bbm_write(hDevice, 0x2009, 0x4a); - bbm_write(hDevice, 0x2008, 0x7f); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[3][i]); -#endif - -#elif (BBM_XTAL_FREQ == 18000) - bbm_write(hDevice, 0x0016, 0); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x2b3c); - - bbm_long_write(hDevice, 0x103c, 0x23700000); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0x9c); - bbm_write(hDevice, 0x2008, 0xac); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[2][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x2b3c); - - bbm_long_write(hDevice, 0x103c, 0x1e600000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x36); - bbm_write(hDevice, 0x2008, 0xc8); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[2][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3456); - - bbm_long_write(hDevice, 0x103c, 0x1a940000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xd0); - bbm_write(hDevice, 0x2008, 0xe5); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[2][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 19200) - bbm_write(hDevice, 0x0016, 0); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x2889); - - bbm_long_write(hDevice, 0x103c, 0x25cccccd); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0x62); - bbm_write(hDevice, 0x2008, 0xe1); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[4][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x2889); - - bbm_long_write(hDevice, 0x103c, 0x20666666); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0xf3); - bbm_write(hDevice, 0x2008, 0x5c); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[4][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3111); - - bbm_long_write(hDevice, 0x103c, 0x1c59999a); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x83); - bbm_write(hDevice, 0x2008, 0xd6); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[4][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 24000) - bbm_write(hDevice, 0x0016, 2); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x30a4); - - bbm_long_write(hDevice, 0x103c, 0x1f800000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x10); - bbm_write(hDevice, 0x2008, 0x41); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[0][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x30a4); - - bbm_long_write(hDevice, 0x103c, 0x1b000000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xbd); - bbm_write(hDevice, 0x2008, 0xa1); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[0][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3ae1); - - bbm_long_write(hDevice, 0x103c, 0x17a00000); - - bbm_write(hDevice, 0x200a, 0x05); - bbm_write(hDevice, 0x2009, 0x6b); - bbm_write(hDevice, 0x2008, 0x01); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[0][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 26000) - bbm_write(hDevice, 0x0016, 2); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x2ce6); - - bbm_long_write(hDevice, 0x103c, 0x221fffd4); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0xc0); - bbm_write(hDevice, 0x2008, 0x3c); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[1][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x2ce6); - - bbm_long_write(hDevice, 0x103c, 0x1d3fffda); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x60); - bbm_write(hDevice, 0x2008, 0x46); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[1][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x365a); - - bbm_long_write(hDevice, 0x103c, 0x1997ffdf); - - bbm_write(hDevice, 0x200a, 0x05); - bbm_write(hDevice, 0x2009, 0x00); - bbm_write(hDevice, 0x2008, 0x50); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[1][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 27000) - bbm_write(hDevice, 0x0016, 2); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x2b3c); - - bbm_long_write(hDevice, 0x103c, 0x23700000); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0x9c); - bbm_write(hDevice, 0x2008, 0xac); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[2][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x2b3c); - - bbm_long_write(hDevice, 0x103c, 0x1e600000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x36); - bbm_write(hDevice, 0x2008, 0xc8); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[2][i]); -#else - bbm_word_write(hDevice, 0x1032, 0x3456); - - bbm_long_write(hDevice, 0x103c, 0x1a940000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xd0); - bbm_write(hDevice, 0x2008, 0xe5); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[2][i]); -#endif - -#elif (BBM_XTAL_FREQ == 27120) - bbm_write(hDevice, 0x0016, 2); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x2b0b); - - bbm_long_write(hDevice, 0x103c, 0x239851ec); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0x98); - bbm_write(hDevice, 0x2008, 0x94); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[5][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x2b0b); - - bbm_long_write(hDevice, 0x103c, 0x1e828f5c); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x32); - bbm_write(hDevice, 0x2008, 0x02); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[5][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x341b); - - bbm_long_write(hDevice, 0x103c, 0x1ab23d71); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xcb); - bbm_write(hDevice, 0x2008, 0x70); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[5][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 24576) - bbm_write(hDevice, 0x0016, 2); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x2f80); - - bbm_long_write(hDevice, 0x103c, 0x20418937); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0xf7); - bbm_write(hDevice, 0x2008, 0xdf); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[3][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x2f80); - - bbm_long_write(hDevice, 0x103c, 0x1ba5e354); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xa1); - bbm_write(hDevice, 0x2008, 0x2f); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[3][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3980); - - bbm_long_write(hDevice, 0x103c, 0x183126e9); - - bbm_write(hDevice, 0x200a, 0x05); - bbm_write(hDevice, 0x2009, 0x4a); - bbm_write(hDevice, 0x2008, 0x7f); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[3][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 32000) - /* Default Clock */ - bbm_write(hDevice, 0x0016, 1); - -#if (BBM_BAND_WIDTH == 6) - /* Default Band-width */ - bbm_word_write(hDevice, 0x1032, 0x30a4); - - bbm_long_write(hDevice, 0x103c, 0x1f800000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x10); - bbm_write(hDevice, 0x2008, 0x41); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[0][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x30a4); - - bbm_long_write(hDevice, 0x103c, 0x1b000000); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xbd); - bbm_write(hDevice, 0x2008, 0xa1); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[0][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3ae1); - - bbm_long_write(hDevice, 0x103c, 0x17a00000); - - bbm_write(hDevice, 0x200a, 0x05); - bbm_write(hDevice, 0x2009, 0x6b); - bbm_write(hDevice, 0x2008, 0x01); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[0][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 37400) - bbm_write(hDevice, 0x0016, 1); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x299e); - - bbm_long_write(hDevice, 0x103c, 0x24d0cccd); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0x7a); - bbm_write(hDevice, 0x2008, 0x0f); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[6][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x299e); - - bbm_long_write(hDevice, 0x103c, 0x1f8e6666); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x0e); - bbm_write(hDevice, 0x2008, 0x66); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[6][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3261); - - bbm_long_write(hDevice, 0x103c, 0x1b9c999a); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0xa2); - bbm_write(hDevice, 0x2008, 0xbe); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[6][i]); - -#endif - -#elif (BBM_XTAL_FREQ == 38400) - bbm_write(hDevice, 0x0016, 1); - -#if (BBM_BAND_WIDTH == 6) - bbm_word_write(hDevice, 0x1032, 0x2889); - - bbm_long_write(hDevice, 0x103c, 0x25cccccd); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0x62); - bbm_write(hDevice, 0x2008, 0xe1); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_6M[4][i]); - -#elif (BBM_BAND_WIDTH == 7) - bbm_word_write(hDevice, 0x1032, 0x2889); - - bbm_long_write(hDevice, 0x103c, 0x20666666); - - bbm_write(hDevice, 0x200a, 0x03); - bbm_write(hDevice, 0x2009, 0xf3); - bbm_write(hDevice, 0x2008, 0x5c); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_7M[4][i]); - -#else - bbm_word_write(hDevice, 0x1032, 0x3111); - - bbm_long_write(hDevice, 0x103c, 0x1c59999a); - - bbm_write(hDevice, 0x200a, 0x04); - bbm_write(hDevice, 0x2009, 0x83); - bbm_write(hDevice, 0x2008, 0xd6); - - for (i = 0; i < 16; i++) - bbm_write(hDevice, 0x1040+i, filter_coef_8M[4][i]); - -#endif -#endif -} - -int fc8150_reset(HANDLE hDevice) -{ - bbm_write(hDevice, BBM_SW_RESET, 0x7f); - bbm_write(hDevice, BBM_SW_RESET, 0xff); - - return BBM_OK; -} - -int fc8150_probe(HANDLE hDevice) -{ - u16 ver; - bbm_word_read(hDevice, BBM_CHIP_ID_L, &ver); - - return (ver == 0x8150) ? BBM_OK : BBM_NOK; -} - -int fc8150_init(HANDLE hDevice) -{ - bbm_write(hDevice, 0x00b0, 0x03); - bbm_write(hDevice, 0x00b1, 0x00); - bbm_write(hDevice, 0x00b2, 0x14); - - fc8150_reset(hDevice); - fc8150_clock_mode(hDevice); - - bbm_write(hDevice, 0x1000, 0x27); - bbm_write(hDevice, 0x1004, 0x4d); - bbm_write(hDevice, 0x1069, 0x09); - bbm_write(hDevice, 0x1075, 0x00); - - bbm_word_write(hDevice, 0x00b4, 0x0000); - /*bbm_write(hDevice, 0x00b6, 0x03);*/ /* Default 0x03, 0x00, 0x07*/ - bbm_write(hDevice, 0x00b9, 0x00); - bbm_write(hDevice, 0x00ba, 0x01); - - bbm_write(hDevice, 0x2004, 0x41); - bbm_write(hDevice, 0x2106, 0x1f); - - bbm_write(hDevice, 0x5010, 0x00); - bbm_write(hDevice, BBM_RS_FAIL_TX, 0x00); /* RS FAILURE TX: 0x02*/ - - bbm_word_write(hDevice, BBM_BUF_TS_START, TS_BUF_START); - bbm_word_write(hDevice, BBM_BUF_TS_END, TS_BUF_END); - bbm_word_write(hDevice, BBM_BUF_TS_THR, TS_BUF_THR); - - /*bbm_word_write(hDevice, BBM_BUF_AC_START, AC_BUF_START);*/ - /*bbm_word_write(hDevice, BBM_BUF_AC_END, AC_BUF_END);*/ - /*bbm_word_write(hDevice, BBM_BUF_AC_THR, AC_BUF_THR);*/ - - /*bbm_write(hDevice, BBM_INT_POLAR_SEL, 0x00);*/ - /*bbm_write(hDevice, BBM_INT_AUTO_CLEAR, 0x01);*/ - /*bbm_write(hDevice, BBM_STATUS_AUTO_CLEAR_EN, 0x00);*/ - - bbm_write(hDevice, BBM_BUF_ENABLE, 0x01); - bbm_write(hDevice, BBM_BUF_INT, 0x01); - - bbm_write(hDevice, BBM_INT_MASK, 0x07); - bbm_write(hDevice, BBM_INT_STS_EN, 0x01); - - return BBM_OK; -} - -int fc8150_deinit(HANDLE hDevice) -{ - bbm_write(hDevice, BBM_SW_RESET, 0x00); - - return BBM_OK; -} - -int fc8150_scan_status(HANDLE hDevice) -{ - u32 ifagc_timeout = 7; - u32 ofdm_timeout = 16; - u32 ffs_lock_timeout = 10; - u32 dagc_timeout = 100; /* always done*/ - u32 cfs_timeout = 12; - u32 tmcc_timeout = 105; - u32 ts_err_free_timeout = 0; - int rssi; - u8 data, data1; - u8 lay0_mod, lay0_cr; - int i; - - for (i = 0; i < ifagc_timeout; i++) { - bbm_read(hDevice, 0x3025, &data); - - if (data & 0x01) - break; - - msWait(10); - } - - if (i == ifagc_timeout) - return BBM_NOK; - - tuner_get_rssi(hDevice, &rssi); - - if (rssi < -107) - return BBM_NOK; - - for (; i < ofdm_timeout; i++) { - bbm_read(hDevice, 0x3025, &data); - - if (data & 0x08) - break; - - msWait(10); - } - - if (i == ofdm_timeout) - return BBM_NOK; - - if (0 == (data & 0x04)) - return BBM_NOK; - - for (; i < ffs_lock_timeout; i++) { - bbm_read(hDevice, 0x3026, &data); - - if (data & 0x10) - break; - - msWait(10); - } - - if (i == ffs_lock_timeout) - return BBM_NOK; - - /* DAGC Lock*/ - for (i = 0; i < dagc_timeout; i++) { - bbm_read(hDevice, 0x3026, &data); - - if (data & 0x01) - break; - - msWait(10); - } - - if (i == dagc_timeout) - return BBM_NOK; - - for (i = 0; i < cfs_timeout; i++) { - bbm_read(hDevice, 0x3025, &data); - - if (data & 0x40) - break; - - msWait(10); - } - - if (i == cfs_timeout) - return BBM_NOK; - - bbm_read(hDevice, 0x2023, &data1); - if (data1 & 1) - return BBM_NOK; - - for (i = 0; i < tmcc_timeout; i++) { - bbm_read(hDevice, 0x3026, &data); - if (data & 0x02) - break; - - msWait(10); - } - - if (i == tmcc_timeout) - return BBM_NOK; - - bbm_read(hDevice, 0x4113, &data); - bbm_read(hDevice, 0x4114, &data1); - - if (((data >> 3) & 0x1) == 0) - return BBM_NOK; - - lay0_mod = ((data & 0x10) >> 2) | - ((data & 0x20) >> 4) | - ((data & 0x40) >> 6); - - lay0_cr = ((data & 0x80) >> 5) | - ((data1 & 0x01) << 1) | - ((data1 & 0x02) >> 1); - - if (!((lay0_mod == 1) || (lay0_mod == 2))) - return BBM_NOK; - - if (((0x70 & data) == 0x40) && ((0x1c & data1) == 0x18)) - ts_err_free_timeout = 400; - else - ts_err_free_timeout = 650; - - for (i = 0; i < ts_err_free_timeout; i++) { - bbm_read(hDevice, 0x5053, &data); - if (data & 0x01) - break; - - msWait(10); - } - - if (i == ts_err_free_timeout) - return BBM_NOK; - - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fc8150_bb.h b/drivers/media/isdbt/fc8150/fc8150_bb.h deleted file mode 100644 index 696c621..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_bb.h +++ /dev/null @@ -1,22 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_bb.h - - Description : API of 1-SEG baseband module - -*******************************************************************************/ - - -#ifndef __FC8150_BB__ -#define __FC8150_BB__ - -#include "fci_types.h" - -extern int fc8150_reset(HANDLE hDevice); -extern int fc8150_probe(HANDLE hDevice); -extern int fc8150_init(HANDLE hDevice); -extern int fc8150_deinit(HANDLE hDevice); -extern int fc8150_scan_status(HANDLE hDevice); - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_hpi.c b/drivers/media/isdbt/fc8150/fc8150_hpi.c deleted file mode 100644 index 67d8484..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_hpi.c +++ /dev/null @@ -1,197 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_hpi.c - - Description : fc8150 host interface - -*******************************************************************************/ -#include "linux/io.h" - -#include "fci_types.h" -#include "fc8150_regs.h" -#include "fci_oal.h" - -#define HPIC_READ 0x01 /* read command */ -#define HPIC_WRITE 0x02 /* write command */ -#define HPIC_AINC 0x04 /* address increment */ -#define HPIC_BMODE 0x00 /* byte mode */ -#define HPIC_WMODE 0x10 /* word mode */ -#define HPIC_LMODE 0x20 /* long mode */ -#define HPIC_ENDIAN 0x00 /* little endian */ -#define HPIC_CLEAR 0x80 /* currently not used */ - -#define BBM_BASE_ADDR 0 -#define BBM_BASE_OFFSET 0 - -#define FC8150_ADDR_REG(x) outb(x, (BBM_BASE_ADDR \ - + (BBM_ADDRESS_REG << BBM_BASE_OFFSET))) -#define FC8150_CMD_REG(x) outb(x, (BBM_BASE_ADDR \ - + (BBM_COMMAND_REG << BBM_BASE_OFFSET))) -#define FC8150_DATA_REG_OUT(x) outb(x, (BBM_BASE_ADDR \ - + (BBM_DATA_REG << BBM_BASE_OFFSET))) -#define FC8150_DATA_REG_IN inb(BBM_BASE_ADDR \ - + (BBM_DATA_REG << BBM_BASE_OFFSET)) - -int fc8150_hpi_init(HANDLE hDevice, u16 param1, u16 param2) -{ - OAL_CREATE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_byteread(HANDLE hDevice, u16 addr, u8 *data) -{ - u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - - *data = FC8150_DATA_REG_IN; - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_wordread(HANDLE hDevice, u16 addr, u16 *data) -{ - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - - *data = FC8150_DATA_REG_IN; - *data |= FC8150_DATA_REG_IN << 8; - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_longread(HANDLE hDevice, u16 addr, u32 *data) -{ - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - - *data = FC8150_DATA_REG_IN; - *data |= FC8150_DATA_REG_IN << 8; - *data |= FC8150_DATA_REG_IN << 16; - *data |= FC8150_DATA_REG_IN << 24; - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - s32 i; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - - for (i = 0; i < length; i++) - data[i] = FC8150_DATA_REG_IN; - - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_bytewrite(HANDLE hDevice, u16 addr, u8 data) -{ - u8 command = HPIC_WRITE | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - FC8150_DATA_REG_OUT(data); - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_wordwrite(HANDLE hDevice, u16 addr, u16 data) -{ - u8 command = HPIC_WRITE | HPIC_BMODE | HPIC_ENDIAN | HPIC_AINC; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - FC8150_DATA_REG_OUT(data & 0xff); - FC8150_DATA_REG_OUT((data & 0xff00) >> 8); - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_longwrite(HANDLE hDevice, u16 addr, u32 data) -{ - u8 command = HPIC_WRITE | HPIC_BMODE | HPIC_ENDIAN | HPIC_AINC; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - - FC8150_DATA_REG_OUT(data & 0xff); - FC8150_DATA_REG_OUT((data & 0xff00) >> 8); - FC8150_DATA_REG_OUT((data & 0xff0000) >> 16); - FC8150_DATA_REG_OUT((data & 0xff000000) >> 24); - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - s32 i; - u8 command = HPIC_WRITE | HPIC_BMODE | HPIC_ENDIAN | HPIC_AINC; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - for (i = 0; i < length; i++) - FC8150_DATA_REG_OUT(data[i]); - - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length) -{ - s32 i; - u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_ADDR_REG(addr & 0xff); - FC8150_ADDR_REG((addr & 0xff00) >> 8); - FC8150_CMD_REG(command); - - for (i = 0; i < length; i++) - data[i] = FC8150_DATA_REG_IN; - - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_hpi_deinit(HANDLE hDevice) -{ - OAL_DELETE_SEMAPHORE(); - - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fc8150_hpi.h b/drivers/media/isdbt/fc8150/fc8150_hpi.h deleted file mode 100644 index b99921a..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_hpi.h +++ /dev/null @@ -1,33 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_hpi.c - - Description : API of 1-SEG baseband module - -*******************************************************************************/ - -#ifndef __FC8150_HPI_H__ -#define __FC8150_HPI_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8150_hpi_init(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8150_hpi_byteread(HANDLE hDevice, u16 addr, u8 *data); -extern int fc8150_hpi_wordread(HANDLE hDevice, u16 addr, u16 *data); -extern int fc8150_hpi_longread(HANDLE hDevice, u16 addr, u32 *data); -extern int fc8150_hpi_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_hpi_bytewrite(HANDLE hDevice, u16 addr, u8 data); -extern int fc8150_hpi_wordwrite(HANDLE hDevice, u16 addr, u16 data); -extern int fc8150_hpi_longwrite(HANDLE hDevice, u16 addr, u32 data); -extern int fc8150_hpi_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_hpi_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length); -extern int fc8150_hpi_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_i2c.c b/drivers/media/isdbt/fc8150/fc8150_i2c.c deleted file mode 100644 index 5d264c1..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_i2c.c +++ /dev/null @@ -1,237 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_i2c.c - - Description : fc8150 host interface - -*******************************************************************************/ - -#include "fci_types.h" -#include "fc8150_regs.h" -#include "fci_oal.h" -#include "fci_hal.h" - -#define HPIC_READ 0x01 /* read command */ -#define HPIC_WRITE 0x02 /* write command */ -#define HPIC_AINC 0x04 /* address increment */ -#define HPIC_BMODE 0x00 /* byte mode */ -#define HPIC_WMODE 0x10 /* word mode */ -#define HPIC_LMODE 0x20 /* long mode */ -#define HPIC_ENDIAN 0x00 /* little endian */ -#define HPIC_CLEAR 0x80 /* currently not used */ - -#define CHIP_ADDR 0x58 - -static int i2c_bulkread(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u16 length) -{ - /* Write your own i2c driver code here for read operation. */ - - return BBM_OK; -} - -static int i2c_bulkwrite(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u16 length) -{ - /* Write your own i2c driver code here for Write operation. */ - - return BBM_OK; -} - -static int i2c_dataread(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u32 length) -{ - return i2c_bulkread(hDevice, chip, addr, data, length); -} - -int fc8150_bypass_read(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u16 length) -{ - int res; - u8 bypass_addr = 0x03; - u8 bypass_data = 1; - u8 bypass_len = 1; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, bypass_addr - , &bypass_data, bypass_len); - res |= i2c_bulkread(hDevice, chip, addr, data, length); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_bypass_write(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u16 length) -{ - int res; - u8 bypass_addr = 0x03; - u8 bypass_data = 1; - u8 bypass_len = 1; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, bypass_addr - , &bypass_data, bypass_len); - res |= i2c_bulkwrite(hDevice, chip, addr, data, length); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_init(HANDLE hDevice, u16 param1, u16 param2) -{ - OAL_CREATE_SEMAPHORE(); - - /* for TSIF, you can call here your own TSIF initialization function. */ - /* tsif_initialize(); */ - - bbm_write(hDevice, BBM_TS_CLK_DIV, 0x04); - bbm_write(hDevice, BBM_TS_PAUSE, 0x80); - - bbm_write(hDevice, BBM_TS_CTRL, 0x02); - bbm_write(hDevice, BBM_TS_SEL, 0x84); - - return BBM_OK; -} - -int fc8150_i2c_byteread(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkread(hDevice, CHIP_ADDR, BBM_DATA_REG, data, 1); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_wordread(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkread(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)data, 2); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_longread(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkread(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)data, 4); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkread(hDevice, CHIP_ADDR, BBM_DATA_REG, data, length); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_bytewrite(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)&data, 1); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_wordwrite(HANDLE hDevice, u16 addr, u16 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)&data, 2); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_longwrite(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)&data, 4); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_DATA_REG, data, length); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length) -{ - int res; - u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN; - - OAL_OBTAIN_SEMAPHORE(); - res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG - , (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1); - res |= i2c_dataread(hDevice, CHIP_ADDR, BBM_DATA_REG, data, length); - OAL_RELEASE_SEMAPHORE(); - - return res; -} - -int fc8150_i2c_deinit(HANDLE hDevice) -{ - bbm_write(hDevice, BBM_TS_SEL, 0x00); - - /* tsif_disable(); */ - - OAL_DELETE_SEMAPHORE(); - - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fc8150_i2c.h b/drivers/media/isdbt/fc8150/fc8150_i2c.h deleted file mode 100644 index 64d69de..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_i2c.h +++ /dev/null @@ -1,33 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_i2c.c - - Description : API of 1-SEG baseband module - -*******************************************************************************/ - -#ifndef __FC8150_I2C_H__ -#define __FC8150_I2C_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8150_i2c_init(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8150_i2c_byteread(HANDLE hDevice, u16 addr, u8 *data); -extern int fc8150_i2c_wordread(HANDLE hDevice, u16 addr, u16 *data); -extern int fc8150_i2c_longread(HANDLE hDevice, u16 addr, u32 *data); -extern int fc8150_i2c_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_i2c_bytewrite(HANDLE hDevice, u16 addr, u8 data); -extern int fc8150_i2c_wordwrite(HANDLE hDevice, u16 addr, u16 data); -extern int fc8150_i2c_longwrite(HANDLE hDevice, u16 addr, u32 data); -extern int fc8150_i2c_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_i2c_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length); -extern int fc8150_i2c_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_isr.c b/drivers/media/isdbt/fc8150/fc8150_isr.c deleted file mode 100644 index 259576b..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_isr.c +++ /dev/null @@ -1,47 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_isr.c - - Description : fc8150 interrupt service routine - -*******************************************************************************/ -#include "fci_types.h" -#include "fci_hal.h" -#include "fci_oal.h" -#include "fc8150_regs.h" - -int (*pTSCallback)(u32 userdata, u8 *data, int length) = NULL; -int (*pACCallback)(u32 userdata, u8 *data, int length) = NULL; - -u32 gTSUserData; -u32 gACUserData; - -/* static u8 acBuffer[AC_BUF_THR]; */ -static u8 tsBuffer[TS_BUF_SIZE]; - -static void fc8150_data(HANDLE hDevice, u8 bufIntStatus) -{ - if (bufIntStatus & 0x01) { /* TS */ - bbm_data(hDevice, BBM_TS_DATA, &tsBuffer[0], TS_BUF_SIZE/2); - - if (pTSCallback) - (*pTSCallback)(gTSUserData - , &tsBuffer[0], TS_BUF_SIZE/2); - } -} - -void fc8150_isr(HANDLE hDevice) -{ - u8 IntStatus = 0; - u8 bufIntStatus = 0; - - bbm_read(hDevice, BBM_INT_STATUS, &IntStatus); - bbm_write(hDevice, BBM_INT_STATUS, IntStatus); - - bbm_read(hDevice, BBM_BUF_STATUS, &bufIntStatus); - if (bufIntStatus) { - bbm_write(hDevice, BBM_BUF_STATUS, bufIntStatus); - fc8150_data(hDevice, bufIntStatus); - } -} diff --git a/drivers/media/isdbt/fc8150/fc8150_isr.h b/drivers/media/isdbt/fc8150/fc8150_isr.h deleted file mode 100644 index d7f1098..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_isr.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef __FC8150_ISR__ -#define __FC8150_ISR__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fci_types.h" - -extern u32 gACUserData; -extern u32 gTSUserData; - -extern int (*pACCallback)(u32 userdata, u8 *data, int length); -extern int (*pTSCallback)(u32 userdata, u8 *data, int length); - -extern void fc8150_isr(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_ppi.c b/drivers/media/isdbt/fc8150/fc8150_ppi.c deleted file mode 100644 index 7c9fc07..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_ppi.c +++ /dev/null @@ -1,212 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_ppi.c - - Description : fc8150 host interface - -*******************************************************************************/ -#include "linux/io.h" - -#include "fci_types.h" -#include "fc8150_regs.h" -#include "fci_oal.h" - -#define BBM_BASE_ADDR 0x00 - -#define PPI_BMODE 0x00 -#define PPI_WMODE 0x10 -#define PPI_LMODE 0x20 -#define PPI_READ 0x40 -#define PPI_WRITE 0x00 -#define PPI_AINC 0x80 - -#define FC8150_PPI_REG_OUT(x) outb(x, BBM_BASE_ADDR) -#define FC8150_PPI_REG_IN inb(BBM_BASE_ADDR) - -int fc8150_ppi_init(HANDLE hDevice, u16 param1, u16 param2) -{ - OAL_CREATE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_byteread(HANDLE hDevice, u16 addr, u8 *data) -{ - u32 length = 1; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(PPI_READ | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - *data = FC8150_PPI_REG_IN; - OAL_RELEASE_SEMAPHORE(); - return BBM_OK; -} - -int fc8150_ppi_wordread(HANDLE hDevice, u16 addr, u16 *data) -{ - u32 length = 2; - u8 command = PPI_AINC | PPI_READ | PPI_BMODE; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(command | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - *data = FC8150_PPI_REG_IN; - *data |= FC8150_PPI_REG_IN << 8; - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_longread(HANDLE hDevice, u16 addr, u32 *data) -{ - u32 length = 4; - u8 command = PPI_AINC | PPI_READ | PPI_BMODE; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(command | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - *data = FC8150_PPI_REG_IN; - *data |= FC8150_PPI_REG_IN << 8; - *data |= FC8150_PPI_REG_IN << 16; - *data |= FC8150_PPI_REG_IN << 24; - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int i; - u8 command = PPI_AINC | PPI_READ | PPI_BMODE; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(command | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - for (i = 0; i < length; i++) - data[i] = FC8150_PPI_REG_IN; - - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_bytewrite(HANDLE hDevice, u16 addr, u8 data) -{ - u32 length = 1; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(PPI_WRITE | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - FC8150_PPI_REG_OUT(data); - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_wordwrite(HANDLE hDevice, u16 addr, u16 data) -{ - u32 length = 2; - u8 command = PPI_AINC | PPI_WRITE | PPI_BMODE; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(command | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - FC8150_PPI_REG_OUT(data & 0xff); - FC8150_PPI_REG_OUT((data & 0xff00) >> 8); - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_longwrite(HANDLE hDevice, u16 addr, u32 data) -{ - u32 length = 4; - u8 command = PPI_AINC | PPI_WRITE | PPI_BMODE; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(command | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - FC8150_PPI_REG_OUT(data & 0x000000ff); - FC8150_PPI_REG_OUT((data & 0x0000ff00) >> 8); - FC8150_PPI_REG_OUT((data & 0x00ff0000) >> 16); - FC8150_PPI_REG_OUT((data & 0xff000000) >> 24); - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int i; - u8 command = PPI_AINC | PPI_WRITE | PPI_BMODE; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(command | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - for (i = 0; i < length; i++) - FC8150_PPI_REG_OUT(data[i]); - - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length) -{ - int i; - u8 command = PPI_READ | PPI_BMODE; - - OAL_OBTAIN_SEMAPHORE(); - FC8150_PPI_REG_OUT(addr & 0xff); - FC8150_PPI_REG_OUT((addr & 0xff00) >> 8); - FC8150_PPI_REG_OUT(command | ((length & 0x0f0000) >> 16)); - FC8150_PPI_REG_OUT((length & 0xff00) >> 8); - FC8150_PPI_REG_OUT(length & 0xff); - - for (i = 0; i < length; i++) - data[i] = FC8150_PPI_REG_IN; - - OAL_RELEASE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_ppi_deinit(HANDLE hDevice) -{ - OAL_DELETE_SEMAPHORE(); - - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fc8150_ppi.h b/drivers/media/isdbt/fc8150/fc8150_ppi.h deleted file mode 100644 index b7d5322..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_ppi.h +++ /dev/null @@ -1,33 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_ppi.c - - Description : API of 1-SEG baseband module - -*******************************************************************************/ - -#ifndef __FC8150_PPI_H__ -#define __FC8150_PPI_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8150_ppi_init(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8150_ppi_byteread(HANDLE hDevice, u16 addr, u8 *data); -extern int fc8150_ppi_wordread(HANDLE hDevice, u16 addr, u16 *data); -extern int fc8150_ppi_longread(HANDLE hDevice, u16 addr, u32 *data); -extern int fc8150_ppi_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_ppi_bytewrite(HANDLE hDevice, u16 addr, u8 data); -extern int fc8150_ppi_wordwrite(HANDLE hDevice, u16 addr, u16 data); -extern int fc8150_ppi_longwrite(HANDLE hDevice, u16 addr, u32 data); -extern int fc8150_ppi_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_ppi_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length); -extern int fc8150_ppi_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_regs.h b/drivers/media/isdbt/fc8150/fc8150_regs.h deleted file mode 100644 index 235e703..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_regs.h +++ /dev/null @@ -1,136 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_regs.h - - Description : Baseband register header - -*******************************************************************************/ - -#ifndef __FC8150_REGS_H__ -#define __FC8150_REGS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* #define BBM_XTAL_FREQ 16000 */ -/* #define BBM_XTAL_FREQ 16384 */ -/* #define BBM_XTAL_FREQ 18000 */ -/* #define BBM_XTAL_FREQ 19200 */ -#define BBM_XTAL_FREQ 24000 -/* #define BBM_XTAL_FREQ 26000 */ -/* #define BBM_XTAL_FREQ 27000 */ -/* #define BBM_XTAL_FREQ 27120 */ -/* #define BBM_XTAL_FREQ 24576 */ -/* #define BBM_XTAL_FREQ 32000 */ -/* #define BBM_XTAL_FREQ 37400 */ -/* #define BBM_XTAL_FREQ 38400 */ - -#define BBM_BAND_WIDTH 6 /* BW = 6M */ -/* #define BBM_BAND_WIDTH 7 */ /* BW = 7M */ -/* #define BBM_BAND_WIDTH 8 */ /* BW = 8M */ - - /* Host register */ -#define BBM_ADDRESS_REG 0x00 -#define BBM_COMMAND_REG 0x01 -#define BBM_DATA_REG 0x02 - - /* Common */ -#define BBM_AP2APB_LT 0x0000 -#define BBM_SW_RESET 0x0001 -#define BBM_INT_STATUS 0x0002 -#define BBM_INT_MASK 0x0003 -#define BBM_INT_STS_EN 0x0006 -#define BBM_AC_DATA 0x0007 -#define BBM_TS_DATA 0x0008 -#define BBM_TS_CLK_DIV 0x0010 -#define BBM_TS_CTRL 0x0011 -#define BBM_MD_MISO 0x0012 -#define BBM_TS_SEL 0x0013 -#define BBM_TS_PAUSE 0x0014 -#define BBM_RF_DEVID 0x0015 -#define BBM_INT_AUTO_CLEAR 0x0017 -#define BBM_INT_PERIOD 0x0018 -#define BBM_NON_AUTO_INT_PERIOD 0x0019 -#define BBM_STATUS_AUTO_CLEAR_EN 0x001a -#define BBM_INT_POLAR_SEL 0x0020 -#define BBM_PATTERN_MODE 0x0021 -#define BBM_CHIP_ID_L 0x0026 -#define BBM_CHIP_VERSION 0x0028 -#define BBM_TS_PAT_L 0x00a0 -#define BBM_AC_PAT_L 0x00a2 -#define BBM_VERIFY_TEST 0x00a4 - - /* I2C */ -#define BBM_I2C_PR_L 0x0030 -#define BBM_I2C_PR_H 0x0031 -#define BBM_I2C_CTR 0x0032 -#define BBM_I2C_RXR 0x0033 -#define BBM_I2C_SR 0x0034 -#define BBM_I2C_TXR 0x0035 -#define BBM_I2C_CR 0x0036 - - /* DM Control */ -#define BBM_DM_AUTO_ENABLE 0x0040 -#define BBM_DM_READ_SIZE 0x0041 -#define BBM_DM_START_ADDR 0x0042 -#define BBM_DM_TIMER_GAP 0x0043 -#define BBM_DM_BUSY 0x0044 - - /* RSSI */ -#define BBM_RSSI 0x0100 - - /* CE */ -#define BBM_WSCN_MSQ 0x4063 - - /* FEC */ -#define BBM_REQ_BER 0x5000 -#define BBM_MAIN_BER_RXD_RSPS 0x5020 -#define BBM_MAIN_BER_ERR_RSPS 0x5022 -#define BBM_MAIN_BER_ERR_BITS 0x5024 -#define BBM_BER_RXD_RSPS 0x5030 -#define BBM_BER_ERR_RSPS 0x5032 -#define BBM_BER_ERR_BITS 0x5034 -#define BBM_DMP_BER_RXD_BITS 0x5040 -#define BBM_DMP_BER_ERR_BITS 0x5044 - - /* Buffer */ -#define BBM_BUF_STATUS 0x8000 -#define BBM_BUF_OVERRUN 0x8001 -#define BBM_BUF_ENABLE 0x8002 -#define BBM_BUF_INT 0x8003 -#define BBM_RS_FAIL_TX 0x8004 - -#define BBM_SYNC_RELATED_INT_STATUS 0x8006 -#define BBM_SYNC_RELATED_INT_ENABLE 0x8007 -#define BBM_HANGING_TS 0x800A -#define BBM_HANGING_AC 0x800B -#define BBM_HANGING_ENABLE 0x800C - -#define BBM_BUF_TS_START 0x8010 -#define BBM_BUF_AC_START 0x8012 -#define BBM_BUF_TS_END 0x8020 -#define BBM_BUF_AC_END 0x8022 -#define BBM_BUF_TS_THR 0x8030 -#define BBM_BUF_AC_THR 0x8032 - - /* DM */ -#define BBM_DM_DATA 0xf001 - - /* Buffer Configuration */ -#define TS_BUF_SIZE (188*32*2) -#define TS_BUF_START (0) -#define TS_BUF_END (TS_BUF_START+TS_BUF_SIZE-1) -#define TS_BUF_THR ((TS_BUF_SIZE>>1)-1) - -#define AC_BUF_SIZE (204*2) -#define AC_BUF_START (TS_BUF_START+TS_BUF_SIZE) -#define AC_BUF_END (AC_BUF_START+AC_BUF_SIZE-1) -#define AC_BUF_THR ((AC_BUF_SIZE>>1)-1) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_spi.c b/drivers/media/isdbt/fc8150/fc8150_spi.c deleted file mode 100644 index 9903fc8..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_spi.c +++ /dev/null @@ -1,293 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_spi.c - - Description : fc8150 host interface - -*******************************************************************************/ -#include -#include - -#include "fci_types.h" -#include "fc8150_regs.h" -#include "fci_oal.h" - -#define SPI_BMODE 0x00 -#define SPI_WMODE 0x10 -#define SPI_LMODE 0x20 -#define SPI_READ 0x40 -#define SPI_WRITE 0x00 -#define SPI_AINC 0x80 -#define CHIPID (0 << 3) - -#define DRIVER_NAME "fc8150_spi" - -struct spi_device *fc8150_spi; - -static u8 tx_data[10]; -static u8 rdata_buf[8192]; -static u8 wdata_buf[8192]; - -static DEFINE_MUTEX(lock); - -static int __devinit fc8150_spi_probe(struct spi_device *spi) -{ - s32 ret; - - PRINTF(0, "fc8150_spi_probe\n"); - - spi->max_speed_hz = 24000000; - spi->bits_per_word = 8; - spi->mode = SPI_MODE_0; - - ret = spi_setup(spi); - - if (ret < 0) - return ret; - - fc8150_spi = spi; - - return ret; -} - -static int fc8150_spi_remove(struct spi_device *spi) -{ - - return 0; -} - -static struct spi_driver fc8150_spi_driver = { - .driver = { - .name = DRIVER_NAME, - .owner = THIS_MODULE, - }, - .probe = fc8150_spi_probe, - .remove = __devexit_p(fc8150_spi_remove), -}; - -static int fc8150_spi_write_then_read(struct spi_device *spi - , u8 *txbuf, u16 tx_length, u8 *rxbuf, u16 rx_length) -{ - int res = 0; - - struct spi_message message; - struct spi_transfer x; - - spi_message_init(&message); - memset(&x, 0, sizeof x); - - spi_message_add_tail(&x, &message); - - memcpy(&wdata_buf[0], txbuf, tx_length); - - x.tx_buf = &wdata_buf[0]; - x.rx_buf = &rdata_buf[0]; - x.len = tx_length + rx_length; - x.cs_change = 0; - x.bits_per_word = 8; - res = spi_sync(spi, &message); - - memcpy(rxbuf, x.rx_buf + tx_length, rx_length); - - return res; -} - -static int spi_bulkread(HANDLE hDevice, u16 addr - , u8 command, u8 *data, u16 length) -{ - int res; - - tx_data[0] = addr & 0xff; - tx_data[1] = (addr >> 8) & 0xff; - tx_data[2] = (command & 0xf0) | CHIPID | ((length >> 16) & 0x07); - tx_data[3] = (length >> 8) & 0xff; - tx_data[4] = length & 0xff; - - res = fc8150_spi_write_then_read(fc8150_spi, &tx_data[0] - , 5, data, length); - - if (res) { - PRINTF(0, "fc8150_spi_bulkread fail : %d\n", res); - return BBM_NOK; - } - - return BBM_OK; -} - -static int spi_bulkwrite(HANDLE hDevice, u16 addr - , u8 command, u8 *data, u16 length) -{ - int i; - int res; - - tx_data[0] = addr & 0xff; - tx_data[1] = (addr >> 8) & 0xff; - tx_data[2] = (command & 0xf0) | CHIPID | ((length >> 16) & 0x07); - tx_data[3] = (length >> 8) & 0xff; - tx_data[4] = length & 0xff; - - for (i = 0; i < length; i++) - tx_data[5+i] = data[i]; - - res = fc8150_spi_write_then_read(fc8150_spi - , &tx_data[0], length+5, NULL, 0); - - if (res) { - PRINTF(0, "fc8150_spi_bulkwrite fail : %d\n", res); - return BBM_NOK; - } - - return BBM_OK; -} - -static int spi_dataread(HANDLE hDevice, u16 addr - , u8 command, u8 *data, u32 length) -{ - int res; - - tx_data[0] = addr & 0xff; - tx_data[1] = (addr >> 8) & 0xff; - tx_data[2] = (command & 0xf0) | CHIPID | ((length >> 16) & 0x07); - tx_data[3] = (length >> 8) & 0xff; - tx_data[4] = length & 0xff; - - res = fc8150_spi_write_then_read(fc8150_spi - , &tx_data[0], 5, data, length); - - if (res) { - PRINTF(0, "fc8150_spi_dataread fail : %d\n", res); - return BBM_NOK; - } - - return BBM_OK; -} - -int fc8150_spi_init(HANDLE hDevice, u16 param1, u16 param2) -{ - int res = 0; - - PRINTF(0, "fc8150_spi_init : %d\n", res); - - res = spi_register_driver(&fc8150_spi_driver); - - if (res) { - PRINTF(0, "fc8150_spi register fail : %d\n", res); - return BBM_NOK; - } - - return res; -} - -int fc8150_spi_byteread(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - u8 command = SPI_READ; - - mutex_lock(&lock); - res = spi_bulkread(hDevice, addr, command, data, 1); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_wordread(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - u8 command = SPI_READ | SPI_AINC; - - mutex_lock(&lock); - res = spi_bulkread(hDevice, addr, command, (u8 *)data, 2); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_longread(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - u8 command = SPI_READ | SPI_AINC; - - mutex_lock(&lock); - res = spi_bulkread(hDevice, addr, command, (u8 *)data, 4); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = SPI_READ | SPI_AINC; - - mutex_lock(&lock); - res = spi_bulkread(hDevice, addr, command, data, length); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_bytewrite(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - u8 command = SPI_WRITE; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, addr, command, (u8 *)&data, 1); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_wordwrite(HANDLE hDevice, u16 addr, u16 data) -{ - int res; - u8 command = SPI_WRITE | SPI_AINC; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, addr, command, (u8 *)&data, 2); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_longwrite(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - u8 command = SPI_WRITE | SPI_AINC; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, addr, command, (u8 *)&data, 4); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = SPI_WRITE | SPI_AINC; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, addr, command, data, length); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length) -{ - int res; - u8 command = SPI_READ; - - mutex_lock(&lock); - res = spi_dataread(hDevice, addr, command, data, length); - mutex_unlock(&lock); - - return res; -} - -int fc8150_spi_deinit(HANDLE hDevice) -{ - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fc8150_spi.h b/drivers/media/isdbt/fc8150/fc8150_spi.h deleted file mode 100644 index 6fd96d1..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_spi.h +++ /dev/null @@ -1,33 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_spi.c - - Description : API of 1-SEG baseband module - -*******************************************************************************/ - -#ifndef __FC8150_SPI__ -#define __FC8150_SPI__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8150_spi_init(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8150_spi_byteread(HANDLE hDevice, u16 addr, u8 *data); -extern int fc8150_spi_wordread(HANDLE hDevice, u16 addr, u16 *data); -extern int fc8150_spi_longread(HANDLE hDevice, u16 addr, u32 *data); -extern int fc8150_spi_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_spi_bytewrite(HANDLE hDevice, u16 addr, u8 data); -extern int fc8150_spi_wordwrite(HANDLE hDevice, u16 addr, u16 data); -extern int fc8150_spi_longwrite(HANDLE hDevice, u16 addr, u32 data); -extern int fc8150_spi_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_spi_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length); -extern int fc8150_spi_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_spib.c b/drivers/media/isdbt/fc8150/fc8150_spib.c deleted file mode 100644 index b2feccb..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_spib.c +++ /dev/null @@ -1,210 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_spib.c - - Description : fc8150 host interface - -*******************************************************************************/ -#include "fci_types.h" -#include "fc8150_regs.h" -#include "fci_oal.h" - -#define SPI_BMODE 0x00 -#define SPI_WMODE 0x10 -#define SPI_LMODE 0x20 -#define SPI_READ 0x40 -#define SPI_WRITE 0x00 -#define SPI_AINC 0x80 -#define CHIPID (0 << 3) - -static int spi_bulkread(HANDLE hDevice, u16 addr -, u8 command, u8 *data, u16 length) -{ - /*unsigned char *cmd; - - cmd = g_SpiCmd; - - cmd[0] = addr & 0xff; - cmd[1] = (addr >> 8) & 0xff; - cmd[2] = (command & 0xf0) | CHIPID | ((length >> 16) & 0x07); - cmd[3] = (length >> 8) & 0xff; - cmd[4] = length & 0xff; - - spi_cmd.pCmd = cmd; - spi_cmd.cmdSize = 5; - spi_cmd.pData = g_SpiData; - spi_cmd.dataSize = length; - - // Send Command and data through the SPI - if (SPID_SendCommand_ByteRead(&spid, &spi_cmd)) - return BBM_NOK; - - memcpy(data, g_SpiData, length);*/ - - return BBM_OK; -} - -static int spi_bulkwrite(HANDLE hDevice, u16 addr - , u8 command, u8 *data, u16 length) -{ - /*unsigned char *cmd; - - cmd = g_SpiCmd; - - cmd[0] = addr & 0xff; - cmd[1] = (addr >> 8) & 0xff; - cmd[2] = (command & 0xf0) | CHIPID | ((length >> 16) & 0x07); - cmd[3] = (length >> 8) & 0xff; - cmd[4] = length & 0xff; - - spi_cmd.pCmd = cmd; - spi_cmd.cmdSize = 5; - spi_cmd.pData = g_SpiData; - memcpy(g_SpiData, data, length); - spi_cmd.dataSize = length; - - // Send Command and data through the SPI - if (SPID_SendCommand_ByteWrite(&spid, &spi_cmd)) - return BBM_NOK;*/ - - return BBM_OK; -} - -static int spi_dataread(HANDLE hDevice, u16 addr - , u8 command, u8 *data, u32 length) -{ - /*unsigned char *cmd; - - cmd = g_SpiCmd; - - cmd[0] = addr & 0xff; - cmd[1] = (addr >> 8) & 0xff; - cmd[2] = (command & 0xf0) | CHIPID | ((length >> 16) & 0x07); - cmd[3] = (length >> 8) & 0xff; - cmd[4] = length & 0xff; - - spi_cmd.pCmd = cmd; - spi_cmd.cmdSize = 5; - spi_cmd.pData = data; - spi_cmd.dataSize = length; - - // Send Command and data through the SPI - if (SPID_SendCommand_ByteRead(&spid, &spi_cmd)) - return BBM_NOK;*/ - - return BBM_OK; -} - -int fc8150_spib_init(HANDLE hDevice, u16 param1, u16 param2) -{ - OAL_CREATE_SEMAPHORE(); - - return BBM_OK; -} - -int fc8150_spib_byteread(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - u8 command = SPI_READ; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_bulkread(hDevice, addr, command, data, 1); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_wordread(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - u8 command = SPI_READ | SPI_AINC; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_bulkread(hDevice, addr, command, (u8 *)data, 2); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_longread(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - u8 command = SPI_READ | SPI_AINC; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_bulkread(hDevice, addr, command, (u8 *)data, 4); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = SPI_READ | SPI_AINC; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_bulkread(hDevice, addr, command, data, length); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_bytewrite(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - u8 command = SPI_WRITE; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_bulkwrite(hDevice, addr, command, (u8 *)&data, 1); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_wordwrite(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - u8 command = SPI_WRITE | SPI_AINC; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_bulkwrite(hDevice, addr, command, (u8 *)&data, 2); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_longwrite(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - u8 command = SPI_WRITE | SPI_AINC; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_bulkwrite(hDevice, addr, command, (u8 *)&data, 4); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = SPI_WRITE | SPI_AINC; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_bulkwrite(hDevice, addr, command, data, length); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length) -{ - int res; - u8 command = SPI_READ; - - OAL_OBTAIN_SEMAPHORE(); - res = spi_dataread(hDevice, addr, command, data, length); - OAL_RELEASE_SEMAPHORE(); - return res; -} - -int fc8150_spib_deinit(HANDLE hDevice) -{ - OAL_DELETE_SEMAPHORE(); - - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fc8150_spib.h b/drivers/media/isdbt/fc8150/fc8150_spib.h deleted file mode 100644 index 86b28eb..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_spib.h +++ /dev/null @@ -1,34 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_spib.c - - Description : API of 1-SEG baseband module - -*******************************************************************************/ - -#ifndef __FC8150_SPIB__ -#define __FC8150_SPIB__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8150_spib_init(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8150_spib_byteread(HANDLE hDevice, u16 addr, u8 *data); -extern int fc8150_spib_wordread(HANDLE hDevice, u16 addr, u16 *data); -extern int fc8150_spib_longread(HANDLE hDevice, u16 addr, u32 *data); -extern int fc8150_spib_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8150_spib_bytewrite(HANDLE hDevice, u16 addr, u8 data); -extern int fc8150_spib_wordwrite(HANDLE hDevice, u16 addr, u16 data); -extern int fc8150_spib_longwrite(HANDLE hDevice, u16 addr, u32 data); -extern int fc8150_spib_bulkwrite(HANDLE hDevice, u16 addr - , u8 *data, u16 length); -extern int fc8150_spib_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length); -extern int fc8150_spib_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8150_tun.c b/drivers/media/isdbt/fc8150/fc8150_tun.c deleted file mode 100644 index 644bf42..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_tun.c +++ /dev/null @@ -1,393 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_tun.c (BGA & QFN) - - Description : fc8150 tuner driver - - History : - ---------------------------------------------------------------------- - 2012/01/20 initial 0.1 version - 2012/01/25 initial 0.3 version - 2012/01/27 initial 0.5 version - 2012/01/31 initial 1.0 version - 2012/01/31 initial 1.1 version - 2012/02/06 initial 1.2 version - 2012/02/09 initial 1.3 Version - 2012/02/15 initial 1.4 Version - 2012/02/15 initial 2.0 Version - 2012/02/24 initial 2.01 Version - 2012/03/30 initial 3.0 Version - 2012/06/07 pre SLR Version - 2012/06/11 pre SLR Version - 2012/06/15 - 2012/06/17 SLR 0.3 version - 2012/06/19 SLR 0.4 version - 2012/06/20 - 2012/07/04 - 2012/07/09 - 2012/07/10 - 2012/07/15 -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_tun.h" -#include "fc8150_regs.h" -#include "fci_hal.h" - -#define FC8150_FREQ_XTAL BBM_XTAL_FREQ /* 32MHZ */ - -static int fc8150_write(HANDLE hDevice, u8 addr, u8 data) -{ - int res; - u8 tmp; - - tmp = data; - res = tuner_i2c_write(hDevice, addr, 1, &tmp, 1); - - return res; -} - -static int fc8150_read(HANDLE hDevice, u8 addr, u8 *data) -{ - int res; - - res = tuner_i2c_read(hDevice, addr, 1, data, 1); - - return res; -} - -static int fc8150_bb_read(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = bbm_read(hDevice, addr, data); - - return res; -} - -#if 0 -static int fc8150_bb_write(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = bbm_write(hDevice, addr, data); - - return res; -} -#endif - -static int fc8150_set_filter(HANDLE hDevice) -{ - int i; - u8 cal_mon = 0; - -#if (FC8150_FREQ_XTAL == 16000) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x20); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 16384) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x21); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 18000) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x24); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 19200) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x26); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 24000) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x30); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 24576) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x31); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 26000) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x34); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 27000) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x36); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 27120) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x36); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 32000) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x40); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 37400) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x4B); - fc8150_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 38400) - fc8150_write(hDevice, 0x3B, 0x01); - fc8150_write(hDevice, 0x3D, 0x4D); - fc8150_write(hDevice, 0x3B, 0x00); -#else - return BBM_NOK; -#endif - - for (i = 0; i < 10; i++) { - msWait(5); - fc8150_read(hDevice, 0x33, &cal_mon); - if ((cal_mon & 0xC0) == 0xC0) - break; - fc8150_write(hDevice, 0x32, 0x01); - fc8150_write(hDevice, 0x32, 0x09); - } - - fc8150_write(hDevice, 0x32, 0x01); - - return BBM_OK; -} - -int fc8150_tuner_init(HANDLE hDevice, u32 band) -{ - int i; - int n_RFAGC_PD1_AVG, n_RFAGC_PD2_AVG; - u8 RFPD_REF; - u8 RFAGC_PD2[6], RFAGC_PD2_AVG, RFAGC_PD2_MAX, RFAGC_PD2_MIN; - u8 RFAGC_PD1[6], RFAGC_PD1_AVG, RFAGC_PD1_MAX, RFAGC_PD1_MIN; - - int res = BBM_OK; - - PRINTF(hDevice, "fc8150_init\n"); - - fc8150_write(hDevice, 0x00, 0x00); - fc8150_write(hDevice, 0x02, 0x81); - - fc8150_write(hDevice, 0x15, 0x02); - fc8150_write(hDevice, 0x20, 0x33); - fc8150_write(hDevice, 0x28, 0x62); - fc8150_write(hDevice, 0x35, 0xAA); - fc8150_write(hDevice, 0x38, 0x28); - - fc8150_write(hDevice, 0x3B, 0x01); - - fc8150_set_filter(hDevice); - - fc8150_write(hDevice, 0x3B, 0x00); - - fc8150_write(hDevice, 0x56, 0x01); - fc8150_write(hDevice, 0x57, 0x86); - fc8150_write(hDevice, 0x58, 0xA7); - fc8150_write(hDevice, 0x59, 0x4D); - - fc8150_write(hDevice, 0x80, 0x17); - fc8150_write(hDevice, 0xAB, 0x48); - - fc8150_write(hDevice, 0xA0, 0xC0); - fc8150_write(hDevice, 0xD0, 0x00); - - fc8150_write(hDevice, 0xA5, 0x65); - - RFAGC_PD1[0] = 0; - RFAGC_PD1[1] = 0; - RFAGC_PD1[2] = 0; - RFAGC_PD1[3] = 0; - RFAGC_PD1[4] = 0; - RFAGC_PD1[5] = 0; - RFAGC_PD1_MAX = 0; - RFAGC_PD1_MIN = 255; - - for (i = 0; i < 6 ; i++) { - fc8150_read(hDevice, 0xD8 , &RFAGC_PD1[i]); - - if (RFAGC_PD1[i] >= RFAGC_PD1_MAX) - RFAGC_PD1_MAX = RFAGC_PD1[i]; - if (RFAGC_PD1[i] <= RFAGC_PD1_MIN) - RFAGC_PD1_MIN = RFAGC_PD1[i]; - } - n_RFAGC_PD1_AVG = (RFAGC_PD1[0] + RFAGC_PD1[1] + RFAGC_PD1[2] - + RFAGC_PD1[3] + RFAGC_PD1[4] + RFAGC_PD1[5] - - RFAGC_PD1_MAX - RFAGC_PD1_MIN) / 4; - RFAGC_PD1_AVG = (unsigned char) n_RFAGC_PD1_AVG; - - fc8150_write(hDevice, 0x7F , RFAGC_PD1_AVG); - - RFAGC_PD2[0] = 0; - RFAGC_PD2[1] = 0; - RFAGC_PD2[2] = 0; - RFAGC_PD2[3] = 0; - RFAGC_PD2[4] = 0; - RFAGC_PD2[5] = 0; - - RFAGC_PD2_MAX = 0; - RFAGC_PD2_MIN = 255; - - for (i = 0; i < 6; i++) { - fc8150_read(hDevice, 0xD6, &RFAGC_PD2[i]); - - if (RFAGC_PD2[i] >= RFAGC_PD2_MAX) - RFAGC_PD2_MAX = RFAGC_PD2[i]; - if (RFAGC_PD2[i] <= RFAGC_PD2_MIN) - RFAGC_PD2_MIN = RFAGC_PD2[i]; - } - n_RFAGC_PD2_AVG = (RFAGC_PD2[0] + RFAGC_PD2[1] + RFAGC_PD2[2] - + RFAGC_PD2[3] + RFAGC_PD2[4] + RFAGC_PD2[5] - - RFAGC_PD2_MAX - RFAGC_PD2_MIN) / 4; - RFAGC_PD2_AVG = (unsigned char) n_RFAGC_PD2_AVG; - - fc8150_write(hDevice, 0x7E , RFAGC_PD2_AVG); - - res = fc8150_read(hDevice, 0xD6, &RFPD_REF); - - if (0x86 <= RFPD_REF) - fc8150_write(hDevice, 0x7B, 0x8F); - else if (RFPD_REF < 0x86) - fc8150_write(hDevice, 0x7B, 0x88); - - fc8150_write(hDevice, 0x79, 0x32); - fc8150_write(hDevice, 0x7A, 0x2C); - fc8150_write(hDevice, 0x7C, 0x10); - fc8150_write(hDevice, 0x7D, 0x0C); - fc8150_write(hDevice, 0x81, 0x0A); - fc8150_write(hDevice, 0x84, 0x00); - - fc8150_write(hDevice, 0x02, 0x81); - - return BBM_OK; -} - - -int fc8150_set_freq(HANDLE hDevice, enum band_type band, u32 rf_kHz) -{ - unsigned long f_diff, f_diff_shifted, n_val, k_val; - unsigned long f_vco, f_comp; - unsigned char r_val, data_0x56; - unsigned char pre_shift_bits = 4; - - f_vco = (rf_kHz) << 2; - if (f_vco < FC8150_FREQ_XTAL*40) - r_val = 2; - else - r_val = 1; - - f_comp = FC8150_FREQ_XTAL / r_val; - - n_val = f_vco / f_comp; - f_diff = f_vco - f_comp * n_val; - - f_diff_shifted = f_diff << (20 - pre_shift_bits); - - k_val = (f_diff_shifted) / (f_comp >> pre_shift_bits); - k_val = (k_val | 1); - - if (470000 < rf_kHz && rf_kHz <= 473143) { - fc8150_write(hDevice, 0x1E, 0x04); - fc8150_write(hDevice, 0x1F, 0x36); - fc8150_write(hDevice, 0x14, 0x84); - } else if (473143 < rf_kHz && rf_kHz <= 485143) { - fc8150_write(hDevice, 0x1E, 0x03); - fc8150_write(hDevice, 0x1F, 0x3E); - fc8150_write(hDevice, 0x14, 0x84); - } else if (485143 < rf_kHz && rf_kHz <= 551143) { - fc8150_write(hDevice, 0x1E, 0x04); - fc8150_write(hDevice, 0x1F, 0x36); - fc8150_write(hDevice, 0x14, 0x84); - } else if (551143 < rf_kHz && rf_kHz <= 563143) { - fc8150_write(hDevice, 0x1E, 0x03); - fc8150_write(hDevice, 0x1F, 0x3E); - fc8150_write(hDevice, 0x14, 0xC4); - } else if (563143 < rf_kHz && rf_kHz <= 593143) { - fc8150_write(hDevice, 0x1E, 0x02); - fc8150_write(hDevice, 0x1F, 0x3E); - fc8150_write(hDevice, 0x14, 0xC4); - } else if (593143 < rf_kHz && rf_kHz <= 659143) { - fc8150_write(hDevice, 0x1E, 0x02); - fc8150_write(hDevice, 0x1F, 0x36); - fc8150_write(hDevice, 0x14, 0x84); - } else if (659143 < rf_kHz && rf_kHz <= 767143) { - fc8150_write(hDevice, 0x1E, 0x01); - fc8150_write(hDevice, 0x1F, 0x36); - fc8150_write(hDevice, 0x14, 0x84); - } else if (767143 < rf_kHz) { - fc8150_write(hDevice, 0x1E, 0x00); - fc8150_write(hDevice, 0x1F, 0x36); - fc8150_write(hDevice, 0x14, 0x84); - } else { - fc8150_write(hDevice, 0x1E, 0x05); - fc8150_write(hDevice, 0x1F, 0x36); - fc8150_write(hDevice, 0x14, 0x84); - } - - data_0x56 = ((r_val == 1) ? 0 : 0x10) + (unsigned char)(k_val>>16); - fc8150_write(hDevice, 0x56, data_0x56); - fc8150_write(hDevice, 0x57, (unsigned char)((k_val>>8)&0xFF)); - fc8150_write(hDevice, 0x58, (unsigned char)(((k_val)&0xFF))); - fc8150_write(hDevice, 0x59, (unsigned char) n_val); - - if (rf_kHz < 525000) - fc8150_write(hDevice, 0x55, 0x0E); - else if (525000 <= rf_kHz && rf_kHz < 600000) - fc8150_write(hDevice, 0x55, 0x0C); - else if (600000 <= rf_kHz && rf_kHz < 700000) - fc8150_write(hDevice, 0x55, 0x08); - else if (700000 < rf_kHz) - fc8150_write(hDevice, 0x55, 0x06); - - if (rf_kHz <= 491143) { - fc8150_write(hDevice, 0x79, 0x28); - fc8150_write(hDevice, 0x7A, 0x24); - } else if (491143 < rf_kHz && rf_kHz <= 659143) { - fc8150_write(hDevice, 0x79, 0x2A); - fc8150_write(hDevice, 0x7A, 0x26); - } else if (659143 < rf_kHz && rf_kHz <= 773143) { - fc8150_write(hDevice, 0x79, 0x2C); - fc8150_write(hDevice, 0x7A, 0x28); - } else if (773143 < rf_kHz) { - fc8150_write(hDevice, 0x79, 0x2F); - fc8150_write(hDevice, 0x7A, 0x2B); - } - - if (rf_kHz <= 707143) { - fc8150_write(hDevice, 0x54, 0x00); - fc8150_write(hDevice, 0x53, 0x5F); - } else if (707143 < rf_kHz) { - fc8150_write(hDevice, 0x54, 0x04); - fc8150_write(hDevice, 0x53, 0x9F); - } - - return BBM_OK; -} - -int fc8150_get_rssi(HANDLE hDevice, int *rssi) -{ - int res = BBM_OK; - u8 LNA, RFVGA, CSF, PREAMP_PGA = 0x00; - int K = -101.25; - int PGA = 0; - - res = fc8150_read(hDevice, 0xA3, &LNA); - res = fc8150_read(hDevice, 0xA4, &RFVGA); - res = fc8150_read(hDevice, 0xA8, &CSF); - res = fc8150_bb_read(hDevice, 0x106E, &PREAMP_PGA); - - if (res != BBM_OK) - return res; - - if (127 < PREAMP_PGA) - PGA = -1 * ((256 - PREAMP_PGA) + 1); - else if (PREAMP_PGA <= 127) - PGA = PREAMP_PGA; - - /* *rssi = (LNA & 0x07) * 6 + (RFVGA & 0x1F) - + ((CSF & 0x03)+((CSF & 0x70) >> 4) ) * 6 - PGA * 0.25f + K ; */ - *rssi = (LNA & 0x07) * 6 + (RFVGA & 0x1F) - + ((CSF & 0x03) + ((CSF & 0x70) >> 4)) * 6 - PGA / 4 + K; - - return BBM_OK; -} - -int fc8150_tuner_deinit(HANDLE hDevice) -{ - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fc8150_tun.h b/drivers/media/isdbt/fc8150/fc8150_tun.h deleted file mode 100644 index 64a715c..0000000 --- a/drivers/media/isdbt/fc8150/fc8150_tun.h +++ /dev/null @@ -1,26 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_tun.c - - Description : fc8150 tuner control driver - -*******************************************************************************/ - -#ifndef __FC8150_TUN__ -#define __FC8150_TUN__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8150_tuner_init(HANDLE hDevice, enum band_type band); -extern int fc8150_set_freq(HANDLE hDevice, enum band_type band, u32 f_lo); -extern int fc8150_get_rssi(HANDLE hDevice, int *rssi); -extern int fc8150_tuner_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fc8151_tun.c b/drivers/media/isdbt/fc8150/fc8151_tun.c deleted file mode 100644 index e17b4b9..0000000 --- a/drivers/media/isdbt/fc8150/fc8151_tun.c +++ /dev/null @@ -1,413 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8151_tun.c (WLCSP) - - Description : fc8150 tuner driver - - History : - ---------------------------------------------------------------------- - 2012/01/20 initial 0.1 version - 2012/01/25 initial 0.3 version - 2012/01/27 initial 0.5 version - 2012/01/31 initial 1.0 version - 2012/01/31 initial 1.1 version - 2012/02/06 initial 1.2 version - 2012/02/09 initial 1.3 Version - 2012/02/15 initial 1.4 Version - 2012/02/15 initial 2.0 Version - 2012/02/24 initial 2.01 Version - 2012/03/30 initial 3.0 Version -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_tun.h" -#include "fc8150_regs.h" -#include "fci_hal.h" - -#define FC8150_FREQ_XTAL BBM_XTAL_FREQ /* 26MHZ */ - -static int high_crnt_mode = 1; - -static int fc8151_write(HANDLE hDevice, u8 addr, u8 data) -{ - int res; - u8 tmp; - - tmp = data; - res = tuner_i2c_write(hDevice, addr, 1, &tmp, 1); - - return res; -} - -static int fc8151_read(HANDLE hDevice, u8 addr, u8 *data) -{ - int res; - - res = tuner_i2c_read(hDevice, addr, 1, data, 1); - - return res; -} - -static int fc8151_bb_read(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = bbm_read(hDevice, addr, data); - - return res; -} - -static int fc8151_bb_write(HANDLE hDevice, u16 addr, u8 data) -{ - return BBM_OK; -} - - -static int KbdFunc(HANDLE hDevice) -{ - int i = 0; - - u8 CSF = 0x00; - int res = BBM_OK; - int crnt_mode[5] = {0, 0, 0, 0, 0}; - int pre_crnt_mode = 0; - - high_crnt_mode = 2; - fc8151_write(hDevice, 0x13, 0xF4); - fc8151_write(hDevice, 0x1F, 0x06); - fc8151_write(hDevice, 0x33, 0x08); - fc8151_write(hDevice, 0x34, 0x68); - fc8151_write(hDevice, 0x35, 0x0A); - - while (1) { - while (1) { - for (i = 0; i < 5; i++) { - msWait(100); - res = fc8151_read(hDevice, 0xA6, &CSF); - if (CSF < 4) - crnt_mode[i] = 2; - if (CSF == 4) - crnt_mode[i] = 1; - if (4 < CSF) - crnt_mode[i] = 0; - } - - pre_crnt_mode = high_crnt_mode; - - if ((crnt_mode[0] + crnt_mode[1] + crnt_mode[2] - + crnt_mode[3] + crnt_mode[4]) == 10) - high_crnt_mode = 2; - else if ((crnt_mode[0] + crnt_mode[1] + crnt_mode[2] - + crnt_mode[3] + crnt_mode[4]) == 5) - high_crnt_mode = 1; - else if ((crnt_mode[0] + crnt_mode[1] + crnt_mode[2] - + crnt_mode[3] + crnt_mode[4]) == 0) - high_crnt_mode = 0; - else - high_crnt_mode = pre_crnt_mode; - - if (!(high_crnt_mode == pre_crnt_mode)) - break; - } - - if (high_crnt_mode == 2) { - fc8151_write(hDevice, 0x13, 0xF4); - fc8151_write(hDevice, 0x1F, 0x06); - fc8151_write(hDevice, 0x33, 0x08); - fc8151_write(hDevice, 0x34, 0x68); - fc8151_write(hDevice, 0x35, 0x0A); - } else if (high_crnt_mode == 1) { - fc8151_write(hDevice, 0x13, 0x44); - fc8151_write(hDevice, 0x1F, 0x06); - fc8151_write(hDevice, 0x33, 0x08); - fc8151_write(hDevice, 0x34, 0x68); - fc8151_write(hDevice, 0x35, 0x0A); - } else if (high_crnt_mode == 0) { - fc8151_write(hDevice, 0x13, 0x44); - fc8151_write(hDevice, 0x1F, 0x02); - fc8151_write(hDevice, 0x33, 0x04); - fc8151_write(hDevice, 0x34, 0x48); - fc8151_write(hDevice, 0x35, 0x0C); - } - } - - return res; - -} - -static int fc8151_set_filter(HANDLE hDevice) -{ - int i; - u8 cal_mon = 0; - -#if (FC8151_FREQ_XTAL == 16000) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x20); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 16384) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x21); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 18000) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x24); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 19200) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x26); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 24000) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x30); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 24576) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x31); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 26000) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x34); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 27000) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x36); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 27120) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x36); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 32000) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x40); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 37400) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x4B); - fc8151_write(hDevice, 0x3B, 0x00); -#elif (FC8150_FREQ_XTAL == 38400) - fc8151_write(hDevice, 0x3B, 0x01); - fc8151_write(hDevice, 0x3D, 0x4D); - fc8151_write(hDevice, 0x3B, 0x00); -#else - return BBM_NOK; -#endif - - for (i = 0; i < 10; i++) { - msWait(5); - fc8151_read(hDevice, 0x33, &cal_mon); - if ((cal_mon & 0xC0) == 0xC0) - break; - fc8151_write(hDevice, 0x32, 0x01); - fc8151_write(hDevice, 0x32, 0x09); - } - - fc8151_write(hDevice, 0x32, 0x01); - - return BBM_OK; -} - -int fc8151_tuner_init(HANDLE hDevice, u32 band) -{ - u8 RFPD_REF, MIXPD_REF; - int res = BBM_OK; - - PRINTF(hDevice, "fc8151_init\n"); - - fc8151_write(hDevice, 0x00, 0x00); - fc8151_write(hDevice, 0x02, 0x81); - - fc8151_write(hDevice, 0x13, 0xF4); - fc8151_write(hDevice, 0x30, 0x0A); - fc8151_write(hDevice, 0x3B, 0x01); - - fc8151_set_filter(hDevice); - - fc8151_write(hDevice, 0x3B, 0x00); - - fc8151_write(hDevice, 0x34, 0x68); - fc8151_write(hDevice, 0x36, 0xFF); - fc8151_write(hDevice, 0x37, 0xFF); - fc8151_write(hDevice, 0x39, 0x11); - fc8151_write(hDevice, 0x3A, 0x00); - - fc8151_write(hDevice, 0x52, 0x20); - fc8151_write(hDevice, 0x53, 0x5F); - fc8151_write(hDevice, 0x54, 0x00); - fc8151_write(hDevice, 0x5E, 0x00); - fc8151_write(hDevice, 0x63, 0x30); - - fc8151_write(hDevice, 0x56, 0x0F); - fc8151_write(hDevice, 0x57, 0x1F); - fc8151_write(hDevice, 0x58, 0x09); - fc8151_write(hDevice, 0x59, 0x5E); - - fc8151_write(hDevice, 0x29, 0x00); - - fc8151_write(hDevice, 0x94, 0x00); - fc8151_write(hDevice, 0x95, 0x01); - fc8151_write(hDevice, 0x96, 0x11); - fc8151_write(hDevice, 0x97, 0x21); - fc8151_write(hDevice, 0x98, 0x31); - fc8151_write(hDevice, 0x99, 0x32); - fc8151_write(hDevice, 0x9A, 0x42); - fc8151_write(hDevice, 0x9B, 0x52); - fc8151_write(hDevice, 0x9C, 0x53); - fc8151_write(hDevice, 0x9D, 0x63); - fc8151_write(hDevice, 0x9E, 0x63); - fc8151_write(hDevice, 0x9F, 0x63); - - fc8151_write(hDevice, 0x79, 0x2A); - fc8151_write(hDevice, 0x7A, 0x24); - fc8151_write(hDevice, 0x7B, 0xFF); - fc8151_write(hDevice, 0x7C, 0x16); - fc8151_write(hDevice, 0x7D, 0x12); - fc8151_write(hDevice, 0x84, 0x00); - fc8151_write(hDevice, 0x85, 0x08); - fc8151_write(hDevice, 0x86, 0x00); - fc8151_write(hDevice, 0x87, 0x08); - fc8151_write(hDevice, 0x88, 0x00); - fc8151_write(hDevice, 0x89, 0x08); - fc8151_write(hDevice, 0x8A, 0x00); - fc8151_write(hDevice, 0x8B, 0x08); - fc8151_write(hDevice, 0x8C, 0x00); - fc8151_write(hDevice, 0x8D, 0x1D); - fc8151_write(hDevice, 0x8E, 0x13); - fc8151_write(hDevice, 0x8F, 0x1D); - fc8151_write(hDevice, 0x90, 0x13); - fc8151_write(hDevice, 0x91, 0x1D); - fc8151_write(hDevice, 0x92, 0x13); - fc8151_write(hDevice, 0x93, 0x1D); - fc8151_write(hDevice, 0x80, 0x1F); - fc8151_write(hDevice, 0x81, 0x0A); - fc8151_write(hDevice, 0x82, 0x40); - fc8151_write(hDevice, 0x83, 0x0A); - - fc8151_write(hDevice, 0xA0, 0xC0); - fc8151_write(hDevice, 0x7E, 0x7F); - fc8151_write(hDevice, 0x7F, 0x7F); - fc8151_write(hDevice, 0xD0, 0x0A); - fc8151_write(hDevice, 0xD2, 0x28); - fc8151_write(hDevice, 0xD4, 0x28); - - /* _beginthread(KbdFunc,0,&x); */ - - fc8151_write(hDevice, 0xA0, 0x17); - fc8151_write(hDevice, 0xD0, 0x00); - fc8151_write(hDevice, 0xA1, 0x1D); - - msWait(100); - - res = fc8151_read(hDevice, 0xD6, &RFPD_REF); - res = fc8151_read(hDevice, 0xD8, &MIXPD_REF); - - fc8151_write(hDevice, 0xA0, 0xD7); - fc8151_write(hDevice, 0xD0, 0x0A); - - fc8151_write(hDevice, 0x7E, RFPD_REF); - fc8151_write(hDevice, 0x7F, MIXPD_REF); - - fc8151_write(hDevice, 0xA0, 0xC0); - fc8151_write(hDevice, 0xA1, 0x00); - - return res; -} - - -int fc8151_set_freq(HANDLE hDevice, band_type band, u32 rf_kHz) -{ - int res = BBM_OK; - int n_captune = 0; - unsigned long f_diff, f_diff_shifted, n_val, k_val; - unsigned long f_vco, f_comp; - unsigned char r_val, data_0x56; - unsigned char pre_shift_bits = 4; - - f_vco = (rf_kHz) << 2; - if (f_vco < FC8150_FREQ_XTAL*40) - r_val = 2; - else - r_val = 1; - - f_comp = FC8150_FREQ_XTAL / r_val; - - n_val = f_vco / f_comp; - f_diff = f_vco - f_comp * n_val; - - f_diff_shifted = f_diff << (20 - pre_shift_bits); - - k_val = (f_diff_shifted + (f_comp >> (pre_shift_bits+1))) - / (f_comp >> pre_shift_bits); - k_val = (k_val | 1); - - if (470000 < rf_kHz && rf_kHz <= 505000) - n_captune = 4; - else if (505000 < rf_kHz && rf_kHz <= 545000) - n_captune = 3; - else if (545000 < rf_kHz && rf_kHz <= 610000) - n_captune = 2; - else if (610000 < rf_kHz && rf_kHz <= 695000) - n_captune = 1; - else if (695000 < rf_kHz) - n_captune = 0; - - fc8151_write(hDevice, 0x1E, (unsigned char)n_captune); - - data_0x56 = ((r_val == 1) ? 0 : 0x10) + (unsigned char)(k_val >> 16); - fc8151_write(hDevice, 0x56, data_0x56); - fc8151_write(hDevice, 0x57, (unsigned char)((k_val >> 8) & 0xFF)); - fc8151_write(hDevice, 0x58, (unsigned char)(((k_val) & 0xFF))); - fc8151_write(hDevice, 0x59, (unsigned char) n_val); - - if (rf_kHz <= 600000) - fc8151_write(hDevice, 0x55, 0x07); - else - fc8151_write(hDevice, 0x55, 0x05); - - if ((490000 < rf_kHz) && (560000 >= rf_kHz)) - fc8151_write(hDevice, 0x1F, 0x0E); - else - fc8151_write(hDevice, 0x1F, 0x06); - - return res; -} - -int fc8151_get_rssi(HANDLE hDevice, int *rssi) -{ - int res = BBM_OK; - u8 LNA, RFVGA, CSF, PREAMP_PGA = 0x00; - int K = -101.25; - float Gain_diff = 0; - int PGA = 0; - - res |= fc8151_read(hDevice, 0xA3, &LNA); - res |= fc8151_read(hDevice, 0xA4, &RFVGA); - res |= fc8151_read(hDevice, 0xA6, &CSF); - res |= fc8151_bb_read(hDevice, 0x106E, &PREAMP_PGA); - - if (res != BBM_OK) - return res; - - if (127 < PREAMP_PGA) - PGA = -1 * ((256 - PREAMP_PGA) + 1); - else if (PREAMP_PGA <= 127) - PGA = PREAMP_PGA; - - if (high_crnt_mode == 2) - Gain_diff = 0; - else if (high_crnt_mode == 1) - Gain_diff = 0; - else if (high_crnt_mode == 0) - Gain_diff = -3.5; - - *rssi = (LNA & 0x07) * 6 + (RFVGA) - + (CSF & 0x0F) * 6 - PGA * 0.25f + K - Gain_diff; - - return BBM_OK; -} - -int fc8151_tuner_deinit(HANDLE hDevice) -{ - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fc8151_tun.h b/drivers/media/isdbt/fc8150/fc8151_tun.h deleted file mode 100644 index 4147fa6..0000000 --- a/drivers/media/isdbt/fc8150/fc8151_tun.h +++ /dev/null @@ -1,26 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8151_tun.c - - Description : fc8151 tuner control driver - -*******************************************************************************/ - -#ifndef __FC8151_TUN__ -#define __FC8151_TUN__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8151_tuner_init(HANDLE hDevice, band_type band); -extern int fc8151_set_freq(HANDLE hDevice, band_type band, u32 f_lo); -extern int fc8151_get_rssi(HANDLE hDevice, int *rssi); -extern int fc8151_tuner_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fci_bypass.c b/drivers/media/isdbt/fc8150/fci_bypass.c deleted file mode 100644 index f3104cb..0000000 --- a/drivers/media/isdbt/fc8150/fci_bypass.c +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_bypass.c - - Description : fci i2c driver -*******************************************************************************/ -#include "fci_bypass.h" -#include "fci_types.h" - - -int fci_bypass_init(HANDLE hDevice, int speed, int slaveaddr) -{ - return BBM_OK; -} - -int fci_bypass_read(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len) -{ - int res; - - res = fc8150_bypass_read(hDevice, chip, addr, data, len); - - return res; -} - -int fci_bypass_write(HANDLE hDevice, u8 chip, u8 addr - , u8 alen, u8 *data, u8 len) -{ - int res; - - res = fc8150_bypass_write(hDevice, chip, addr, data, len); - - return res; -} - -int fci_bypass_deinit(HANDLE hDevice) -{ - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fci_bypass.h b/drivers/media/isdbt/fc8150/fci_bypass.h deleted file mode 100644 index dda0e64..0000000 --- a/drivers/media/isdbt/fc8150/fci_bypass.h +++ /dev/null @@ -1,34 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_bypass.h - - Description : fci i2c driver header -*******************************************************************************/ - -#ifndef __FCI_BYPASS_H__ -#define __FCI_BYPASS_H__ - -#include "fci_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fci_bypass_init(HANDLE hDevice, int speed, int slaveaddr); -extern int fci_bypass_read(HANDLE hDevice, u8 chip, u8 addr - , u8 alen, u8 *data, u8 len); -extern int fci_bypass_write(HANDLE hDevice, u8 chip, u8 addr - , u8 alen, u8 *data, u8 len); -extern int fci_bypass_deinit(HANDLE hDevice); - -extern int fc8150_bypass_read(HANDLE hDevice, u8 chip - , u8 addr, u8 *data, u16 length); -extern int fc8150_bypass_write(HANDLE hDevice, u8 chip - , u8 addr, u8 *data, u16 length); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fci_hal.c b/drivers/media/isdbt/fc8150/fci_hal.c deleted file mode 100644 index b70f5eb..0000000 --- a/drivers/media/isdbt/fc8150/fci_hal.c +++ /dev/null @@ -1,245 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_hal.c - - Description : fc8150 host interface - -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_hal.h" -#include "fc8150_hpi.h" -#include "fc8150_spi.h" -#include "fc8150_ppi.h" -#include "fc8150_i2c.h" -#include "fc8150_spib.h" - -struct IF_PORT { - int (*init)(HANDLE hDevice, u16 param1, u16 param2); - - int (*byteread)(HANDLE hDevice, u16 addr, u8 *data); - int (*wordread)(HANDLE hDevice, u16 addr, u16 *data); - int (*longread)(HANDLE hDevice, u16 addr, u32 *data); - int (*bulkread)(HANDLE hDevice, u16 addr, u8 *data, u16 length); - - int (*bytewrite)(HANDLE hDevice, u16 addr, u8 data); - int (*wordwrite)(HANDLE hDevice, u16 addr, u16 data); - int (*longwrite)(HANDLE hDevice, u16 addr, u32 data); - int (*bulkwrite)(HANDLE hDevice, u16 addr, u8 *data, u16 length); - - int (*dataread)(HANDLE hDevice, u16 addr, u8 *data, u32 length); - - int (*deinit)(HANDLE hDevice); -}; - -static struct IF_PORT hpiif = { - &fc8150_hpi_init, - - &fc8150_hpi_byteread, - &fc8150_hpi_wordread, - &fc8150_hpi_longread, - &fc8150_hpi_bulkread, - - &fc8150_hpi_bytewrite, - &fc8150_hpi_wordwrite, - &fc8150_hpi_longwrite, - &fc8150_hpi_bulkwrite, - - &fc8150_hpi_dataread, - - &fc8150_hpi_deinit -}; - -static struct IF_PORT spiif = { - &fc8150_spi_init, - - &fc8150_spi_byteread, - &fc8150_spi_wordread, - &fc8150_spi_longread, - &fc8150_spi_bulkread, - - &fc8150_spi_bytewrite, - &fc8150_spi_wordwrite, - &fc8150_spi_longwrite, - &fc8150_spi_bulkwrite, - - &fc8150_spi_dataread, - - &fc8150_spi_deinit -}; - -static struct IF_PORT spibif = { - &fc8150_spib_init, - - &fc8150_spib_byteread, - &fc8150_spib_wordread, - &fc8150_spib_longread, - &fc8150_spib_bulkread, - - &fc8150_spib_bytewrite, - &fc8150_spib_wordwrite, - &fc8150_spib_longwrite, - &fc8150_spib_bulkwrite, - - &fc8150_spib_dataread, - - &fc8150_spib_deinit -}; - -static struct IF_PORT ppiif = { - &fc8150_ppi_init, - - &fc8150_ppi_byteread, - &fc8150_ppi_wordread, - &fc8150_ppi_longread, - &fc8150_ppi_bulkread, - - &fc8150_ppi_bytewrite, - &fc8150_ppi_wordwrite, - &fc8150_ppi_longwrite, - &fc8150_ppi_bulkwrite, - - &fc8150_ppi_dataread, - - &fc8150_ppi_deinit -}; - -static struct IF_PORT i2cif = { - &fc8150_i2c_init, - - &fc8150_i2c_byteread, - &fc8150_i2c_wordread, - &fc8150_i2c_longread, - &fc8150_i2c_bulkread, - - &fc8150_i2c_bytewrite, - &fc8150_i2c_wordwrite, - &fc8150_i2c_longwrite, - &fc8150_i2c_bulkwrite, - - &fc8150_i2c_dataread, - - &fc8150_i2c_deinit -}; - -static struct IF_PORT *ifport = &spiif; -u8 hostif_type = BBM_SPI; - -int bbm_hostif_select(HANDLE hDevice, u8 hostif) -{ - hostif_type = hostif; - - switch (hostif) { - case BBM_HPI: - ifport = &hpiif; - break; - case BBM_SPI: - ifport = &spiif; - break; - case BBM_I2C: - ifport = &i2cif; - break; - case BBM_PPI: - ifport = &ppiif; - break; - case BBM_SPIB: - ifport = &spibif; - break; - default: - return BBM_E_HOSTIF_SELECT; - } - - if (ifport->init(hDevice, 0, 0)) - return BBM_E_HOSTIF_INIT; - - return BBM_OK; -} - -int bbm_hostif_deselect(HANDLE hDevice) -{ - if (ifport->deinit(hDevice)) - return BBM_NOK; - - ifport = NULL; - hostif_type = BBM_SPI; - - return BBM_OK; -} - -int bbm_read(HANDLE hDevice, u16 addr, u8 *data) -{ - if (ifport->byteread(hDevice, addr, data)) - return BBM_E_BB_READ; - return BBM_OK; -} - -int bbm_byte_read(HANDLE hDevice, u16 addr, u8 *data) -{ - if (ifport->byteread(hDevice, addr, data)) - return BBM_E_BB_READ; - return BBM_OK; -} - -int bbm_word_read(HANDLE hDevice, u16 addr, u16 *data) -{ - if (ifport->wordread(hDevice, addr, data)) - return BBM_E_BB_READ; - return BBM_OK; -} - -int bbm_long_read(HANDLE hDevice, u16 addr, u32 *data) -{ - if (ifport->longread(hDevice, addr, data)) - return BBM_E_BB_READ; - return BBM_OK; -} - -int bbm_bulk_read(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - if (ifport->bulkread(hDevice, addr, data, length)) - return BBM_E_BB_READ; - return BBM_OK; -} - -int bbm_write(HANDLE hDevice, u16 addr, u8 data) -{ - if (ifport->bytewrite(hDevice, addr, data)) - return BBM_E_BB_WRITE; - return BBM_OK; -} - -int bbm_byte_write(HANDLE hDevice, u16 addr, u8 data) -{ - if (ifport->bytewrite(hDevice, addr, data)) - return BBM_E_BB_WRITE; - return BBM_OK; -} - -int bbm_word_write(HANDLE hDevice, u16 addr, u16 data) -{ - if (ifport->wordwrite(hDevice, addr, data)) - return BBM_E_BB_WRITE; - return BBM_OK; -} - -int bbm_long_write(HANDLE hDevice, u16 addr, u32 data) -{ - if (ifport->longwrite(hDevice, addr, data)) - return BBM_E_BB_WRITE; - return BBM_OK; -} - -int bbm_bulk_write(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - if (ifport->bulkwrite(hDevice, addr, data, length)) - return BBM_E_BB_WRITE; - return BBM_OK; -} - -int bbm_data(HANDLE hDevice, u16 addr, u8 *data, u32 length) -{ - if (ifport->dataread(hDevice, addr, data, length)) - return BBM_E_BB_WRITE; - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fci_hal.h b/drivers/media/isdbt/fc8150/fci_hal.h deleted file mode 100644 index e9d44c4..0000000 --- a/drivers/media/isdbt/fc8150/fci_hal.h +++ /dev/null @@ -1,37 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fc8150_hal.h - - Description : fc8150 host interface -*******************************************************************************/ - -#ifndef __FCI_HAL_H__ -#define __FCI_HAL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int bbm_hostif_select(HANDLE hDevice, u8 hostif); -extern int bbm_hostif_deselect(HANDLE hDevice); - -extern int bbm_read(HANDLE hDevice, u16 addr, u8 *data); -extern int bbm_byte_read(HANDLE hDevice, u16 addr, u8 *data); -extern int bbm_word_read(HANDLE hDevice, u16 addr, u16 *data); -extern int bbm_long_read(HANDLE hDevice, u16 addr, u32 *data); -extern int bbm_bulk_read(HANDLE hDevice, u16 addr, u8 *data, u16 length); - -extern int bbm_write(HANDLE hDevice, u16 addr, u8 data); -extern int bbm_byte_write(HANDLE hDevice, u16 addr, u8 data); -extern int bbm_word_write(HANDLE hDevice, u16 addr, u16 data); -extern int bbm_long_write(HANDLE hDevice, u16 addr, u32 data); -extern int bbm_bulk_write(HANDLE hDevice, u16 addr, u8 *data, u16 length); - -extern int bbm_data(HANDLE hDevice, u16 addr, u8 *data, u32 length); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fci_i2c.c b/drivers/media/isdbt/fc8150/fci_i2c.c deleted file mode 100644 index 1f011ca..0000000 --- a/drivers/media/isdbt/fc8150/fci_i2c.c +++ /dev/null @@ -1,226 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_i2c.c - - Description : fci i2c driver -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fc8150_regs.h" -#include "fci_hal.h" - -#define I2CSTAT_TIP 0x02 /* Tip bit */ -#define I2CSTAT_NACK 0x80 /* Nack bit */ - -#define I2C_TIMEOUT 100 - -#define I2C_CR_STA 0x80 -#define I2C_CR_STO 0x40 -#define I2C_CR_RD 0x20 -#define I2C_CR_WR 0x10 -#define I2C_CR_NACK 0x08 -#define I2C_CR_IACK 0x01 - -#define I2C_WRITE 0 -#define I2C_READ 1 - -#define I2C_OK 0 -#define I2C_NOK 1 -#define I2C_NACK 2 -#define I2C_NOK_LA 3 /* Lost arbitration */ -#define I2C_NOK_TOUT 4 /* time out */ - -#define FC8150_FREQ_XTAL BBM_XTAL_FREQ - -/* static OAL_SEMAPHORE hBbmMutex; */ - -static int WaitForXfer(HANDLE hDevice) -{ - int i; - int res = I2C_OK; - u8 status; - - i = I2C_TIMEOUT * 20000; - /* wait for transfer complete */ - do { - bbm_read(hDevice, BBM_I2C_SR, &status); - i--; - } while ((i > 0) && (status & I2CSTAT_TIP)); - - /* check time out or nack */ - if (status & I2CSTAT_TIP) { - res = I2C_NOK_TOUT; - } else { - bbm_read(hDevice, BBM_I2C_SR, &status); - if (status & I2CSTAT_NACK) - res = I2C_NACK; - else - res = I2C_OK; - } - - return res; -} - -static int fci_i2c_transfer(HANDLE hDevice, u8 cmd_type, u8 chip - , u8 addr[], u8 addr_len, u8 data[], u8 data_len) -{ - int i; - int result = I2C_OK; - - switch (cmd_type) { - case I2C_WRITE: - bbm_write(hDevice, BBM_I2C_TXR, chip | cmd_type); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); - result = WaitForXfer(hDevice); - if (result != I2C_OK) - return result; - - if (addr && addr_len) { - i = 0; - while ((i < addr_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, addr[i]); - bbm_write(hDevice, BBM_I2C_CR - , I2C_CR_WR /*0x10*/); - result = WaitForXfer(hDevice); - if (result != I2C_OK) - return result; - i++; - } - } - - i = 0; - while ((i < data_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, data[i]); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); - result = WaitForXfer(hDevice); - if (result != I2C_OK) - return result; - i++; - } - - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STO /*0x40*/); - result = WaitForXfer(hDevice); - if (result != I2C_OK) - return result; - break; - case I2C_READ: - if (addr && addr_len) { - bbm_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); - bbm_write(hDevice, BBM_I2C_CR - , I2C_CR_STA | I2C_CR_WR /*0x90*/); - result = WaitForXfer(hDevice); - if (result != I2C_OK) - return result; - - i = 0; - while ((i < addr_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, addr[i]); - bbm_write(hDevice, BBM_I2C_CR - , I2C_CR_WR /*0x10*/); - result = WaitForXfer(hDevice); - if (result != I2C_OK) - return result; - i++; - } - } - - bbm_write(hDevice, BBM_I2C_TXR, chip | I2C_READ); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); - result = WaitForXfer(hDevice); - if (result != I2C_OK) - return result; - - i = 0; - while ((i < data_len) && (result == I2C_OK)) { - if (i == data_len - 1) { - bbm_write(hDevice, BBM_I2C_CR - , I2C_CR_RD|I2C_CR_NACK/*0x28*/); - result = WaitForXfer(hDevice); - if ((result != I2C_NACK) - && (result != I2C_OK)) { - PRINTF(hDevice, "NACK4-0[%02x]\n" - , result); - return result; - } - } else { - bbm_write(hDevice, BBM_I2C_CR - , I2C_CR_RD /*0x20*/); - result = WaitForXfer(hDevice); - if (result != I2C_OK) { - PRINTF(hDevice, "NACK4-1[%02x]\n" - , result); - return result; - } - } - bbm_read(hDevice, BBM_I2C_RXR, &data[i]); - i++; - } - - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STO /*0x40*/); - result = WaitForXfer(hDevice); - if ((result != I2C_NACK) && (result != I2C_OK)) { - PRINTF(hDevice, "NACK5[%02X]\n", result); - return result; - } - break; - default: - return I2C_NOK; - } - - return I2C_OK; -} - -int fci_i2c_init(HANDLE hDevice, int speed, int slaveaddr) -{ - u16 r = FC8150_FREQ_XTAL % (5 * speed); - u16 pr = (FC8150_FREQ_XTAL - r) / (5 * speed) - 1; - - if (((5 * speed) >> 1) <= r) - pr++; - - bbm_word_write(hDevice, BBM_I2C_PR_L, pr); - bbm_write(hDevice, BBM_I2C_CTR, 0xc0); - - PRINTF(hDevice, "Internal I2C Pre-scale: 0x%02x\n", pr); - - return BBM_OK; -} - -int fci_i2c_read(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len) -{ - int ret; - - ret = fci_i2c_transfer(hDevice, I2C_READ, chip << 1, &addr - , alen, data, len); - - if (ret != I2C_OK) { - PRINTF(hDevice, "fci_i2c_read() result=%d, addr = %x, data=%x\n" - , ret, addr, *data); - return ret; - } - - return ret; -} - -int fci_i2c_write(HANDLE hDevice, u8 chip, u8 addr, u8 alen, u8 *data, u8 len) -{ - int ret; - u8 *paddr = &addr; - - ret = fci_i2c_transfer(hDevice, I2C_WRITE, chip << 1 - , paddr, alen, data, len); - - if (ret != I2C_OK) - PRINTF(hDevice, "fci_i2c_write() result=%d, addr= %x, data=%x\n" - , ret, addr, *data); - - return ret; -} - -int fci_i2c_deinit(HANDLE hDevice) -{ - bbm_write(hDevice, BBM_I2C_CTR, 0x00); - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fci_i2c.h b/drivers/media/isdbt/fc8150/fci_i2c.h deleted file mode 100644 index 8c4ce07..0000000 --- a/drivers/media/isdbt/fc8150/fci_i2c.h +++ /dev/null @@ -1,29 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_i2c.h - - Description : fci i2c driver header -*******************************************************************************/ - -#ifndef __FCI_I2C_H__ -#define __FCI_I2C_H__ - -#include "fci_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fci_i2c_init(HANDLE hDevice, int speed, int slaveaddr); -extern int fci_i2c_read(HANDLE hDevice, u8 chip, u8 addr - , u8 alen, u8 *data, u8 len); -extern int fci_i2c_write(HANDLE hDevice, u8 chip, u8 addr - , u8 alen, u8 *data, u8 len); -extern int fci_i2c_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fci_oal.c b/drivers/media/isdbt/fc8150/fci_oal.c deleted file mode 100644 index a7d7f77..0000000 --- a/drivers/media/isdbt/fc8150/fci_oal.c +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_oal.c - - Description : OS adaptation layer -*******************************************************************************/ -#include -#include - -#include "fc8150_regs.h" -#include "fci_types.h" - -void PRINTF(HANDLE hDevice, char *fmt, ...) -{ - va_list ap; - char str[256]; - - va_start(ap, fmt); - vsprintf(str, fmt, ap); - - printk(KERN_DEBUG"%s", str); - - va_end(ap); -} - -void msWait(int ms) -{ - msleep(ms); -} - -void OAL_CREATE_SEMAPHORE(void) -{ - -} - -void OAL_DELETE_SEMAPHORE(void) -{ - -} - -void OAL_OBTAIN_SEMAPHORE(void) -{ - -} - -void OAL_RELEASE_SEMAPHORE(void) -{ - -} diff --git a/drivers/media/isdbt/fc8150/fci_oal.h b/drivers/media/isdbt/fc8150/fci_oal.h deleted file mode 100644 index 88b3c35..0000000 --- a/drivers/media/isdbt/fc8150/fci_oal.h +++ /dev/null @@ -1,28 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_oal.h - - Description : OS adatation layer -*******************************************************************************/ - -#ifndef __FCI_OAL_H__ -#define __FCI_OAL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern void PRINTF(HANDLE hDevice, char *fmt, ...); -extern void msWait(int ms); - -extern void OAL_CREATE_SEMAPHORE(void); -extern void OAL_DELETE_SEMAPHORE(void); -extern void OAL_OBTAIN_SEMAPHORE(void); -extern void OAL_RELEASE_SEMAPHORE(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fci_ringbuffer.c b/drivers/media/isdbt/fc8150/fci_ringbuffer.c deleted file mode 100644 index 25fad51..0000000 --- a/drivers/media/isdbt/fc8150/fci_ringbuffer.c +++ /dev/null @@ -1,271 +0,0 @@ -/***************************************************************************** - Copyright(c) 2010 FCI Inc. All Rights Reserved - - File name : fci_ringbuffer.c - - Description : fci ringbuffer - - History : - ---------------------------------------------------------------------- - 2010/11/25 aslan.cho initial -*******************************************************************************/ - -#include -#include -#include -#include -#include -#include - -#include "fci_ringbuffer.h" - -#define PKT_READY 0 -#define PKT_DISPOSED 1 - -void fci_ringbuffer_init(struct fci_ringbuffer *rbuf, void *data, size_t len) -{ - rbuf->pread = rbuf->pwrite = 0; - rbuf->data = data; - rbuf->size = len; - rbuf->error = 0; - - init_waitqueue_head(&rbuf->queue); - - spin_lock_init(&(rbuf->lock)); -} - -int fci_ringbuffer_empty(struct fci_ringbuffer *rbuf) -{ - return (rbuf->pread == rbuf->pwrite); -} - -ssize_t fci_ringbuffer_free(struct fci_ringbuffer *rbuf) -{ - ssize_t free; - - free = rbuf->pread - rbuf->pwrite; - if (free <= 0) - free += rbuf->size; - return free-1; -} - -ssize_t fci_ringbuffer_avail(struct fci_ringbuffer *rbuf) -{ - ssize_t avail; - - avail = rbuf->pwrite - rbuf->pread; - if (avail < 0) - avail += rbuf->size; - return avail; -} - -void fci_ringbuffer_flush(struct fci_ringbuffer *rbuf) -{ - rbuf->pread = rbuf->pwrite; - rbuf->error = 0; -} - -void fci_ringbuffer_reset(struct fci_ringbuffer *rbuf) -{ - rbuf->pread = rbuf->pwrite = 0; - rbuf->error = 0; -} - -void fci_ringbuffer_flush_spinlock_wakeup(struct fci_ringbuffer *rbuf) -{ - unsigned long flags; - - spin_lock_irqsave(&rbuf->lock, flags); - fci_ringbuffer_flush(rbuf); - spin_unlock_irqrestore(&rbuf->lock, flags); - - wake_up(&rbuf->queue); -} - -ssize_t fci_ringbuffer_read_user(struct fci_ringbuffer *rbuf - , u8 __user *buf, size_t len) -{ - size_t todo = len; - size_t split; - - split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0; - if (split > 0) { - if (copy_to_user(buf, rbuf->data+rbuf->pread, split)) - return -EFAULT; - buf += split; - todo -= split; - rbuf->pread = 0; - } - if (copy_to_user(buf, rbuf->data+rbuf->pread, todo)) - return -EFAULT; - - rbuf->pread = (rbuf->pread + todo) % rbuf->size; - - return len; -} - -void fci_ringbuffer_read(struct fci_ringbuffer *rbuf, u8 *buf, size_t len) -{ - size_t todo = len; - size_t split; - - split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0; - if (split > 0) { - memcpy(buf, rbuf->data+rbuf->pread, split); - buf += split; - todo -= split; - rbuf->pread = 0; - } - memcpy(buf, rbuf->data+rbuf->pread, todo); - - rbuf->pread = (rbuf->pread + todo) % rbuf->size; -} - -ssize_t fci_ringbuffer_write(struct fci_ringbuffer *rbuf - , const u8 *buf, size_t len) -{ - size_t todo = len; - size_t split; - - split = (rbuf->pwrite + len > rbuf->size) - ? rbuf->size - rbuf->pwrite : 0; - - if (split > 0) { - memcpy(rbuf->data+rbuf->pwrite, buf, split); - buf += split; - todo -= split; - rbuf->pwrite = 0; - } - memcpy(rbuf->data+rbuf->pwrite, buf, todo); - rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; - - return len; -} - -ssize_t fci_ringbuffer_pkt_write(struct fci_ringbuffer *rbuf - , u8 *buf, size_t len) -{ - int status; - ssize_t oldpwrite = rbuf->pwrite; - - FCI_RINGBUFFER_WRITE_BYTE(rbuf, len >> 8); - FCI_RINGBUFFER_WRITE_BYTE(rbuf, len & 0xff); - FCI_RINGBUFFER_WRITE_BYTE(rbuf, PKT_READY); - status = fci_ringbuffer_write(rbuf, buf, len); - - if (status < 0) - rbuf->pwrite = oldpwrite; - return status; -} - -ssize_t fci_ringbuffer_pkt_read_user(struct fci_ringbuffer *rbuf, size_t idx, - int offset, u8 __user *buf, size_t len) -{ - size_t todo; - size_t split; - size_t pktlen; - - pktlen = rbuf->data[idx] << 8; - pktlen |= rbuf->data[(idx + 1) % rbuf->size]; - if (offset > pktlen) - return -EINVAL; - if ((offset + len) > pktlen) - len = pktlen - offset; - - idx = (idx + FCI_RINGBUFFER_PKTHDRSIZE + offset) % rbuf->size; - todo = len; - split = ((idx + len) > rbuf->size) ? rbuf->size - idx : 0; - if (split > 0) { - if (copy_to_user(buf, rbuf->data+idx, split)) - return -EFAULT; - buf += split; - todo -= split; - idx = 0; - } - if (copy_to_user(buf, rbuf->data+idx, todo)) - return -EFAULT; - - return len; -} - -ssize_t fci_ringbuffer_pkt_read(struct fci_ringbuffer *rbuf, size_t idx, - int offset, u8 *buf, size_t len) -{ - size_t todo; - size_t split; - size_t pktlen; - - pktlen = rbuf->data[idx] << 8; - pktlen |= rbuf->data[(idx + 1) % rbuf->size]; - if (offset > pktlen) - return -EINVAL; - if ((offset + len) > pktlen) - len = pktlen - offset; - - idx = (idx + FCI_RINGBUFFER_PKTHDRSIZE + offset) % rbuf->size; - todo = len; - split = ((idx + len) > rbuf->size) ? rbuf->size - idx : 0; - if (split > 0) { - memcpy(buf, rbuf->data+idx, split); - buf += split; - todo -= split; - idx = 0; - } - memcpy(buf, rbuf->data+idx, todo); - return len; -} - -void fci_ringbuffer_pkt_dispose(struct fci_ringbuffer *rbuf, size_t idx) -{ - size_t pktlen; - - rbuf->data[(idx + 2) % rbuf->size] = PKT_DISPOSED; - - while (fci_ringbuffer_avail(rbuf) > FCI_RINGBUFFER_PKTHDRSIZE) { - if (FCI_RINGBUFFER_PEEK(rbuf, 2) == PKT_DISPOSED) { - pktlen = FCI_RINGBUFFER_PEEK(rbuf, 0) << 8; - pktlen |= FCI_RINGBUFFER_PEEK(rbuf, 1); - FCI_RINGBUFFER_SKIP(rbuf - , pktlen + FCI_RINGBUFFER_PKTHDRSIZE); - } else - break; - } -} - -ssize_t fci_ringbuffer_pkt_next(struct fci_ringbuffer *rbuf - , size_t idx, size_t *pktlen) -{ - int consumed; - int curpktlen; - int curpktstatus; - - if (idx == -1) - idx = rbuf->pread; - else { - curpktlen = rbuf->data[idx] << 8; - curpktlen |= rbuf->data[(idx + 1) % rbuf->size]; - idx = (idx + curpktlen + FCI_RINGBUFFER_PKTHDRSIZE) - % rbuf->size; - } - - consumed = (idx - rbuf->pread) % rbuf->size; - - while ((fci_ringbuffer_avail(rbuf) - consumed) - > FCI_RINGBUFFER_PKTHDRSIZE) { - - curpktlen = rbuf->data[idx] << 8; - curpktlen |= rbuf->data[(idx + 1) % rbuf->size]; - curpktstatus = rbuf->data[(idx + 2) % rbuf->size]; - - if (curpktstatus == PKT_READY) { - *pktlen = curpktlen; - return idx; - } - - consumed += curpktlen + FCI_RINGBUFFER_PKTHDRSIZE; - idx = (idx + curpktlen + FCI_RINGBUFFER_PKTHDRSIZE) - % rbuf->size; - } - - return -1; -} diff --git a/drivers/media/isdbt/fc8150/fci_ringbuffer.h b/drivers/media/isdbt/fc8150/fci_ringbuffer.h deleted file mode 100644 index 0d1a2cc..0000000 --- a/drivers/media/isdbt/fc8150/fci_ringbuffer.h +++ /dev/null @@ -1,89 +0,0 @@ -/***************************************************************************** - Copyright(c) 2010 FCI Inc. All Rights Reserved - - File name : fci_ringbuffer.h - - Description : - - History : - ---------------------------------------------------------------------- - 2010/11/25 aslan.cho initial -*******************************************************************************/ - -#ifndef __FCI_RINGBUFFER_H__ -#define __FCI_RINGBUFFER_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -struct fci_ringbuffer { - u8 *data; - ssize_t size; - ssize_t pread; - ssize_t pwrite; - int error; - - wait_queue_head_t queue; - spinlock_t lock; -}; - -#define FCI_RINGBUFFER_PKTHDRSIZE 3 - -extern void fci_ringbuffer_init(struct fci_ringbuffer *rbuf - , void *data, size_t len); - -extern int fci_ringbuffer_empty(struct fci_ringbuffer *rbuf); - -extern ssize_t fci_ringbuffer_free(struct fci_ringbuffer *rbuf); - -extern ssize_t fci_ringbuffer_avail(struct fci_ringbuffer *rbuf); - -extern void fci_ringbuffer_reset(struct fci_ringbuffer *rbuf); - -extern void fci_ringbuffer_flush(struct fci_ringbuffer *rbuf); - -extern void fci_ringbuffer_flush_spinlock_wakeup(struct fci_ringbuffer *rbuf); - -#define FCI_RINGBUFFER_PEEK(rbuf, offs) \ - ((rbuf)->data[((rbuf)->pread+(offs)) % (rbuf)->size]) - -#define FCI_RINGBUFFER_SKIP(rbuf, num) \ - ((rbuf)->pread = ((rbuf)->pread+(num)) % (rbuf)->size) - -extern ssize_t fci_ringbuffer_read_user(struct fci_ringbuffer *rbuf -, u8 __user *buf, size_t len); - -extern void fci_ringbuffer_read(struct fci_ringbuffer *rbuf - , u8 *buf, size_t len); - - -#define FCI_RINGBUFFER_WRITE_BYTE(rbuf, byte) \ - { (rbuf)->data[(rbuf)->pwrite] = (byte); \ - (rbuf)->pwrite = ((rbuf)->pwrite + 1) % (rbuf)->size; } - -extern ssize_t fci_ringbuffer_write(struct fci_ringbuffer *rbuf - , const u8 *buf, size_t len); - -extern ssize_t fci_ringbuffer_pkt_write(struct fci_ringbuffer *rbuf - , u8 *buf, size_t len); - -extern ssize_t fci_ringbuffer_pkt_read_user(struct fci_ringbuffer *rbuf - , size_t idx, int offset, u8 __user *buf, size_t len); - -extern ssize_t fci_ringbuffer_pkt_read(struct fci_ringbuffer *rbuf - , size_t idx, int offset, u8 *buf, size_t len); - -extern void fci_ringbuffer_pkt_dispose(struct fci_ringbuffer *rbuf, size_t idx); - -extern ssize_t fci_ringbuffer_pkt_next(struct fci_ringbuffer *rbuf - , size_t idx, size_t *pktlen); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fci_tun.c b/drivers/media/isdbt/fc8150/fci_tun.c deleted file mode 100644 index a369487..0000000 --- a/drivers/media/isdbt/fc8150/fci_tun.c +++ /dev/null @@ -1,204 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_tun.c - - Description : tuner control driver -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_hal.h" -#include "fci_tun.h" -#include "fci_i2c.h" -#include "fci_bypass.h" -#include "fc8150_regs.h" -#include "fc8150_bb.h" -#include "fc8150_tun.h" - - -#define FC8150_TUNER_ADDR 0x5b - -static u8 tuner_addr = FC8150_TUNER_ADDR; -static enum band_type tuner_band = ISDBT_1_SEG_TYPE; -static enum i2c_type tuner_i2c = FCI_I2C_TYPE; - -struct I2C_DRV { - int (*init)(HANDLE hDevice, int speed, int slaveaddr); - int (*read)(HANDLE hDevice, u8 chip, u8 addr - , u8 alen, u8 *data, u8 len); - int (*write)(HANDLE hDevice, u8 chip, u8 addr - , u8 alen, u8 *data, u8 len); - int (*deinit)(HANDLE hDevice); -}; - -static struct I2C_DRV fcii2c = { - &fci_i2c_init, - &fci_i2c_read, - &fci_i2c_write, - &fci_i2c_deinit -}; - -static struct I2C_DRV fcibypass = { - &fci_bypass_init, - &fci_bypass_read, - &fci_bypass_write, - &fci_bypass_deinit -}; - -struct TUNER_DRV { - int (*init)(HANDLE hDevice, enum band_type band); - int (*set_freq)(HANDLE hDevice - , enum band_type band, u32 rf_Khz); - int (*get_rssi)(HANDLE hDevice, int *rssi); - int (*deinit)(HANDLE hDevice); -}; - -static struct TUNER_DRV fc8150_tuner = { - &fc8150_tuner_init, - &fc8150_set_freq, - &fc8150_get_rssi, - &fc8150_tuner_deinit -}; - -#if 0 -static TUNER_DRV fc8151_tuner = { - &fc8151_tuner_init, - &fc8151_set_freq, - &fc8151_get_rssi, - &fc8151_tuner_deinit -}; -#endif - -static struct I2C_DRV *tuner_ctrl = &fcii2c; -static struct TUNER_DRV *tuner = &fc8150_tuner; - -int tuner_ctrl_select(HANDLE hDevice, enum i2c_type type) -{ - switch (type) { - case FCI_I2C_TYPE: - tuner_ctrl = &fcii2c; - break; - case FCI_BYPASS_TYPE: - tuner_ctrl = &fcibypass; - break; - default: - return BBM_E_TN_CTRL_SELECT; - } - - if (tuner_ctrl->init(hDevice, 600, 0)) - return BBM_E_TN_CTRL_INIT; - - tuner_i2c = type; - - return BBM_OK; -} - -int tuner_ctrl_deselect(HANDLE hDevice) -{ - if (tuner_ctrl == NULL) - return BBM_E_TN_CTRL_SELECT; - - tuner_ctrl->deinit(hDevice); - - tuner_i2c = FCI_I2C_TYPE; - tuner_ctrl = &fcii2c; - - return BBM_OK; -} - -int tuner_i2c_read(HANDLE hDevice, u8 addr, u8 alen, u8 *data, u8 len) -{ - if (tuner_ctrl == NULL) - return BBM_E_TN_CTRL_SELECT; - - if (tuner_ctrl->read(hDevice, tuner_addr, addr, alen, data, len)) - return BBM_E_TN_READ; - - return BBM_OK; -} - -int tuner_i2c_write(HANDLE hDevice, u8 addr, u8 alen, u8 *data, u8 len) -{ - if (tuner_ctrl == NULL) - return BBM_E_TN_CTRL_SELECT; - - if (tuner_ctrl->write(hDevice, tuner_addr, addr, alen, data, len)) - return BBM_E_TN_WRITE; - - return BBM_OK; -} - -int tuner_set_freq(HANDLE hDevice, u32 freq) -{ - if (tuner == NULL) - return BBM_E_TN_SELECT; - -#if (BBM_BAND_WIDTH == 8) - freq -= 460; -#else - freq -= 380; -#endif - - if (tuner->set_freq(hDevice, tuner_band, freq)) - return BBM_E_TN_SET_FREQ; - - fc8150_reset(hDevice); - - return BBM_OK; -} - -int tuner_select(HANDLE hDevice, u32 product, u32 band) -{ - switch (product) { - case FC8150_TUNER: - tuner = &fc8150_tuner; - tuner_addr = FC8150_TUNER_ADDR; - tuner_band = band; - break; -#if 0 - case FC8151_TUNER: - tuner = &fc8151_tuner; - tuner_addr = FC8150_TUNER_ADDR; - tuner_band = band; - break; -#endif - default: - return BBM_E_TN_SELECT; - } - - if (tuner == NULL) - return BBM_E_TN_SELECT; - - if (tuner_i2c == FCI_BYPASS_TYPE) - bbm_write(hDevice, BBM_RF_DEVID, tuner_addr); - - if (tuner->init(hDevice, tuner_band)) - return BBM_E_TN_INIT; - - return BBM_OK; -} - -int tuner_deselect(HANDLE hDevice) -{ - if (tuner == NULL) - return BBM_E_TN_SELECT; - - if (tuner->deinit(hDevice)) - return BBM_NOK; - - tuner = NULL; - - return BBM_OK; -} - -int tuner_get_rssi(HANDLE hDevice, s32 *rssi) -{ - if (tuner == NULL) - return BBM_E_TN_SELECT; - - if (tuner->get_rssi(hDevice, rssi)) - return BBM_E_TN_RSSI; - - return BBM_OK; -} diff --git a/drivers/media/isdbt/fc8150/fci_tun.h b/drivers/media/isdbt/fc8150/fci_tun.h deleted file mode 100644 index f81c522..0000000 --- a/drivers/media/isdbt/fc8150/fci_tun.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_tun.h - - Description : tuner control driver -*******************************************************************************/ - -#ifndef __FCI_TUN_H__ -#define __FCI_TUN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fci_types.h" - -enum i2c_type { - FCI_I2C_TYPE = 0, - FCI_BYPASS_TYPE = 1 -}; - -enum band_type { - ISDBT_1_SEG_TYPE = 2 -}; - -enum product_type { - FC8150_TUNER = 8150, - FC8151_TUNER = 8151 -}; - -extern int tuner_ctrl_select(HANDLE hDevice, enum i2c_type type); -extern int tuner_ctrl_deselect(HANDLE hDevice); -extern int tuner_select(HANDLE hDevice, u32 product, u32 band); -extern int tuner_deselect(HANDLE hDevice); - -extern int tuner_i2c_read(HANDLE hDevice, u8 addr, u8 alen, u8 *data, u8 len); -extern int tuner_i2c_write(HANDLE hDevice, u8 addr, u8 alen, u8 *data, u8 len); -extern int tuner_set_freq(HANDLE hDevice, u32 freq); -extern int tuner_get_rssi(HANDLE hDevice, s32 *rssi); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/fc8150/fci_types.h b/drivers/media/isdbt/fc8150/fci_types.h deleted file mode 100644 index 95b5ca8..0000000 --- a/drivers/media/isdbt/fc8150/fci_types.h +++ /dev/null @@ -1,61 +0,0 @@ -/***************************************************************************** - Copyright(c) 2012 FCI Inc. All Rights Reserved - - File name : fci_types.h - - Description : -*******************************************************************************/ - -#ifndef __FCI_TYPES_H__ -#define __FCI_TYPES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef HANDLE -#define HANDLE void * -#endif - -#define BBM_HPI 0 -#define BBM_SPI 1 -#define BBM_USB 2 -#define BBM_I2C 3 -#define BBM_PPI 4 -#define BBM_SPIB 5 - -#define s8 signed char -#define s16 signed short int -#define s32 signed int -#define u8 unsigned char -#define u16 unsigned short -#define u32 unsigned int -#define TRUE 1 -#define FALSE 0 - -#ifndef NULL -#define NULL 0 -#endif - -#define BBM_OK 0 -#define BBM_NOK 1 - -#define BBM_E_FAIL 0x00000001 -#define BBM_E_HOSTIF_SELECT 0x00000002 -#define BBM_E_HOSTIF_INIT 0x00000003 -#define BBM_E_BB_WRITE 0x00000100 -#define BBM_E_BB_READ 0x00000101 -#define BBM_E_TN_WRITE 0x00000200 -#define BBM_E_TN_READ 0x00000201 -#define BBM_E_TN_CTRL_SELECT 0x00000202 -#define BBM_E_TN_CTRL_INIT 0x00000203 -#define BBM_E_TN_SELECT 0x00000204 -#define BBM_E_TN_INIT 0x00000205 -#define BBM_E_TN_RSSI 0x00000206 -#define BBM_E_TN_SET_FREQ 0x00000207 - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/media/isdbt/isdbt.c b/drivers/media/isdbt/isdbt.c deleted file mode 100644 index da08bc0..0000000 --- a/drivers/media/isdbt/isdbt.c +++ /dev/null @@ -1,598 +0,0 @@ -/************************************************************ - * /drivers/media/isdbt/isdbt.c - * - * ISDBT DRIVER - * - * - * Copyright (c) 2011 Samsung Electronics - * - * http://www.samsung.com - * - ***********************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "isdbt.h" - -#define SPI_FIND_HEADER_IN_BUFFER -/* #define SPI_WRITE_BUF */ - -#define DATA_PACKET_SIZE 188 -#define DATA_PACKET_CNT 128 -#define SPI_BURST_READ_SIZE (DATA_PACKET_SIZE * DATA_PACKET_CNT) -#define SPI_DATA_FRAME_BUF (SPI_BURST_READ_SIZE * 10) - -#define SPI_READ_TIMEOUT (SPI_BURST_READ_SIZE/40 + 10) - -#define READ_PACKET_MARGIN (DATA_PACKET_SIZE/2) - -#define HEADER_OF_VALID_PACKET 0x47 -#define INVALID_PACKET_CHECK_CNT 3 - -#define CS_INT_MODE() S3C_GPIO_SFN(0xf) -#define CS_SPI_MODE() S3C_GPIO_SFN(0x2) - -#define SPIDEV_WARMUP_DELAY 300 - -#define DEVICE_NAME "isdbtdata" - -typedef struct{ - int index; - int init_info; - unsigned char *rBuf; - unsigned char *wBuf; - struct mutex buflock; - struct completion xfer_completion; - struct completion overflow_completion; - long xfer_size; - int xfer_result; - struct class *isdbt_class; - struct device *isdbt_debug_dev; - struct spi_device *spidev; - unsigned char *RingBuf; - long ring_buf_wr_pos; - long ring_buf_rd_pos; - int buf_over_flow; - struct workqueue_struct *read_workqueue; - struct work_struct work_read_spi; - unsigned long pkt_err_cnt; -} isdbt_spi_info; - -static isdbt_spi_info *isdbt_data; - -static ssize_t isdbt_status_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - isdbt_spi_info *pdev = dev_get_drvdata(dev); - int result = 0; - - if (pdev->init_info == 0) - result = 0; - else - result = 1; - - return sprintf(buf, " %s \n wr_pos : [ %lx ]\n rd_pos : [ %lx ] \n pkt_err_cnt [ %lx ]\n", - (result & 1) ? "active" : "deactive", pdev->ring_buf_wr_pos, - pdev->ring_buf_rd_pos, pdev->pkt_err_cnt); -} -static DEVICE_ATTR(isdbt_status, 0666, isdbt_status_show, NULL); - - -static int fc8100_spi_read(struct spi_device *spidev, u8 *buf, size_t len) -{ - struct spi_message msg; - struct spi_transfer transfer; - int status = 0; - int result = 0; - - memset(&msg, 0, sizeof(msg)); - memset(&transfer, 0, sizeof(transfer)); - - spi_message_init(&msg); - msg.spi = spidev; - - transfer.tx_buf = (unsigned char *)NULL; - transfer.rx_buf = (unsigned char *)buf; - transfer.len = len; - transfer.bits_per_word = 8; - transfer.delay_usecs = 0; - - spi_message_add_tail(&transfer, &msg); - status = spi_sync(spidev, &msg); - - if (status == 0) - result = msg.actual_length; - else - result = status; - - return result; -} - - - -static int fc8100_spi_write(struct spi_device *spidev, u8 *buf, size_t len) -{ - struct spi_message msg; - struct spi_transfer transfer; - int status = 0; - int result = 0; - - memset(&msg, 0, sizeof(msg)); - memset(&transfer, 0, sizeof(transfer)); - - spi_message_init(&msg); - msg.spi = spidev; - - transfer.tx_buf = (unsigned char *)buf; - transfer.rx_buf = (unsigned char *)NULL; - transfer.len = len; - transfer.bits_per_word = 8; - transfer.delay_usecs = 0; - - spi_message_add_tail(&transfer, &msg); - status = spi_sync(spidev, &msg); - - if (status == 0) - result = msg.actual_length; - else - result = status; - - return result; -} - -static int fc8100_spi_probe(struct spi_device *spi) -{ - int ret = -EINVAL; - isdbt_spi_info *pdev; - - pdev = kmalloc(sizeof(isdbt_spi_info), GFP_KERNEL); - if (pdev == NULL) { - I_DEV_DBG(" memory allocation failed "); - ret = -ENOMEM; - goto done; - } - memset(pdev, 0, sizeof(isdbt_spi_info)); - - pdev->isdbt_class = class_create(THIS_MODULE, "isdbt"); - if (IS_ERR(pdev->isdbt_class)) { - I_DEV_DBG(" could not create isdbt_class"); - goto err_class_create; - } - - pdev->isdbt_debug_dev = device_create(pdev->isdbt_class, - NULL, 0, NULL, "isdbt_status"); - if (IS_ERR(pdev->isdbt_debug_dev)) { - I_DEV_DBG(" could not create isdbt_status file"); - goto err_device_create; - } - - if (device_create_file(pdev->isdbt_debug_dev, - &dev_attr_isdbt_status) < 0) { - I_DEV_DBG(" could not create device file(%s)", - dev_attr_isdbt_status.attr.name); - goto err_device_create_file; - } - - pdev->spidev = spi; - pdev->spidev->mode = (SPI_MODE_0|SPI_CS_HIGH); - pdev->spidev->bits_per_word = 8; - - dev_set_drvdata(pdev->isdbt_debug_dev, pdev); - - ret = spi_setup(pdev->spidev); - - spi_set_drvdata(spi, pdev); - isdbt_data = pdev; - - I_DEV_DBG("Probe %s ,[ %d ]", (ret & 1) ? "ERROR" : "SUCCESS" , ret); - goto done; - -err_device_create_file: - device_destroy(pdev->isdbt_class, 0); -err_device_create: - class_destroy(pdev->isdbt_class); -err_class_create: - kfree(pdev); -done: - return ret; -} - -static int fc8100_spi_remove(struct spi_device *spi) -{ - isdbt_spi_info *pdev = spi_get_drvdata(spi); - - device_destroy(pdev->isdbt_class, 0); - class_destroy(pdev->isdbt_class); - kfree(pdev); - isdbt_data = NULL; - I_DEV_DBG(""); - return 0; -} - -static struct spi_driver fc8100_spi_driver = { - .driver = { - .name = "isdbtspi", - .bus = &spi_bus_type, - .owner = THIS_MODULE, - }, - .probe = fc8100_spi_probe, - .remove = __devexit_p(fc8100_spi_remove), -}; - -static int fc8100_spi_driver_init(void) -{ - int ret = 0; - - ret = spi_register_driver(&fc8100_spi_driver); - - I_DEV_DBG("FC8100 SPI DRIVER %s , ret = [ %d ]", - (ret & 1) ? "ERROR" : " INIT ", ret); - - return ret; -} - -static void fc8100_spi_exit(void) -{ - I_DEV_DBG(""); - spi_unregister_driver(&fc8100_spi_driver); - return; -} - -static void IsValied_packet_check(isdbt_spi_info *pdev) -{ - int cnt = 0; - - /* Find Header */ - while (1) { - if ((pdev->rBuf[cnt] == HEADER_OF_VALID_PACKET) - && (pdev->rBuf[cnt + DATA_PACKET_SIZE] == HEADER_OF_VALID_PACKET) - && (pdev->rBuf[cnt + (DATA_PACKET_SIZE*2)] == HEADER_OF_VALID_PACKET)) { - break; - } - - if (cnt > READ_PACKET_MARGIN) { - pdev->pkt_err_cnt++; - I_DEV_DBG(" FIND ====== ERROR cnt = %d, pkt_err_cnt = %d ", - cnt, pdev->pkt_err_cnt); - pdev->xfer_result = -EINVAL; - break; - } - cnt++; - } - - if (pdev->xfer_result == pdev->xfer_size) { - mutex_lock(&pdev->buflock); - if (pdev->ring_buf_wr_pos + cnt > SPI_DATA_FRAME_BUF) { - pdev->ring_buf_wr_pos = 0; - pdev->buf_over_flow = 1; - complete(&pdev->overflow_completion); - } - memcpy(&pdev->RingBuf[pdev->ring_buf_wr_pos], - &pdev->rBuf[cnt], pdev->xfer_result); - pdev->ring_buf_wr_pos += pdev->xfer_result; - pdev->index = 1; - mutex_unlock(&pdev->buflock); - complete(&pdev->xfer_completion); - } - - return; -} - -void isdbt_work_queue_spi_read_buf(struct work_struct *work) -{ - isdbt_spi_info *pdev = container_of(work, isdbt_spi_info, work_read_spi); - struct s3c64xx_spi_csinfo *cs = pdev->spidev->controller_data; - - disable_irq(gpio_to_irq(cs->line)); - s3c_gpio_cfgpin(cs->line, CS_SPI_MODE()); - udelay(SPIDEV_WARMUP_DELAY); - INIT_COMPLETION(pdev->xfer_completion); - pdev->xfer_size = SPI_BURST_READ_SIZE + READ_PACKET_MARGIN ; - pdev->xfer_result = fc8100_spi_read(pdev->spidev, - pdev->rBuf, pdev->xfer_size); - pdev->xfer_size -= READ_PACKET_MARGIN; - pdev->xfer_result -= READ_PACKET_MARGIN; - - s3c_gpio_cfgpin(cs->line, CS_INT_MODE()); - enable_irq(gpio_to_irq(cs->line)); - - if ((pdev->xfer_result != pdev->xfer_size) - || (pdev->xfer_result < DATA_PACKET_SIZE*INVALID_PACKET_CHECK_CNT)) { - I_DEV_DBG(" Packet read failed = %d", pdev->xfer_result); - pdev->xfer_result = -EINVAL; - } else { - IsValied_packet_check(pdev); - } - - return; -} - - -static irqreturn_t isdbt_read_data_threaded_irq(int irq, void *data) -{ - isdbt_spi_info *pdev = (isdbt_spi_info *)(data); - queue_work(pdev->read_workqueue, &pdev->work_read_spi); - return IRQ_HANDLED; -} - -static int isdbt_open(struct inode *inode, struct file *filp) -{ - int status = 0; - isdbt_spi_info *pdev; - struct s3c64xx_spi_csinfo *cs; - I_DEV_DBG(""); - - pdev = isdbt_data; - - if (pdev->init_info == 1) { - I_DEV_DBG("Already open...."); - return status; - } - - pdev->index = 0; - pdev->ring_buf_wr_pos = 0; - pdev->ring_buf_rd_pos = 0; - pdev->buf_over_flow = 0; - - cs = pdev->spidev->controller_data; - - pdev->rBuf = kmalloc(SPI_BURST_READ_SIZE+(DATA_PACKET_SIZE*5), GFP_KERNEL); - if (pdev->rBuf == NULL) { - I_DEV_DBG(" rBuf :: kamlloc failed"); - status = -ENOMEM; - goto err_malloc_rBuf; - } - pdev->RingBuf = vmalloc(SPI_DATA_FRAME_BUF); - if (pdev->RingBuf == NULL) { - I_DEV_DBG(" ring buf :: malloc failed"); - status = -ENOMEM; - goto err_malloc_ringbuf; - } -#if defined(SPI_WRITE_BUF) - pdev->wBuf = kmalloc(SPI_BURST_READ_SIZE+(DATA_PACKET_SIZE*5), GFP_KERNEL); - if (pdev->wBuf == NULL) { - I_DEV_DBG(" wBuf :: kmalloc failed"); - status = -ENOMEM; - goto err_malloc_wBuf; - } -#endif - filp->private_data = pdev; - mutex_init(&pdev->buflock); - - pdev->read_workqueue = create_singlethread_workqueue("isdbtd"); - if (pdev->read_workqueue == 0) { - I_DEV_DBG(" ERROR : register workqueue"); - goto err_register_queue; - } - INIT_WORK(&pdev->work_read_spi, isdbt_work_queue_spi_read_buf); - - init_completion(&pdev->xfer_completion); - init_completion(&pdev->overflow_completion); - - status = request_threaded_irq(gpio_to_irq(cs->line), NULL, - isdbt_read_data_threaded_irq, IRQF_DISABLED, "isdbt_irq", pdev); - if (status != 0) { - I_DEV_DBG(" ERROR : request_threaded_irq failed = [ %d ]", status); - I_DEV_DBG("filp private_data=0x%x. ", (unsigned int)filp->private_data); - status = -EINVAL; - goto err_register_isr; - } - disable_irq(gpio_to_irq(cs->line)); - s3c_gpio_cfgpin(cs->line, CS_INT_MODE()); - set_irq_type(gpio_to_irq(cs->line), IRQ_TYPE_EDGE_RISING); - - I_DEV_DBG(""); - s3c_gpio_cfgpin(cs->line, CS_INT_MODE()); - enable_irq(gpio_to_irq(cs->line)); - - status = 0; - goto done; -err_register_isr: - free_irq(gpio_to_irq(cs->line), pdev); - flush_workqueue(pdev->read_workqueue); -#if defined(SPI_WRITE_BUF) - kfree(pdev->wBuf); -#endif -err_register_queue: - destroy_workqueue(pdev->read_workqueue); -#if defined(SPI_WRITE_BUF) -err_malloc_wBuf: - pdev->wBuf = NULL; -#endif - vfree(pdev->RingBuf); -err_malloc_ringbuf: - pdev->RingBuf = NULL; - kfree(pdev->rBuf); -err_malloc_rBuf: - pdev->rBuf = NULL; -done: - if (status == 0) - pdev->init_info = 1; - return status; -} - -static int isdbt_release(struct inode *inode, struct file *filp) -{ - isdbt_spi_info *pdev = (isdbt_spi_info *)(filp->private_data); - struct s3c64xx_spi_csinfo *cs = pdev->spidev->controller_data; - - if (pdev->init_info == 0) { - I_DEV_DBG(" Already release... "); - return 0; - } - - cancel_work_sync(&pdev->work_read_spi); - free_irq(gpio_to_irq(cs->line), pdev); - - flush_work(&pdev->work_read_spi); - flush_workqueue(pdev->read_workqueue); - destroy_workqueue(pdev->read_workqueue); - - vfree(pdev->RingBuf); - pdev->RingBuf = NULL; - -#if defined(SPI_WRITE_BUF) - kfree(pdev->wBuf); -#endif - pdev->wBuf = NULL; - - kfree(pdev->rBuf); - pdev->rBuf = NULL; - - pdev->init_info = 0; - return 0; -} - -static int isdbt_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) -{ - int result = 0; - int status = 0; - int unused_packet = 0; - - unsigned long timeout = 0; - isdbt_spi_info *pdev = (isdbt_spi_info *)(filp->private_data); - - if (pdev->index == 0) { - msleep(100); - return -EIO; - } - - if (pdev->ring_buf_rd_pos+count <= SPI_DATA_FRAME_BUF) { - if (pdev->buf_over_flow == 0) { - if (pdev->ring_buf_rd_pos+count > pdev->ring_buf_wr_pos) { - timeout = wait_for_completion_timeout(&pdev->xfer_completion, - msecs_to_jiffies(SPI_READ_TIMEOUT)); - I_DEV_DBG(" xfer timeout = %ld ", timeout); - if (timeout == 0) - result = -ETIMEDOUT; - } - } - } else { - if (!pdev->buf_over_flow) { - wait_for_completion_timeout(&pdev->overflow_completion, - msecs_to_jiffies(SPI_READ_TIMEOUT)); - INIT_COMPLETION(pdev->overflow_completion); - I_DEV_DBG(" overflow timeout = %ld ", timeout); - if (timeout == 0) - result = -ETIMEDOUT; - } - - pdev->buf_over_flow = 0; - pdev->ring_buf_rd_pos = 0; - if (pdev->ring_buf_rd_pos+count > pdev->ring_buf_wr_pos) { - wait_for_completion_timeout(&pdev->xfer_completion, - msecs_to_jiffies(SPI_READ_TIMEOUT)); - I_DEV_DBG(" over xfer timeout = %ld ", timeout); - if (timeout == 0) - result = -ETIMEDOUT; - } - } - - unused_packet = pdev->ring_buf_wr_pos - pdev->ring_buf_rd_pos+count; - if (pdev->buf_over_flow) - unused_packet += SPI_DATA_FRAME_BUF; - - if (result == 0) { - mutex_lock(&pdev->buflock); - status = copy_to_user(buf, &pdev->RingBuf[pdev->ring_buf_rd_pos], count); - if (status < 0) { - I_DEV_DBG(" copy user failed "); - result = -EFAULT; - } else { - result = count; - pdev->ring_buf_rd_pos += result; - } - mutex_unlock(&pdev->buflock); - if ((SPI_DATA_FRAME_BUF/5) < unused_packet) { - msleep(40); - I_DEV_DBG(" read write gap : %d ", unused_packet); - } else - msleep(80); - } - I_DEV_DBG(" rd pos %lx , unused %x", pdev->ring_buf_rd_pos, unused_packet); - - return result; -} - -static ssize_t isdbt_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos) -{ - int result = 0; - int status = 0; - isdbt_spi_info *pdev = (isdbt_spi_info *)(filp->private_data); - - mutex_lock(&pdev->buflock); - - status = copy_from_user(pdev->wBuf, buf, count); - if (status < 0) { - I_DEV_DBG(" copy user failed "); - result = -EINVAL; - } - - result = fc8100_spi_write(pdev->spidev, pdev->wBuf, count); - - if (result < 0) - I_DEV_DBG(" write failed = %d ", result); - - mutex_unlock(&pdev->buflock); - - return result; -} - - -static struct file_operations isdbt_spi_fops = { - .owner = THIS_MODULE, - .open = isdbt_open, - .release = isdbt_release, - .read = isdbt_read, - .write = isdbt_write, -}; - -static struct miscdevice isdbt_spi_misc_dev = { - .minor = MISC_DYNAMIC_MINOR, - .name = DEVICE_NAME, - .fops = &isdbt_spi_fops, -}; - -static int __init isdbt_spi_init(void) -{ - int ret = 0; - - I_DEV_DBG(""); - - ret = misc_register(&isdbt_spi_misc_dev); - - if (ret < 0) - I_DEV_DBG(" ERROR "); - else - ret = fc8100_spi_driver_init(); - - return ret; -} -module_init(isdbt_spi_init); - -static void __exit isdbt_spi_exit(void) -{ - I_DEV_DBG(""); - fc8100_spi_exit(); - misc_deregister(&isdbt_spi_misc_dev); -} -module_exit(isdbt_spi_exit); - -MODULE_DESCRIPTION(" ISDBT DRIVER - FC8100 "); -MODULE_AUTHOR("xmoondash"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/isdbt/isdbt.h b/drivers/media/isdbt/isdbt.h deleted file mode 100644 index cc56503..0000000 --- a/drivers/media/isdbt/isdbt.h +++ /dev/null @@ -1,26 +0,0 @@ -/************************************************************ - * /drivers/media/isdbt/isdbt.c - * - * ISDBT DRIVER - * - * - * Copyright (c) 2011 Samsung Electronics - * - * http://www.samsung.com - * - ***********************************************************/ -#ifndef __ISDBT_H__ -#define __ISDBT_H__ - -/* #define DEBUG_MSG_SPI */ - -#ifdef DEBUG_MSG_SPI -#define SUBJECT "ISDBT-SPI-DRIVER" -#define I_DEV_DBG(format, ...) \ - printk("[ "SUBJECT " (%s,%d) ] " format "\n", __func__, __LINE__, ## __VA_ARGS__) - -#else -#define I_DEV_DBG(format, ...) -#endif - -#endif diff --git a/drivers/media/tdmb/Kconfig b/drivers/media/tdmb/Kconfig deleted file mode 100644 index 10a51b0..0000000 --- a/drivers/media/tdmb/Kconfig +++ /dev/null @@ -1,89 +0,0 @@ -# -# TDMB config states -# - -#klaatu TDMB -config TDMB - bool "T-DMB" - help - This allows T-DMB support for Korea. - This module is designed for SPI or EBI2. - Select chipset and interface - -choice - depends on TDMB - depends on TDMB_VENDOR_FCI || TDMB_VENDOR_RAONTECH \ - || TDMB_VENDOR_INC || TDMB_VENDOR_TELECHIPS - prompt "interface" - default TDMB_SPI - config TDMB_SPI - bool "SPI" - config TDMB_EBI - bool "EBI" - config TDMB_TSIF - bool "TSIF" -endchoice - - config TDMB_VENDOR_FCI - depends on TDMB - bool "FCI" - -choice - depends on TDMB && TDMB_VENDOR_FCI - prompt "chip" - default TDMB_FC8053 - config TDMB_FC8053 - bool "FC8053" - config TDMB_FC8050 - bool "FC8050" -endchoice - -config TDMB_VENDOR_INC - depends on TDMB - bool "I&C" - -choice - depends on TDMB && TDMB_VENDOR_INC - prompt "chip" - default TDMB_T39F0 - config TDMB_T39F0 - bool "T39F0" - config TDMB_T3900 - bool "T3900" - config TDMB_T3700 - bool "T3700" - config TDMB_T3300 - bool "T3300" -endchoice - -config TDMB_VENDOR_RAONTECH - depends on TDMB - bool "Raontech" - -choice - depends on TDMB && TDMB_VENDOR_RAONTECH - prompt "chip" - default TDMB_MTV318 - config TDMB_MTV318 - bool "MTV318" -endchoice - -config TDMB_VENDOR_TELECHIPS - depends on TDMB - bool "Telechips" - -choice - depends on TDMB && TDMB_VENDOR_TELECHIPS - prompt "chip" - default TDMB_TCC3170 - config TDMB_TCC3170 - bool "TCC3170" -endchoice - -config TDMB_SIMUL - depends on TDMB - bool "Simulation" - -config TDMB_ANT_DET - depends on TDMB - bool "tdmb antenna detector" diff --git a/drivers/media/tdmb/Makefile b/drivers/media/tdmb/Makefile deleted file mode 100644 index 8bc2221..0000000 --- a/drivers/media/tdmb/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# -# Makefile for TDMB Device Drivers. -# - -ccflags-y += -Idrivers/media/tdmb -ccflags-y += -v - -obj-$(CONFIG_TDMB) += tdmb.o tdmb_data.o - -# T39F0 -ccflags-$(CONFIG_TDMB_T39F0) += -Idrivers/media/tdmb/t39f0 -obj-$(CONFIG_TDMB_T39F0) += tdmb_port_t3900.o -obj-$(CONFIG_TDMB_T39F0) += t3900/ -# T3900 -ccflags-$(CONFIG_TDMB_T3900) += -Idrivers/media/tdmb/t3900 -obj-$(CONFIG_TDMB_T3900) += tdmb_port_t3900.o -obj-$(CONFIG_TDMB_T3900) += t3900/ -# FC8050 -ccflags-$(CONFIG_TDMB_FC8050) += -Idrivers/media/tdmb/fc8050 -obj-$(CONFIG_TDMB_FC8050) += tdmb_port_fc8050.o -obj-$(CONFIG_TDMB_FC8050) += fc8050/ -# MTV318 -ccflags-$(CONFIG_TDMB_MTV318) += -Idrivers/media/tdmb/mtv318 -obj-$(CONFIG_TDMB_MTV318) += tdmb_port_mtv318.o -obj-$(CONFIG_TDMB_MTV318) += mtv318/ -# TCC3170 -ccflags-$(CONFIG_TDMB_TCC3170) += -Idrivers/media/tdmb/tcc3170 -ccflags-$(CONFIG_TDMB_TCC3170) += -Idrivers/media/tdmb/tcc3170/inc -ccflags-$(CONFIG_TDMB_TCC3170) += -Idrivers/media/tdmb/tcc3170/inc/tcpal -ccflags-$(CONFIG_TDMB_TCC3170) += -Idrivers/media/tdmb/tcc3170/inc/tcbd_diagnosis -ccflags-$(CONFIG_TDMB_TCC3170) += -Idrivers/media/tdmb/tcc3170/inc/tcbd_stream_parser -ccflags-$(CONFIG_TDMB_TCC3170) += -Idrivers/media/tdmb/tcc3170/inc/tcc_fic_decoder -obj-$(CONFIG_TDMB_TCC3170) += tdmb_port_tcc3170.o -obj-$(CONFIG_TDMB_TCC3170) += tcc3170/ -# Test -obj-$(CONFIG_TDMB_SIMUL) += tdmb_port_Simul.o - -# i/f -obj-$(CONFIG_TDMB_SPI) += tdmb_spi.o -obj-$(CONFIG_TDMB_EBI) += tdmb_ebi.o - diff --git a/drivers/media/tdmb/fc8050/Makefile b/drivers/media/tdmb/fc8050/Makefile deleted file mode 100644 index c2e2fc9..0000000 --- a/drivers/media/tdmb/fc8050/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -obj-y += bbm.o -obj-y += dmbdrv_wrap_fc8050.o -obj-y += fc8050_bb.o -obj-y += fc8050_i2c.o -obj-y += fc8050_isr.o -obj-y += fc8050_spi.o -obj-y += fc8050_tun.o -obj-y += fci_hal.o -obj-y += fci_i2c.o -obj-y += fci_oal.o -obj-y += fci_tun.o -obj-y += fic.o -obj-y += ficdecoder.o - -ccflags-y += -Idrivers/media/tdmb diff --git a/drivers/media/tdmb/fc8050/bbm.c b/drivers/media/tdmb/fc8050/bbm.c deleted file mode 100644 index 0074803..0000000 --- a/drivers/media/tdmb/fc8050/bbm.c +++ /dev/null @@ -1,364 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : bbm.c - - Description : API of dmb baseband module - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - - -#include "fci_types.h" -#include "fci_tun.h" -#include "fc8050_regs.h" -#include "fc8050_bb.h" -#include "fci_hal.h" -#include "fc8050_isr.h" - -int bbm_com_reset(HANDLE hDevice) -{ - int res; - - res = fc8050_reset(hDevice); - - return res; -} - -int bbm_com_probe(HANDLE hDevice) -{ - int res; - - res = fc8050_probe(hDevice); - - return res; -} - -int bbm_com_init(HANDLE hDevice) -{ - int res; - - res = fc8050_init(hDevice); - - return res; -} - -int bbm_com_deinit(HANDLE hDevice) -{ - int res; - - res = fc8050_deinit(hDevice); - - return res; -} - -int bbm_com_read(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = bbm_read(hDevice, addr, data); - - return res; -} - -int bbm_com_byte_read(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - - res = bbm_byte_read(hDevice, addr, data); - - return res; -} - -int bbm_com_word_read(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - - res = bbm_word_read(hDevice, addr, data); - - return res; -} - -int bbm_com_long_read(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - - res = bbm_long_read(hDevice, addr, data); - - return res; -} - -int bbm_com_bulk_read(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res; - - res = bbm_bulk_read(hDevice, addr, data, size); - - return res; -} - -int bbm_com_data(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res; - - res = bbm_data(hDevice, addr, data, size); - - return res; -} - -int bbm_com_write(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = bbm_write(hDevice, addr, data); - - return res; -} - -int bbm_com_byte_write(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - - res = bbm_byte_write(hDevice, addr, data); - - return res; -} - -int bbm_com_word_write(HANDLE hDevice, u16 addr, u16 data) -{ - int res; - - res = bbm_word_write(hDevice, addr, data); - - return res; -} - -int bbm_com_long_write(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - - res = bbm_long_write(hDevice, addr, data); - - return res; -} - -int bbm_com_bulk_write(HANDLE hDevice, u16 addr, u8 *data, u16 size) -{ - int res; - - res = bbm_bulk_write(hDevice, addr, data, size); - - return res; -} - -int bbm_com_tuner_read( - HANDLE hDevice, u8 addr, u8 address_len, u8 *buffer, u8 len) -{ - int res; - - res = tuner_i2c_read(hDevice, addr, address_len, buffer, len); - - return res; -} - -int bbm_com_tuner_write( - HANDLE hDevice, u8 addr, u8 address_len, u8 *buffer, u8 len) -{ - int res; - - res = tuner_i2c_write(hDevice, addr, address_len, buffer, len); - - return res; -} - -int bbm_com_tuner_set_freq(HANDLE hDevice, u32 freq) -{ - int res = BBM_OK; - - res = tuner_set_freq(hDevice, freq); - - return res; -} - -int bbm_com_tuner_select(HANDLE hDevice, u32 product, u32 band) -{ - int res = BBM_OK; - - res = tuner_select(hDevice, product, band); - - return res; -} - -int bbm_com_tuner_get_rssi(HANDLE hDevice, s32 *rssi) -{ - int res = BBM_OK; - - res = tuner_get_rssi(hDevice, rssi); - - return res; -} - -int bbm_com_scan_status(HANDLE hDevice) -{ - int res = BBM_OK; - - res = fc8050_scan_status(hDevice); - - return res; -} - -int bbm_com_channel_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - int res; - - res = fc8050_channel_select(hDevice, subchannel_id, service_channel_id); - - return res; -} - -int bbm_com_video_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id, u8 cdiId) -{ - int res; - - res = fc8050_video_select( - hDevice, subchannel_id, service_channel_id, cdiId); - - return res; -} - -int bbm_com_audio_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - int res; - - res = fc8050_audio_select(hDevice, subchannel_id, service_channel_id); - - return res; -} - -int bbm_com_data_select(HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - int res; - - res = fc8050_data_select(hDevice, subchannel_id, service_channel_id); - - return res; -} - -int bbm_com_channel_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - int res; - - res = fc8050_channel_deselect( - hDevice, subchannel_id, service_channel_id); - - return res; -} - -int bbm_com_video_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id, u8 cdiId) -{ - int res; - - res = fc8050_video_deselect( - hDevice, subchannel_id, service_channel_id, cdiId); - - return res; -} - -int bbm_com_audio_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - int res; - - res = fc8050_audio_deselect(hDevice, subchannel_id, service_channel_id); - - return res; -} - -int bbm_com_data_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - int res; - - res = fc8050_data_deselect(hDevice, subchannel_id, service_channel_id); - - return res; -} - -void bbm_com_isr(HANDLE hDevice) -{ - fc8050_isr(hDevice); -} - -int bbm_com_hostif_select(HANDLE hDevice, u8 hostif) -{ - int res = BBM_NOK; - - res = bbm_hostif_select(hDevice, hostif); - - return res; -} - -int bbm_com_hostif_deselect(HANDLE hDevice) -{ - int res = BBM_NOK; - - res = bbm_hostif_deselect(hDevice); - - return res; -} - -int bbm_com_fic_callback_register( - u32 userdata - , int (*callback)(u32 userdata, u8 *data, int length)) -{ - fic_user_data = userdata; - fic_callback = callback; - - return BBM_OK; -} - -int bbm_com_msc_callback_register( - u32 userdata - , int (*callback)(u32 userdata, u8 subchannel_id, u8 *data, int length)) -{ - msc_user_data = userdata; - msc_callback = callback; - - return BBM_OK; -} - -int bbm_com_fic_callback_deregister(HANDLE hDevice) -{ - fic_user_data = 0; - fic_callback = NULL; - - return BBM_OK; -} - -int bbm_com_msc_callback_deregister(HANDLE hDevice) -{ - msc_user_data = 0; - msc_callback = NULL; - - return BBM_OK; -} diff --git a/drivers/media/tdmb/fc8050/bbm.h b/drivers/media/tdmb/fc8050/bbm.h deleted file mode 100644 index 89fb26a..0000000 --- a/drivers/media/tdmb/fc8050/bbm.h +++ /dev/null @@ -1,102 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : bbm.h - - Description : API of dmb baseband module - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - - - -#ifndef __BBM_H__ -#define __BBM_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fci_types.h" - -#define DRIVER_VER "VER 3.6.3" - -#define BBM_HPI 0 /* HPI */ -#define BBM_SPI 1 /* SPI */ -#define BBM_USB 2 /* USB */ -#define BBM_I2C 3 /* I2C */ -#define BBM_PPI 4 /* PPI */ - -extern int bbm_com_reset(HANDLE hDevice); -extern int bbm_com_probe(HANDLE hDevice); -extern int bbm_com_init(HANDLE hDevice); -extern int bbm_com_deinit(HANDLE hDevice); -extern int bbm_com_read(HANDLE hDevice, u16 addr, u8 *data); -extern int bbm_com_byte_read(HANDLE hDevice, u16 addr, u8 *data); -extern int bbm_com_word_read(HANDLE hDevice, u16 addr, u16 *data); -extern int bbm_com_long_read(HANDLE hDevice, u16 addr, u32 *data); -extern int bbm_com_bulk_read(HANDLE hDevice, u16 addr, u8 *data, u16 size); -extern int bbm_com_data(HANDLE hDevice, u16 addr, u8 *data, u16 size); -extern int bbm_com_write(HANDLE hDevice, u16 addr, u8 data); -extern int bbm_com_byte_write(HANDLE hDevice, u16 addr, u8 data); -extern int bbm_com_word_write(HANDLE hDevice, u16 addr, u16 data); -extern int bbm_com_long_write(HANDLE hDevice, u16 addr, u32 data); -extern int bbm_com_bulk_write(HANDLE hDevice, u16 addr, u8 *data, u16 size); -extern int bbm_com_tuner_read( - HANDLE hDevice, u8 addr, u8 address_len, u8 *buffer, u8 len); -extern int bbm_com_tuner_write( - HANDLE hDevice, u8 addr, u8 address_len, u8 *buffer, u8 len); -extern int bbm_com_tuner_set_freq(HANDLE hDevice, u32 freq); -extern int bbm_com_tuner_select(HANDLE hDevice, u32 product, u32 band); -extern int bbm_com_tuner_get_rssi(HANDLE hDevice, s32 *rssi); -extern int bbm_com_scan_status(HANDLE hDevice); -extern int bbm_com_channel_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int bbm_com_video_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id, u8 cdiId); -extern int bbm_com_audio_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int bbm_com_data_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int bbm_com_channel_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int bbm_com_video_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id, u8 cdiId); -extern int bbm_com_audio_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int bbm_com_data_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int bbm_com_hostif_select(HANDLE hDevice, u8 hostif); -extern int bbm_com_hostif_deselect(HANDLE hDevice); -extern int bbm_com_fic_callback_register( - u32 userdata - , int (*callback)(u32 userdata, u8 *data, int length)); -extern int bbm_com_msc_callback_register( - u32 userdata - , int (*callback)( - u32 userdata, u8 subchannel_id, u8 *data, int length)); -extern int bbm_com_fic_callback_deregister(HANDLE hDevice); -extern int bbm_com_msc_callback_deregister(HANDLE hDevice); -extern void bbm_com_isr(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif /* __BBM_H__ */ diff --git a/drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.c b/drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.c deleted file mode 100644 index 548e900..0000000 --- a/drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.c +++ /dev/null @@ -1,607 +0,0 @@ -/* -* Copyright(c) 2008 SEC Corp. All Rights Reserved -* -* File name : DMBDrv_wrap_FC8050.c -* -* Description : fc8050 tuner control driver -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* 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. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -* History : -* ---------------------------------------------------------------------- -* 2009/01/19 changsul.park initial -* 2009/09/23 jason porting QSC6270 -*/ - -#include "dmbdrv_wrap_fc8050.h" -#include "fci_types.h" -#include "bbm.h" -#include "fci_oal.h" -#include "fc8050_regs.h" -#include "fic.h" -#include "fci_tun.h" -#include "tdmb.h" - -struct sub_channel_info_type dmb_subchannel_info; -struct sub_channel_info_type dab_subchannel_info; - - -static u32 saved_ber = 3000; -static u32 dmb_initialize; - -unsigned char current_service_type = 0x18; -unsigned char current_subchannel_id; - -int tdmb_interrupt_fic_callback(u32 userdata, u8 *data, int length) -{ - fic_decoder_put((struct fic *)data, length); - - return 0; -} - -#ifdef FEATURE_FC8050_DEBUG -#define FC8050_DMB 0x01 -#define FC8050_DATA 0x04 -#define FC8050_DAB 0x08 - -u16 dmb_mode = FC8050_DMB; -#endif - -int tdmb_interrupt_msc_callback( -u32 userdata, u8 subchannel_id, u8 *data, int length) -{ - tdmb_store_data(&data[0], length); - - return 0; -} - -static int viterbi_rt_ber_read(unsigned int *ber) -{ - u32 frame, error; - u8 control = 0; - - int res = BBM_OK; - - bbm_com_read(NULL, BBM_VT_CONTROL, &control); - control |= 0x10; - bbm_com_write(NULL, BBM_VT_CONTROL, control); - - bbm_com_long_read(NULL, BBM_VT_RT_BER_PERIOD, &frame); - bbm_com_long_read(NULL, BBM_VT_RT_ERROR_SUM, &error); - - control &= ~0x10; - bbm_com_write(NULL, BBM_VT_CONTROL, control); - - if (frame == 0) { - *ber = 0; - return BBM_NOK; - } - - *ber = (error * 10000 / frame); - - return res; -} - -static int get_signal_level(u32 ber, u8 *level) -{ - if (ber >= 900) - *level = 0; - else if ((ber >= 800) && (ber < 900)) - *level = 1; - else if ((ber >= 700) && (ber < 800)) - *level = 2; - else if ((ber >= 600) && (ber < 700)) - *level = 3; - else if ((ber >= 500) && (ber < 600)) - *level = 4; - else if ((ber >= 400) && (ber < 500)) - *level = 5; - else if (ber < 400) - *level = 6; - - return BBM_OK; -} - -void dmb_drv_isr() -{ - bbm_com_isr(NULL); -} - - -unsigned char dmb_drv_init(void) -{ - int i; -#ifdef FEATURE_INTERFACE_TEST_MODE - u8 data; - u16 wdata; - u32 ldata; - u8 temp = 0x1e; -#endif - -#ifdef CONFIG_TDMB_SPI - if (bbm_com_hostif_select(NULL, BBM_SPI)) - return TDMB_FAIL; -#elif defined(CONFIG_TDMB_EBI) - if (bbm_com_hostif_select(NULL, BBM_PPI)) - return TDMB_FAIL; -#endif - - /* check for factory chip interface test */ - if (bbm_com_probe(NULL) != BBM_OK) { - DPRINTK("%s : BBM_PROBE fail\n", __func__); - return TDMB_FAIL; - } - - bbm_com_fic_callback_register(0, tdmb_interrupt_fic_callback); - bbm_com_msc_callback_register(0, tdmb_interrupt_msc_callback); - - bbm_com_init(NULL); - bbm_com_tuner_select(NULL, FC8050_TUNER, BAND3_TYPE); - -#ifdef FEATURE_INTERFACE_TEST_MODE - for (i = 0; i < 1000; i++) { - bbm_com_write(NULL, 0x05, i & 0xff); - bbm_com_read(NULL, 0x05, &data); - if ((i & 0xff) != data) - DPRINTK("FC8000 byte test (0x%x,0x%x)\r\n" - , i & 0xff, data); - } - for (i = 0; i < 1000; i++) { - bbm_com_word_write(NULL, 0x0210, i & 0xffff); - bbm_com_word_read(NULL, 0x0210, &wdata); - if ((i & 0xffff) != wdata) - DPRINTK("FC8000 word test (0x%x,0x%x)\r\n" - , i & 0xffff, wdata); - } - for (i = 0; i < 1000; i++) { - bbm_com_long_write(NULL, 0x0210, i & 0xffffffff); - bbm_com_long_read(NULL, 0x0210, &ldata); - if ((i & 0xffffffff) != ldata) - DPRINTK("FC8000 long test (0x%x,0x%x)\r\n" - , i & 0xffffffff, ldata); - } - for (i = 0; i < 1000; i++) { - temp = i&0xff; - bbm_com_tuner_write(NULL, 0x12, 0x01, &temp, 0x01); - bbm_com_tuner_read(NULL, 0x12, 0x01, &data, 0x01); - if ((i & 0xff) != data) - DPRINTK("FC8000 tuner test (0x%x,0x%x)\r\n" - , i & 0xff, data); - } - temp = 0x51; - bbm_com_tuner_write(NULL, 0x12, 0x01, &temp, 0x01); -#endif - - saved_ber = 3000; - dmb_initialize = 1; - - return TDMB_SUCCESS; -} - -unsigned char dmb_drv_deinit(void) -{ - dmb_initialize = 0; - - bbm_com_video_deselect(NULL, 0, 0, 0); - bbm_com_audio_deselect(NULL, 0, 3); - bbm_com_data_deselect(NULL, 0, 2); - bbm_com_write(NULL, BBM_COM_STATUS_ENABLE, 0x00); - - ms_wait(100); - - bbm_com_deinit(NULL); - - bbm_com_fic_callback_deregister(NULL); - bbm_com_msc_callback_deregister(NULL); - - bbm_com_hostif_deselect(NULL); - - return TDMB_SUCCESS; -} - -unsigned char dmb_drv_scan_ch(unsigned long frequency) -{ - struct esbinfo_t *esb; - - if (!dmb_initialize) - return TDMB_FAIL; - - if (bbm_com_tuner_set_freq(NULL, frequency)) { - bbm_com_word_write(NULL, BBM_BUF_INT, 0x00ff); - return TDMB_FAIL; - } - - fic_decoder_subchannel_info_clean(); - bbm_com_word_write(NULL, BBM_BUF_INT, 0x01ff); - - if (bbm_com_scan_status(NULL)) { - bbm_com_word_write(NULL, BBM_BUF_INT, 0x00ff); - return TDMB_FAIL; - } - - /* wait 1.2 sec for gathering fic information */ - ms_wait(1200); - - bbm_com_word_write(NULL, BBM_BUF_INT, 0x00ff); - - esb = fic_decoder_get_ensemble_info(0); - if (esb->flag != 99) { - fic_decoder_subchannel_info_clean(); - return TDMB_FAIL; - } - - if (strnlen(esb->label, sizeof(esb->label)) <= 0) { - fic_decoder_subchannel_info_clean(); - return TDMB_FAIL; - } - - return TDMB_SUCCESS; -} - -int dmb_drv_get_dmb_sub_ch_cnt() -{ - struct service_info_t *svc_info; - int i, n; - - if (!dmb_initialize) - return 0; - - n = 0; - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = fic_decoder_get_service_info_list(i); - - if ((svc_info->flag & 0x07) == 0x07) { - if ((svc_info->tmid == 0x01) - && (svc_info->dscty == 0x18)) - n++; - } - } - - return n; -} - -int dmb_drv_get_dab_sub_ch_cnt() -{ - struct service_info_t *svc_info; - int i, n; - - if (!dmb_initialize) - return 0; - - n = 0; - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = fic_decoder_get_service_info_list(i); - - if ((svc_info->flag & 0x07) == 0x07) { - if ((svc_info->tmid == 0x00) - && (svc_info->ascty == 0x00)) - n++; - } - } - - return n; -} - -char *dmb_drv_get_ensemble_label() -{ - struct esbinfo_t *esb; - - if (!dmb_initialize) - return NULL; - - esb = fic_decoder_get_ensemble_info(0); - - if (esb->flag == 99) - return (char *)esb->label; - - return NULL; -} - -char *dmb_drv_get_sub_ch_dmb_label(int subchannel_count) -{ - int i, n; - struct service_info_t *svc_info; - char *label = NULL; - - if (!dmb_initialize) - return NULL; - - n = 0; - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = fic_decoder_get_service_info_list(i); - - if ((svc_info->flag & 0x07) == 0x07) { - if ((svc_info->tmid == 0x01) - && (svc_info->dscty == 0x18)) { - if (n == subchannel_count) { - label = (char *) svc_info->label; - break; - } - n++; - } - } - } - - return label; -} - -char *dmb_drv_get_sub_ch_dab_label(int subchannel_count) -{ - int i, n; - struct service_info_t *svc_info; - char *label = NULL; - - if (!dmb_initialize) - return NULL; - - n = 0; - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = fic_decoder_get_service_info_list(i); - - if ((svc_info->flag & 0x07) == 0x07) { - if ((svc_info->tmid == 0x00) - && (svc_info->ascty == 0x00)) { - if (n == subchannel_count) { - label = (char *) svc_info->label; - break; - } - n++; - } - } - } - - return label; -} - -struct sub_channel_info_type *dmb_drv_get_fic_dmb(int subchannel_count) -{ - int i, n, j; - struct esbinfo_t *esb; - struct service_info_t *svc_info; - u8 num_of_user_appl; - - if (!dmb_initialize) - return NULL; - - memset((void *)&dmb_subchannel_info, 0, sizeof(dmb_subchannel_info)); - - n = 0; - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = fic_decoder_get_service_info_list(i); - - if ((svc_info->flag & 0x07) == 0x07) { - if ((svc_info->tmid == 0x01) - && (svc_info->dscty == 0x18)) { - if (n == subchannel_count) { - dmb_subchannel_info.ucSubchID - = svc_info->sub_channel_id; - dmb_subchannel_info.uiStartAddress - = 0; - dmb_subchannel_info.ucTMId - = svc_info->tmid; - dmb_subchannel_info.ucServiceType - = svc_info->dscty; - dmb_subchannel_info.ulServiceID - = svc_info->sid; - - num_of_user_appl = - svc_info->num_of_user_appl; - dmb_subchannel_info.num_of_user_appl - = num_of_user_appl; - for (j = 0; j < num_of_user_appl; j++) { - dmb_subchannel_info. - user_appl_type[j] - = svc_info->user_appl_type[j]; - dmb_subchannel_info. - user_appl_length[j] - = svc_info->user_appl_length[j]; - memcpy( - &dmb_subchannel_info. - user_appl_data[j][0] - , &svc_info-> - user_appl_data[j][0] - , dmb_subchannel_info. - user_appl_length[j]); - } - - esb = fic_decoder_get_ensemble_info(0); - if (esb->flag == 99) - dmb_subchannel_info.uiEnsembleID - = esb->eid; - else - dmb_subchannel_info.uiEnsembleID - = 0; - - break; - } - n++; - } - } - } - - return &dmb_subchannel_info; -} - -struct sub_channel_info_type *dmb_drv_get_fic_dab(int subchannel_count) -{ - int i, n; - struct esbinfo_t *esb; - struct service_info_t *svc_info; - - if (!dmb_initialize) - return NULL; - - memset((void *)&dab_subchannel_info, 0, sizeof(dab_subchannel_info)); - - n = 0; - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = fic_decoder_get_service_info_list(i); - - if ((svc_info->flag & 0x07) == 0x07) { - if ((svc_info->tmid == 0x00) - && (svc_info->ascty == 0x00)) { - if (n == subchannel_count) { - dab_subchannel_info.ucSubchID = - svc_info->sub_channel_id; - dab_subchannel_info.uiStartAddress = 0; - dab_subchannel_info.ucTMId - = svc_info->tmid; - dab_subchannel_info.ucServiceType = - svc_info->ascty; - dab_subchannel_info.ulServiceID = - svc_info->sid; - esb = fic_decoder_get_ensemble_info(0); - if (esb->flag == 99) - dmb_subchannel_info.uiEnsembleID - = esb->eid; - else - dmb_subchannel_info.uiEnsembleID - = 0; - - break; - } - n++; - } - } - } - - return &dab_subchannel_info; -} - -#ifdef FEATURE_FC8050_DEBUG -void fc8050_isr_interruptclear(void) -{ - u8 status = 0; - - bbm_com_read(NULL, BBM_COM_INT_STATUS, &status); - bbm_com_write(NULL, BBM_COM_INT_STATUS, status); - bbm_com_write(NULL, BBM_COM_INT_STATUS, 0x00); -} - -void dmb_drv_check_overrun(u8 reset) -{ - u16 overrun; - u16 temp = 0; - - bbm_com_word_read(NULL, BBM_BUF_OVERRUN, &overrun); - - if (overrun & dmb_mode) { - /* overrun clear */ - bbm_com_word_write(NULL, BBM_BUF_OVERRUN, overrun); - bbm_com_word_write(NULL, BBM_BUF_OVERRUN, 0x0000); - - if (reset) { - /* buffer restore */ - bbm_com_word_read(NULL, BBM_BUF_ENABLE, &temp); - temp &= ~dmb_mode; - bbm_com_word_write(NULL, BBM_BUF_ENABLE, temp); - temp |= dmb_mode; - bbm_com_word_write(NULL, BBM_BUF_ENABLE, temp); - - /* external interrupt restore */ - fc8050_isr_interruptclear(); - } - - DPRINTK("FC8050 Overrun occured\n"); - } - -} -#endif - -unsigned char dmb_drv_set_ch( -unsigned long frequency -, unsigned char subchannel -, unsigned char sevice_type) -{ - if (!dmb_initialize) - return TDMB_FAIL; - - current_service_type = sevice_type; - current_subchannel_id = subchannel; - - bbm_com_video_deselect(NULL, 0, 0, 0); - bbm_com_audio_deselect(NULL, 0, 3); - bbm_com_data_deselect(NULL, 0, 2); - - bbm_com_word_write(NULL, BBM_BUF_INT, 0x00ff); - - if (bbm_com_tuner_set_freq(NULL, frequency) != BBM_OK) - return TDMB_FAIL; - - if (sevice_type == 0x18) - bbm_com_video_select(NULL, subchannel, 0, 0); - else if (sevice_type == 0x00) - bbm_com_audio_select(NULL, subchannel, 3); - else - bbm_com_data_select(NULL, subchannel, 2); - -#ifdef FEATURE_FC8050_DEBUG - if (sevice_type == 0x18) - dmb_mode = FC8050_DMB; - else if (sevice_type == 0x00) - dmb_mode = FC8050_DAB; - else - dmb_mode = FC8050_DATA; -#endif - - return TDMB_SUCCESS; -} - -unsigned short dmb_drv_get_ber() -{ - return saved_ber; -} - -unsigned char dmb_drv_get_ant(void) -{ - u8 level = 0; - unsigned int ber; - - if (!dmb_initialize) { - saved_ber = 3000; - return 0; - } - - if (viterbi_rt_ber_read(&ber)) { - saved_ber = 3000; - return 0; - } - - if (ber <= 20) - ber = 0; - - saved_ber = ber; - if (get_signal_level(ber, &level)) - return 0; - -#ifdef FEATURE_FC8050_DEBUG - dmb_drv_check_overrun(1); -#endif - - return level; -} - -signed short dmb_drv_get_rssi() -{ - s32 rssi; - - if (!dmb_initialize) { - rssi = -110; - return rssi; - } - - bbm_com_tuner_get_rssi(NULL, &rssi); - - return (signed short)rssi; -} diff --git a/drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.h b/drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.h deleted file mode 100644 index 802e421..0000000 --- a/drivers/media/tdmb/fc8050/dmbdrv_wrap_fc8050.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -* Copyright(c) 2008 SEC Corp. All Rights Reserved -* -* File name : dmbdrv_wrap_fc8050.h -* -* Description : fc8050 tuner control driver -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* 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. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -* History : -* ---------------------------------------------------------------------- -* -*/ - -#ifndef __DMBDRV_WRAP_FC8050_H -#define __DMBDRV_WRAP_FC8050_H - -#include -#include - -#define TDMB_SUCCESS 1 -#define TDMB_FAIL 0 - -#define USER_APPL_NUM_MAX 12 -#define USER_APPL_DATA_SIZE_MAX 24 - -struct sub_channel_info_type { - unsigned short uiEnsembleID; - unsigned char ucSubchID; - unsigned short uiStartAddress; - unsigned char ucTMId; - unsigned char ucServiceType; - unsigned long ulServiceID; - unsigned char num_of_user_appl; - unsigned short user_appl_type[USER_APPL_NUM_MAX]; - unsigned char user_appl_length[USER_APPL_NUM_MAX]; - unsigned char user_appl_data - [USER_APPL_NUM_MAX][USER_APPL_DATA_SIZE_MAX]; -}; - -void dmb_drv_isr(void); -unsigned char dmb_drv_init(void); -unsigned char dmb_drv_deinit(void); -unsigned char dmb_drv_scan_ch(unsigned long frequency); -int dmb_drv_get_dmb_sub_ch_cnt(void); -int dmb_drv_get_dab_sub_ch_cnt(void); -char *dmb_drv_get_ensemble_label(void); -char *dmb_drv_get_sub_ch_dmb_label(int subchannel_count); -char *dmb_drv_get_sub_ch_dab_label(int subchannel_count); -struct sub_channel_info_type *dmb_drv_get_fic_dmb(int subchannel_count); -struct sub_channel_info_type *dmb_drv_get_fic_dab(int subchannel_count); -unsigned char dmb_drv_set_ch( - unsigned long frequency - , unsigned char subchannel - , unsigned char sevice_type); -unsigned short dmb_drv_get_ber(void); -unsigned char dmb_drv_get_ant(void); -signed short dmb_drv_get_rssi(void); -int tdmb_interrupt_fic_callback(u32 userdata, u8 *data, int length); -int tdmb_interrupt_msc_callback( - u32 userdata, u8 subchannel_id, u8 *data, int length); -#endif diff --git a/drivers/media/tdmb/fc8050/fc8050_bb.c b/drivers/media/tdmb/fc8050/fc8050_bb.c deleted file mode 100644 index 1f5b825..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_bb.c +++ /dev/null @@ -1,607 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_bb.c - - Description : API of dmb baseband module - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial - BB Config 1p0 -*******************************************************************************/ -#include -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_hal.h" -#include "fci_tun.h" -#include "fc8050_regs.h" - -#define POWER_SAVE_MODE -#define MSMCHIP - -#define LOCK_TIME_TICK 5 /* 5ms */ -#define SLOCK_MAX_TIME 200 -#define FLOCK_MAX_TIME 300 -#define DLOCK_MAX_TIME 500 - -static int fc8050_power_save_on(HANDLE hDevice) -{ - u8 tmp = 0x64; - - bbm_write(hDevice, BBM_DIDP_POWER_OPT0, 0x06); - bbm_write(hDevice, BBM_DIDP_POWER_OPT1, 0x06); - bbm_write(hDevice, BBM_DIDP_POWER_OPT2, 0x07); - bbm_write(hDevice, BBM_FFT_ADC_CONTROL, 0x1c); - - tuner_i2c_write(hDevice, 0x61, 1, &tmp, 1); - - print_log(hDevice, "Power Save On\n"); - - return BBM_OK; -} - -static int fc8050_power_save_off(HANDLE hDevice) -{ - u8 tmp = 0x1e; - - bbm_write(hDevice, BBM_DIDP_POWER_OPT0, 0x04); - bbm_write(hDevice, BBM_DIDP_POWER_OPT1, 0x05); - bbm_write(hDevice, BBM_DIDP_POWER_OPT2, 0x05); - bbm_write(hDevice, BBM_FFT_ADC_CONTROL, 0x9c); - - tuner_i2c_write(hDevice, 0x61, 1, &tmp, 1); - - print_log(hDevice, "Power Save Off\n"); - - return BBM_OK; -} - -static int fc8050_cu_size_check(HANDLE hDevice, u8 svcId, u16 *cuSize) -{ - int res = BBM_NOK; - int i; - u16 subch_info = 0; - - *cuSize = 0; - - for (i = 0; i < 40; i++) { - bbm_word_read(hDevice, 0x192 + 12 * svcId, &subch_info); - - if (subch_info & 0x3ff) { - *cuSize = subch_info & 0x3ff; - res = BBM_OK; - - print_log(hDevice - , "CU CHECK LOOP COUNT: %d ms\n", i * 10); - break; - } - - ms_wait(10); - } - - return res; -} - -static int fc8050_set_xtal(HANDLE hDevice) -{ -#if (FC8050_FREQ_XTAL == 19200) - /* Default XTAL */ -#elif (FC8050_FREQ_XTAL == 16384) - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x0); - bbm_write(hDevice, BBM_QDD_COEF, 0x2); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x1); - bbm_write(hDevice, BBM_QDD_COEF, 0xff); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x2); - bbm_write(hDevice, BBM_QDD_COEF, 0xfd); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x3); - bbm_write(hDevice, BBM_QDD_COEF, 0x0); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x4); - bbm_write(hDevice, BBM_QDD_COEF, 0x4); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x5); - bbm_write(hDevice, BBM_QDD_COEF, 0x3); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x6); - bbm_write(hDevice, BBM_QDD_COEF, 0xfc); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x7); - bbm_write(hDevice, BBM_QDD_COEF, 0xf9); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x8); - bbm_write(hDevice, BBM_QDD_COEF, 0x2); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x9); - bbm_write(hDevice, BBM_QDD_COEF, 0xc); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xa); - bbm_write(hDevice, BBM_QDD_COEF, 0x4); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xb); - bbm_write(hDevice, BBM_QDD_COEF, 0xf0); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xc); - bbm_write(hDevice, BBM_QDD_COEF, 0xed); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xd); - bbm_write(hDevice, BBM_QDD_COEF, 0x13); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xe); - bbm_write(hDevice, BBM_QDD_COEF, 0x4f); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xf); - bbm_write(hDevice, BBM_QDD_COEF, 0x6b); - bbm_write(hDevice, 0xe8, 0x00); - bbm_write(hDevice, 0xe9, 0x00); - bbm_write(hDevice, 0xea, 0x00); - bbm_write(hDevice, 0xeb, 0x04); - bbm_write(hDevice, 0xec, 0x80); - bbm_write(hDevice, 0xed, 0x80); - bbm_write(hDevice, 0xee, 0x06); -#elif (FC8050_FREQ_XTAL == 24576) - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x0); - bbm_write(hDevice, BBM_QDD_COEF, 0x2); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x1); - bbm_write(hDevice, BBM_QDD_COEF, 0xff); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x2); - bbm_write(hDevice, BBM_QDD_COEF, 0xfd); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x3); - bbm_write(hDevice, BBM_QDD_COEF, 0x0); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x4); - bbm_write(hDevice, BBM_QDD_COEF, 0x4); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x5); - bbm_write(hDevice, BBM_QDD_COEF, 0x3); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x6); - bbm_write(hDevice, BBM_QDD_COEF, 0xfc); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x7); - bbm_write(hDevice, BBM_QDD_COEF, 0xf9); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x8); - bbm_write(hDevice, BBM_QDD_COEF, 0x2); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x9); - bbm_write(hDevice, BBM_QDD_COEF, 0xc); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xa); - bbm_write(hDevice, BBM_QDD_COEF, 0x4); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xb); - bbm_write(hDevice, BBM_QDD_COEF, 0xf0); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xc); - bbm_write(hDevice, BBM_QDD_COEF, 0xed); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xd); - bbm_write(hDevice, BBM_QDD_COEF, 0x13); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xe); - bbm_write(hDevice, BBM_QDD_COEF, 0x4f); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xf); - bbm_write(hDevice, BBM_QDD_COEF, 0x6b); - bbm_write(hDevice, 0xe8, 0x00); - bbm_write(hDevice, 0xe9, 0x00); - bbm_write(hDevice, 0xea, 0x00); - bbm_write(hDevice, 0xeb, 0x04); - bbm_write(hDevice, 0xec, 0x80); - bbm_write(hDevice, 0xed, 0x80); - bbm_write(hDevice, 0xee, 0x05); -#elif (FC8050_FREQ_XTAL == 27000) - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x0); - bbm_write(hDevice, BBM_QDD_COEF, 0xfe); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x1); - bbm_write(hDevice, BBM_QDD_COEF, 0xfe); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x2); - bbm_write(hDevice, BBM_QDD_COEF, 0x1); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x3); - bbm_write(hDevice, BBM_QDD_COEF, 0x4); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x4); - bbm_write(hDevice, BBM_QDD_COEF, 0x3); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x5); - bbm_write(hDevice, BBM_QDD_COEF, 0xfd); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x6); - bbm_write(hDevice, BBM_QDD_COEF, 0xf9); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x7); - bbm_write(hDevice, BBM_QDD_COEF, 0xff); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x8); - bbm_write(hDevice, BBM_QDD_COEF, 0x9); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x9); - bbm_write(hDevice, BBM_QDD_COEF, 0x9); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xa); - bbm_write(hDevice, BBM_QDD_COEF, 0xfb); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xb); - bbm_write(hDevice, BBM_QDD_COEF, 0xed); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xc); - bbm_write(hDevice, BBM_QDD_COEF, 0xf5); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xd); - bbm_write(hDevice, BBM_QDD_COEF, 0x1c); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xe); - bbm_write(hDevice, BBM_QDD_COEF, 0x4b); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xf); - bbm_write(hDevice, BBM_QDD_COEF, 0x61); - bbm_write(hDevice, 0xe8, 0x4b); - bbm_write(hDevice, 0xe9, 0x11); - bbm_write(hDevice, 0xea, 0xa4); - bbm_write(hDevice, 0xeb, 0x03); - bbm_write(hDevice, 0xec, 0x8c); - bbm_write(hDevice, 0xed, 0x75); - bbm_write(hDevice, 0xee, 0x05); -#elif (FC8050_FREQ_XTAL == 27120) - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x0); - bbm_write(hDevice, BBM_QDD_COEF, 0xfe); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x1); - bbm_write(hDevice, BBM_QDD_COEF, 0xfe); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x2); - bbm_write(hDevice, BBM_QDD_COEF, 0x1); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x3); - bbm_write(hDevice, BBM_QDD_COEF, 0x4); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x4); - bbm_write(hDevice, BBM_QDD_COEF, 0x2); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x5); - bbm_write(hDevice, BBM_QDD_COEF, 0xfc); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x6); - bbm_write(hDevice, BBM_QDD_COEF, 0xf9); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x7); - bbm_write(hDevice, BBM_QDD_COEF, 0xff); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x8); - bbm_write(hDevice, BBM_QDD_COEF, 0x9); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x9); - bbm_write(hDevice, BBM_QDD_COEF, 0x9); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xa); - bbm_write(hDevice, BBM_QDD_COEF, 0xfb); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xb); - bbm_write(hDevice, BBM_QDD_COEF, 0xed); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xc); - bbm_write(hDevice, BBM_QDD_COEF, 0xf5); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xd); - bbm_write(hDevice, BBM_QDD_COEF, 0x1c); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xe); - bbm_write(hDevice, BBM_QDD_COEF, 0x4b); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xf); - bbm_write(hDevice, BBM_QDD_COEF, 0x61); - bbm_write(hDevice, 0xe8, 0x80); - bbm_write(hDevice, 0xe9, 0xf1); - bbm_write(hDevice, 0xea, 0x9f); - bbm_write(hDevice, 0xeb, 0x03); - bbm_write(hDevice, 0xec, 0x8d); - bbm_write(hDevice, 0xed, 0x74); - bbm_write(hDevice, 0xee, 0x05); -#elif (FC8050_FREQ_XTAL == 38400) - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x0); - bbm_write(hDevice, BBM_QDD_COEF, 0xfe); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x1); - bbm_write(hDevice, BBM_QDD_COEF, 0x0); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x2); - bbm_write(hDevice, BBM_QDD_COEF, 0x3); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x3); - bbm_write(hDevice, BBM_QDD_COEF, 0x3); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x4); - bbm_write(hDevice, BBM_QDD_COEF, 0xff); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x5); - bbm_write(hDevice, BBM_QDD_COEF, 0xfa); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x6); - bbm_write(hDevice, BBM_QDD_COEF, 0xfb); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x7); - bbm_write(hDevice, BBM_QDD_COEF, 0x3); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x8); - bbm_write(hDevice, BBM_QDD_COEF, 0xa); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0x9); - bbm_write(hDevice, BBM_QDD_COEF, 0x5); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xa); - bbm_write(hDevice, BBM_QDD_COEF, 0xf7); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xb); - bbm_write(hDevice, BBM_QDD_COEF, 0xed); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xc); - bbm_write(hDevice, BBM_QDD_COEF, 0xfa); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xd); - bbm_write(hDevice, BBM_QDD_COEF, 0x1f); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xe); - bbm_write(hDevice, BBM_QDD_COEF, 0x49); - bbm_write(hDevice, BBM_QDD_COEF_BANK_SEL, 0xf); - bbm_write(hDevice, BBM_QDD_COEF, 0x5c); - bbm_write(hDevice, 0xe8, 0x36); - bbm_write(hDevice, 0xe9, 0xd0); - bbm_write(hDevice, 0xea, 0x69); - bbm_write(hDevice, 0xeb, 0x03); - bbm_write(hDevice, 0xec, 0x96); - bbm_write(hDevice, 0xed, 0x6d); - bbm_write(hDevice, 0xee, 0x04); -#endif - return BBM_OK; -} - -int fc8050_reset(HANDLE hDevice) -{ - bbm_write(hDevice, BBM_COM_RESET, 0xFE); - ms_wait(1); - bbm_write(hDevice, BBM_COM_RESET, 0xFF); - - return BBM_OK; -} - -int fc8050_probe(HANDLE hDevice) -{ - u16 ver; - bbm_word_read(hDevice, BBM_QDD_CHIP_IDL, &ver); - - printk(KERN_DEBUG "tdmb %s : ver(0x%x)\n", __func__, ver); - return (ver == 0x8050) ? BBM_OK : BBM_NOK; -} - -int fc8050_init(HANDLE hDevice) -{ - u8 intMask; - - fc8050_reset(hDevice); - fc8050_set_xtal(hDevice); - - bbm_write(hDevice, BBM_BUF_MISC_CTRL, 0x19); - - /* bbm_write(hDevice, BBM_24M_CLK_EN, 0xff); */ - bbm_write(hDevice, BBM_VT_CONTROL, 0x03); - bbm_word_write(hDevice, BBM_SYNC_CNTRL, 0x0020); - bbm_write(hDevice, BBM_FIC_CRC_CONTROL, 0x03); - bbm_write(hDevice, BBM_BUF_TEST_MODE, 0x08); - bbm_write(hDevice, 0x33c, 0x03); - - bbm_write(hDevice, BBM_FFT_MODEM_STSH, 0x03); - bbm_write(hDevice, BBM_DIDP_MODE, 0x01); - bbm_write(hDevice, BBM_SYNC_DET_CNTRL, 0x01); - bbm_word_write(hDevice, BBM_SYNC_DET_MAX_THRL, 0x0A00); - bbm_write(hDevice, BBM_SYNC_DET_MODE_ENABLE, 0x01); - bbm_write(hDevice, BBM_BUF_CLOCK_EN, 0xff); - bbm_write(hDevice, BBM_FFT_SCALEV_IFFT, 0xea); - bbm_write(hDevice, BBM_SYNC_FT_RANGE, 0x20); - bbm_write(hDevice, BBM_QDD_AGC530_EN, 0x53); - bbm_write(hDevice, BBM_QDD_BLOCK_AVG_SIZE, 0x48); - bbm_write(hDevice, BBM_QDD_BLOCK_AVG_SIZE_LOCK, 0x49); - bbm_word_write(hDevice, BBM_QDD_GAIN_CONSTANT, 0x0303); - bbm_write(hDevice, BBM_QDD_DET_CNT_BOUND, 0x60); - bbm_write(hDevice, BBM_QDD_REF_AMPL, 0x00); - bbm_write(hDevice, BBM_QDD_BW_CTRL_LOCK, 0x50); - bbm_write(hDevice, BBM_QDD_DC_CTRL, 0x3f); - - bbm_write(hDevice, BBM_RS_CONTROL, 0x01); - bbm_word_write(hDevice, BBM_RS_BER_PERIOD, 0x14e); - -#if defined(POWER_SAVE_MODE) - bbm_write(hDevice, BBM_DIDP_POWER_OPT0, 0x06); - bbm_write(hDevice, BBM_DIDP_ADD_N_SHIFT0, 0x41); - bbm_write(hDevice, BBM_DIDP_POWER_OPT1, 0x06); - bbm_write(hDevice, BBM_DIDP_ADD_N_SHIFT1, 0xf1); - bbm_write(hDevice, BBM_DIDP_POWER_OPT2, 0x07); - bbm_write(hDevice, BBM_FFT_ADC_CONTROL, 0x1c); -#else - bbm_write(hDevice, BBM_DIDP_POWER_OPT0, 0x04); - bbm_write(hDevice, BBM_DIDP_ADD_N_SHIFT0, 0x21); - bbm_write(hDevice, BBM_DIDP_POWER_OPT1, 0x05); - bbm_write(hDevice, BBM_DIDP_ADD_N_SHIFT1, 0x21); - bbm_write(hDevice, BBM_DIDP_POWER_OPT2, 0x05); - bbm_write(hDevice, BBM_FFT_ADC_CONTROL, 0x9c); -#endif - - bbm_word_write(hDevice, BBM_BUF_FIC_START, FIC_BUF_START); - bbm_word_write(hDevice, BBM_BUF_FIC_END, FIC_BUF_END); - bbm_word_write(hDevice, BBM_BUF_FIC_THR, FIC_BUF_THR); - bbm_word_write(hDevice, BBM_BUF_CH0_START, CH0_BUF_START); - bbm_word_write(hDevice, BBM_BUF_CH0_END, CH0_BUF_END); - bbm_word_write(hDevice, BBM_BUF_CH0_THR, CH0_BUF_THR); - bbm_word_write(hDevice, BBM_BUF_CH1_START, CH1_BUF_START); - bbm_word_write(hDevice, BBM_BUF_CH1_END, CH1_BUF_END); - bbm_word_write(hDevice, BBM_BUF_CH1_THR, CH1_BUF_THR); - bbm_word_write(hDevice, BBM_BUF_CH2_START, CH2_BUF_START); - bbm_word_write(hDevice, BBM_BUF_CH2_END, CH2_BUF_END); - bbm_word_write(hDevice, BBM_BUF_CH2_THR, CH2_BUF_THR); - bbm_word_write(hDevice, BBM_BUF_CH3_START, CH3_BUF_START); - bbm_word_write(hDevice, BBM_BUF_CH3_END, CH3_BUF_END); - bbm_word_write(hDevice, BBM_BUF_CH3_THR, CH3_BUF_THR); - - bbm_word_write(hDevice, BBM_BUF_INT, 0x01ff); - bbm_word_write(hDevice, BBM_BUF_ENABLE, 0x01ff); - - intMask = BBM_MF_INT; - bbm_write(hDevice, BBM_COM_INT_ENABLE, intMask); - bbm_write(hDevice, BBM_COM_STATUS_ENABLE, intMask); - - return BBM_OK; -} - -int fc8050_deinit(HANDLE hDevice) -{ - bbm_write(hDevice, BBM_COM_RESET, 0x00); - return BBM_OK; -} - -int fc8050_channel_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - u16 cuSize = 0; - - bbm_write(hDevice - , BBM_DIDP_CH0_SUBCH + service_channel_id - , 0x40 | subchannel_id); - - if (fc8050_cu_size_check(hDevice, service_channel_id, &cuSize)) { - fc8050_power_save_off(hDevice); - return BBM_OK; - } - - if (cuSize >= 672) { - fc8050_power_save_off(hDevice); - return BBM_OK; - } - - fc8050_power_save_on(hDevice); - - return BBM_OK; -} - -int fc8050_video_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id, u8 cdiId) -{ - if (fc8050_channel_select( - hDevice, subchannel_id, service_channel_id) != BBM_OK) - return BBM_NOK; - - bbm_write(hDevice - , BBM_CDI0_SUBCH_EN+cdiId, 0x40 | subchannel_id); - bbm_write(hDevice - , BBM_BUF_CH0_SUBCH+service_channel_id, 0x40 | subchannel_id); - - return BBM_OK; -} - -int fc8050_audio_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - if (fc8050_channel_select( - hDevice, subchannel_id, service_channel_id) != BBM_OK) - return BBM_NOK; - - bbm_write(hDevice - , BBM_BUF_CH0_SUBCH+service_channel_id, 0x40 | subchannel_id); - - return BBM_OK; -} - -int fc8050_data_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - if (fc8050_channel_select( - hDevice, subchannel_id, service_channel_id) != BBM_OK) - return BBM_NOK; - - bbm_write(hDevice - , BBM_BUF_CH0_SUBCH+service_channel_id, 0x40 | subchannel_id); - - return BBM_OK; -} - -int fc8050_channel_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - int i; - - bbm_write(hDevice, BBM_DIDP_CH0_SUBCH + service_channel_id, 0); - - for (i = 0; i < 12; i++) - bbm_write(hDevice, 0x190 + service_channel_id * 12 + i, 0); - - return BBM_OK; -} - -int fc8050_video_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id, u8 cdiId) -{ - if (fc8050_channel_deselect( - hDevice, subchannel_id, service_channel_id) != BBM_OK) - return BBM_NOK; - - bbm_write(hDevice, BBM_BUF_CH0_SUBCH+service_channel_id, 0x00); - bbm_write(hDevice, BBM_CDI0_SUBCH_EN+cdiId, 0x00); - - return BBM_OK; -} - -int fc8050_audio_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - if (fc8050_channel_deselect( - hDevice, subchannel_id, service_channel_id) != BBM_OK) - return BBM_NOK; - - bbm_write(hDevice, BBM_BUF_CH0_SUBCH+service_channel_id, 0); - - return BBM_OK; -} - -int fc8050_data_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id) -{ - if (fc8050_channel_deselect( - hDevice, subchannel_id, service_channel_id) != BBM_OK) - return BBM_NOK; - - bbm_write(hDevice, BBM_BUF_CH0_SUBCH+service_channel_id, 0); - - return BBM_OK; -} - -int fc8050_scan_status(HANDLE hDevice) -{ - int i, res = BBM_NOK; - u8 mode = 0, status = 0, sync_status = 0; - int slock_cnt, flock_cnt, dlock_cnt; - - bbm_read(hDevice, BBM_SYNC_DET_CNTRL, &mode); - - if ((mode & 0x01) == 0x01) { - slock_cnt = SLOCK_MAX_TIME / LOCK_TIME_TICK; - flock_cnt = FLOCK_MAX_TIME / LOCK_TIME_TICK; - dlock_cnt = DLOCK_MAX_TIME / LOCK_TIME_TICK; - - /* OFDM Detect */ - for (i = 0; i < slock_cnt; i++) { - ms_wait(LOCK_TIME_TICK); - - bbm_read(hDevice, BBM_SYNC_DET_STATUS, &status); - - if (status & 0x01) - break; - } - - if (i == slock_cnt) { - printk(KERN_DEBUG "tdmb:status(0x%x) s(%d)\n", - status, slock_cnt); - return BBM_NOK; - } - - if ((status & 0x02) == 0x00) { - printk(KERN_DEBUG "tdmb %s : status(0x%x)\n", - __func__, status); - return BBM_NOK; - } - - /* FRS */ - for (i += 1; i < flock_cnt; i++) { - ms_wait(LOCK_TIME_TICK); - - bbm_read(hDevice, BBM_SYNC_STATUS, &sync_status); - - if (sync_status & 0x01) - break; - } - - if (i == flock_cnt) { - printk(KERN_DEBUG "tdmb %s : flock_cnt(0x%x)\n" - , __func__ - , flock_cnt); - return BBM_NOK; - } - - /* Digital Lock */ - for (i += 1; i < dlock_cnt; i++) { - ms_wait(LOCK_TIME_TICK); - - bbm_read(hDevice, BBM_SYNC_STATUS, &sync_status); - - if (sync_status & 0x20) { - printk(KERN_DEBUG "tdmb:sync_status(0x%x)\n", - sync_status); - return BBM_OK; - } - } - } else { - dlock_cnt = DLOCK_MAX_TIME / LOCK_TIME_TICK; - - for (i = 0; i < dlock_cnt; i++) { - ms_wait(LOCK_TIME_TICK); - - bbm_read(hDevice, BBM_SYNC_STATUS, &sync_status); - if (sync_status & 0x20) { - printk(KERN_DEBUG "tdmb:sync_status(0x%x)\n", - sync_status); - return BBM_OK; - } - } - } - - printk(KERN_DEBUG "tdmb %s : res(0x%x)\n" - , __func__, res); - - return res; -} diff --git a/drivers/media/tdmb/fc8050/fc8050_bb.h b/drivers/media/tdmb/fc8050/fc8050_bb.h deleted file mode 100644 index 8e9f699..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_bb.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_bb.h - - Description : baseband header file - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - History : - ---------------------------------------------------------------------- - 2009/09/14 jason initial -*******************************************************************************/ - -#ifndef __FC8050_BB_H__ -#define __FC8050_BB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8050_reset(HANDLE hDevice); -extern int fc8050_probe(HANDLE hDevice); -extern int fc8050_init(HANDLE hDevice); -extern int fc8050_deinit(HANDLE hDevice); - -extern int fc8050_scan_status(HANDLE hDevice); - -extern int fc8050_channel_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int fc8050_video_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id, u8 cdiId); -extern int fc8050_audio_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int fc8050_data_select( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); - -extern int fc8050_channel_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int fc8050_video_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id, u8 cdiId); -extern int fc8050_audio_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); -extern int fc8050_data_deselect( - HANDLE hDevice, u8 subchannel_id, u8 service_channel_id); - -#ifdef __cplusplus -} -#endif - -#endif /* __FC8050_BB_H__ */ diff --git a/drivers/media/tdmb/fc8050/fc8050_i2c.c b/drivers/media/tdmb/fc8050/fc8050_i2c.c deleted file mode 100644 index 38f3067..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_i2c.c +++ /dev/null @@ -1,171 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_i2c.c - - Description : fc8050 host interface - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- -*******************************************************************************/ - -#include "fci_types.h" -#include "fc8050_regs.h" - -#define HPIC_READ 0x01 /* read command */ -#define HPIC_WRITE 0x02 /* write command */ -#define HPIC_AINC 0x04 /* address increment */ -#define HPIC_BMODE 0x00 /* byte mode */ -#define HPIC_WMODE 0x10 /* word mode */ -#define HPIC_LMODE 0x20 /* long mode */ -#define HPIC_ENDIAN 0x00 /* little endian */ -#define HPIC_CLEAR 0x80 /* currently not used */ - -#define CHIP_ADRR 0x58 - -static int i2c_bulkread(HANDLE hDevice, u8 addr, u8 *data, u16 length) -{ - return 0; -} - -static int i2c_bulkwrite(HANDLE hDevice, u8 addr, u8 *data, u16 length) -{ - return 0; -} - -static int i2c_dataread(HANDLE hDevice, u8 addr, u8 *data, u16 length) -{ - return i2c_bulkread(hDevice, addr, data, length); -} - -int fc8050_i2c_init(HANDLE hDevice, u16 param1, u16 param2) -{ - return BBM_OK; -} - -int fc8050_i2c_byteread(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN; - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_bulkread(hDevice, BBM_DATA_REG, data, 1); - - return res; -} - -int fc8050_i2c_wordread(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - if (BBM_SCI_DATA <= addr && BBM_SCI_SYNCRX >= addr) - command = HPIC_READ | HPIC_WMODE | HPIC_ENDIAN; - - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_bulkread(hDevice, BBM_DATA_REG, (u8 *)data, 2); - - return res; -} - -int fc8050_i2c_longread(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_bulkread(hDevice, BBM_DATA_REG, (u8 *)data, 4); - - return res; -} - -int fc8050_i2c_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_bulkread(hDevice, BBM_DATA_REG, data, length); - - return res; -} - -int fc8050_i2c_bytewrite(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_BMODE | HPIC_ENDIAN; - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, BBM_DATA_REG, (u8 *)&data, 1); - - return res; -} - -int fc8050_i2c_wordwrite(HANDLE hDevice, u16 addr, u16 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - if (BBM_SCI_DATA <= addr && BBM_SCI_SYNCRX >= addr) - command = HPIC_WRITE | HPIC_WMODE | HPIC_ENDIAN; - - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, BBM_DATA_REG, (u8 *)&data, 2); - - return res; -} - -int fc8050_i2c_longwrite(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, BBM_DATA_REG, (u8 *)&data, 4); - - return res; -} - -int fc8050_i2c_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_bulkwrite(hDevice, BBM_DATA_REG, data, length); - - return res; -} - -int fc8050_i2c_dataread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN; - res = i2c_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= i2c_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= i2c_dataread(hDevice, BBM_DATA_REG, data, length); - - return res; -} - -int fc8050_i2c_deinit(HANDLE hDevice) -{ - return BBM_OK; -} diff --git a/drivers/media/tdmb/fc8050/fc8050_i2c.h b/drivers/media/tdmb/fc8050/fc8050_i2c.h deleted file mode 100644 index b212d2c..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_i2c.h +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_i2c.c - - Description : API of dmb baseband module - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - History : - ---------------------------------------------------------------------- - 2009/09/14 jason initial -*******************************************************************************/ - -#ifndef __FC8050_I2C_H__ -#define __FC8050_I2C_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8050_i2c_init(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8050_i2c_byteread(HANDLE hDevice, u16 addr, u8 *data); -extern int fc8050_i2c_wordread(HANDLE hDevice, u16 addr, u16 *data); -extern int fc8050_i2c_longread(HANDLE hDevice, u16 addr, u32 *data); -extern int fc8050_i2c_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8050_i2c_bytewrite(HANDLE hDevice, u16 addr, u8 data); -extern int fc8050_i2c_wordwrite(HANDLE hDevice, u16 addr, u16 data); -extern int fc8050_i2c_longwrite(HANDLE hDevice, u16 addr, u32 data); -extern int fc8050_i2c_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8050_i2c_dataread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8050_i2c_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif /* __FC8050_I2C_H__ */ diff --git a/drivers/media/tdmb/fc8050/fc8050_isr.c b/drivers/media/tdmb/fc8050/fc8050_isr.c deleted file mode 100644 index e181d49..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_isr.c +++ /dev/null @@ -1,116 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_isr.c - - Description : fc8050 interrupt service routine - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_hal.h" -#include "fc8050_regs.h" -#include "fc8050_isr.h" - -static u8 fic_buffer[512+4]; -static u8 msc_buffer[8192+4]; - -int (*fic_callback)(u32 userdata, u8 *data, int length) = NULL; -int (*msc_callback)(u32 userdata, u8 subchid, u8 *data, int length) = NULL; - -u32 fic_user_data; -u32 msc_user_data; - - -void fc8050_isr(HANDLE hDevice) -{ - u8 ext_int_status = 0; - - bbm_read(hDevice, BBM_COM_INT_STATUS, &ext_int_status); - bbm_write(hDevice, BBM_COM_INT_STATUS, ext_int_status); - bbm_write(hDevice, BBM_COM_INT_STATUS, 0x00); - - if (ext_int_status & BBM_MF_INT) { - u16 buf_int_status = 0; - u16 size; - int i; - - bbm_word_read(hDevice, BBM_BUF_STATUS, &buf_int_status); - bbm_word_write(hDevice, BBM_BUF_STATUS, buf_int_status); - bbm_word_write(hDevice, BBM_BUF_STATUS, 0x0000); - - if (buf_int_status & 0x0100) { - bbm_word_read(hDevice, BBM_BUF_FIC_THR, &size); - size += 1; - if (size-1) { - bbm_data(hDevice, BBM_COM_FIC_DATA - , &fic_buffer[4], size); - -#ifdef CONFIG_TDMB_SPI - if (fic_callback) - (*fic_callback)(fic_user_data - , &fic_buffer[6], size); -#else - if (fic_callback) - (*fic_callback)(fic_user_data - , &fic_buffer[4], size); -#endif - } - } - - for (i = 0; i < 8; i++) { - if (buf_int_status & (1 << i)) { - bbm_word_read(hDevice - , BBM_BUF_CH0_THR+i*2, &size); - size += 1; - - if (size-1) { - u8 sub_ch_id; - - bbm_read(hDevice, BBM_BUF_CH0_SUBCH+i - , &sub_ch_id); - sub_ch_id = sub_ch_id & 0x3f; - - bbm_data(hDevice, (BBM_COM_CH0_DATA+i) - , &msc_buffer[4], size); - -#ifdef CONFIG_TDMB_SPI - if (msc_callback) - (*msc_callback)( - msc_user_data - , sub_ch_id - , &msc_buffer[6] - , size); -#else - if (msc_callback) - (*msc_callback)( - msc_user_data - , sub_ch_id - , &msc_buffer[4] - , size); -#endif - } - } - } - - } - -} diff --git a/drivers/media/tdmb/fc8050/fc8050_isr.h b/drivers/media/tdmb/fc8050/fc8050_isr.h deleted file mode 100644 index 2c20368..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_isr.h +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_isr.h - - Description : API of dmb baseband module - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - - History : - ---------------------------------------------------------------------- - 2009/09/11 jason initial -*******************************************************************************/ - -#ifndef __FC8050_ISR__ -#define __FC8050_ISR__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fci_types.h" - -extern u32 fic_user_data; -extern u32 msc_user_data; - -#ifdef FEATURE_FC8050_DEBUG -extern u16 dmb_mode; -#endif - -extern int (*fic_callback)(u32 userdata, u8 *data, int length); -extern int (*msc_callback)(u32 userdata, u8 subchid, u8 *data, int length); - -extern void fc8050_isr(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif /* __FC8050_ISR__ */ diff --git a/drivers/media/tdmb/fc8050/fc8050_regs.h b/drivers/media/tdmb/fc8050/fc8050_regs.h deleted file mode 100644 index 56483c2..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_regs.h +++ /dev/null @@ -1,414 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_regs.h - - Description : baseband header file - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/14 jason initial -*******************************************************************************/ - -#ifndef __FC8050_REGS_H__ -#define __FC8050_REGS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* X-TAL Frequency Configuration */ -/* #define FC8050_FREQ_XTAL 16384 */ -/* #define FC8050_FREQ_XTAL 19200 */ -#define FC8050_FREQ_XTAL 24576 -/* #define FC8050_FREQ_XTAL 27000 */ -/* #define FC8050_FREQ_XTAL 38400 */ -#define FEATURE_FC8050_DEBUG -/* #define FEATURE_INTERFACE_TEST_MODE */ - -/* INTERRUPT SOURCE */ -#define BBM_MF_INT 0x0001 -#define BBM_WAGC_INT 0x0002 -#define BBM_RECFG_INT 0x0004 -#define BBM_TII_INT 0x0008 -#define BBM_SYNC_INT 0x0010 -#define BBM_I2C_INT 0x0020 -#define BBM_SCI_INT 0x0040 - -/* Host Access Common Register */ -#define BBM_COMMAND_REG 0x0000 -#define BBM_ADDRESS_REG 0x0001 -#define BBM_DATA_REG 0x0002 - -/* COMMON */ -#define BBM_COM_AP2APB_LT 0x0000 -#define BBM_COM_RESET 0x0001 -#define BBM_COM_INT_STATUS 0x0002 -#define BBM_COM_INT_ENABLE 0x0003 -#define BBM_COM_STATUS_ENABLE 0x0006 -#define BBM_COM_FIC_DATA 0x0007 -#define BBM_COM_CH0_DATA 0x0008 -#define BBM_COM_CH1_DATA 0x0009 -#define BBM_COM_CH2_DATA 0x000a -#define BBM_COM_CH3_DATA 0x000b -#define BBM_COM_CH4_DATA 0x000c -#define BBM_COM_CH5_DATA 0x000d -#define BBM_COM_CH6_DATA 0x000e -#define BBM_COM_CH7_DATA 0x000f - -/* QDD */ -#define BBM_QDD_SYNC_RST_EN 0x0010 -#define BBM_QDD_CHIP_IDL 0x0012 -#define BBM_QDD_CHIP_IDH 0x0013 -#define BBM_QDD_COMMAN 0x0014 -#define BBM_QDD_TUN_COMMA 0x0015 -#define BBM_QDD_TRAGET_RMS 0x0016 -#define BBM_QDD_TUN_GAIN 0x0017 -#define BBM_QDD_TUN_GAIN_LOC 0x0018 -#define BBM_QDD_QLEVEL 0x0019 -#define BBM_QDD_GAIN_MIN 0x001a -#define BBM_QDD_GAIN_MAX 0x001b -#define BBM_QDD_AGC_GAIN 0x001c -#define BBM_QDD_IF_RMS 0x001d -#define BBM_QDD_AGC_CTRL 0x001e -#define BBM_QDD_AGC_PERIOD 0x001f -#define BBM_QDD_AGC_STEP 0x0020 -#define BBM_QDD_DC_CTRL 0x0021 -#define BBM_QDD_I_COMP 0x0022 -#define BBM_QDD_Q_COMP 0x0023 -#define BBM_QDD_I_DC 0x0024 -#define BBM_QDD_Q_DC 0x0025 -#define BBM_QDD_PWM_VALL 0x0026 -#define BBM_QDD_PWM_VALH 0x0027 -#define BBM_QDD_PWM_CTRL 0x0028 -#define BBM_QDD_UPDN_PERIOD 0x0029 -#define BBM_QDD_M_FREQ_OFFSET 0x002a -#define BBM_QDD_COEF_BANK_SEL 0x0030 -#define BBM_QDD_COEF 0x0031 -#define BBM_QDD_AGC530_EN 0x0032 -#define BBM_QDD_BLOCK_AVG_SIZE 0x0033 -#define BBM_QDD_BLOCK_AVG_SIZE_LOCK 0x0034 -#define BBM_QDD_GAIN_UPDATE_SPEED 0x0035 -#define BBM_QDD_REF_AMPL 0x0036 -#define BBM_QDD_BW_CTRL_LOCK 0x0037 -#define BBM_QDD_GAIN_CONSTANT 0x0038 -#define BBM_QDD_GAIN_CONSTANT_LOCK 0x0039 -#define BBM_QDD_BLOCK_AVG 0x003a -#define BBM_QDD_DET_CNT_BOUND 0x003c -#define BBM_QDD_AGC_LOCK 0x003e -#define BBM_QDD_UPDOWN_CLK_PERIOD 0x003f - -/* SYNC */ -#define BBM_SYNC_WIN_SIZE 0x0050 -#define BBM_SYNC_FRSYNC_PERIOD 0x0052 -#define BBM_SYNC_NF_ON 0x0053 -#define BBM_SYNC_RMS_CLIP 0x0054 -#define BBM_SYNC_GSG_CF 0x0056 -#define BBM_SYNC_MIN_CF 0x0057 -#define BBM_SYNC_GCMD_CF 0x0058 -#define BBM_SYNC_FTERR_THRESH 0x005A -#define BBM_SYNC_MA_GAIN 0x005B -#define BBM_SYNC_FTSYNC_CTRL 0x005C -#define BBM_SYNC_LPF_POWER 0x005e -#define BBM_SYNC_HPF_POWER 0x005f -#define BBM_SYNC_MODE 0x0060 -#define BBM_SYNC_FFT_SHIFT 0x0061 -#define BBM_SYNC_FF_ERROR 0x0062 -#define BBM_SYNC_CIR_THRESH 0x0064 -#define BBM_SYNC_FF_AVG_LEN 0x0065 -#define BBM_SYNC_D4GIBSHIFT 0x0066 -#define BBM_SYNC_CF_CBW 0x0067 -#define BBM_SYNC_CF_ERROR 0x0068 -#define BBM_SYNC_CFOFFSET_RNGP 0x006a -#define BBM_SYNC_CFOFFSET_RNGM 0x006b -#define BBM_SYNC_CFOFFSET_TGT 0x006c -#define BBM_SYNC_FIC_CNTRL 0x006d -#define BBM_SYNC_DET_CNTRL 0x0070 -#define BBM_SYNC_DET_ACC_PERIOD 0x0071 -#define BBM_SYNC_DET_MAX_THRL 0x0072 -#define BBM_SYNC_DET_MAX_THRH 0x0073 -#define BBM_SYNC_DET_MAX_MAGL 0x0074 -#define BBM_SYNC_DET_MAX_MAGH 0x0075 -#define BBM_SYNC_DET_MEAN_MAGL 0x0076 -#define BBM_SYNC_DET_MEAN_MAGH 0x0077 -#define BBM_SYNC_DET_STATUS 0x0078 -#define BBM_SYNC_DET_DONECNT 0x0079 -#define BBM_SYNC_DET_OKCNT 0x007A -#define BBM_SYNC_DET_MODE_ENABLE 0x007B - -#define BBM_SYNC_NSBLK 0x0090 -#define BBM_SYNC_FTOFFSET 0x0092 -#define BBM_SYNC_FT_RANGE 0x0094 -#define BBM_SYNC_CNTRL 0x0096 -#define BBM_SYNC_STATUS 0x0098 -#define BBM_SYNC_AMD_RANGE 0x009a -#define BBM_SYNC_ERR_THRESH 0x009e -#define BBM_SYNC_LOOP 0x009f -#define BBM_SYNC_WINDOW 0x00a0 -#define BBM_SYNC_NONZERO 0x00a1 -#define BBM_SYNC_LOOP_OUT 0x00a2 -#define BBM_SYNC_TUNER 0x00a4 -#define BBM_SYNC_TII_CTRL 0x00a5 -#define BBM_SYNC_MIN_THRESH 0x00a6 -#define BBM_SYNC_MAINID1 0x00a7 -#define BBM_SYNC_SUBID1 0x00a8 -#define BBM_SYNC_MAINID2 0x00a9 -#define BBM_SYNC_SUBID2 0x00aa -#define BBM_SYNC_ID1_POWER 0x00ab -#define BBM_SYNC_ID2_POWER 0x00ac -#define BBM_SYNC_TII_THRESH 0x00ad -#define BBM_SYNC_MODE_TARGET 0x00ae -#define BBM_SYNC_SYNC_TEST_SEL 0x00af - -/* AGC */ -#define BBM_AGC_REFGAIN 0x0110 -#define BBM_AGC_PERIOD 0x0111 -#define BBM_AGC_GAIN_EXP 0x0113 -#define BBM_AGC_GAIN_FRP 0x0114 -#define BBM_AGC_RMS 0x0116 -#define BBM_AGC_MTH 0x0117 -#define BBM_AGC_Q_LEVEL 0x0118 -#define BBM_AGC_UPDATE_VAL 0x0119 -#define BBM_AGC_FIXED_ON 0x011b -#define BBM_AGC_EXP_FIXED 0x011c -#define BBM_AGC_FR_FIXED 0x011d -#define BBM_AGC_CTRL 0x011f - -/* FFT */ -#define BBM_FFT_SCALEV_FFT 0x0120 -#define BBM_FFT_SCALEV_IFFT 0x0122 -#define BBM_FFT_ADC_CONTROL 0x0128 -#define BBM_FFT_MODEM_STSL 0x0129 -#define BBM_FFT_MODEM_STSH 0x012A -#define BBM_FFT_PAD_DRIVING_SEL 0x012B - -/* TII */ -#define BBM_TII_IF_EN 0x0130 -#define BBM_TII_DATA 0x0131 -#define BBM_TII_DATA_LEN 0x0132 - -/* DIDP */ -#define BBM_DIDP_CH_EN 0x0150 -#define BBM_DIDP_MODE 0x0151 -#define BBM_DIDP_CH0_SUBCH 0x0152 -#define BBM_DIDP_CH1_SUBCH 0x0153 -#define BBM_DIDP_CH2_SUBCH 0x0154 -#define BBM_DIDP_CH3_SUBCH 0x0155 -#define BBM_DIDP_CH4_SUBCH 0x0156 -#define BBM_DIDP_CH5_SUBCH 0x0157 -#define BBM_DIDP_CH6_SUBCH 0x0158 -#define BBM_DIDP_CH7_SUBCH 0x0159 -#define BBM_DIDP_POWER_OPT0 0x015a -#define BBM_DIDP_ADD_N_SHIFT0 0x015b -#define BBM_DIDP_POWER_OPT1 0x015c -#define BBM_DIDP_ADD_N_SHIFT1 0x015d -#define BBM_DIDP_POWER_OPT2 0x015e -#define BBM_DIDP_ADD_N_SHIFT2 0x015f - -/* VT */ -#define BBM_VT_BER_PERIOD 0x0210 -#define BBM_VT_ERROR_SUM 0x0214 -#define BBM_VT_RT_BER_PERIOD 0x0218 -#define BBM_VT_RT_ERROR_SUM 0x021c -#define BBM_VT_CONTROL 0x0220 - -/* FIC */ -#define BBM_FIC_CRC_CONTROL 0x0222 -#define BBM_FIC_ERR_SUM 0x0223 - -/* CDI */ -#define BBM_CDI0_SUBCH_EN 0x0224 -#define BBM_CDI1_SUBCH_EN 0x0225 -#define BBM_CDI0_COUNT 0x0226 -#define BBM_CDI1_COUNT 0x0227 -#define BBM_CDI0_ERROR 0x0228 -#define BBM_CDI1_ERROR 0x0229 -#define BBM_CDI_SYNC_PATTERN 0x022a -#define BBM_CDI_CONTROL 0x022b - -/* RS */ -#define BBM_RS_BER_PERIOD 0x022c -#define BBM_RS_FAIL_COUNT 0x022e -#define BBM_RS_ERR_SUM 0x0230 -#define BBM_RS_RT_BER_PER 0x0234 -#define BBM_RS_RT_FAIL_CNT 0x0236 -#define BBM_RS_RT_ERR_SUM 0x0238 -#define BBM_RS_CONTROL 0x023e - -/* BUF */ -#define BBM_BUF_STATUS 0x0250 -#define BBM_BUF_OVERRUN 0x0252 -#define BBM_BUF_ENABLE 0x0254 -#define BBM_BUF_INT 0x0256 -#define BBM_BUF_STS_CTRL 0x0258 -#define BBM_BUF_STS_CLK_DIV 0x0259 -#define BBM_BUF_STS_CHID 0x025a -#define BBM_BUF_CLOCK_EN 0x025b -#define BBM_BUF_MISC_CTRL 0x025c -#define BBM_BUF_TEST_MODE 0x025d -#define BBM_BUF_TEST_SIGNAL 0x025e -#define BBM_BUF_CH0_SUBCH 0x0260 -#define BBM_BUF_CH1_SUBCH 0x0261 -#define BBM_BUF_CH2_SUBCH 0x0262 -#define BBM_BUF_CH3_SUBCH 0x0263 -#define BBM_BUF_CH4_SUBCH 0x0264 -#define BBM_BUF_CH5_SUBCH 0x0265 -#define BBM_BUF_CH6_SUBCH 0x0266 -#define BBM_BUF_CH7_SUBCH 0x0267 -#define BBM_BUF_CH0_START 0x0268 -#define BBM_BUF_CH1_START 0x026a -#define BBM_BUF_CH2_START 0x026c -#define BBM_BUF_CH3_START 0x026e -#define BBM_BUF_CH4_START 0x0270 -#define BBM_BUF_CH5_START 0x0272 -#define BBM_BUF_CH6_START 0x0274 -#define BBM_BUF_CH7_START 0x0276 -#define BBM_BUF_FIC_START 0x0278 -#define BBM_BUF_CH0_END 0x0290 -#define BBM_BUF_CH1_END 0x0292 -#define BBM_BUF_CH2_END 0x0294 -#define BBM_BUF_CH3_END 0x0296 -#define BBM_BUF_CH4_END 0x0298 -#define BBM_BUF_CH5_END 0x029a -#define BBM_BUF_CH6_END 0x029c -#define BBM_BUF_CH7_END 0x029e -#define BBM_BUF_FIC_END 0x02a0 -#define BBM_BUF_CH0_THR 0x02a2 -#define BBM_BUF_CH1_THR 0x02a4 -#define BBM_BUF_CH2_THR 0x02a6 -#define BBM_BUF_CH3_THR 0x02a8 -#define BBM_BUF_CH4_THR 0x02aa -#define BBM_BUF_CH5_THR 0x02ac -#define BBM_BUF_CH6_THR 0x02ae -#define BBM_BUF_CH7_THR 0x02b0 -#define BBM_BUF_FIC_THR 0x02b2 - -/* I2C */ -#define BBM_I2C_PR 0x0310 -#define BBM_I2C_CTR 0x0312 -#define BBM_I2C_RXR 0x0313 -#define BBM_I2C_SR 0x0314 -#define BBM_I2C_TXR 0x0315 -#define BBM_I2C_CR 0x0316 - -#define BBM_TS_PAUSE 0x0378 -#define BBM_TS_SELECT 0x037A - -/* SCI (PL131) */ -/* 0x000 SCIDATA ,SCI Data register */ -#define BBM_SCI_DATA 0x0390 -/* 0x004 SCICR0 ,SCI Control register 0 */ -#define BBM_SCI_CR0 0x0392 -/* 0x008 SCICR1 ,SCI Control register 1 */ -#define BBM_SCI_CR1 0x0394 -/* 0x00C SCICR2 ,SCI Control register 2 */ -#define BBM_SCI_CR2 0x0396 -/* 0x010 SCICLKICC ,SCI Smart card clock frequency */ -#define BBM_SCI_CLKICC 0x0398 -/* 0x014 SCIVALUE ,SCI Baud cycles time register */ -#define BBM_SCI_VALUE 0x039a -/* 0x018 SCIBAUD ,SCI Baud rate clock time */ -#define BBM_SCI_BAUD 0x039c -/* 0x01C SCITIDE ,SCI Tx and Rx Tide mark */ -#define BBM_SCI_TIDE 0x039e -/* 0x020 SCIDMACR ,SCI Direct Memory Access control register */ -#define BBM_SCI_DMACR 0x03a0 -/* 0x024 SCISTABLE ,SCI Debounce time register */ -#define BBM_SCI_STABLE 0x03a2 -/* 0x028 SCIATIME ,SCI card activation event time register */ -#define BBM_SCI_ATIME 0x03a4 -/* 0x02C SCIDTIME ,SCI card deactivation event time register */ -#define BBM_SCI_DTIME 0x03a6 -/* 0x030 SCIATRSTIME ,SCI ATR start time register */ -#define BBM_SCI_ATRSTIME 0x03a8 -/* 0x034 SCIATRDTIME ,SCI ATR duration time register */ -#define BBM_SCI_ATRDTIME 0x03aa -/* 0x038 SCISTOPTIME ,SCI Duration before Card Clk can be stopped */ -#define BBM_SCI_STOPTIME 0x03ac -/* 0x03C SCISTARTTIME ,SCI Duration before Card Clk can be re-started */ -#define BBM_SCI_STARTTIME 0x03ae -/* 0x040 SCIRETRY ,SCI Tx and Rx Retry register */ -#define BBM_SCI_RETRY 0x03b0 -/* 0x044 SCICHTIMELS ,SCI Char to char timeout timeout least sig. */ -#define BBM_SCI_CHTIMELS 0x03b2 -/* 0x048 SCICHTIMEMS ,SCI Char to char timeout timeout most sig. */ -#define BBM_SCI_CHTIMEMS 0x03b4 -/* 0x04C SCIBLKTIMELS ,SCI Receive timeout between blocks least sig. */ -#define BBM_SCI_BLKTIMELS 0x03b6 -/* 0x050 SCIBLKTIMEMS ,SCI Receive timeout between blocks most sig. */ -#define BBM_SCI_BLKTIMEMS 0x03b8 -/* 0x054 SCICHGUARD ,SCI Character guard time register */ -#define BBM_SCI_CHGUARD 0x03ba -/* 0x058 SCIBLKGUARD ,SCI Block guard time register */ -#define BBM_SCI_BLKGUARD 0x03bc -/* 0x05C SCIRXTIME ,SCI RX read timeout register */ -#define BBM_SCI_RXTIME 0x03be -/* 0x060 SCIFIFOSTATUS ,SCI TX and RX FIFO Status */ -#define BBM_SCI_FIFOSTATUS 0x03d0 -/* 0X064 SCITXCOUNT ,SCI TX FIFO fill level */ -#define BBM_SCI_TXCOUNT 0x03d2 -/* 0x068 SCIRXCOUNT ,SCI RX FIFO fill level */ -#define BBM_SCI_RXCOUNT 0x03d4 -/* 0x06C SCIIMSC ,SCI Interrupt mask set or clear register */ -#define BBM_SCI_IMSC 0x03d6 -/* 0x070 SCIRIS ,SCI Raw interrupt status register */ -#define BBM_SCI_RIS 0x03d8 -/* 0x074 SCIMIS ,SCI Masked interrupt status register */ -#define BBM_SCI_MIS 0x03da -/* 0x078 SCIICR ,SCI Interrupt clear register */ -#define BBM_SCI_ICR 0x03dc -/* 0x07C SCISYNCACT ,SCI Synchronous mode Activation register */ -#define BBM_SCI_SYNCACT 0x03de -/* 0x080 SCISYNCTX ,SCI Synchronous mode transmit register */ -#define BBM_SCI_SYNCTX 0x03e0 -/* 0x084 SCISYNCRX ,SCI Synchronous mode receive register */ -#define BBM_SCI_SYNCRX 0x03e2 - -/* ---------------------------------------------------- -// BUFFER MANAGEMENT -//---------------------------------------------------- */ -#define FIC_BUF_START 0x0000 -#define FIC_BUF_LENGTH (32*24) -#define FIC_BUF_END (FIC_BUF_START + FIC_BUF_LENGTH - 1) -#define FIC_BUF_THR (FIC_BUF_LENGTH/2-1) - -#define CH0_BUF_START (FIC_BUF_START + FIC_BUF_LENGTH) -#define CH0_BUF_LENGTH (188*40*2) -#define CH0_BUF_END (CH0_BUF_START + CH0_BUF_LENGTH - 1) -#define CH0_BUF_THR (CH0_BUF_LENGTH/2-1) - -#define CH1_BUF_START (FIC_BUF_START + FIC_BUF_LENGTH) -#define CH1_BUF_LENGTH (0) -#define CH1_BUF_END (CH1_BUF_START + CH1_BUF_LENGTH - 1) -#define CH1_BUF_THR (0) - -#define CH2_BUF_START (FIC_BUF_START + FIC_BUF_LENGTH) -#define CH2_BUF_LENGTH (128*6) -#define CH2_BUF_END (CH2_BUF_START + CH2_BUF_LENGTH - 1) -#define CH2_BUF_THR (CH2_BUF_LENGTH/2-1) - -#define CH3_BUF_START (FIC_BUF_START + FIC_BUF_LENGTH) -#define CH3_BUF_LENGTH (188*20*2) -#define CH3_BUF_END (CH3_BUF_START + CH3_BUF_LENGTH - 1) -#define CH3_BUF_THR (CH3_BUF_LENGTH/2-1) - -#ifdef __cplusplus -} -#endif - -#endif /* __FC8050_REGS_H__ */ diff --git a/drivers/media/tdmb/fc8050/fc8050_spi.c b/drivers/media/tdmb/fc8050/fc8050_spi.c deleted file mode 100644 index 23db2d5..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_spi.c +++ /dev/null @@ -1,324 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_spi.c - - Description : fc8050 host interface - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ -#include -#include - -#include "fci_types.h" -#include "fc8050_regs.h" -#include "fci_oal.h" -#include "fc8050_spi.h" - -#include "tdmb.h" - -#define DRIVER_NAME "fc8050_spi" - -#define HPIC_READ 0x01 /* read command */ -#define HPIC_WRITE 0x02 /* write command */ -#define HPIC_AINC 0x04 /* address increment */ -#define HPIC_BMODE 0x00 /* byte mode */ -#define HPIC_WMODE 0x10 /* word mode */ -#define HPIC_LMODE 0x20 /* long mode */ -#define HPIC_ENDIAN 0x00 /* little endian */ -#define HPIC_CLEAR 0x80 /* currently not used */ - -#define CHIPID 0 -#if (CHIPID == 0) -#define SPI_CMD_WRITE 0x0 -#define SPI_CMD_READ 0x1 -#define SPI_CMD_BURST_WRITE 0x2 -#define SPI_CMD_BURST_READ 0x3 -#else -#define SPI_CMD_WRITE 0x4 -#define SPI_CMD_READ 0x5 -#define SPI_CMD_BURST_WRITE 0x6 -#define SPI_CMD_BURST_READ 0x7 -#endif - -struct spi_device *fc8050_spi; - -static u8 tx_data[10]; - -static DEFINE_MUTEX(lock); - -int fc8050_spi_write_then_read( - struct spi_device *spi - , u8 *txbuf - , u16 tx_length - , u8 *rxbuf - , u16 rx_length) -{ - s32 res; - - struct spi_message message; - struct spi_transfer x; - - spi_message_init(&message); - memset(&x, 0, sizeof x); - - spi_message_add_tail(&x, &message); - - x.tx_buf = txbuf; - x.rx_buf = txbuf; - x.len = tx_length + rx_length; - - res = spi_sync(spi, &message); - - memcpy(rxbuf, x.rx_buf + tx_length, rx_length); - - return res; -} - -int fc8050_spi_write_then_burstread( - struct spi_device *spi - , u8 *txbuf - , u16 tx_length - , u8 *rxbuf - , u16 rx_length) -{ - s32 res; - - struct spi_message message; - struct spi_transfer x; - - spi_message_init(&message); - memset(&x, 0, sizeof x); - - spi_message_add_tail(&x, &message); - - x.tx_buf = txbuf; - x.rx_buf = rxbuf; - x.len = tx_length + rx_length; - - res = spi_sync(spi, &message); - - return res; -} - -static int spi_bulkread(HANDLE hDevice, u8 addr, u8 *data, u16 length) -{ - s32 ret; - - tx_data[0] = SPI_CMD_BURST_READ; - tx_data[1] = addr; - - fc8050_spi = tdmb_get_spi_handle(); - ret = fc8050_spi_write_then_read( - fc8050_spi, &tx_data[0], 2, &data[0], length); - - if (ret) { - print_log(0, "fc8050_spi_bulkread fail : %d\n", ret); - return BBM_NOK; - } - - return BBM_OK; -} - -static int spi_bulkwrite(HANDLE hDevice, u8 addr, u8 *data, u16 length) -{ - s32 ret; - s32 i; - - tx_data[0] = SPI_CMD_BURST_WRITE; - tx_data[1] = addr; - - for (i = 0; i < length; i++) - tx_data[2+i] = data[i]; - - fc8050_spi = tdmb_get_spi_handle(); - ret = fc8050_spi_write_then_read( - fc8050_spi, &tx_data[0], length+2, NULL, 0); - - if (ret) { - print_log(0, "fc8050_spi_bulkwrite fail : %d\n", ret); - return BBM_NOK; - } - - return BBM_OK; -} - -static int spi_dataread(HANDLE hDevice, u8 addr, u8 *data, u16 length) -{ - s32 ret = 0; - - tx_data[0] = SPI_CMD_BURST_READ; - tx_data[1] = addr; - - fc8050_spi = tdmb_get_spi_handle(); - - ret = fc8050_spi_write_then_burstread( - fc8050_spi, &tx_data[0], 2, &data[0], length); - - if (ret) { - print_log(0, "fc8050_spi_dataread fail : %d\n", ret); - return BBM_NOK; - } - - return BBM_OK; -} - -int fc8050_spi_init(HANDLE hDevice, u16 param1, u16 param2) -{ - - return BBM_OK; -} - -int fc8050_spi_byteread(HANDLE hDevice, u16 addr, u8 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_bulkread(hDevice, BBM_DATA_REG, data, 1); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_wordread(HANDLE hDevice, u16 addr, u16 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - if (BBM_SCI_DATA <= addr && BBM_SCI_SYNCRX >= addr) - command = HPIC_READ | HPIC_WMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_bulkread(hDevice, BBM_DATA_REG, (u8 *)data, 2); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_longread(HANDLE hDevice, u16 addr, u32 *data) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_bulkread(hDevice, BBM_DATA_REG, (u8 *)data, 4); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_bulkread(hDevice, BBM_DATA_REG, data, length); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_bytewrite(HANDLE hDevice, u16 addr, u8 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_BMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_bulkwrite(hDevice, BBM_DATA_REG, (u8 *)&data, 1); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_wordwrite(HANDLE hDevice, u16 addr, u16 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - if (BBM_SCI_DATA <= addr && BBM_SCI_SYNCRX >= addr) - command = HPIC_WRITE | HPIC_WMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_bulkwrite(hDevice, BBM_DATA_REG, (u8 *)&data, 2); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_longwrite(HANDLE hDevice, u16 addr, u32 data) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_bulkwrite(hDevice, BBM_DATA_REG, (u8 *)&data, 4); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_bulkwrite(hDevice, BBM_DATA_REG, data, length); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_dataread(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - int res; - u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN; - - mutex_lock(&lock); - res = spi_bulkwrite(hDevice, BBM_COMMAND_REG, &command, 1); - res |= spi_bulkwrite(hDevice, BBM_ADDRESS_REG, (u8 *)&addr, 2); - res |= spi_dataread(hDevice, BBM_DATA_REG, data, length); - mutex_unlock(&lock); - - return res; -} - -int fc8050_spi_deinit(HANDLE hDevice) -{ - print_log(NULL, "fc8050_spi_deinit\n"); - return BBM_OK; -} diff --git a/drivers/media/tdmb/fc8050/fc8050_spi.h b/drivers/media/tdmb/fc8050/fc8050_spi.h deleted file mode 100644 index c973701..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_spi.h +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_spi.c - - Description : API of dmb baseband module - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/14 jason initial -*******************************************************************************/ - -#ifndef __FC8050_SPI__ -#define __FC8050_SPI__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8050_spi_init(HANDLE hDevice, u16 param1, u16 param2); -extern int fc8050_spi_byteread(HANDLE hDevice, u16 addr, u8 *data); -extern int fc8050_spi_wordread(HANDLE hDevice, u16 addr, u16 *data); -extern int fc8050_spi_longread(HANDLE hDevice, u16 addr, u32 *data); -extern int fc8050_spi_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8050_spi_bytewrite(HANDLE hDevice, u16 addr, u8 data); -extern int fc8050_spi_wordwrite(HANDLE hDevice, u16 addr, u16 data); -extern int fc8050_spi_longwrite(HANDLE hDevice, u16 addr, u32 data); -extern int fc8050_spi_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8050_spi_dataread(HANDLE hDevice, u16 addr, u8 *data, u16 length); -extern int fc8050_spi_deinit(HANDLE hDevice); - -#ifdef __cplusplus -} -#endif - -#endif /* __FC8050_SPI__ */ diff --git a/drivers/media/tdmb/fc8050/fc8050_tun.c b/drivers/media/tdmb/fc8050/fc8050_tun.c deleted file mode 100644 index 7b73f77..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_tun.c +++ /dev/null @@ -1,255 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_tun.c - - Description : fc8050 host interface - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/14 jason initial - 2009/11/26 MPW Config1p0 - 2010/02/24 SLR Config1p0 - 2010/05/04 SLR Config1p2 -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_tun.h" -#include "fci_hal.h" -#include "fc8050_regs.h" - -#define FEATURE_TUNER_BURST_MODE - -static int fc8050_write(HANDLE hDevice, u8 addr, u8 data) -{ - int res; - u8 tmp; - - tmp = data; - res = tuner_i2c_write(hDevice, addr, 1, &tmp, 1); - - return res; -} - -static int fc8050_read(HANDLE hDevice, u8 addr, u8 *data) -{ - int res; - - res = tuner_i2c_read(hDevice, addr, 1, data, 1); - - return res; -} - -static int fc8050_set_filter(HANDLE hDevice) -{ - int i; - u8 cal_mon = 0; - -#if (FC8050_FREQ_XTAL == 19200) - fc8050_write(hDevice, 0x02, 0x86); - - fc8050_write(hDevice, 0x3B, 0x52); - fc8050_write(hDevice, 0x32, 0x09); -#elif (FC8050_FREQ_XTAL == 16384) - fc8050_write(hDevice, 0x02, 0x86); - - fc8050_write(hDevice, 0x3B, 0x45); - fc8050_write(hDevice, 0x32, 0x09); -#elif (FC8050_FREQ_XTAL == 24576) - fc8050_write(hDevice, 0x02, 0x86); - - fc8050_write(hDevice, 0x3B, 0x68); - fc8050_write(hDevice, 0x32, 0x09); -#elif (FC8050_FREQ_XTAL == 27000) - fc8050_write(hDevice, 0x02, 0x86); - - fc8050_write(hDevice, 0x3B, 0x71); - fc8050_write(hDevice, 0x32, 0x09); -#elif (FC8050_FREQ_XTAL == 27120) - fc8050_write(hDevice, 0x02, 0x86); - - fc8050_write(hDevice, 0x3B, 0x74); - fc8050_write(hDevice, 0x32, 0x09); -#elif (FC8050_FREQ_XTAL == 38400) - fc8050_write(hDevice, 0x02, 0x86); - - fc8050_write(hDevice, 0x3B, 0xA1); - fc8050_write(hDevice, 0x32, 0x09); -#else - return BBM_NOK; -#endif - - for (i = 0; i < 10; i++) { - ms_wait(5); - fc8050_read(hDevice, 0x33, &cal_mon); - if ((cal_mon & 0xC0) == 0xC0) - break; - fc8050_write(hDevice, 0x32, 0x01); - fc8050_write(hDevice, 0x32, 0x09); - } - - fc8050_write(hDevice, 0x32, 0x01); - - return BBM_OK; -} - -static int fc8050_lband_init(HANDLE hDevice) -{ - print_log(hDevice, "fc8050_lband_init\n"); - return BBM_NOK; -} - -static int fc8050_band3_init(HANDLE hDevice) -{ - print_log(hDevice, "fc8050_band3_init\n"); - - fc8050_write(hDevice, 0x00, 0x00); - - fc8050_write(hDevice, 0x00, 0x00); - fc8050_write(hDevice, 0x02, 0x86); - - fc8050_write(hDevice, 0x05, 0xD8); - fc8050_write(hDevice, 0x0A, 0x83); - fc8050_write(hDevice, 0x16, 0x0d); - fc8050_write(hDevice, 0x13, 0x88); - fc8050_write(hDevice, 0x15, 0x00); - fc8050_write(hDevice, 0x21, 0x73); - - fc8050_write(hDevice, 0x57, 0x40); - fc8050_write(hDevice, 0x69, 0x8C); - fc8050_write(hDevice, 0x51, 0x04); - fc8050_write(hDevice, 0x53, 0x00); - fc8050_write(hDevice, 0x54, 0x28); - fc8050_write(hDevice, 0x45, 0x40); - fc8050_write(hDevice, 0x46, 0x32); - fc8050_write(hDevice, 0x48, 0x40); - fc8050_write(hDevice, 0x49, 0x32); - fc8050_write(hDevice, 0x7A, 0x88); - fc8050_write(hDevice, 0x53, 0x01); - fc8050_write(hDevice, 0x58, 0x34); - fc8050_write(hDevice, 0x59, 0x2A); - fc8050_write(hDevice, 0x5A, 0x1D); - fc8050_write(hDevice, 0x5B, 0x14); - fc8050_write(hDevice, 0x61, 0x64); - fc8050_write(hDevice, 0x74, 0x3A); - fc8050_write(hDevice, 0x75, 0x1E); - fc8050_write(hDevice, 0x6A, 0x0C); - fc8050_write(hDevice, 0x6C, 0x0C); - fc8050_write(hDevice, 0x6E, 0x0C); - fc8050_write(hDevice, 0x70, 0x0C); - fc8050_write(hDevice, 0x72, 0x0C); - fc8050_write(hDevice, 0x7C, 0x0C); - fc8050_write(hDevice, 0x4E, 0x26); - fc8050_write(hDevice, 0x31, 0x13); - fc8050_write(hDevice, 0x34, 0x53); - fc8050_write(hDevice, 0x43, 0x20); - fc8050_write(hDevice, 0x2e, 0x70); - - fc8050_set_filter(hDevice); - return BBM_OK; -} - -int fc8050_tuner_init(HANDLE hDevice, u32 band) -{ - int res = BBM_NOK; - - bbm_write(hDevice, BBM_QDD_COMMAN, 0x5C); - bbm_write(hDevice, BBM_QDD_AGC_STEP, 0x03); - bbm_write(hDevice, BBM_QDD_TUN_COMMA, 0x40); - bbm_write(hDevice, BBM_QDD_TUN_GAIN, 0x24); - bbm_write(hDevice, BBM_QDD_AGC_PERIOD, 0x14); - bbm_write(hDevice, BBM_QDD_TRAGET_RMS, 0x60); - bbm_write(hDevice, BBM_QDD_TUN_GAIN_LOC, 0x44); - bbm_write(hDevice, BBM_QDD_GAIN_MAX, 0x38); - - if (band == LBAND_TYPE) - res = fc8050_lband_init(hDevice); - else if (band == BAND3_TYPE) - res = fc8050_band3_init(hDevice); - else - return BBM_NOK; - - if (res != BBM_OK) - return res; - - return res; -} - -int fc8050_set_freq(HANDLE hDevice, u32 band, u32 f_lo) -{ - u32 f_diff, f_diff_shifted, n_val, k_val; - u32 f_vco = f_lo * 12; - u32 r_val = (f_vco >= 25 * FC8050_FREQ_XTAL) ? 1 : 2; - u32 f_comp = FC8050_FREQ_XTAL/r_val; - u8 pre_shift_bits = 4; - u8 data_0x0E; - - fc8050_write(hDevice, 0x0a, 0x85); - fc8050_write(hDevice, 0x16, 0x0d); - - n_val = f_vco / f_comp; - - f_diff = f_vco - f_comp * n_val; - f_diff_shifted = f_diff << (20 - pre_shift_bits); - k_val = f_diff_shifted / ((f_comp) >> pre_shift_bits); - - k_val = (f_diff_shifted + (f_comp >> (pre_shift_bits+1))) - / (f_comp >> pre_shift_bits); - - data_0x0E = ((r_val == 1) ? 0x40 : 0x50) + (unsigned char)(k_val >> 16); - fc8050_write(hDevice, 0x0E, data_0x0E); - fc8050_write(hDevice, 0x0F, (unsigned char)(k_val >> 8)); - fc8050_write(hDevice, 0x10, (unsigned char)(k_val)); - fc8050_write(hDevice, 0x11, (unsigned char)(n_val)); - - fc8050_write(hDevice, 0x0a, 0x83); - - return BBM_OK; -} - -int fc8050_get_rssi(HANDLE hDevice, int *rssi) -{ - int res = BBM_OK; - u8 LNA, RFVGA, PREAMP_PGA, CSF = 0x00; - int K = -66; -#ifdef FEATURE_TUNER_BURST_MODE - u32 burst_data; - - res = tuner_i2c_read(hDevice, 0x76, 1, (unsigned char *)&burst_data, 4); - - LNA = burst_data&0x000000ff; - RFVGA = (burst_data&0x0000ff00)>>8; - CSF = (burst_data&0x00ff0000)>>16; - PREAMP_PGA = (burst_data&0xff000000)>>24; -#else - res = fc8050_read(hDevice, 0x76, &LNA); - res |= fc8050_read(hDevice, 0x77, &RFVGA); - res |= fc8050_read(hDevice, 0x78, &CSF); - res |= fc8050_read(hDevice, 0x79, &PREAMP_PGA); -#endif - - if (res != BBM_OK) - return res; - - *rssi = (((LNA & 0x07) * 5) + (RFVGA * 7 / 10) - + ((PREAMP_PGA >> 7) * 6) + ((CSF & 0x7) * 6) - - ((PREAMP_PGA & 0x7F) >> 1) + K); - - return BBM_OK; -} diff --git a/drivers/media/tdmb/fc8050/fc8050_tun.h b/drivers/media/tdmb/fc8050/fc8050_tun.h deleted file mode 100644 index 17c547c..0000000 --- a/drivers/media/tdmb/fc8050/fc8050_tun.h +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8050_tun.c - - Description : API of dmb baseband module - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/11 jason initial -*******************************************************************************/ - -#ifndef __FC8050_TUNER__ -#define __FC8050_TUNER__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fc8050_tuner_init(HANDLE hDevice, enum band_type band); -extern int fc8050_set_freq(HANDLE hDevice, enum band_type band, u32 f_lo); -extern int fc8050_get_rssi(HANDLE hDevice, int *rssi); - -#ifdef __cplusplus -} -#endif - -#endif /* __FC8050_TUNER__ */ diff --git a/drivers/media/tdmb/fc8050/fci_hal.c b/drivers/media/tdmb/fc8050/fci_hal.c deleted file mode 100644 index 508c4c3..0000000 --- a/drivers/media/tdmb/fc8050/fci_hal.c +++ /dev/null @@ -1,231 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_hal.c - - Description : fc8050 host interface - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#include "fci_types.h" -#include "bbm.h" -#include "fci_hal.h" -/* #include "fc8050_hpi.h" */ -#include "fc8050_spi.h" -/* #include "fc8050_ppi.h" */ -#include "fc8050_i2c.h" - -#define FEATURE_INTERFACE_DEBUG -struct interface_port { - int (*init)(HANDLE hDevice, u16 param1, u16 param2); - - int (*byteread)(HANDLE hDevice, u16 addr, u8 *data); - int (*wordread)(HANDLE hDevice, u16 addr, u16 *data); - int (*longread)(HANDLE hDevice, u16 addr, u32 *data); - int (*bulkread)(HANDLE hDevice, u16 addr, u8 *data, u16 size); - - int (*bytewrite)(HANDLE hDevice, u16 addr, u8 data); - int (*wordwrite)(HANDLE hDevice, u16 addr, u16 data); - int (*longwrite)(HANDLE hDevice, u16 addr, u32 data); - int (*bulkwrite)(HANDLE hDevice, u16 addr, u8 *data, u16 size); - - int (*dataread)(HANDLE hDevice, u16 addr, u8 *data, u16 size); - - int (*deinit)(HANDLE hDevice); -} ; - -static struct interface_port ifport; -static u8 hostif_type = BBM_SPI; - -int bbm_hostif_get(HANDLE hDevice, u8 *hostif) -{ - *hostif = hostif_type; - - return BBM_OK; -} - -int bbm_hostif_select(HANDLE hDevice, u8 hostif) -{ - hostif_type = hostif; - - switch (hostif) { - case BBM_SPI: - ifport.init = fc8050_spi_init; - ifport.byteread = fc8050_spi_byteread; - ifport.wordread = fc8050_spi_wordread; - ifport.longread = fc8050_spi_longread; - ifport.bulkread = fc8050_spi_bulkread; - - ifport.bytewrite = fc8050_spi_bytewrite; - ifport.wordwrite = fc8050_spi_wordwrite; - ifport.longwrite = fc8050_spi_longwrite; - ifport.bulkwrite = fc8050_spi_bulkwrite; - - ifport.dataread = fc8050_spi_dataread; - - ifport.deinit = fc8050_spi_deinit; - break; -#ifndef FEATURE_INTERFACE_DEBUG - case BBM_HPI: - ifport.init = fc8050_hpi_init; - ifport.byteread = fc8050_hpi_byteread; - ifport.wordread = fc8050_hpi_wordread; - ifport.longread = fc8050_hpi_longread; - ifport.bulkread = fc8050_hpi_bulkread; - - ifport.bytewrite = fc8050_hpi_bytewrite; - ifport.wordwrite = fc8050_hpi_wordwrite; - ifport.longwrite = fc8050_hpi_longwrite; - ifport.bulkwrite = fc8050_hpi_bulkwrite; - - ifport.dataread = fc8050_hpi_dataread; - - ifport.deinit = fc8050_hpi_deinit; - break; - case BBM_I2C: - ifport.init = fc8050_i2c_init; - ifport.byteread = fc8050_i2c_byteread; - ifport.wordread = fc8050_i2c_wordread; - ifport.longread = fc8050_i2c_longread; - ifport.bulkread = fc8050_i2c_bulkread; - - ifport.bytewrite = fc8050_i2c_bytewrite; - ifport.wordwrite = fc8050_i2c_wordwrite; - ifport.longwrite = fc8050_i2c_longwrite; - ifport.bulkwrite = fc8050_i2c_bulkwrite; - - ifport.dataread = fc8050_i2c_dataread; - - ifport.deinit = fc8050_i2c_deinit; - break; - case BBM_PPI: - ifport.init = fc8050_ppi_init; - ifport.byteread = fc8050_ppi_byteread; - ifport.wordread = fc8050_ppi_wordread; - ifport.longread = fc8050_ppi_longread; - ifport.bulkread = fc8050_ppi_bulkread; - - ifport.bytewrite = fc8050_ppi_bytewrite; - ifport.wordwrite = fc8050_ppi_wordwrite; - ifport.longwrite = fc8050_ppi_longwrite; - ifport.bulkwrite = fc8050_ppi_bulkwrite; - - ifport.dataread = fc8050_ppi_dataread; - - ifport.deinit = fc8050_ppi_deinit; - break; -#endif - default: - return BBM_E_HOSTIF_SELECT; - } - - if (ifport.init(hDevice, 0, 0)) - return BBM_E_HOSTIF_INIT; - - return BBM_OK; -} - -int bbm_hostif_deselect(HANDLE hDevice) -{ - if (ifport.deinit(hDevice)) - return BBM_NOK; - - hostif_type = BBM_HPI; - - return BBM_OK; -} - -int bbm_read(HANDLE hDevice, u16 addr, u8 *data) -{ - if (ifport.byteread(hDevice, addr, data)) - return BBM_E_BB_REG_READ; - return BBM_OK; -} - -int bbm_byte_read(HANDLE hDevice, u16 addr, u8 *data) -{ - if (ifport.byteread(hDevice, addr, data)) - return BBM_E_BB_REG_READ; - return BBM_OK; -} - -int bbm_word_read(HANDLE hDevice, u16 addr, u16 *data) -{ - if (ifport.wordread(hDevice, addr, data)) - return BBM_E_BB_REG_READ; - return BBM_OK; -} - -int bbm_long_read(HANDLE hDevice, u16 addr, u32 *data) -{ - if (ifport.longread(hDevice, addr, data)) - return BBM_E_BB_REG_READ; - return BBM_OK; -} - -int bbm_bulk_read(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - if (ifport.bulkread(hDevice, addr, data, length)) - return BBM_E_BB_REG_READ; - return BBM_OK; -} - -int bbm_write(HANDLE hDevice, u16 addr, u8 data) -{ - if (ifport.bytewrite(hDevice, addr, data)) - return BBM_E_BB_REG_WRITE; - return BBM_OK; -} - -int bbm_byte_write(HANDLE hDevice, u16 addr, u8 data) -{ - if (ifport.bytewrite(hDevice, addr, data)) - return BBM_E_BB_REG_WRITE; - return BBM_OK; -} - -int bbm_word_write(HANDLE hDevice, u16 addr, u16 data) -{ - if (ifport.wordwrite(hDevice, addr, data)) - return BBM_E_BB_REG_WRITE; - return BBM_OK; -} - -int bbm_long_write(HANDLE hDevice, u16 addr, u32 data) -{ - if (ifport.longwrite(hDevice, addr, data)) - return BBM_E_BB_REG_WRITE; - return BBM_OK; -} - -int bbm_bulk_write(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - if (ifport.bulkwrite(hDevice, addr, data, length)) - return BBM_E_BB_REG_WRITE; - return BBM_OK; -} - -int bbm_data(HANDLE hDevice, u16 addr, u8 *data, u16 length) -{ - if (ifport.dataread(hDevice, addr, data, length)) - return BBM_E_BB_REG_WRITE; - return BBM_OK; -} diff --git a/drivers/media/tdmb/fc8050/fci_hal.h b/drivers/media/tdmb/fc8050/fci_hal.h deleted file mode 100644 index 68cfb8f..0000000 --- a/drivers/media/tdmb/fc8050/fci_hal.h +++ /dev/null @@ -1,57 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fc8000_hal.h - - Description : fc8000 host interface header - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#ifndef __FCI_HAL_H__ -#define __FCI_HAL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int bbm_hostif_select(HANDLE hDevice, u8 hostif); -extern int bbm_hostif_deselect(HANDLE hDevice); -extern int bbm_hostif_get(HANDLE hDevice, u8 *hostif); - -extern int bbm_read(HANDLE hDevice, u16 addr, u8 *data); -extern int bbm_byte_read(HANDLE hDevice, u16 addr, u8 *data); -extern int bbm_word_read(HANDLE hDevice, u16 addr, u16 *data); -extern int bbm_long_read(HANDLE hDevice, u16 addr, u32 *data); -extern int bbm_bulk_read(HANDLE hDevice, u16 addr, u8 *data, u16 length); - -extern int bbm_write(HANDLE hDevice, u16 addr, u8 data); -extern int bbm_byte_write(HANDLE hDevice, u16 addr, u8 data); -extern int bbm_word_write(HANDLE hDevice, u16 addr, u16 data); -extern int bbm_long_write(HANDLE hDevice, u16 addr, u32 data); -extern int bbm_bulk_write(HANDLE hDevice, u16 addr, u8 *data, u16 length); - -extern int bbm_data(HANDLE hDevice, u16 addr, u8 *data, u16 length); - -#ifdef __cplusplus -} -#endif - -#endif /* __FCI_HAL_H__ */ diff --git a/drivers/media/tdmb/fc8050/fci_i2c.c b/drivers/media/tdmb/fc8050/fci_i2c.c deleted file mode 100644 index 2cad84d..0000000 --- a/drivers/media/tdmb/fc8050/fci_i2c.c +++ /dev/null @@ -1,263 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_i2c.c - - Description : fci i2c driver - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/11 jason initial -*******************************************************************************/ - -#include - - -#include "fci_types.h" -#include "fci_oal.h" -#include "fc8050_regs.h" -#include "fci_hal.h" - -/* #define FEATURE_FCI_I2C_CHECK_STATUS */ - -#define I2CSTAT_TIP 0x02 /* Tip bit */ -#define I2CSTAT_NACK 0x80 /* Nack bit */ - -#define I2C_TIMEOUT 1 /* 1 second */ - -#define I2C_CR_STA 0x80 -#define I2C_CR_STO 0x40 -#define I2C_CR_RD 0x20 -#define I2C_CR_WR 0x10 -#define I2C_CR_NACK 0x08 -#define I2C_CR_IACK 0x01 - -#define I2C_WRITE 0 -#define I2C_READ 1 - -#define I2C_OK 0 -#define I2C_NOK 1 -#define I2C_NACK 2 -#define I2C_NOK_LA 3 /* Lost arbitration */ -#define I2C_NOK_TOUT 4 /* time out */ - -static int wait_for_xfer(HANDLE hDevice) -{ - int i; - int res = I2C_OK; - u8 status; - - i = I2C_TIMEOUT * 10000; - /* wait for transfer complete */ - do { - bbm_read(hDevice, BBM_I2C_SR, &status); - i--; - } while ((i > 0) && (status & I2CSTAT_TIP)); - - /* check time out or nack */ - if (status & I2CSTAT_TIP) - res = I2C_NOK_TOUT; - -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - else { - bbm_read(hDevice, BBM_I2C_SR, &status); - if (status & I2CSTAT_NACK) - res = I2C_NACK; - else - res = I2C_OK; - } -#endif - return res; -} - -static int fci_i2c_transfer( - HANDLE hDevice, u8 cmd_type, u8 chip - , u8 addr[], u8 addr_len, u8 data[], u8 data_len) -{ - int i; - int result = I2C_OK; - - switch (cmd_type) { - case I2C_WRITE: - bbm_write(hDevice, BBM_I2C_TXR, chip | cmd_type); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - if (addr && addr_len) { - i = 0; - while ((i < addr_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, addr[i]); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - i++; - } - } - - i = 0; - while ((i < data_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, data[i]); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - i++; - } - - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STO); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - break; - case I2C_READ: - if (addr && addr_len) { - bbm_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - - i = 0; - while ((i < addr_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, addr[i]); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - i++; - } - } - - bbm_write(hDevice, BBM_I2C_TXR, chip | I2C_READ); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - - i = 0; - while ((i < data_len) && (result == I2C_OK)) { - if (i == data_len - 1) { - bbm_write(hDevice, BBM_I2C_CR - , I2C_CR_RD|I2C_CR_NACK); - result = wait_for_xfer(hDevice); - if ((result != I2C_NACK) - && (result != I2C_OK)) { - print_log(hDevice, "NACK4-0[%02x]\n" - , result); - return result; - } - } else { - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_RD); - result = wait_for_xfer(hDevice); - if (result != I2C_OK) { - print_log(hDevice, "NACK4-1[%02x]\n" - , result); - return result; - } - } - bbm_read(hDevice, BBM_I2C_RXR, &data[i]); - i++; - } - - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STO); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if ((result != I2C_NACK) && (result != I2C_OK)) { - print_log(hDevice, "NACK5[%02X]\n", result); - return result; - } -#endif - break; - default: - return I2C_NOK; - } - - return I2C_OK; -} - -int fci_i2c_init(HANDLE hDevice, int speed, int slaveaddr) -{ - u16 pr, rpr = 0; - - pr = (u16)((4800 / speed) - 1); - /* pr=400; */ - bbm_word_write(hDevice, BBM_I2C_PR, pr); - - bbm_word_read(hDevice, BBM_I2C_PR, &rpr); - if (pr != rpr) - return BBM_NOK; - - /* i2c master core enable & interrupt enable */ - bbm_write(hDevice, BBM_I2C_CTR, 0xC0); - - return BBM_OK; -} - -int fci_i2c_read( - HANDLE hDevice, u8 chip, u8 addr, u8 address_len, u8 *data, u8 len) -{ - int ret; - u8 tmp[4] = {0xcc, 0xcc, 0xcc, 0xcc}; - - ret = fci_i2c_transfer(hDevice, I2C_READ, chip << 1 - , &addr, address_len, &tmp[0], len); - if (ret != I2C_OK) { - print_log(hDevice - , "fci_i2c_read() result=%d, addr = %x, data=%x\n" - , ret, addr, *data); - return ret; - } - - /* *data = tmp[0]; */ - memcpy(data, tmp, len); - - return ret; -} - -int fci_i2c_write( - HANDLE hDevice, u8 chip, u8 addr, u8 address_len, u8 *data, u8 len) -{ - int ret; - u8 *paddr = &addr; - - ret = fci_i2c_transfer(hDevice, I2C_WRITE, chip << 1 - , paddr, address_len, data, len); - - if (ret != I2C_OK) - print_log(hDevice - , "fci_i2c_write() result=%d, addr= %x, data=%x\n" - , ret, addr, *data); - - return ret; -} diff --git a/drivers/media/tdmb/fc8050/fci_i2c.h b/drivers/media/tdmb/fc8050/fci_i2c.h deleted file mode 100644 index a519a49..0000000 --- a/drivers/media/tdmb/fc8050/fci_i2c.h +++ /dev/null @@ -1,47 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_i2c.h - - Description : fci i2c driver header - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/11 jason initial -*******************************************************************************/ - -#ifndef __FCI_I2C_H__ -#define __FCI_I2C_H__ - -#include "fci_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern int fci_i2c_init(HANDLE hDevice, int speed, int slaveaddr); -extern int fci_i2c_read( - HANDLE hDevice, u8 chip, u8 addr, u8 address_len, u8 *data, u8 len); -extern int fci_i2c_write( - HANDLE hDevice, u8 chip, u8 addr, u8 address_len, u8 *data, u8 len); - -#ifdef __cplusplus -} -#endif - -#endif /* __FCI_I2C_H__ */ diff --git a/drivers/media/tdmb/fc8050/fci_oal.c b/drivers/media/tdmb/fc8050/fci_oal.c deleted file mode 100644 index 51d7d9a..0000000 --- a/drivers/media/tdmb/fc8050/fci_oal.c +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_oal.c - - Description : OS Adaptation Layer - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/13 jason initial -*******************************************************************************/ -#include - -#include "fci_types.h" - -void print_log(HANDLE hDevice, char *fmt, ...) -{ - -} - -void ms_wait(int ms) -{ - usleep_range(ms*1000, ms*1000); -} diff --git a/drivers/media/tdmb/fc8050/fci_oal.h b/drivers/media/tdmb/fc8050/fci_oal.h deleted file mode 100644 index f11f522..0000000 --- a/drivers/media/tdmb/fc8050/fci_oal.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_oal.h - - Description : OS Adatation Layer header - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/13 jason initial -*******************************************************************************/ - -#ifndef __FCI_OAL_H__ -#define __FCI_OAL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern void print_log(HANDLE hDevice, char *fmt, ...); -extern void ms_wait(int ms); - -#ifdef __cplusplus -} -#endif - -#endif /* __FCI_OAL_H__ */ diff --git a/drivers/media/tdmb/fc8050/fci_tun.c b/drivers/media/tdmb/fc8050/fci_tun.c deleted file mode 100644 index 461217f..0000000 --- a/drivers/media/tdmb/fc8050/fci_tun.c +++ /dev/null @@ -1,166 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : tuner.c - - Description : tuner driver - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#include "fci_types.h" -#include "fci_oal.h" -#include "fci_hal.h" -#include "fci_tun.h" -#include "fci_i2c.h" -#include "fc8050_regs.h" -#include "fc8050_bb.h" -#include "fc8050_tun.h" - -#define FC8000_TUNER_ADDR 0x56 -#define FC2501_TUNER_ADDR 0x60 -#define FC2507_TUNER_ADDR 0x60 -#define FC2580_TUNER_ADDR 0x56 -#define FC2582_TUNER_ADDR 0x56 -#define FC8050_TUNER_ADDR 0x5F - -static u8 tuner_addr = FC8050_TUNER_ADDR; -static enum band_type tuner_band = BAND3_TYPE; - -struct tuner_i2c_driver { - int (*init) - (HANDLE hDevice, int speed, int slaveaddr); - int (*read) - (HANDLE hDevice, u8 chip, u8 addr - , u8 address_len, u8 *data, u8 len); - int (*write) - (HANDLE hDevice, u8 chip, u8 addr - , u8 address_len, u8 *data, u8 len); -}; - -struct tuner_driver { - int (*init)(HANDLE hDevice, enum band_type band); - int (*set_freq) - (HANDLE hDevice, enum band_type band, u32 f_lo); - int (*get_rssi)(HANDLE hDevice, int *rssi); -}; - -static struct tuner_i2c_driver tuner_ctrl; -static struct tuner_driver tuner; - -int tuner_ctrl_select(HANDLE hDevice, enum i2c_type type) -{ - switch (type) { - case FCI_I2C_TYPE: - tuner_ctrl.init = fci_i2c_init; - tuner_ctrl.read = fci_i2c_read; - tuner_ctrl.write = fci_i2c_write; - break; - default: - return BBM_E_TN_CTRL_SELECT; - } - - if (tuner_ctrl.init(hDevice, 400, 0)) - return BBM_E_TN_CTRL_INIT; - return BBM_OK; -} - -int tuner_i2c_read(HANDLE hDevice, u8 addr, u8 address_len, u8 *data, u8 len) -{ - if (tuner_ctrl.read(hDevice, tuner_addr, addr, address_len, data, len)) - return BBM_E_TN_REG_READ; - return BBM_OK; -} - -int tuner_i2c_write(HANDLE hDevice, u8 addr, u8 address_len, u8 *data, u8 len) -{ - if (tuner_ctrl.write(hDevice, tuner_addr, addr, address_len, data, len)) - return BBM_E_TN_REG_WRITE; - return BBM_OK; -} - -int tuner_type(HANDLE hDevice, u32 *type) -{ - *type = tuner_band; - - return BBM_OK; -} - -int tuner_set_freq(HANDLE hDevice, u32 freq) -{ - int res = BBM_NOK; - u8 tmp; - - if (tuner.init == NULL) { - print_log(hDevice, "TUNER NULL ERROR\n"); - return BBM_NOK; - } - - res = tuner.set_freq(hDevice, tuner_band, freq); - if (res != BBM_OK) { - print_log(hDevice, "TUNER res ERROR\n"); - return BBM_NOK; - } - -#if (FC8050_FREQ_XTAL == 19200) || (FC8050_FREQ_XTAL == 27000) \ - || (FC8050_FREQ_XTAL == 27120) || (FC8050_FREQ_XTAL == 38400) - tmp = (u8)(33554432/freq); - bbm_write(hDevice, 0xf1, tmp); -#endif - - fc8050_reset(hDevice); - - return res; -} - -int tuner_select(HANDLE hDevice, u32 product, u32 band) -{ - switch (product) { - case FC8050_TUNER: - tuner_ctrl_select(hDevice, FCI_I2C_TYPE); - - tuner.init = fc8050_tuner_init; - tuner.set_freq = fc8050_set_freq; - tuner.get_rssi = fc8050_get_rssi; - - tuner_band = (enum band_type) band; - tuner_addr = FC8050_TUNER_ADDR; - break; - default: - return BBM_E_TN_SELECT; - } - - if (tuner.init == NULL) { - print_log(hDevice, "[ERROR] Can not supported Tuner(%d,%d)\n" - , product, band); - return BBM_E_TN_SELECT; - } - - if (tuner.init(hDevice, tuner_band)) - return BBM_E_TN_INIT; - return BBM_OK; -} - -int tuner_get_rssi(HANDLE hDevice, s32 *rssi) -{ - if (tuner.get_rssi(hDevice, rssi)) - return BBM_E_TN_RSSI; - return BBM_OK; -} diff --git a/drivers/media/tdmb/fc8050/fci_tun.h b/drivers/media/tdmb/fc8050/fci_tun.h deleted file mode 100644 index 259b95d..0000000 --- a/drivers/media/tdmb/fc8050/fci_tun.h +++ /dev/null @@ -1,65 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_tun.h - - Description : tuner control driver header - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/08/29 jason initial -*******************************************************************************/ - -#ifndef __FCI_TUN_H__ -#define __FCI_TUN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "fci_types.h" - -enum i2c_type { - FCI_I2C_TYPE = 0 -}; - -enum band_type { - BAND3_TYPE = 0, - LBAND_TYPE -}; - -enum product_type { - FC8000_TUNER = 0, - FC8050_TUNER -}; - -extern int tuner_i2c_init(HANDLE hDevice, int speed, int slaveaddr); -extern int tuner_i2c_read( - HANDLE hDevice, u8 addr, u8 address_len, u8 *data, u8 len); -extern int tuner_i2c_write( - HANDLE hDevice, u8 addr, u8 address_len, u8 *data, u8 len); - -extern int tuner_select(HANDLE hDevice, u32 product, u32 band); -extern int tuner_set_freq(HANDLE hDevice, u32 freq); -extern int tuner_get_rssi(HANDLE hDevice, s32 *rssi); - -#ifdef __cplusplus -} -#endif - -#endif /* __FCI_TUN_H__ */ diff --git a/drivers/media/tdmb/fc8050/fci_types.h b/drivers/media/tdmb/fc8050/fci_types.h deleted file mode 100644 index 16f57f2..0000000 --- a/drivers/media/tdmb/fc8050/fci_types.h +++ /dev/null @@ -1,77 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_types.h - - Description : - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/08/31 jason initial -*******************************************************************************/ - -#ifndef __FCI_TYPES_H__ -#define __FCI_TYPES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef HANDLE -#define HANDLE void * -#endif - -#define s8 char -#define s16 short int -#define s32 int -#define u8 unsigned char -#define u16 unsigned short -#define u32 unsigned int -#define TRUE 1 -#define FALSE 0 - -#ifndef NULL -#define NULL 0 -#endif - -#define BBM_OK 0 -#define BBM_NOK 1 - -#define BBM_E_FAIL 0x00000001 -#define BBM_E_HOSTIF_SELECT 0x00000002 -#define BBM_E_HOSTIF_INIT 0x00000003 -#define BBM_E_BB_REG_WRITE 0x00000100 -#define BBM_E_BB_REG_READ 0x00000101 -#define BBM_E_TN_REG_WRITE 0x00000200 -#define BBM_E_TN_REG_READ 0x00000201 -#define BBM_E_TN_CTRL_SELECT 0x00000202 -#define BBM_E_TN_CTRL_INIT 0x00000203 -#define BBM_E_TN_SELECT 0x00000204 -#define BBM_E_TN_INIT 0x00000205 -#define BBM_E_TN_RSSI 0x00000206 -#define BBM_E_TN_SET_FREQ 0x00000207 -#define BBM_E_MUX_SYNC 0x00010000 -#define BBM_E_MUX_DATA_MASK 0x00010001 -#define BBM_E_MUX_SUBCHANNEL 0x00010002 -#define BBM_E_MUX_INDICATOR 0x00010003 - -#ifdef __cplusplus -} -#endif - -#endif /* __FCI_TYPES_H__ */ diff --git a/drivers/media/tdmb/fc8050/fic.c b/drivers/media/tdmb/fc8050/fic.c deleted file mode 100644 index 5acb6d3..0000000 --- a/drivers/media/tdmb/fc8050/fic.c +++ /dev/null @@ -1,80 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : FIC.c - - Description : FIC Wrapper - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- -*******************************************************************************/ -#include "fic.h" - -int fic_decoder_put(struct fic *pfic, u16 length) -{ - return fic_decoder(pfic, length); -} - -struct esbinfo_t *fic_decoder_get_ensemble_info(u32 freq) -{ - return get_emsemble_info(); -} - -struct subch_info_t *fic_decoder_get_subchannel_info(u8 subchannel_id) -{ - return get_subchannel_info(subchannel_id); -} - -struct service_info_t *fic_decoder_get_service_info(u32 sid) -{ - return get_service_info(sid); -} - -struct scInfo_t *fic_decoder_get_sc_info(u16 scid) -{ - return get_sc_info(scid); -} - -struct service_info_t *fic_decoder_get_service_info_list(u8 service_index) -{ - return get_service_info_list(service_index); -} - -void fic_decoder_subchannel_org_prn(int subchannel_id) -{ - subchannel_org_prn(subchannel_id); -} - -int fic_decoder_subchannel_org_to_didp( - struct subch_info_t *sub_ch_info, struct didp_info_t *pdidp) -{ - return subchannel_org_to_didp(sub_ch_info, pdidp); -} - -int fic_decoder_found_all_labels(void) -{ - if (found_all_labels()) - return 1; - return 0; -} - -int fic_decoder_subchannel_info_clean(void) -{ - subchannel_org_clean(); - return 0; -} diff --git a/drivers/media/tdmb/fc8050/fic.h b/drivers/media/tdmb/fc8050/fic.h deleted file mode 100644 index f09fad9..0000000 --- a/drivers/media/tdmb/fc8050/fic.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : FIC.h - - Description : FIC Wrapper - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - History : - ---------------------------------------------------------------------- -*******************************************************************************/ -#ifndef __FIC_H__ -#define __FIC_H__ - -#include "ficdecoder.h" - -int fic_decoder_put(struct fic *pfic, u16 length); -struct esbinfo_t *fic_decoder_get_ensemble_info(u32 freq); -struct subch_info_t *fic_decoder_get_subchannel_info(u8 subchannel_id); -struct service_info_t *fic_decoder_get_service_info(u32 sid); -struct scInfo_t *fic_decoder_get_sc_info(u16 scid); -struct service_info_t *fic_decoder_get_service_info_list(u8 service_index); -void fic_decoder_subchannel_org_prn(int subchannel_id); -int fic_decoder_found_all_labels(void); -int fic_decoder_subchannel_info_clean(void); -int fic_decoder_subchannel_org_to_didp - (struct subch_info_t *sub_ch_info, struct didp_info_t *pdidp); - -#endif /* __FIC_H__ */ diff --git a/drivers/media/tdmb/fc8050/ficdecoder.c b/drivers/media/tdmb/fc8050/ficdecoder.c deleted file mode 100644 index abfd991..0000000 --- a/drivers/media/tdmb/fc8050/ficdecoder.c +++ /dev/null @@ -1,1654 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : ficdecoder.c - - Description : fic parser - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - History : - ---------------------------------------------------------------------- -*******************************************************************************/ -#include -#include - -#include "ficdecoder.h" -#include "fci_oal.h" - -#define MSB(X) (((X) >> 8) & 0Xff) -#define LSB(X) ((X) & 0Xff) -#define BYTESWAP(X) ((LSB(X)<<8) | MSB(X)) - -struct esbinfo_t ensemble_info[MAX_ESB_NUM]; -struct service_info_t service_info[MAX_SVC_NUM]; -struct scInfo_t sc_info[MAX_SC_NUM]; -struct subch_info_t subchannel_info[MAX_SUBCH_NUM]; -struct didp_info_t didpInfo[MAX_DIDP_NUM]; - -static int fig0_decoder(struct fig *pFig); -static int fig1_decoder(struct fig *pFig); - -static int fig0_ext1_decoder(u8 cn, u8 *fibBuffer, int figLength); -static int fig0_ext2_decoder(u8 *fibBuffer, int figLength, int pd); -static int fig0_ext3_decoder(u8 *fibBuffer, int figLength); -/* static int fig0_ext4_decoder(u8 *fibBuffer, int figLength); */ -static int fig0_ext10_decoder(u8 *fibBuffer, int figLength); -static int fig0_ext13_decoder(u8 *fibBuffer, int figLength, int pd); -static int fig0_ext14_decoder(u8 *fibBuffer, int figLength); -static int fig0_ext15_decoder(u8 *fibBuffer, int figLength, int pd); -static int fig0_ext18_decoder(u8 *fibBuffer, int figLength); -static int fig1_ext0_decoder(u8 *fibBuffer, int figLength); -static int fig1_ext5_decoder(u8 *fibBuffer, int figLength); -static int fig1_ext1_decoder(u8 *fibBuffer, int figLength); -static int fig1_ext4_decoder(u8 *fibBuffer, int figLength); - -const u16 bitrate_profile[64][3] = { /* CU PL Bit Rates */ - { 16, 5, 32}, { 21, 4, 32}, { 24, 3, 32}, - { 29, 2, 32}, { 35, 1, 32}, { 24, 5, 48}, - { 29, 4, 48}, { 35, 3, 48}, { 42, 2, 48}, - { 52, 1, 48}, { 29, 5, 56}, { 35, 4, 56}, - { 42, 3, 56}, { 52, 2, 56}, { 32, 5, 64}, - { 42, 4, 64}, { 48, 3, 64}, { 58, 2, 64}, - { 70, 1, 64}, { 40, 5, 80}, { 52, 4, 80}, - { 58, 3, 80}, { 70, 2, 80}, { 84, 1, 80}, - { 48, 5, 96}, { 58, 4, 96}, { 70, 3, 96}, - { 84, 2, 96}, {104, 1, 96}, { 58, 5, 112}, - { 70, 4, 112}, { 84, 3, 112}, {104, 2, 112}, - { 64, 5, 128}, { 84, 4, 128}, { 96, 3, 128}, - {116, 2, 128}, {140, 1, 128}, { 80, 5, 160}, - {104, 4, 160}, {116, 3, 160}, {140, 2, 160}, - {168, 1, 160}, { 96, 5, 192}, {116, 4, 192}, - {140, 3, 192}, {168, 2, 192}, {208, 1, 192}, - {116, 5, 224}, {140, 4, 224}, {168, 3, 224}, - {208, 2, 224}, {232, 1, 224}, {128, 5, 256}, - {168, 4, 256}, {192, 3, 256}, {232, 2, 256}, - {280, 1, 256}, {160, 5, 320}, {208, 4, 320}, - {280, 2, 320}, {192, 5, 384}, {280, 3, 384}, - {416, 1, 384} -}; - -const u16 uep_profile[14][5][9] = { /* L1 L2 L3 L4 PI1 PI2 PI3 PI4 pad */ - /* 32kbps */ - { - { 3, 5, 13, 3, 24, 17, 12, 17, 4}, - { 3, 4, 14, 3, 22, 13, 8, 13, 0}, - { 3, 4, 14, 3, 15, 9, 6, 8, 0}, - { 3, 3, 18, 0, 11, 6, 5, 0, 0}, - { 3, 4, 17, 0, 5, 3, 2, 0, 0} - }, - - /* 48kbps */ - { - { 3, 5, 25, 3, 24, 18, 13, 18, 0}, - { 3, 4, 26, 3, 24, 14, 8, 15, 0}, - { 3, 4, 26, 3, 15, 10, 6, 9, 4}, - { 3, 4, 26, 3, 9, 6, 4, 6, 0}, - { 4, 3, 26, 3, 5, 4, 2, 3, 0} - }, - - /* 56kbps */ - { - { 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* not use */ - { 6, 10, 23, 3, 23, 13, 8, 13, 8}, - { 6, 12, 21, 3, 16, 7, 6, 9, 0}, - { 6, 10, 23, 3, 9, 6, 4, 5, 0}, - { 6, 10, 23, 3, 5, 4, 2, 3, 0} - }, - - /* 64kbps */ - { - { 6, 11, 28, 3, 24, 18, 12, 18, 4}, - { 6, 10, 29, 3, 23, 13, 8, 13, 8}, - { 6, 12, 27, 3, 16, 8, 6, 9, 0}, - { 6, 9, 33, 0, 11, 6, 5, 0, 0}, - { 6, 9, 31, 2, 5, 3, 2, 3, 0} - }, - - /* 80kbps */ - { - { 6, 10, 41, 3, 24, 17, 12, 18, 4}, - { 6, 10, 41, 3, 23, 13, 8, 13, 8}, - { 6, 11, 40, 3, 16, 8, 6, 7, 0}, - { 6, 10, 41, 3, 11, 6, 5, 6, 0}, - { 6, 10, 41, 3, 6, 3, 2, 3, 0} - }, - - /* 96kbps */ - { - { 6, 13, 50, 3, 24, 18, 13, 19, 0}, - { 6, 10, 53, 3, 22, 12, 9, 12, 0}, - { 6, 12, 51, 3, 16, 9, 6, 10, 4}, - { 7, 10, 52, 3, 9, 6, 4, 6, 0}, - { 7, 9, 53, 3, 5, 4, 2, 4, 0} - }, - - /* 112kbps */ - { - { 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* not use */ - { 11, 21, 49, 3, 23, 12, 9, 14, 4}, - { 11, 23, 47, 3, 16, 8, 6, 9, 0}, - { 11, 21, 49, 3, 9, 6, 4, 8, 0}, - { 14, 17, 50, 3, 5, 4, 2, 5, 0} - }, - - /* 128kbps */ - { - { 11, 20, 62, 3, 24, 17, 13, 19, 8}, - { 11, 21, 61, 3, 22, 12, 9, 14, 0}, - { 11, 22, 60, 3, 16, 9, 6, 10, 4}, - { 11, 21, 61, 3, 11, 6, 5, 7, 0}, - { 12, 19, 62, 3, 5, 3, 2, 4, 0} - }, - - /* 160kbps */ - { - { 11, 22, 84, 3, 24, 18, 12, 19, 0}, - { 11, 21, 85, 3, 22, 11, 9, 13, 0}, - { 11, 24, 82, 3, 16, 8, 6, 11, 0}, - { 11, 23, 83, 3, 11, 6, 5, 9, 0}, - { 11, 19, 87, 3, 5, 4, 2, 4, 0} - }, - - /* 192kbps */ - { - { 11, 21, 109, 3, 24, 20, 13, 24, 0}, - { 11, 20, 110, 3, 22, 13, 9, 13, 8}, - { 11, 24, 106, 3, 16, 10, 6, 11, 0}, - { 11, 22, 108, 3, 10, 6, 4, 9, 0}, - { 11, 20, 110, 3, 6, 4, 2, 5, 0} - }, - - /* 224kbps */ - { - { 11, 24, 130, 3, 24, 20, 12, 20, 4}, - { 11, 22, 132, 3, 24, 16, 10, 15, 0}, - { 11, 20, 134, 3, 16, 10, 7, 9, 0}, - { 12, 26, 127, 3, 12, 8, 4, 11, 0}, - { 12, 22, 131, 3, 8, 6, 2, 6, 4} - }, - - /* 256kbps */ - { - { 11, 26, 152, 3, 24, 19, 14, 18, 4}, - { 11, 22, 156, 3, 24, 14, 10, 13, 8}, - { 11, 27, 151, 3, 16, 10, 7, 10, 0}, - { 11, 24, 154, 3, 12, 9, 5, 10, 4}, - { 11, 24, 154, 3, 6, 5, 2, 5, 0} - }, - - /* 320kbps */ - { - { 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* not use */ - { 11, 26, 200, 3, 24, 17, 9, 17, 0}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* not use */ - { 11, 25, 201, 3, 13, 9, 5, 10, 8}, - { 11, 26, 200, 3, 8, 5, 2, 6, 4} - }, - - /* 384kbps */ - { - { 12, 28, 245, 3, 24, 20, 14, 23, 8}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* not use */ - { 11, 24, 250, 3, 16, 9, 7, 10, 4}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* not use */ - { 11, 27, 247, 3, 8, 6, 2, 7, 0} - } -}; - -int crc_good_cnt; -int crc_bad_cnt; -int fic_nice_cnt; - -int announcement; -int bbm_recfg_flag; - -struct esbinfo_t *get_emsemble_info(void) -{ - return &ensemble_info[0]; -} - -struct subch_info_t *get_subchannel_info(u8 subchannel_id) -{ - struct subch_info_t *sub_ch_info; - int i; - - for (i = 0; i < MAX_SUBCH_NUM; i++) { - sub_ch_info = &subchannel_info[i]; - if ((sub_ch_info->flag != 0) - && (sub_ch_info->subchannel_id == subchannel_id)) - break; - } - - if (i == MAX_SUBCH_NUM) { - for (i = 0; i < MAX_SUBCH_NUM; i++) { - sub_ch_info = &subchannel_info[i]; - if (sub_ch_info->flag == 0) - break; - } - if (i == MAX_SUBCH_NUM) - return NULL; - } - - return sub_ch_info; -} - -struct service_info_t *get_service_info_list(u8 service_index) -{ - return &service_info[service_index]; -} - -struct service_info_t *get_service_info(u32 sid) -{ - struct service_info_t *svc_info; - int i; - - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = &service_info[i]; - if ((svc_info->flag != 0) && (sid == svc_info->sid)) - break; - } - - if (i == MAX_SVC_NUM) { - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = &service_info[i]; - if (svc_info->flag == 0) { - svc_info->sid = sid; - break; - } - } - if (i == MAX_SVC_NUM) - return NULL; - } - - return svc_info; -} - -struct scInfo_t *get_sc_info(u16 scid) -{ - struct scInfo_t *pScInfo; - int i; - - for (i = 0; i < MAX_SC_NUM; i++) { - pScInfo = &sc_info[i]; - if ((pScInfo->flag == 99) && (pScInfo->scid == scid)) { - /* pScInfo->scid = 0xffff; */ - break; - } - } - if (i == MAX_SVC_NUM) { - for (i = 0; i < MAX_SVC_NUM; i++) { - pScInfo = &sc_info[i]; - if (pScInfo->flag == 0) - break; - } - if (i == MAX_SC_NUM) - return NULL; - } - - return pScInfo; -} - -static unsigned short crc16(unsigned char *fibBuffer, int len) -{ - int i, j, k; - unsigned int sta, din; - unsigned int crc_tmp = 0x0; - int crc_buf[16]; - int crc_coff[16] = { /* CRC16 CCITT REVERSED */ - 0, 0, 0, 0, /* 0x0 */ - 1, 0, 0, 0, /* 0x8 */ - 0, 0, 0, 1, /* 0x1 */ - 0, 0, 0, 1 /* 0x1 */ - }; - - for (j = 0; j < 16; j++) - crc_buf[j] = 0x1; - - for (i = 0; i < len; i++) { - sta = fibBuffer[i] & 0xff; - - for (k = 7; k >= 0; k--) { - din = ((sta >> k) & 0x1) ^ (crc_buf[15] & 0x1); - - for (j = 15; j > 0; j--) - crc_buf[j] = - (crc_buf[j-1] & 0x1) - ^ ((crc_coff[j-1] * din) & 0x1); - - crc_buf[0] = din; - } - } - - crc_tmp = 0; - for (j = 15; j >= 0; j--) - crc_tmp = (crc_tmp << 1) | (crc_buf[j] & 0x1); - - return ~crc_tmp & 0xffff; -} - -int fic_crc_ctrl = 1; /* fic crc check enable */ - -int fic_decoder(struct fic *pfic, u16 length) -{ - struct fib *pfib; - int result = 0; - int i; - u16 bufferCnt; - - bufferCnt = length; - - if (bufferCnt % 32) { - /* print_log(NULL - , "FIC BUFFER LENGTH ERROR %d\n", bufferCnt); */ - return 1; - } - - for (i = 0; i < bufferCnt/32; i++) { - pfib = &pfic->fib[i]; - if (fic_crc_ctrl) { - if (crc16(pfib->data, 30) == BYTESWAP(pfib->crc)) { - crc_good_cnt++; - result = fib_decoder(pfib); - } else { - crc_bad_cnt++; - /* print_log(NULL, "CRC ERROR: FIB %d\n", i); */ - } - } else { - result = fib_decoder(pfib); - crc_good_cnt++; - } - } - - return result; -} - -int fib_decoder(struct fib *pfib) -{ - struct fig *pFig; - int type, length; - int fib_ptr = 0; - int result = 0; - - while (fib_ptr < 30) { - pFig = (struct fig *)&pfib->data[fib_ptr]; - - type = (pFig->head >> 5) & 0x7; - length = pFig->head & 0x1f; - - if (pFig->head == 0xff || !length) { /* end mark */ - break; - } - - fic_nice_cnt++; - - switch (type) { - case 0: - result = fig0_decoder(pFig); /* MCI & SI */ - break; - case 1: - result = fig1_decoder(pFig); /* SI */ - /* - if (result) - print_log(NULL, "SI Error [%x]\n", result); - */ - break; - - default: - /* - print_log(NULL, "FIG 0x%X Length : 0x%X 0x%X\n" - , type, length, fib_ptr); - */ - result = 1; - break; - } - - fib_ptr += length + 1; - } - - return result; -} - -/* - * MCI & SI - */ -static int fig0_decoder(struct fig *pFig) -{ - int result = 0; - int extension, length, pd; - u8 cn; - - length = pFig->head & 0x1f; - cn = (pFig->data[0] & 0x80) >> 7; - if ((bbm_recfg_flag == 1) && (cn == 0)) - return 0; - /* if (cn) - print_log(NULL, "N"); - */ - extension = pFig->data[0] & 0x1F; - pd = (pFig->data[0] & 0x20) >> 5; - - switch (extension) { - case 1: - result = fig0_ext1_decoder(cn, &pFig->data[1], length); - break; - case 2: - result = fig0_ext2_decoder(&pFig->data[1], length, pd); - break; - case 3: /* Service component in packet mode or without CA */ - result = fig0_ext3_decoder(&pFig->data[1], length); - break; - case 4: /* Service component with CA */ - /* - result = fig0_ext4_decoder(&pFig->data[1], length); - */ - break; - case 10: /* Date & Time */ - result = fig0_ext10_decoder(&pFig->data[1], length-1); - break; - case 13: - result = fig0_ext13_decoder(&pFig->data[1], length, pd); - break; - case 14: /* FEC */ - result = fig0_ext14_decoder(&pFig->data[1], length); - break; - case 15: - result = fig0_ext15_decoder(&pFig->data[1], length, pd); - break; - case 0: /* Ensembel Information */ - case 5: /* Language */ - case 8: /* Service component global definition */ - case 9: /* Country LTO and International table */ - case 17: /* Programme Type */ - result = dummy_decoder(&pFig->data[1], length); - break; - case 18: /* Announcements */ - if (announcement) - result = - fig0_ext18_decoder(&pFig->data[1], length); - break; - case 19: /* Announcements switching */ - /* - print_log(NULL, "FIG 0x%X/0x%X Length : 0x%X\n" - , 0, extension, length); - */ - break; - default: - /* - print_log(NULL, "FIG 0x%X/0x%X Length : 0x%X\n" - , 0, extension, length); - */ - result = 1; - break; - } - - return result; -} - -static int fig1_decoder(struct fig *pFig) -{ - int result = 0; - int length; - int /*charset, oe,*/ extension; - - length = pFig->head & 0x1f; - /* charset = (pFig->data[0] >> 4) & 0xF; */ - /* oe = (pFig->data[0]) >> 3 & 0x1; */ - extension = pFig->data[0] & 0x7; - - switch (extension) { - case 0: /* Ensembel Label */ - result = fig1_ext0_decoder(&pFig->data[1], length); - break; - case 1: /* Programme service Label */ - result = fig1_ext1_decoder(&pFig->data[1], length); - break; - case 5: /* Data service Label */ - result = fig1_ext5_decoder(&pFig->data[1], length); - break; - case 4: /* Service component Label */ - result = fig1_ext4_decoder(&pFig->data[1], length); - break; - default: - /* - print_log(NULL, "FIG 0x%X/0x%X Length : 0x%X\n" - , 1, extension, length); - */ - result = 1; - break; - } - - return result; -} - -int dummy_decoder(u8 *fibBuffer, int figLength) -{ - return 0; -} - -/* - * FIG 0/1 MCI, Sub Channel Organization - */ -int fig0_ext1_decoder(u8 cn, u8 *fibBuffer, int figLength) -{ - u8 sta; - int result = 0; - int readcnt = 0; - - u8 subchannel_id; - struct subch_info_t *sub_ch_info; - - while (figLength-1 > readcnt) { - sta = fibBuffer[readcnt++]; - if (sta == 0xFF) - break; - subchannel_id = (sta >> 2) & 0x3F; - sub_ch_info = get_subchannel_info(subchannel_id); - if (sub_ch_info == NULL) { - /*print_log(NULL, "subchannel_info error ..\n"); */ - return 1; - } - - sub_ch_info->flag = 99; - sub_ch_info->mode = 0; /* T-DMB */ - sub_ch_info->subchannel_id = subchannel_id; - - sub_ch_info->start_address = (sta & 0x3) << 8; - sta = fibBuffer[readcnt++]; - sub_ch_info->start_address |= sta; - sta = fibBuffer[readcnt++]; - sub_ch_info->form_type = (sta & 0x80) >> 7; - - switch (sub_ch_info->form_type) { - case 0: /* short form */ - sub_ch_info->table_switch = (sta & 0x40) >> 6; - sub_ch_info->table_index = sta & 0x3f; - break; - case 1: /* long form */ - sub_ch_info->option = (sta & 0x70) >> 4; - sub_ch_info->protect_level = (sta & 0x0c) >> 2; - sub_ch_info->subch_size = (sta & 0x03) << 8; - sta = fibBuffer[readcnt++]; - sub_ch_info->subch_size |= sta; - break; - default: - /* - print_log(NULL, "Unknown Form Type %d\n" - , sub_ch_info->form_type); - */ - result = 1; - break; - } - if (cn) { - if (sub_ch_info->re_config == 0) - sub_ch_info->re_config = 1; - /* ReConfig Info Updated */ - } - } - - return result; -} - -/* - * FIG 0/2 MCI, Sub Channel Organization - */ -static int fig0_ext2_decoder(u8 *fibBuffer, int figLength, int pd) -{ - struct service_info_t *svc_info; - struct subch_info_t *sub_ch_info; - u8 sta; - int result = 0; - int readcnt = 0; - u32 sid = 0xffffffff; - int nscps; - u32 temp; - int tmid; - int i; - - while (figLength-1 > readcnt) { - temp = 0; - - temp = fibBuffer[readcnt++]; - temp = (temp << 8) | fibBuffer[readcnt++]; - - - switch (pd) { - case 0: /* 16-bit sid, used for programme services */ - { - temp = temp; - /*sid = temp & 0xFFF; */ - sid = temp; - } - break; - case 1: /*32bit sid, used for data service */ - { - temp = (temp << 8) | fibBuffer[readcnt++]; - temp = (temp << 8) | fibBuffer[readcnt++]; - - /*sid = temp & 0xFFFFF; */ - sid = temp; - } - break; - default: - break; - } - - svc_info = get_service_info(sid); - if (svc_info == NULL) { - /*print_log(NULL, "get_service_info Error ...\n"); */ - break; - } - - svc_info->addrType = pd; - svc_info->sid = sid; - svc_info->flag |= 0x02; - - sta = fibBuffer[readcnt++]; /* flag, CAId, nscps */ - - nscps = sta & 0xF; - - svc_info->nscps = nscps; - - for (i = 0; i < nscps; i++) { - sta = fibBuffer[readcnt++]; - tmid = (sta >> 6) & 0x3; - /* svc_info->tmid = tmid; */ - - switch (tmid) { - case 0: /* MSC stream audio */ - svc_info->ascty = sta & 0x3f; - sta = fibBuffer[readcnt++]; - if ((sta & 0x02) == 0x02) { /* Primary */ - svc_info->sub_channel_id - = (sta >> 2) & 0x3F; - svc_info->tmid = tmid; - } - sub_ch_info = - get_subchannel_info(svc_info->sub_channel_id); - if (sub_ch_info == NULL) { - /* - print_log(NULL - , "get_subchannel_info Error ...\n"); - */ - return 1; - } - sub_ch_info->sid = svc_info->sid; - svc_info->flag |= 0x04; - break; - case 1: /* MSC stream data */ - svc_info->dscty = sta & 0x3f; - sta = fibBuffer[readcnt++]; - if ((sta & 0x02) == 0x02) { /* Primary */ - svc_info->sub_channel_id - = (sta >> 2) & 0x3F; - svc_info->tmid = tmid; - } - sub_ch_info = - get_subchannel_info(svc_info->sub_channel_id); - if (sub_ch_info == NULL) { - /* - print_log(NULL - , "get_subchannel_info Error ...\n"); - */ - return 1; - } - sub_ch_info->sid = svc_info->sid; - svc_info->flag |= 0x04; - break; - case 2: /* FIDC */ - svc_info->dscty = sta & 0x3f; - sta = fibBuffer[readcnt++]; - if ((sta & 0x02) == 0x02) { /* Primary */ - svc_info->fidc_id = (sta & 0xFC) >> 2; - svc_info->tmid = tmid; - } - svc_info->flag |= 0x04; - break; - case 3: /* MSC packet data */ - svc_info->scid = (sta & 0x3F) << 6; - sta = fibBuffer[readcnt++]; - if ((sta & 0x02) == 0x02) { /* Primary */ - svc_info->scid |= (sta & 0xFC) >> 2; - svc_info->tmid = tmid; - } - /* by iproda */ - svc_info->flag |= 0x04; - break; - default: - /* print_log(NULL - , "Unkown tmid [%X]\n", tmid); */ - result = 1; - break; - } - } - } - - return result; -} - -int fig0_ext3_decoder(u8 *fibBuffer, int figLength) -{ - u8 sta; - int result = 0; - int readcnt = 0; - u16 scid; - int i; - - struct scInfo_t *pScInfo; - struct service_info_t *svc_info; - struct subch_info_t *sub_ch_info; - - while (figLength-1 > readcnt) { - scid = 0; - sta = fibBuffer[readcnt++]; - scid = sta; - scid = scid << 4; - sta = fibBuffer[readcnt++]; - scid |= (sta & 0xf0) >> 4; - - pScInfo = get_sc_info(scid); - if (pScInfo == NULL) { - /* print_log(NULL, "get_sc_info Error ...\n"); */ - return 1; - } - - pScInfo->flag = 99; - pScInfo->scid = scid; - pScInfo->scca_flag = sta & 0x1; - sta = fibBuffer[readcnt++]; - pScInfo->dg_flag = (sta & 0x80) >> 7; - pScInfo->dscty = (sta & 0x3f); - sta = fibBuffer[readcnt++]; - pScInfo->sub_channel_id = (sta & 0xfc) >> 2; - pScInfo->packet_address = sta & 0x3; - pScInfo->packet_address = pScInfo->packet_address << 8; - sta = fibBuffer[readcnt++]; - pScInfo->packet_address |= sta; - if (pScInfo->scca_flag) { - sta = fibBuffer[readcnt++]; - pScInfo->scca = sta; - pScInfo->scca = pScInfo->scca << 8; - sta = fibBuffer[readcnt++]; - pScInfo->scca |= sta; - } - - for (i = 0; i < MAX_SVC_NUM; i++) { - svc_info = &service_info[i]; - if (svc_info->scid == pScInfo->scid - && svc_info->tmid == 3) { - sub_ch_info = - get_subchannel_info(pScInfo->sub_channel_id); - if (sub_ch_info == NULL) { - /* - print_log(NULL - , "get_subchannel_info Error ...\n"); - */ - return 1; - } - - sub_ch_info->sid = svc_info->sid; - svc_info->sub_channel_id - = sub_ch_info->subchannel_id; - } - } - } - - return result; -} - -/*int fig0_ext4_decoder(u8 *fibBuffer, int figLength) { - int result = 0; - int readcnt = 0; - int Mf, sub_channel_id, CAOrg; - - while (figLength - 1 > readcnt) { - Mf = (fibBuffer[readcnt] & 0x40) >> 6; - sub_channel_id = (fibBuffer[readcnt] & 0x3f); - CAOrg = - (fibBuffer[readcnt + 1] << 8) + fibBuffer[readcnt + 2]; - readcnt += 3; - //print_log(NULL, "CA MF: %d, SubChiD: %d, CAOrg: %d\n" - , Mf, sub_channel_id, CAOrg); - } - - return result; -}*/ - -/* - * FIG 0/10 Date & Time - */ -int fig0_ext10_decoder(u8 *fibBuffer, int figLength) -{ - int result = 0; - - u8 MJD, /*ConfInd,*/ UTCflag; - /* u16 LSI; */ - u8 hour = 0; /*minutes = 0, seconds = 0*/ - u16 milliseconds = 0; - - MJD = (fibBuffer[0] & 0x7f) << 10; - MJD |= (fibBuffer[1] << 2); - MJD |= (fibBuffer[2] & 0xc0) >> 6; - /*LSI = (fibBuffer[2] & 0x20) >> 5; */ - /*ConfInd = (fibBuffer[2] & 0x10) >> 4; */ - UTCflag = (fibBuffer[2] & 0x08) >> 3; - - hour = (fibBuffer[2] & 0x07) << 2; - hour |= (fibBuffer[3] & 0xc0) >> 6; - - /* minutes = fibBuffer[3] & 0x3f; */ - - if (UTCflag) { - /* seconds = (fibBuffer[4] & 0xfc) >> 2; */ - milliseconds = (fibBuffer[4] & 0x03) << 8; - milliseconds |= fibBuffer[5]; - } - - /* - print_log(NULL, " %d:%d:%d.%d\n" - , hour+9, minutes, seconds, milliseconds); - */ - - return result; -} - -/* - * FIG 0/13 Announcement - */ -int fig0_ext13_decoder(u8 *fibBuffer, int figLength, int pd) -{ - u8 sta; - int result = 0; - int readcnt = 0; - u32 sid = 0xffffffff; - /* u8 SCIdS; */ - u8 NumOfUAs; - u16 UAtype; - u8 UAlen; - int i, j; - - struct service_info_t *svc_info; - - - while (figLength-1 > readcnt) { - switch (pd) { - case 0: /* 16-bit sid, used for programme services */ - { - u32 temp; - - temp = 0; - - temp = fibBuffer[readcnt++]; - temp = (temp << 8) | fibBuffer[readcnt++]; - - sid = temp; - } - break; - case 1: /* 32bit sid, used for data service */ - { - u32 temp; - - temp = 0; - - temp = fibBuffer[readcnt++]; - temp = (temp << 8) | fibBuffer[readcnt++]; - temp = (temp << 8) | fibBuffer[readcnt++]; - temp = (temp << 8) | fibBuffer[readcnt++]; - - sid = temp; - } - break; - default: - break; - } - - svc_info = get_service_info(sid); - if (svc_info == NULL) { - /* print_log(NULL, "get_service_info Error ...\n"); */ - break; - } - svc_info->sid = sid; - - svc_info->flag |= 0x04; - - sta = fibBuffer[readcnt++]; - - /* SCIdS = (sta & 0xff00) >> 4; */ - NumOfUAs = sta & 0xff; - - /* Because of Visual Radio */ - svc_info->num_of_user_appl = NumOfUAs; - - for (i = 0; i < NumOfUAs; i++) { - UAtype = 0; - sta = fibBuffer[readcnt++]; - UAtype = sta; - sta = fibBuffer[readcnt++]; - UAtype = (UAtype << 3) | ((sta >> 5) & 0x07); - - /* Because of Visual Radio */ - UAlen = sta & 0x1f; - - svc_info->user_appl_type[i] = UAtype; - svc_info->user_appl_length[i] = UAlen; - - for (j = 0; j < UAlen; j++) { - sta = fibBuffer[readcnt++]; - svc_info->user_appl_data[i][j] = sta; - } - } - } - - return result; -} - -int fig0_ext14_decoder(u8 *fibBuffer, int figLength) -{ - int result = 0; - int readcnt = 0; - unsigned char subch, fec_scheme; - struct subch_info_t *sub_ch_info; - - while (figLength-1 > readcnt) { - subch = (fibBuffer[readcnt] & 0xfc) >> 2; - fec_scheme = (fibBuffer[readcnt] & 0x03); - readcnt++; - /* - print_log(NULL, "SubChID: %d, FEC Scheme: %d\n" - , subch, fec_scheme); - */ - sub_ch_info = get_subchannel_info(subch); - if (sub_ch_info) - sub_ch_info->fec_schem = fec_scheme; - } - - return result; -} - - /* - * TMMB kjju TODO - */ -int fig0_ext15_decoder(u8 *fibBuffer, int figLength, int pd) -{ - u8 sta; - int result = 0; - int readcnt = 0; - u8 subchannel_id; - struct subch_info_t *sub_ch_info; - - while (figLength-1 > readcnt) { - sta = fibBuffer[readcnt++]; - if (sta == 0xFF) - break; - - subchannel_id = (sta & 0xfc) >> 2; - sub_ch_info = get_subchannel_info(subchannel_id); - if (sub_ch_info == NULL) { - /* print_log(NULL, "subchannel_info error ..\n"); */ - return 1; - } - - sub_ch_info->flag = 99; - sub_ch_info->mode = 1; /* T-MMB */ - sub_ch_info->subchannel_id = subchannel_id; - sub_ch_info->start_address = (sta & 0x3) << 8; - - sta = fibBuffer[readcnt++]; - sub_ch_info->start_address |= sta; - - sub_ch_info = get_subchannel_info(sub_ch_info->subchannel_id); - if (sub_ch_info == NULL) { - /* print_log(NULL, "subchannel_info error ..\n"); */ - return 1; - } - - sta = fibBuffer[readcnt++]; - - sub_ch_info->mod_type = (sta & 0xc0) >> 6; - sub_ch_info->enc_type = (sta & 0x20) >> 5; - sub_ch_info->intv_depth = (sta & 0x18) >> 3; - sub_ch_info->pl = (sta & 0x04) >> 2; - sub_ch_info->subch_size = (sta & 0x03) << 8; - - sta = fibBuffer[readcnt++]; - sub_ch_info->subch_size |= sta; - } - - return result; -} - -/* - * FIG 0/18 Announcement - */ -int fig0_ext18_decoder(u8 *fibBuffer, int figLength) -{ - u8 sta; - int result = 0; - int readcnt = 0; - u16 sid; - /* u8 CId; */ - u16 AsuFlag; - int nocs; - int i; - - while (figLength-1 > readcnt) { - sta = fibBuffer[readcnt++]; - sid = sta << 8; - sta = fibBuffer[readcnt++]; - sid |= sta; - /* print_log(NULL, "sid = 0x%X, ", sid); */ - - sta = fibBuffer[readcnt++]; - AsuFlag = sta << 8; - sta = fibBuffer[readcnt++]; - AsuFlag |= sta; - /* print_log(NULL, "AsuFlag = 0x%X, ", AsuFlag); */ - - sta = fibBuffer[readcnt++]; - nocs = sta & 0x1F; - /* print_log(NULL, "nocs = 0x%X, ", nocs); */ - - for (i = 0; i < nocs; i++) { - sta = fibBuffer[readcnt++]; - /* CId = sta; */ - /* print_log(NULL, "CId = %d, ", CId); */ - } - /* print_log(NULL, "\n"); */ - } - - return result; -} - -static int fig1_ext0_decoder(u8 *fibBuffer, int figLength) -{ - int result = 0; - int readcnt = 0; - int i; - - u16 eid; - u16 flag; - - eid = 0; - eid = fibBuffer[readcnt++]; - eid = eid << 8 | fibBuffer[readcnt++]; - - for (i = 0; i < 16; i++) - ensemble_info[0].label[i] = fibBuffer[readcnt++]; - - flag = 0; - flag = fibBuffer[readcnt++]; - flag = flag << 8 | fibBuffer[readcnt++]; - - ensemble_info[0].label[16] = '\0'; - ensemble_info[0].flag = 99; - ensemble_info[0].eid = eid; - /* - print_log(DMB_FIC_INFO"FIG 1/0 label [%x][%s]\n" - , eid, ensemble_info[0].label); - */ - - for (i = 16-1; i >= 0; i--) { - if (ensemble_info[0].label[i] == 0x20) - ensemble_info[0].label[i] = 0; - else { - if (i == 16-1) - ensemble_info[0].label[i] = 0; - break; - } - } - - return result; -} - -static int fig1_ext1_decoder(u8 *fibBuffer, int figLength) -{ - struct service_info_t *svc_info; - u32 temp; - int result = 0; - int readcnt = 0; - int i; - - u16 sid; - - temp = 0; - temp = fibBuffer[readcnt++]; - temp = temp << 8 | fibBuffer[readcnt++]; - - sid = temp; - - svc_info = get_service_info(sid); - if (svc_info == NULL) { - /* print_log(NULL, "get_service_info Error ...\n"); */ - return 1; - } - - svc_info->sid = sid; - - svc_info->flag |= 0x01; - - for (i = 0; i < 16; i++) - svc_info->label[i] = fibBuffer[readcnt++]; - - svc_info->label[16] = '\0'; - /* print_log(NULL, "FIG 1/1 label [%x][%s]\n", sid, svc_info->label); */ - - for (i = 16-1; i >= 0; i--) { - if (svc_info->label[i] == 0x20) - svc_info->label[i] = 0; - else { - if (i == 16-1) - svc_info->label[i] = 0; - break; - } - } - - /* print_log(NULL, "FIG 1/5 label [%x][%s]\n", sid, svc_info->label); */ - - return result; -} - -static int fig1_ext4_decoder(u8 *fibBuffer, int figLength) -{ - struct scInfo_t *pScInfo; - u8 sta; - u8 pd; - u32 temp; - int result = 0; - int readcnt = 0; - int i; - - u16 scid; - /* u32 sid; */ - u16 flag; - - sta = fibBuffer[readcnt++]; - - pd = (sta & 0x80) >> 7; - scid = (sta & 0x0f); - - temp = 0; - temp = fibBuffer[readcnt++]; - temp = temp << 8 | fibBuffer[readcnt++]; - - if (pd) { - temp = temp << 8 | fibBuffer[readcnt++]; - temp = temp << 8 | fibBuffer[readcnt++]; - /* sid = temp; */ - } else { - /* sid = temp; */ - } - - pScInfo = get_sc_info(scid); - if (pScInfo == NULL) { - /* print_log(NULL, "get_service_info Error ...\n"); */ - return 1; - } - - pScInfo->flag = 99; - pScInfo->scid = scid; - - for (i = 0; i < 16; i++) - pScInfo->label[i] = fibBuffer[readcnt++]; - - flag = 0; - flag = fibBuffer[readcnt++]; - flag = flag << 8 | fibBuffer[readcnt++]; - - pScInfo->label[16] = '\0'; - /* print_log(NULL, "FIG 1/4 label [%x][%s]\n", sid, pScInfo->label); */ - - for (i = 16-1; i >= 0; i--) { - if (pScInfo->label[i] == 0x20) - pScInfo->label[i] = 0; - else { - if (i == 16-1) - pScInfo->label[i] = 0; - break; - } - } - - /*print_log(NULL, "FIG 1/5 label [%x][%s]\n", sid, svc_info->label); */ - - return result; -} - -static int fig1_ext5_decoder(u8 *fibBuffer, int figLength) -{ - struct service_info_t *svc_info; - u32 temp; - int result = 0; - int readcnt = 0; - int i; - - u32 sid; - u16 flag; - - temp = 0; - temp = fibBuffer[readcnt++]; - temp = temp << 8 | fibBuffer[readcnt++]; - temp = temp << 8 | fibBuffer[readcnt++]; - temp = temp << 8 | fibBuffer[readcnt++]; - - sid = temp; - - svc_info = get_service_info(sid); - if (svc_info == NULL) { - /* print_log(NULL, "get_service_info Error ...\n"); */ - return 1; - } - - svc_info->sid = sid; - - svc_info->flag |= 0x01; - - for (i = 0; i < 16; i++) - svc_info->label[i] = fibBuffer[readcnt++]; - - flag = 0; - flag = fibBuffer[readcnt++]; - flag = flag << 8 | fibBuffer[readcnt++]; - - svc_info->label[16] = '\0'; - - for (i = 16-1; i >= 0; i--) { - if (svc_info->label[i] == 0x20) - svc_info->label[i] = 0; - else { - if (i == 16-1) - svc_info->label[i] = 0; - break; - } - } - - /* print_log(NULL, "FIG 1/5 label [%x][%s]\n", sid, svc_info->label); */ - - return result; -} - -void subchannel_org_prn(int subchannel_id) -{ - struct didp_info_t didp; - struct subch_info_t *sub_ch_info; - - memset(&didp, 0, sizeof(didp)); - - sub_ch_info = get_subchannel_info(subchannel_id); - if (sub_ch_info == NULL) - return; - - if (sub_ch_info->flag == 99) { - subchannel_org_to_didp(sub_ch_info, &didp); - /* - if (sub_ch_info->service_channel_id & 0x40) - print_log(NULL, "service_channel_id = 0x%X, " - , sub_ch_info->service_channel_id & 0x3F); - else - print_log(NULL, "service_channel_id = NOTUSE, "); - */ - switch (sub_ch_info->re_config) { - case 0: - /* print_log(NULL, "re_config = INIT\n"); */ - break; - case 1: - /* print_log(NULL, "re_config = UPDATED\n"); */ - break; - case 2: - /* print_log(NULL, "re_config = DONE\n"); */ - break; - } - - /* print_log(NULL, "sid = 0x%X\n", sub_ch_info->sid); */ - /* didp_prn(&didp); */ - } -} - -void subchannel_org_clean(void) -{ - int i; - - memset(ensemble_info, 0, sizeof(struct esbinfo_t) * MAX_ESB_NUM); - memset(service_info, 0, sizeof(struct service_info_t) * MAX_SVC_NUM); - memset(sc_info, 0, sizeof(struct scInfo_t) * MAX_SC_NUM); - memset(subchannel_info, 0, sizeof(struct subch_info_t) * MAX_SUBCH_NUM); - - for (i = 0; i < MAX_SUBCH_NUM; i++) - subchannel_info[i].flag = 0; - - for (i = 0; i < MAX_SVC_NUM; i++) { - service_info[i].flag = 0; - service_info[i].scid = 0xffff; - } - - for (i = 0; i < MAX_SC_NUM; i++) - sc_info[i].scid = 0xffff; - - return; -} - -int bitrate_to_index(u16 bitrate) -{ - int index; - - switch (bitrate) { - case 32: - index = 0; break; - case 48: - index = 1; break; - case 56: - index = 2; break; - case 64: - index = 3; break; - case 80: - index = 4; break; - case 96: - index = 5; break; - case 112: - index = 6; break; - case 128: - index = 7; break; - case 160: - index = 8; break; - case 192: - index = 9; break; - case 224: - index = 10; break; - case 256: - index = 11; break; - case 320: - index = 12; break; - case 384: - index = 13; break; - default: - index = -1; break; - } - - return index; -} - -int GetN(struct subch_info_t *sub_ch_info, int *n) -{ - int result = 0; - - switch (sub_ch_info->option) { - case 0: - switch (sub_ch_info->protect_level) { - case 0: - *n = sub_ch_info->subch_size / 12; - break; - case 1: - *n = sub_ch_info->subch_size / 8; - break; - case 2: - *n = sub_ch_info->subch_size / 6; - break; - case 3: - *n = sub_ch_info->subch_size / 4; - break; - default: - /* - print_log(NULL, "Unknown Protection Level %d\n" - , sub_ch_info->protect_level); - */ - result = 1; - break; - } - break; - case 1: - switch (sub_ch_info->protect_level) { - case 0: - *n = sub_ch_info->subch_size / 27; - break; - case 1: - *n = sub_ch_info->subch_size / 21; - break; - case 2: - *n = sub_ch_info->subch_size / 18; - break; - case 3: - *n = sub_ch_info->subch_size / 15; - break; - default: - /* - print_log(NULL, "Unknown Protection Level %d\n" - , sub_ch_info->protect_level); - */ - result = 1; - break; - } - break; - default: - /* print_log(NULL, "Unknown Option %d\n" - , sub_ch_info->option); */ - result = 1; - break; - } - - return result; -} - -int subchannel_org_to_didp( - struct subch_info_t *sub_ch_info, struct didp_info_t *pdidp) -{ - int index, bitrate, level; - int result = 0, n = 0; - u16 subch_size = 0; - u16 dataRate; - u8 intv_depth = 0; - - if (sub_ch_info->flag != 99) - return 1; - - switch (sub_ch_info->mode) { - case 0: /* T-DMB */ - pdidp->mode = sub_ch_info->mode; - switch (sub_ch_info->form_type) { - case 0: /* short form UEP */ - pdidp->subchannel_id = sub_ch_info->subchannel_id; - pdidp->start_address = sub_ch_info->start_address; - pdidp->form_type = sub_ch_info->form_type; - subch_size = - bitrate_profile[sub_ch_info->table_index][0]; - pdidp->speed = - bitrate_profile[sub_ch_info->table_index][2]; - - level = bitrate_profile[sub_ch_info->table_index][1]; - bitrate = bitrate_profile[sub_ch_info->table_index][2]; - index = bitrate_to_index(bitrate); - - if (index < 0) { - result = 1; - break; - } - - pdidp->l1 = uep_profile[index][level-1][0]; - pdidp->l2 = uep_profile[index][level-1][1]; - pdidp->l3 = uep_profile[index][level-1][2]; - pdidp->l4 = uep_profile[index][level-1][3]; - pdidp->p1 = (u8)uep_profile[index][level-1][4]; - pdidp->p2 = (u8)uep_profile[index][level-1][5]; - pdidp->p3 = (u8)uep_profile[index][level-1][6]; - pdidp->p4 = (u8)uep_profile[index][level-1][7]; - pdidp->pad = (u8)uep_profile[index][level-1][8]; - break; - case 1: /* long form EEP */ - pdidp->subchannel_id = sub_ch_info->subchannel_id; - pdidp->start_address = sub_ch_info->start_address; - pdidp->form_type = sub_ch_info->form_type; - subch_size = sub_ch_info->subch_size; - pdidp->l3 = 0; - pdidp->p3 = 0; - pdidp->l4 = 0; - pdidp->p4 = 0; - pdidp->pad = 0; - - if (GetN(sub_ch_info, &n)) { - result = 1; - break; - } - - switch (sub_ch_info->option) { - case 0: - switch (sub_ch_info->protect_level) { - case 0: - pdidp->l1 = 6*n - 3; - pdidp->l2 = 3; - pdidp->p1 = 24; - pdidp->p2 = 23; - break; - case 1: - if (n > 1) { - pdidp->l1 = 2*n - 3; - pdidp->l2 = 4*n + 3; - pdidp->p1 = 14; - pdidp->p2 = 13; - } else { - pdidp->l1 = 5; - pdidp->l2 = 1; - pdidp->p1 = 13; - pdidp->p2 = 12; - } - break; - case 2: - pdidp->l1 = 6*n - 3; - pdidp->l2 = 3; - pdidp->p1 = 8; - pdidp->p2 = 7; - break; - case 3: - pdidp->l1 = 4*n - 3; - pdidp->l2 = 2*n + 3; - pdidp->p1 = 3; - pdidp->p2 = 2; - break; - default: - result = 1; - break; - } - pdidp->speed = 8*n; - break; - case 1: - switch (sub_ch_info->protect_level) { - case 0: - pdidp->l1 = 24*n - 3; - pdidp->l2 = 3; - pdidp->p1 = 10; - pdidp->p2 = 9; - break; - case 1: - pdidp->l1 = 24*n - 3; - pdidp->l2 = 3; - pdidp->p1 = 6; - pdidp->p2 = 5; - break; - case 2: - pdidp->l1 = 24*n - 3; - pdidp->l2 = 3; - pdidp->p1 = 4; - pdidp->p2 = 3; - break; - case 3: - pdidp->l1 = 24*n - 3; - pdidp->l2 = 3; - pdidp->p1 = 2; - pdidp->p2 = 1; - break; - default: - break; - } - pdidp->speed = 32*n; - break; - default: - result = 1; - break; - } - break; - default: - result = 1; - break; - } - - if (subch_size <= pdidp->subch_size) - pdidp->reconfig_offset = 0; - else - pdidp->reconfig_offset = 1; - - pdidp->subch_size = subch_size; - break; - case 1: /* T-MMB */ - pdidp->mode = sub_ch_info->mode; - pdidp->start_address = sub_ch_info->start_address; - pdidp->subchannel_id = sub_ch_info->subchannel_id; - pdidp->subch_size = sub_ch_info->subch_size; - pdidp->mod_type = sub_ch_info->mod_type; - pdidp->enc_type = sub_ch_info->enc_type; - pdidp->intv_depth = sub_ch_info->intv_depth; - pdidp->pl = sub_ch_info->pl; - - switch (pdidp->mod_type) { - case 0: - n = pdidp->subch_size / 18; - break; - case 1: - n = pdidp->subch_size / 12; - break; - case 2: - n = pdidp->subch_size / 9; - break; - default: - result = 1; - break; - } - - switch (pdidp->intv_depth) { - case 0: - intv_depth = 16; - break; - case 1: - intv_depth = 32; - break; - case 2: - intv_depth = 64; - break; - default: - result = 1; - break; - } - - if (result == 1) - break; - - if (pdidp->pl) { - dataRate = n * 32; - pdidp->mi = - (((((dataRate * 3) / 2) * 24) / intv_depth) * 3) - / 4; - } else { - dataRate = n * 24; - pdidp->mi = - ((((dataRate * 2) * 24) / intv_depth) * 3) / 4; - } - break; - default: - break; - } - - return result; -} - -int found_all_labels(void) -{ - ms_wait(1200); - return 1; -} diff --git a/drivers/media/tdmb/fc8050/ficdecoder.h b/drivers/media/tdmb/fc8050/ficdecoder.h deleted file mode 100644 index ae39402..0000000 --- a/drivers/media/tdmb/fc8050/ficdecoder.h +++ /dev/null @@ -1,183 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : ficdecoder.h - - Description : fic parser - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- -*******************************************************************************/ -#ifndef __ficdecodera_h__ -#define __ficdecodera_h__ - -#include "fci_types.h" - -#define MAX_ESB_NUM 1 -#define MAX_SVC_NUM 128 -#define MAX_SC_NUM 128 -#define MAX_SUBCH_NUM 64 -#define MAX_DIDP_NUM 8 - -#define MAX_USER_APPL_NUM 15 -#define MAX_USER_APPL_DATA_SIZE 24 - -struct fig { - u8 head; - u8 data[29]; -}; - -struct fib { - u8 data[30]; - u16 crc; -}; - -struct fic { - /* Fib fib[12]; */ - struct fib fib[32]; -}; - -struct figdata { - u8 head; - u8 data[28]; -}; - -struct esbinfo_t { - u8 flag; - u16 eid; - u8 label[32]; -}; - -struct service_info_t { - u8 flag; - u32 sid; - u16 scid; - u8 ascty; - u8 dscty; - u8 fidc_id; - u8 addrType; /* PD */ - u8 tmid; - u8 sub_channel_id; - u8 nscps; - u8 label[32]; - - u8 num_of_user_appl; - u16 user_appl_type[MAX_USER_APPL_NUM]; - u8 user_appl_length[MAX_USER_APPL_NUM]; - u8 user_appl_data[MAX_USER_APPL_NUM][MAX_USER_APPL_DATA_SIZE]; -}; - -struct scInfo_t { - u8 flag; - u16 scid; - u8 dscty; - u8 sub_channel_id; - u8 scca_flag; - u8 dg_flag; - u16 packet_address; - u16 scca; - u8 label[32]; -}; - -struct subch_info_t { - u8 flag; - u8 subchannel_id; - u16 start_address; - u8 form_type; - u8 table_index; - u8 table_switch; - u8 option; - u8 protect_level; - u16 subch_size; - u32 sid; - u8 service_channel_id; - u8 re_config; - - /* T-MMB */ - u8 mode; /* 0 T-DMB, 1 T-MMB */ - u8 mod_type; - u8 enc_type; - u8 intv_depth; - u8 pl; - /* T-MMB */ - - /* FEC */ - u8 fec_schem; - -}; - -struct didp_info_t { - u8 flag; - u8 reconfig_offset; - u8 subchannel_id; - u16 start_address; - u8 form_type; - u16 subch_size; - u16 speed; /* kbsp */ - u16 l1; - u8 p1; - u16 l2; - u8 p2; - u16 l3; - u8 p3; - u16 l4; - u8 p4; - u8 pad; - /* T-MMB */ - u8 mode; /* 0 T-DMB, 1 T-MMB */ - u8 mod_type; - u8 enc_type; - u8 intv_depth; - u8 pl; - u16 mi; /* kies use */ - /* T-MMB */ -}; - -#ifdef __cplusplus - extern "C" { -#endif - -extern struct esbinfo_t ensemble_info[MAX_ESB_NUM]; -extern struct service_info_t service_info[MAX_SVC_NUM]; -extern struct subch_info_t subchannel_info[MAX_SUBCH_NUM]; -extern struct didp_info_t didpInfo[MAX_DIDP_NUM]; - - -extern int fic_decoder(struct fic *pfic, u16 length); -extern int fib_decoder(struct fib *pfib); -extern struct esbinfo_t *get_emsemble_info(void); -extern struct subch_info_t *get_subchannel_info(u8 subchannel_id); -extern struct service_info_t *get_service_info(u32 sid); -extern struct scInfo_t *get_sc_info(u16 scid); -extern struct service_info_t *get_service_info_list(u8 service_index); -extern void subchannel_org_clean(void); -extern void subchannel_org_prn(int subchannel_id); -extern int found_all_labels(void); -extern void didp_prn(struct didp_info_t *pdidp); -extern int set_didp_reg(int service_channel_id, struct didp_info_t *pdidp); -extern int subchannel_org_to_didp( - struct subch_info_t *sub_ch_info, struct didp_info_t *pdidp); -extern void subchannel_org_prn(int subchannel_id); -extern int dummy_decoder(u8 *fibBuffer, int figLength); - - -#ifdef __cplusplus - } /* extern "C" {*/ -#endif - -#endif /* __ficdecoder_h__ */ diff --git a/drivers/media/tdmb/mtv318/Makefile b/drivers/media/tdmb/mtv318/Makefile deleted file mode 100644 index ad4ce80..0000000 --- a/drivers/media/tdmb/mtv318/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -obj-y += raontv.o -obj-y += raontv_port.o -obj-y += raontv_rf.o -obj-y += raontv_ficdec.o -obj-y += raontv_tdmb.o - -ccflags-y += -Idrivers/media/tdmb diff --git a/drivers/media/tdmb/mtv318/raontv.c b/drivers/media/tdmb/mtv318/raontv.c deleted file mode 100644 index d450aa9..0000000 --- a/drivers/media/tdmb/mtv318/raontv.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv.c - * - * Description : RAONTECH TV device driver. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "raontv_rf.h" - -BOOL g_fRtvChannelChange; - -enum E_RTV_ADC_CLK_FREQ_TYPE g_eRtvAdcClkFreqType; -BOOL g_fRtvStreamEnabled; - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_ISDBT_ENABLE) -enum E_RTV_COUNTRY_BAND_TYPE g_eRtvCountryBandType; -#endif - -#ifdef RTV_DAB_ENABLE -enum E_RTV_TV_MODE_TYPE g_curDabSetType; -#endif - -#ifdef RTV_IF_EBI2 -VU8 g_bRtvEbiMapSelData = 0x7; -#endif - -UINT g_nRtvMscThresholdSize; - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -U8 g_bRtvIntrMaskRegL; - -#else -#if !defined(RTV_CIF_MODE_ENABLED) || !defined(RTV_FIC_POLLING_MODE) -U8 g_bRtvIntrMaskRegL; -#endif -#endif - -void rtv_ConfigureHostIF(void) -{ -#if defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x77, 0x15); /* TSIF Enable */ - RTV_REG_SET(0x22, 0x48); - -#if defined(RTV_IF_MPEG2_PARALLEL_TSIF) - RTV_REG_SET(0x04, 0x01); /* I2C + TSIF Mode Enable*/ -#else - RTV_REG_SET(0x04, 0x29); /* I2C + TSIF Mode Enable*/ -#endif - - RTV_REG_SET(0x0C, 0xF4); /* TSIF Enable*/ - -#elif defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x77, 0x14); /*SPI Mode Enable*/ - RTV_REG_SET(0x04, 0x28); /* SPI Mode Enable*/ - RTV_REG_SET(0x0C, 0xF5); - -#else -#error "Code not present" -#endif -} - -INT rtv_InitSystem(enum E_RTV_TV_MODE_TYPE eTvMode, - enum E_RTV_ADC_CLK_FREQ_TYPE eAdcClkFreqType) -{ - INT nRet; - int i; - - g_fRtvChannelChange = FALSE; - - g_fRtvStreamEnabled = FALSE; - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - g_bRtvIntrMaskRegL = 0xFF; -#else -#ifndef RTV_CIF_MODE_ENABLED /* Individual Mode */ - g_bRtvIntrMaskRegL = 0xFF; -#endif -#endif - - for (i = 1; i <= 100; i++) { - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x7D, 0x06); - if (RTV_REG_GET(0x7D) == 0x06) - goto RTV_POWER_ON_SUCCESS; - - RTV_DBGMSG1("[rtv_InitSystem] Power On wait: %d\n", i); - - RTV_DELAY_MS(5); - } - - RTV_DBGMSG1("rtv_InitSystem: Power On Check error: %d\n", i); - return RTV_POWER_ON_CHECK_ERROR; - -RTV_POWER_ON_SUCCESS: - - rtvRF_ConfigurePowerType(eTvMode); - nRet = rtvRF_ConfigureAdcClock(eTvMode, eAdcClkFreqType); - - if (nRet != RTV_SUCCESS) - return nRet; - - return RTV_SUCCESS; -} diff --git a/drivers/media/tdmb/mtv318/raontv.h b/drivers/media/tdmb/mtv318/raontv.h deleted file mode 100644 index 3a1d762..0000000 --- a/drivers/media/tdmb/mtv318/raontv.h +++ /dev/null @@ -1,274 +0,0 @@ -/* -* -* File name: drivers/media/tdmb/mtv318/src/raontv.h -* -* Description : RAONTECH TV device driver API header file. -* -* Copyright (C) (2011, RAONTECH) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#ifndef __RAONTV_H__ -#define __RAONTV_H__ - -#ifdef __cplusplus -extern "C"{ -#endif - -#include "raontv_port.h" - -#define RAONTV_CHIP_ID 0x8A - -/*============================================================================== - * - * Common definitions and types. - * - *============================================================================*/ -#ifndef NULL - #define NULL 0 -#endif - -#ifndef FALSE - #define FALSE 0 -#endif - -#ifndef TRUE - #define TRUE 1 -#endif - -#ifndef MAX - #define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif - -#ifndef MIN - #define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -#ifndef ABS - #define ABS(x) (((x) < 0) ? -(x) : (x)) -#endif - - -#define RTV_TS_PACKET_SIZE 188 - - -/* Error codes. */ -#define RTV_SUCCESS 0 -#define RTV_INVAILD_COUNTRY_BAND -1 -#define RTV_UNSUPPORT_ADC_CLK -2 -#define RTV_INVAILD_TV_MODE -3 -#define RTV_CHANNEL_NOT_DETECTED -4 -#define RTV_INSUFFICIENT_CHANNEL_BUF -5 -#define RTV_INVAILD_FREQ -6 -#define RTV_INVAILD_SUB_CHANNEL_ID -7 /* for T-DMB and DAB */ -#define RTV_NO_MORE_SUB_CHANNEL -8 /* for T-DMB and DAB */ -#define RTV_INVAILD_THRESHOLD_SIZE -9 -#define RTV_POWER_ON_CHECK_ERROR -10 -#define RTV_PLL_UNLOCKED -11 -#define RTV_ADC_CLK_UNLOCKED -12 - - - - - -enum E_RTV_COUNTRY_BAND_TYPE { - RTV_COUNTRY_BAND_JAPAN = 0, - RTV_COUNTRY_BAND_KOREA, - RTV_COUNTRY_BAND_BRAZIL, - RTV_COUNTRY_BAND_ARGENTINA -}; - - -/* Do not modify the order! */ -enum E_RTV_ADC_CLK_FREQ_TYPE { - RTV_ADC_CLK_FREQ_8_MHz = 0, - RTV_ADC_CLK_FREQ_8_192_MHz, - RTV_ADC_CLK_FREQ_9_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - MAX_NUM_RTV_ADC_CLK_FREQ_TYPE -}; - - -/*============================================================================ - * - * FM definitions, types and APIs. - * - *============================================================================*/ -#define RTV_FM_PILOT_LOCK_MASK 0x1 -#define RTV_FM_RDS_LOCK_MASK 0x2 -#define RTV_FM_CHANNEL_LOCK_OK (RTV_FM_PILOT_LOCK_MASK|RTV_FM_RDS_LOCK_MASK) - -#define RTV_FM_RSSI_DIVIDER 10 - -enum E_RTV_FM_OUTPUT_MODE_TYPE { - RTV_FM_OUTPUT_MODE_AUTO = 0, - RTV_FM_OUTPUT_MODE_MONO = 1, - RTV_FM_OUTPUT_MODE_STEREO = 2 -}; - -void rtvFM_StandbyMode(int on); -void rtvFM_GetLockStatus(UINT *pLockVal, UINT *pLockCnt); -S32 rtvFM_GetRSSI(void); -void rtvFM_SetOutputMode(enum E_RTV_FM_OUTPUT_MODE_TYPE eOutputMode); -void rtvFM_DisableStreamOut(void); -void rtvFM_EnableStreamOut(void); -INT rtvFM_SetFrequency(U32 dwChFreqKHz); -INT rtvFM_SearchFrequency(U32 *pDetectedFreqKHz - , U32 dwStartFreqKHz, U32 dwEndFreqKHz); -INT rtvFM_ScanFrequency(U32 *pChBuf, UINT nNumChBuf - , U32 dwStartFreqKHz, U32 dwEndFreqKHz); -INT rtvFM_Initialize(enum E_RTV_ADC_CLK_FREQ_TYPE eAdcClkFreqType - , UINT nThresholdSize); - - -/*============================================================================ - * - * TDMB definitions, types and APIs. - * - *===========================================================================*/ -#define RTV_TDMB_OFDM_LOCK_MASK 0x1 -#define RTV_TDMB_FEC_LOCK_MASK 0x2 -#define RTV_TDMB_CHANNEL_LOCK_OK \ - (RTV_TDMB_OFDM_LOCK_MASK|RTV_TDMB_FEC_LOCK_MASK) - -#define RTV_TDMB_BER_DIVIDER 100000 -#define RTV_TDMB_CNR_DIVIDER 1000 -#define RTV_TDMB_RSSI_DIVIDER 1000 - -enum E_RTV_TDMB_SERVICE_TYPE { - RTV_TDMB_SERVICE_VIDEO = 0, - RTV_TDMB_SERVICE_AUDIO, - RTV_TDMB_SERVICE_DATA -}; - -struct RTV_TDMB_TII_INFO { - int tii_combo; - int tii_pattern; - int tii_tower; - int tii_strength; -}; - - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - #define RTV_CIF_HEADER_SIZE 4 /* bytes */ -#else - #define RTV_CIF_HEADER_SIZE 16 /* bytes */ -#endif - - -struct RTV_CIF_DEC_INFO { -#if defined(RTV_IF_TSIF) - UINT fic_size; /* Result size. */ - U8 *fic_buf_ptr; /* Destination buffer address. */ -#endif - - /* Result size. */ - UINT msc_size[RTV_MAX_NUM_SUB_CHANNEL_USED]; - /* Result sub channel ID. */ - UINT msc_subch_id[RTV_MAX_NUM_SUB_CHANNEL_USED]; - /* Destination buffer address. */ - U8 *msc_buf_ptr[RTV_MAX_NUM_SUB_CHANNEL_USED]; -}; - -BOOL rtvCIFDEC_Decode(struct RTV_CIF_DEC_INFO *ptDecInfo, - const U8 *pbTsBuf, UINT nTsLen); -#if defined(RTV_IF_SPI) && defined(RTV_CIF_HEADER_INSERTED) -BOOL rtvCIFDEC_CheckCifData_SPI(const U8 *pbTsBuf, UINT nTsLen); -#endif - - -void rtvTDMB_StandbyMode(int on); -UINT rtvTDMB_GetLockStatus(void); -U32 rtvTDMB_GetPER(void); -S32 rtvTDMB_GetRSSI(void); -U32 rtvTDMB_GetCNR(void); -U32 rtvTDMB_GetCER(void); -U32 rtvTDMB_GetBER(void); -UINT rtvTDMB_GetAntennaLevel(U32 dwCER); -U32 rtvTDMB_GetPreviousFrequency(void); -void rtvTDMB_DisableStreamOut(void); -INT rtvTDMB_OpenSubChannel(U32 dwChFreqKHz, UINT nSubChID, - enum E_RTV_TDMB_SERVICE_TYPE eServiceType, - UINT nThresholdSize); -INT rtvTDMB_CloseSubChannel(UINT nSubChID); -void rtvTDMB_CloseAllSubChannels(void); -INT rtvTDMB_ScanFrequency(U32 dwChFreqKHz); -UINT rtvTDMB_ReadFIC(U8 *pbBuf); -void rtvTDMB_CloseFIC(void); -void rtvTDMB_OpenFIC(void); -INT rtvTDMB_Initialize(enum E_RTV_COUNTRY_BAND_TYPE eRtvCountryBandType); - - -/*============================================================================ - * - * DAB definitions, types and APIs. - * - *============================================================================*/ -#define RTV_DAB_OFDM_LOCK_MASK 0x1 -#define RTV_DAB_FEC_LOCK_MASK 0x2 -#define RTV_DAB_CHANNEL_LOCK_OK \ - (RTV_TDMB_OFDM_LOCK_MASK|RTV_TDMB_FEC_LOCK_MASK) - -#define RTV_DAB_BER_DIVIDER 100000 -#define RTV_DAB_CNR_DIVIDER 1000 -#define RTV_DAB_RSSI_DIVIDER 10 - -enum E_RTV_DAB_SERVICE_TYPE { - RTV_DAB_SERVICE_VIDEO = 0, - RTV_DAB_SERVICE_AUDIO, - RTV_DAB_SERVICE_DATA -}; - -struct RTV_DAB_TII_INFO { - int tii_combo; - int tii_pattern; - int tii_tower; - int tii_strength; -}; - - -enum E_RTV_DAB_TRANSMISSION_MODE { - RTV_DAB_TRANSMISSION_MODE1 = 0, - RTV_DAB_TRANSMISSION_MODE2, - RTV_DAB_TRANSMISSION_MODE3, - RTV_DAB_TRANSMISSION_MODE4, - RTV_DAB_INVALID_TRANSMISSION_MODE -}; - - -void rtvDAB_StandbyMode(int on); -UINT rtvDAB_GetLockStatus(void); -U32 rtvDAB_GetPER(void); -S32 rtvDAB_GetRSSI(void); -U32 rtvDAB_GetCNR(void); -U32 rtvDAB_GetCER(void); -U32 rtvDAB_GetBER(void); -U32 rtvDAB_GetPreviousFrequency(void); -void rtvDAB_DisableStreamOut(void); -INT rtvDAB_OpenSubChannel(U32 dwChFreqKHz, UINT nSubChID - , enum E_RTV_DAB_SERVICE_TYPE eServiceType, UINT nThresholdSize); -INT rtvDAB_CloseSubChannel(UINT nSubChID); -void rtvDAB_CloseAllSubChannels(void); -INT rtvDAB_ScanFrequency(U32 dwChFreqKHz); -UINT rtvDAB_ReadFIC(U8 *pbBuf, UINT nFicSize); -UINT rtvDAB_GetFicSize(void); -void rtvDAB_CloseFIC(void); -void rtvDAB_OpenFIC(void); -INT rtvDAB_Initialize(void); - - -#ifdef __cplusplus -} -#endif - -#endif /* __RAONTV_H__ */ - diff --git a/drivers/media/tdmb/mtv318/raontv_ficdec.c b/drivers/media/tdmb/mtv318/raontv_ficdec.c deleted file mode 100644 index 35ec74a..0000000 --- a/drivers/media/tdmb/mtv318/raontv_ficdec.c +++ /dev/null @@ -1,2710 +0,0 @@ -/* -* -* File name: drivers/media/tdmb/mtv318/src/raontv_ficdec.c -* -* Description : RAONTECH FIC Decoder driver. -* -* Copyright (C) (2011, RAONTECH) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include "raontv_ficdec_internal.h" -#include "raontv_internal.h" - -struct ensemble_info_type ensble; - -/*****************************/ -/* FIC Information Variable */ -/*****************************/ -static struct FIG_DATA fig_data; -static const U8 FIC_BIT_MASK[8] = {0x0, 0x80, 0xC0, 0xE0, 0xFF, - 0xF8, 0xFC, 0xFE}; - - -/**********************************/ -/* FIC information get function */ -/**********************************/ -static S32 Get_Bytes(U8 cnt, void *Res) -{ - S32 i; - - for (i = 0; i < cnt; i++) { - *((U8 *) Res+i) = *(fig_data.data+fig_data.byte_cnt); - fig_data.byte_cnt++; - } - - return RTV_OK; -} - -static S32 Get_Bits(U8 cnt, void *Res) -{ - *(U8 *)Res = (U8) (*(fig_data.data+fig_data.byte_cnt) & - (FIC_BIT_MASK[cnt] >> fig_data.bit_cnt)); - - *(U8 *)Res = (*(U8 *)Res) >> (8-cnt-fig_data.bit_cnt); - fig_data.bit_cnt += cnt; - if (fig_data.bit_cnt == 8) { - fig_data.byte_cnt++; - fig_data.bit_cnt = 0; - } - return RTV_OK; -} - -void *Get_FIG0_EXT[] = { - (void *) Get_FIG0_EXT0, (void *) Get_FIG0_EXT1, - (void *) Get_FIG0_EXT2, (void *) Get_FIG0_EXT3, - (void *) Get_FIG0_EXT4, (void *) Get_FIG0_EXT5, - (void *) Get_FIG0_EXT6, (void *) Get_FIG0_EXT7, - (void *) Get_FIG0_EXT8, (void *) Get_FIG0_EXT9, - (void *) Get_FIG0_EXT10, (void *) Get_FIG0_EXT11, - (void *) Get_FIG0_EXT12, (void *) Get_FIG0_EXT13, - (void *) Get_FIG0_EXT14, (void *) Get_FIG0_EXT15, - (void *) Get_FIG0_EXT16, (void *) Get_FIG0_EXT17, - (void *) Get_FIG0_EXT18, (void *) Get_FIG0_EXT19, - (void *) Get_FIG0_EXT20, (void *) Get_FIG0_EXT21, - (void *) Get_FIG0_EXT22, (void *) Get_FIG0_EXT23, - (void *) Get_FIG0_EXT24, (void *) Get_FIG0_EXT25, - (void *) Get_FIG0_EXT26, (void *) Get_FIG0_EXT27, - (void *) Get_FIG0_EXT28, (void *) Get_FIG0_EXT29, - (void *) Get_FIG0_EXT30, (void *) Get_FIG0_EXT31, - 0 -}; - -void *Get_FIG1_EXT[] = { - (void *) Get_FIG1_EXT0, (void *) Get_FIG1_EXT1, - (void *) Get_FIG1_EXT2, (void *) Get_FIG1_EXT3, - (void *) Get_FIG1_EXT4, (void *) Get_FIG1_EXT5, - (void *) Get_FIG1_EXT6, (void *) Get_FIG1_EXT7, - 0 -}; - -void *Get_FIG2_EXT[] = { - (void *) Get_FIG2_EXT0, (void *) Get_FIG2_EXT1, - (void *) Get_FIG2_EXT2, (void *) Get_FIG2_EXT3, - (void *) Get_FIG2_EXT4, (void *) Get_FIG2_EXT5, - (void *) Get_FIG2_EXT6, (void *) Get_FIG2_EXT7, - 0 -}; - -void *Get_FIG5_EXT[] = { - (void *) Get_FIG5_EXT0, (void *) Get_FIG5_EXT1, (void *) Get_FIG5_EXT2, - 0 -}; - -void *FIG_PARSER[] = { - (void *) MCI_SI_DEC, - (void *) SI_LABEL_DEC1, - (void *) SI_LABEL_DEC2, - (void *) RESERVED1, - (void *) RESERVED2, - (void *) FIDC_DEC, - (void *) CA_DEC, - (void *) RESERVED3, - 0 -}; - -S32 Get_FIG_Init(U8 *data) -{ - fig_data.data = data; - fig_data.byte_cnt = 0; - fig_data.bit_cnt = 0; - return RTV_OK; -} - -S32 Get_FIG_Header(struct FIG_DATA *fig_data) -{ - - Get_Bytes(1, &(fig_data->length)); - if (fig_data->length == PN_FIB_END_MARKER) - return PN_FIB_END_MARKER; - - fig_data->type = (fig_data->length) >> 5; - fig_data->length = (fig_data->length) & 0x1f; - return RTV_OK; -} - -S32 FIB_INIT_DEC(U8 *fib_ptr) -{ - U8 fib_cnt = 0; - U8 fic_cmd = 1; - - while (fib_cnt < 30) { - Get_FIG_Init(fib_ptr+fib_cnt); - - if (Get_FIG_Header(&fig_data) == PN_FIB_END_MARKER) - return RTV_OK; - if (fig_data.length == 0) - return RTV_FAIL; - - ((S32 (*) (U8)) FIG_PARSER[fig_data.type]) (fic_cmd); - - fib_cnt += (fig_data.length+1); - } - - return RTV_OK; -} - -S32 MCI_SI_DEC(U8 fic_cmd) -{ - U8 C_N, OE, P_D, EXT; - - Get_Bits(1, &C_N); - Get_Bits(1, &OE); - Get_Bits(1, &P_D); - Get_Bits(5, &EXT); - - ((S32 (*) (U8, U8, U8)) Get_FIG0_EXT[EXT]) (fic_cmd, P_D, C_N); - return RTV_OK; -} - -S32 SI_LABEL_DEC1(U8 fic_cmd) -{ - U8 Charset, OE, EXT; - - Get_Bits(4, &Charset); - Get_Bits(1, &OE); - Get_Bits(3, &EXT); - - ((S32 (*) (U8, U8)) Get_FIG1_EXT[EXT]) (fic_cmd, Charset); - return RTV_OK; -} - -S32 SI_LABEL_DEC2(U8 fic_cmd) -{ - U8 Toggle_Flag, Seg_Index, OE, EXT; - - Get_Bits(1, &Toggle_Flag); - Get_Bits(3, &Seg_Index); - Get_Bits(1, &OE); - Get_Bits(3, &EXT); - - ((S32 (*) (U8, U8)) Get_FIG2_EXT[EXT]) (fic_cmd, Seg_Index); - return RTV_OK; -} - -S32 RESERVED1(U8 fic_cmd) -{ - return RTV_OK; -} - -S32 RESERVED2(U8 fic_cmd) -{ - return RTV_OK; -} - -S32 FIDC_DEC(U8 fic_cmd) -{ - U8 D1, D2, TCid, EXT; - - Get_Bits(1, &D1); - Get_Bits(1, &D2); - Get_Bits(3, &TCid); - Get_Bits(3, &EXT); - - ((S32 (*) (U8, U8, U8, U8)) Get_FIG5_EXT[EXT]) (D1, D2, fic_cmd, TCid); - return RTV_OK; -} - -S32 CA_DEC(U8 fic_cmd) -{ - U8 F_L, EXT; - - Get_Bits(2, &F_L); - Get_Bits(6, &EXT); - return RTV_OK; -} - -S32 RESERVED3(U8 fic_cmd) -{ - return RTV_OK; -} - -/* -* FIG TYPE 0 Extension Function -* Ensemble Information */ -S32 Get_FIG0_EXT0(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2; - - struct FIG_TYPE0_Ext0 type0_ext0; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext0.Eid = (temp1 << 8) | temp2; - - Get_Bits(2, &type0_ext0.Change_flag); - Get_Bits(1, &type0_ext0.AI_flag); - - Get_Bits(5, &type0_ext0.CIF_Count0); - Get_Bytes(1, &type0_ext0.CIF_Count1); - - if (type0_ext0.Change_flag != 0) - Get_Bytes(1, &type0_ext0.Occurence_Change); - - if (fic_cmd) { - ENS_DESC.id = type0_ext0.Eid; - ENS_DESC.change_flag = type0_ext0.Change_flag; - ENS_DESC.Alarm_flag = type0_ext0.AI_flag; - } - } - - return RTV_OK; -} - -/* Basic sub-channel organization */ -S32 Get_FIG0_EXT1(U8 fic_cmd, U8 P_D, U8 C_N) -{ -U8 temp1, temp2, cnt; -S32 bit_rate, sub_ch_size, p_l; - -struct FIG_TYPE0_Ext1 type0_ext1; - -while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(6, &type0_ext1.SubChid); - Get_Bits(2, &temp1); - Get_Bytes(1, &temp2); - type0_ext1.StartAdd = (temp1 << 8) | temp2; - - Get_Bits(1, &type0_ext1.S_L_form); - if (type0_ext1.S_L_form) { - Get_Bits(3, &type0_ext1.Option); - Get_Bits(2, &type0_ext1.Protection_Level); - Get_Bits(2, &temp1); - Get_Bytes(1, &temp2); - type0_ext1.Sub_ch_size = (temp1 << 8) | temp2; - type0_ext1.Size_Protection = (type0_ext1.Option << 12) - | (type0_ext1.Protection_Level << 10) - | type0_ext1.Sub_ch_size; - } else { - Get_Bits(1, &type0_ext1.Table_sw); - Get_Bits(6, &type0_ext1.Table_index); - type0_ext1.Size_Protection = (type0_ext1.Table_sw << 6) - | type0_ext1.Table_index; - } - - if (fic_cmd) { - if (C_N) { - GET_SUBCH_INFO(&type0_ext1, &bit_rate, - &sub_ch_size, &p_l); - /*Old SId & New SId matching */ - for (cnt = 0 - ; cnt < NEXT_ENS_DESC.svr_comp_num - ; cnt++){ - - if (NEXT_ENS_DESC.svr_comp[cnt].SubChid - == type0_ext1.SubChid) { - - NEXT_ENS_DESC.svr_comp[cnt].START_Addr - = type0_ext1.StartAdd; - NEXT_ENS_DESC.svr_comp[cnt].SUB_CH_Size - = sub_ch_size; - NEXT_ENS_DESC.svr_comp[cnt].P_L - = p_l; - NEXT_ENS_DESC.svr_comp[cnt].BIT_RATE - = bit_rate; - } - } - } else { - GET_SUBCH_INFO(&type0_ext1, - &bit_rate, - &sub_ch_size, &p_l); - - for (cnt = 0 - ; cnt < ENS_DESC.svr_comp_num - ; cnt++) { - /*Old SId & New SId matching */ - if (ENS_DESC.svr_comp[cnt].SubChid - == type0_ext1.SubChid) { - ENS_DESC.svr_comp[cnt].START_Addr - = type0_ext1.StartAdd; - ENS_DESC.svr_comp[cnt].SUB_CH_Size - = sub_ch_size; - ENS_DESC.svr_comp[cnt].P_L - = p_l; - ENS_DESC.svr_comp[cnt].BIT_RATE - = bit_rate; - } - } - } - } -} - -return RTV_OK; -} - -static INLINE void update_next_ens_desc_type0_ext2( - struct ENSEMBLE_DESC *next, - struct FIG_TYPE0_Ext2 *type0_ext2, - U8 P_D) -{ - UINT l = 0; - - if (P_D) { - next->svr_desc[next->svr_num].P_D = 1; - next->svr_desc[next->svr_num].ECC - = type0_ext2->ECC; - } else - next->svr_desc[next->svr_num].P_D = 0; - - next->svr_desc[next->svr_num].Country_id = type0_ext2->Country_id; - next->svr_desc[next->svr_num].Service_ref = type0_ext2->Service_ref; - next->svr_desc[next->svr_num].Sid = type0_ext2->Sid; - - next->svr_desc[next->svr_num].Local_flag = type0_ext2->Local_flag; - next->svr_desc[next->svr_num].CAID = type0_ext2->CAID; - next->svr_desc[next->svr_num].Num_ser_comp = type0_ext2->Num_ser_comp; - - for (l = 0; l < type0_ext2->Num_ser_comp; l++) { - - next->svr_desc[next->svr_num].ser_comp_num[l] - = next->svr_comp_num; - next->svr_comp[next->svr_comp_num].TMID - = type0_ext2->svr_comp_des[l].TMID; - /* Transport Mechanism Identifier. */ - switch (type0_ext2->svr_comp_des[l].TMID) { - /* MSC stream Audio mode. */ - case MSC_STREAM_AUDIO: - next->svr_comp[next->svr_comp_num].Sid - = type0_ext2->Sid; - next->svr_comp[next->svr_comp_num].ASCTy - = type0_ext2->svr_comp_des[l].ASCTy; - next->svr_comp[next->svr_comp_num].SubChid - = type0_ext2->svr_comp_des[l].SubChid; - next->svr_comp[next->svr_comp_num].P_S - = type0_ext2->svr_comp_des[l].P_S; - next->svr_comp[next->svr_comp_num].CA_flag - = type0_ext2->svr_comp_des[l].CA_flag; - break; - /* MSC stream data mode. */ - case MSC_STREAM_DATA: - next->svr_comp[next->svr_comp_num].Sid - = type0_ext2->Sid; - next->svr_comp[next->svr_comp_num].DSCTy - = type0_ext2->svr_comp_des[l].DSCTy; - next->svr_comp[next->svr_comp_num].SubChid - = type0_ext2->svr_comp_des[l].SubChid; - next->svr_comp[next->svr_comp_num].P_S - = type0_ext2->svr_comp_des[l].P_S; - next->svr_comp[next->svr_comp_num].CA_flag - = type0_ext2->svr_comp_des[l].CA_flag; - break; - /* FIDC mode. */ - case FIDC: - next->svr_comp[next->svr_comp_num].Sid - = type0_ext2->Sid; - next->svr_comp[next->svr_comp_num].DSCTy - = type0_ext2->svr_comp_des[l].DSCTy; - next->svr_comp[next->svr_comp_num].FIDCid - = type0_ext2->svr_comp_des[l].FIDCid; - next->svr_comp[next->svr_comp_num].P_S - = type0_ext2->svr_comp_des[l].P_S; - next->svr_comp[next->svr_comp_num].CA_flag - = type0_ext2->svr_comp_des[l].CA_flag; - break; - /* MSC Packet data mode. */ - case MSC_PACKET_DATA: - next->svr_comp[next->svr_comp_num].Sid - = type0_ext2->Sid; - next->svr_comp[next->svr_comp_num].SCid - = type0_ext2->svr_comp_des[l].SCid; - next->svr_comp[next->svr_comp_num].P_S - = type0_ext2->svr_comp_des[l].P_S; - next->svr_comp[next->svr_comp_num].CA_flag - = type0_ext2->svr_comp_des[l].CA_flag; - break; - } - next->svr_comp_num++; - } - next->svr_num++; - -} - - -static INLINE void update_current_ens_desc_type0_ext2( - struct ENSEMBLE_DESC *cur, - struct FIG_TYPE0_Ext2 *type0_ext2, - U8 P_D) -{ - UINT l = 0; - - if (P_D) { - cur->svr_desc[cur->svr_num].P_D = 1; - cur->svr_desc[cur->svr_num].ECC = type0_ext2->ECC; - } else - cur->svr_desc[cur->svr_num].P_D = 0; - - cur->svr_desc[cur->svr_num].Country_id = type0_ext2->Country_id; - cur->svr_desc[cur->svr_num].Service_ref = type0_ext2->Service_ref; - cur->svr_desc[cur->svr_num].Sid = type0_ext2->Sid; - - cur->svr_desc[cur->svr_num].Local_flag = type0_ext2->Local_flag; - cur->svr_desc[cur->svr_num].CAID = type0_ext2->CAID; - cur->svr_desc[cur->svr_num].Num_ser_comp = type0_ext2->Num_ser_comp; - - for (l = 0; l < type0_ext2->Num_ser_comp; l++) { - cur->svr_desc[cur->svr_num].ser_comp_num[l] = cur->svr_comp_num; - cur->svr_comp[cur->svr_comp_num].TMID - = type0_ext2->svr_comp_des[l].TMID; - - switch (type0_ext2->svr_comp_des[l].TMID) { - case MSC_STREAM_AUDIO: - /* MSC stream Audio mode. */ - cur->svr_comp[cur->svr_comp_num].Sid - = type0_ext2->Sid; - cur->svr_comp[cur->svr_comp_num].ASCTy - = type0_ext2->svr_comp_des[l].ASCTy; - cur->svr_comp[cur->svr_comp_num].SubChid - = type0_ext2->svr_comp_des[l].SubChid; - cur->svr_comp[cur->svr_comp_num].P_S - = type0_ext2->svr_comp_des[l].P_S ; - cur->svr_comp[cur->svr_comp_num].CA_flag - = type0_ext2->svr_comp_des[l].CA_flag; - break; - case MSC_STREAM_DATA: - /* MSC stream data mode.*/ - cur->svr_comp[cur->svr_comp_num].Sid - = type0_ext2->Sid; - cur->svr_comp[cur->svr_comp_num].DSCTy - = type0_ext2->svr_comp_des[l].DSCTy; - cur->svr_comp[cur->svr_comp_num].SubChid - = type0_ext2->svr_comp_des[l].SubChid; - cur->svr_comp[cur->svr_comp_num].P_S - = type0_ext2->svr_comp_des[l].P_S; - cur->svr_comp[cur->svr_comp_num].CA_flag - = type0_ext2->svr_comp_des[l].CA_flag; - break; - case FIDC: - /* FIDC mode. */ - #if 0 - /* EWS Data have no Label in Korea */ - if (type0_ext2->svr_comp_des[l].DSCTy == 2) { - cur->svr_comp_num--; - cur->svr_num--; - } - #endif - cur->svr_comp[cur->svr_comp_num].Sid - = type0_ext2->Sid; - cur->svr_comp[cur->svr_comp_num].DSCTy - = type0_ext2->svr_comp_des[l].DSCTy; - cur->svr_comp[cur->svr_comp_num].FIDCid - = type0_ext2->svr_comp_des[l].FIDCid; - cur->svr_comp[cur->svr_comp_num].P_S - = type0_ext2->svr_comp_des[l].P_S; - cur->svr_comp[cur->svr_comp_num].CA_flag - = type0_ext2->svr_comp_des[l].CA_flag; - break; - case MSC_PACKET_DATA: - /* MSC Packet data mode.*/ - cur->svr_comp[cur->svr_comp_num].Sid - = type0_ext2->Sid; - cur->svr_comp[cur->svr_comp_num].SCid - = type0_ext2->svr_comp_des[l].SCid; - cur->svr_comp[cur->svr_comp_num].P_S - = type0_ext2->svr_comp_des[l].P_S; - cur->svr_comp[cur->svr_comp_num].CA_flag - = type0_ext2->svr_comp_des[l].CA_flag; - break; - } - cur->svr_comp_num++; - } - cur->svr_num++; -} - - - - - -/* Basic service and service component definition */ -S32 Get_FIG0_EXT2(U8 fic_cmd, U8 P_D, U8 C_N) -{ -U8 temp1, temp2, temp3; -UINT cnt, update_flag = 0; - -struct FIG_TYPE0_Ext2 type0_ext2; - -while (fig_data.byte_cnt < fig_data.length) { - if (P_D) { - Get_Bytes(1, &type0_ext2.ECC); - Get_Bits(4, &type0_ext2.Country_id); - Get_Bits(4, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - type0_ext2.Service_ref = (temp1 << 16) - | (temp2 << 8) | temp3; - type0_ext2.Sid = (type0_ext2.ECC << 24) - | (type0_ext2.Country_id << 20) - | type0_ext2.Service_ref; - } else { - Get_Bits(4, &type0_ext2.Country_id); - Get_Bits(4, &temp1); - Get_Bytes(1, &temp2); - type0_ext2.Service_ref = (temp1 << 8) | temp2; - type0_ext2.Sid = (type0_ext2.Country_id << 12) - | type0_ext2.Service_ref; - } - - Get_Bits(1, &type0_ext2.Local_flag); - Get_Bits(3, &type0_ext2.CAID); - Get_Bits(4, &type0_ext2.Num_ser_comp); - - for (cnt = 0; cnt < type0_ext2.Num_ser_comp; cnt++) { - Get_Bits(2, &type0_ext2.svr_comp_des[cnt].TMID); - switch (type0_ext2.svr_comp_des[cnt].TMID) { - case MSC_STREAM_AUDIO: - Get_Bits(6, - &type0_ext2.svr_comp_des[cnt].ASCTy); - Get_Bits(6, - &type0_ext2.svr_comp_des[cnt].SubChid); - Get_Bits(1, - &type0_ext2.svr_comp_des[cnt].P_S); - Get_Bits(1, - &type0_ext2.svr_comp_des[cnt].CA_flag); - break; - case MSC_STREAM_DATA: - Get_Bits(6, - &type0_ext2.svr_comp_des[cnt].DSCTy); - Get_Bits(6, - &type0_ext2.svr_comp_des[cnt].SubChid); - Get_Bits(1, - &type0_ext2.svr_comp_des[cnt].P_S); - Get_Bits(1, - &type0_ext2.svr_comp_des[cnt].CA_flag); - break; - case FIDC: - Get_Bits(6, - &type0_ext2.svr_comp_des[cnt].DSCTy); - Get_Bits(6, - &type0_ext2.svr_comp_des[cnt].FIDCid); - Get_Bits(1, - &type0_ext2.svr_comp_des[cnt].P_S); - Get_Bits(1, - &type0_ext2.svr_comp_des[cnt].CA_flag); - break; - case MSC_PACKET_DATA: - Get_Bits(6, &temp1); - Get_Bits(6, &temp2); - type0_ext2.svr_comp_des[cnt].SCid = (temp1 << 6) - |temp2; - Get_Bits(1, &type0_ext2.svr_comp_des[cnt].P_S); - Get_Bits(1, - &type0_ext2.svr_comp_des[cnt].CA_flag); - break; - } - } - - if (fic_cmd) { - if (C_N) { - update_flag = 1; - for (cnt = 0 - ; cnt < NEXT_ENS_DESC.svr_num - ; cnt++) { - /*Old SId & New SId matching */ - if (NEXT_ENS_DESC.svr_desc[cnt].Sid - == type0_ext2.Sid) { - update_flag = 0; - break; - } - } - - if (update_flag) { - update_next_ens_desc_type0_ext2(&NEXT_ENS_DESC, - &type0_ext2, P_D); - } - } else { - update_flag = 1; - for (cnt = 0; cnt < ENS_DESC.svr_num; cnt++) { - /*Old SId & New SId matching */ - if (ENS_DESC.svr_desc[cnt].Sid - == type0_ext2.Sid) { - update_flag = 0; - break; - } - } - - if (update_flag) { - update_current_ens_desc_type0_ext2(&ENS_DESC, - &type0_ext2, P_D); - } - } - } -} - -return RTV_OK; -} - - -static INLINE void update_ens_desc_type0_ext3( - struct ENSEMBLE_DESC *next, - struct ENSEMBLE_DESC *cur, - struct FIG_TYPE0_Ext3 *type0_ext3, - U8 C_N) -{ - UINT k = 0; - - if (C_N) { - for (k = 0; k < next->svr_comp_num; k++) { - if ((next->svr_comp[k].TMID == MSC_PACKET_DATA) && - (next->svr_comp[k].SCid == type0_ext3->SCid)) { - next->svr_comp[k].SubChid - = type0_ext3->SubChid; - next->svr_comp[k].Packet_add - = type0_ext3->Packet_add; - next->svr_comp[k].DSCTy - = type0_ext3->DSCTy; - next->svr_comp[k].DG_flag - = type0_ext3->DG_flag; - - if (type0_ext3->CA_Org_flag) - next->svr_comp[k].CA_Org - = type0_ext3->CA_Org; - } - } - } else { - for (k = 0; k < cur->svr_comp_num; k++) { - if ((cur->svr_comp[k].TMID == MSC_PACKET_DATA) && - (cur->svr_comp[k].SCid == type0_ext3->SCid)) { - cur->svr_comp[k].SubChid - = type0_ext3->SubChid; - cur->svr_comp[k].Packet_add - = type0_ext3->Packet_add; - - cur->svr_comp[k].DSCTy - = type0_ext3->DSCTy; - cur->svr_comp[k].DG_flag - = type0_ext3->DG_flag; - - if (type0_ext3->CA_Org_flag) - cur->svr_comp[k].CA_Org - = type0_ext3->CA_Org; - } - } - } -} - -/* Service component in packet mode with or without Conditional Access */ -S32 Get_FIG0_EXT3(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2; - - struct FIG_TYPE0_Ext3 type0_ext3; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &temp1); - Get_Bits(4, &temp2); - type0_ext3.SCid = (temp1 << 4) | temp2; - - Get_Bits(3, &temp1); - Get_Bits(1, &type0_ext3.CA_Org_flag); - Get_Bits(1, &type0_ext3.DG_flag); - Get_Bits(1, &temp2); - Get_Bits(6, &type0_ext3.DSCTy); - Get_Bits(6, &type0_ext3.SubChid); - - Get_Bits(2, &temp1); - Get_Bytes(1, &temp2); - type0_ext3.Packet_add = (temp1 << 8) | temp2; - - if (type0_ext3.CA_Org_flag) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext3.CA_Org = (temp1 << 8) | temp2; - } - - if (fic_cmd) { - update_ens_desc_type0_ext3(&NEXT_ENS_DESC, - &ENS_DESC, &type0_ext3, - C_N); - } - } - - return RTV_OK; -} - - -static INLINE void update_ens_desc_type0_ext4( - struct ENSEMBLE_DESC *next, - struct ENSEMBLE_DESC *cur, - struct FIG_TYPE0_Ext4 *type0_ext4, - U8 C_N) -{ - UINT k = 0; - - if (C_N) { - for (k = 0; k < next->svr_comp_num; k++) { - if (type0_ext4->M_F) { - if ((next->svr_comp[k].FIDCid - == type0_ext4->FIDCid)) - next->svr_comp[k].CA_Org - = type0_ext4->CA_Org; - } else { - if ((next->svr_comp[k].SubChid - == type0_ext4->SubChid)) - next->svr_comp[k].CA_Org - = type0_ext4->CA_Org; - } - } - } else { - for (k = 0; k < cur->svr_comp_num; k++) { - if (type0_ext4->M_F) { - if ((cur->svr_comp[k].FIDCid - == type0_ext4->FIDCid)) - cur->svr_comp[k].CA_Org - = type0_ext4->CA_Org; - } else { - if ((cur->svr_comp[k].SubChid - == type0_ext4->SubChid)) - cur->svr_comp[k].CA_Org - = type0_ext4->CA_Org; - } - } - } - -} - - -/* Service component with Conditional Access in stream mode or FIC */ -S32 Get_FIG0_EXT4(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2; - - struct FIG_TYPE0_Ext4 type0_ext4; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(1, &temp1); - Get_Bits(1, &type0_ext4.M_F); - - if (type0_ext4.M_F) - Get_Bits(6, &type0_ext4.FIDCid); - else - Get_Bits(6, &type0_ext4.SubChid); - - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext4.CA_Org = (temp1 << 8) | temp2; - - if (fic_cmd) { - update_ens_desc_type0_ext4(&NEXT_ENS_DESC, - &ENS_DESC, - &type0_ext4, - C_N); - } - } - - return RTV_OK; -} - -static INLINE void update_current_ens_desc_type0_ext5( - struct ENSEMBLE_DESC *cur, - struct FIG_TYPE0_Ext5 *type0_ext5) -{ - UINT k; - - for (k = 0; k < cur->svr_comp_num; k++) { - if (type0_ext5->L_S_flag) { - if (cur->svr_comp[k].SCid == type0_ext5->SCid) - cur->svr_comp[k].language - = type0_ext5->Language; - } else { - if (type0_ext5->MSC_FIC_flag) { - if (cur->svr_comp[k].FIDCid - == type0_ext5->FIDCid) - cur->svr_comp[k].language - = type0_ext5->Language; - } else { - if (cur->svr_comp[k].SubChid - == type0_ext5->SubChid) - cur->svr_comp[k].language - = type0_ext5->Language; - } - } - } -} - -/* Service Component Language */ -S32 Get_FIG0_EXT5(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2, temp3; - - struct FIG_TYPE0_Ext5 type0_ext5; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(1, &type0_ext5.L_S_flag); - if (type0_ext5.L_S_flag) { - Get_Bits(3, &temp1); - Get_Bits(4, &temp2); - Get_Bytes(1, &temp3); - type0_ext5.SCid = (temp2 << 8) | temp3; - } else { - Get_Bits(1, &type0_ext5.MSC_FIC_flag); - if (type0_ext5.MSC_FIC_flag) - Get_Bits(6, &type0_ext5.FIDCid); - else - Get_Bits(6, &type0_ext5.SubChid); - - } - Get_Bytes(1, &type0_ext5.Language); - - if (fic_cmd) { - update_current_ens_desc_type0_ext5(&ENS_DESC, - &type0_ext5); - } - } - - return RTV_OK; -} - -/* Service Linking Information */ -S32 Get_FIG0_EXT6(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2, temp3, temp4; - U8 k; - - struct FIG_TYPE0_Ext6 type0_ext6; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(1, &type0_ext6.id_list_flag); - Get_Bits(1, &type0_ext6.LA); - Get_Bits(1, &type0_ext6.S_H); - Get_Bits(1, &type0_ext6.ILS); - Get_Bits(4, &temp1); - Get_Bytes(1, &temp2); - type0_ext6.LSN = (temp1 << 8) | temp2; - - if (type0_ext6.id_list_flag) { - if (P_D) { - Get_Bits(4, &temp1); - Get_Bits(4, &type0_ext6.Num_ids); - - for (k = 0; k < type0_ext6.Num_ids; k++) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - Get_Bytes(1, &temp4); - type0_ext6.Sid[k] = (temp1 << 24) - | (temp2 << 16) | (temp3 << 8) - | temp4; - } - } else { - Get_Bits(1, &temp1); - Get_Bits(2, &type0_ext6.idLQ); - Get_Bits(1, &type0_ext6.Shd); - Get_Bits(4, &type0_ext6.Num_ids); - - for (k = 0; k < type0_ext6.Num_ids; k++) { - if (type0_ext6.ILS) - Get_Bytes(1, - &type0_ext6.ECC[k]); - - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext6.id[k] = (temp1 << 8) | temp2; - } - } - } - - if (fic_cmd) { - /* Not yet implementation - * - * */ - } - } - - return RTV_OK; -} - -S32 Get_FIG0_EXT7(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} - - -static INLINE void update_ens_desc_type0_ext8( - struct ENSEMBLE_DESC *next, - struct ENSEMBLE_DESC *cur, - struct FIG_TYPE0_Ext8 *type0_ext8, - U8 C_N) -{ -UINT k; - -if (C_N) { - for (k = 0; k < next->svr_comp_num; k++) { - if (type0_ext8->L_S_flag) { - if (next->svr_comp[k].SCid - == type0_ext8->SCid) { - if (next->svr_comp[k].Sid - == type0_ext8->Sid) - next->svr_comp[k].SCidS - = type0_ext8->SCidS; - } - } else { - if (type0_ext8->MSC_FIC_flag) { - if (next->svr_comp[k].FIDCid - == type0_ext8->FIDCid) { - if (next->svr_comp[k].Sid - == type0_ext8->Sid) - next->svr_comp[k].SCidS - = type0_ext8->SCidS; - } - } else { - if (next->svr_comp[k].SubChid - == type0_ext8->SubChid) { - if (next->svr_comp[k].Sid - == type0_ext8->Sid) - next->svr_comp[k].SCidS - = type0_ext8->SCidS; - } - } - } - } -} else { - for (k = 0; k < cur->svr_comp_num; k++) { - if (type0_ext8->L_S_flag) { - if (cur->svr_comp[k].SCid - == type0_ext8->SCid) { - if (cur->svr_comp[k].Sid - == type0_ext8->Sid) - cur->svr_comp[k].SCidS - = type0_ext8->SCidS; - } - } else { - if (type0_ext8->MSC_FIC_flag) { - if (cur->svr_comp[k].FIDCid - == type0_ext8->FIDCid) { - if (cur->svr_comp[k].Sid - == type0_ext8->Sid) - cur->svr_comp[k].SCidS - = type0_ext8->SCidS; - } - } else { - if (cur->svr_comp[k].SubChid - == type0_ext8->SubChid) { - if (cur->svr_comp[k].Sid - == type0_ext8->Sid) - cur->svr_comp[k].SCidS - = type0_ext8->SCidS; - } - } - } - } -} - -} - - - -/* Service component global definition*/ -S32 Get_FIG0_EXT8(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2, temp3, temp4; - - struct FIG_TYPE0_Ext8 type0_ext8; - - while (fig_data.byte_cnt < fig_data.length) { - if (P_D) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - Get_Bytes(1, &temp4); - type0_ext8.Sid = (temp1 << 24) - | (temp2 << 16) - | (temp3 << 8) - | temp4; - } else { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext8.Sid = (temp1 << 8) | temp2; - } - - Get_Bits(1, &type0_ext8.Ext_flag); - Get_Bits(3, &temp1); - Get_Bits(4, &type0_ext8.SCidS); - Get_Bits(1, &type0_ext8.L_S_flag); - - if (type0_ext8.L_S_flag) { - Get_Bits(3, &temp1); - Get_Bits(4, &temp2); - Get_Bytes(1, &temp3); - type0_ext8.SCid = (temp2 << 8) | temp3; - } else { - Get_Bits(1, &type0_ext8.MSC_FIC_flag); - if (type0_ext8.MSC_FIC_flag) - Get_Bits(6, &type0_ext8.FIDCid); - else - Get_Bits(6, &type0_ext8.SubChid); - } - - if (type0_ext8.Ext_flag) - Get_Bytes(1, &temp1); - - if (fic_cmd) { - update_ens_desc_type0_ext8(&NEXT_ENS_DESC, - &ENS_DESC, - &type0_ext8, - C_N); - } - } - - return RTV_OK; -} - -/* Country, LTO and International Table */ -S32 Get_FIG0_EXT9(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2, temp3, temp4; - U8 k = 0; - - struct FIG_TYPE0_Ext9 type0_ext9; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(1, &type0_ext9.Ext_flag); - Get_Bits(1, &type0_ext9.LTO_unique); - Get_Bits(6, &type0_ext9.Ensemble_LTO); - - Get_Bytes(1, &type0_ext9.Ensemble_ECC); - Get_Bytes(1, &type0_ext9.Inter_Table_ID); - - if (type0_ext9.Ext_flag) { - Get_Bits(2, &type0_ext9.Num_Ser); - Get_Bits(6, &type0_ext9.LTO); - - if (P_D) { - for (k = 0; k < type0_ext9.Num_Ser; k++) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - Get_Bytes(1, &temp4); - type0_ext9.Sid[k] = (temp1 << 24) - | (temp2 << 16) - | (temp3 << 8) - | temp4; - } - } else { - if (type0_ext9.Num_Ser != 0) - Get_Bytes(1, &type0_ext9.ECC); - - for (k = 0; k < type0_ext9.Num_Ser; k++) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext9.Sid[k] - = (temp1 << 8) | temp2; - } - } - } - - if (fic_cmd) { - ENS_DESC.date_time_info.LTO = type0_ext9.Ensemble_LTO; - ENS_DESC.date_time_info.get_flag |= LTO_FLAG; - } - } - - return RTV_OK; -} - -/* Date and Time */ -S32 Get_FIG0_EXT10(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2, temp3; - - struct FIG_TYPE0_Ext10 type0_ext10; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(1, &temp1); - Get_Bits(7, &temp1); - Get_Bytes(1, &temp2); - Get_Bits(2, &temp3); - - type0_ext10.MJD = (temp1 << 10) | (temp2 << 2) | temp3; - - Get_Bits(1, &type0_ext10.LSI); - Get_Bits(1, &type0_ext10.Conf_ind); - Get_Bits(1, &type0_ext10.UTC_flag); - Get_Bits(3, &temp1); - Get_Bits(2, &temp2); - type0_ext10.Hours = (temp1 << 2) | temp2; - Get_Bits(6, &type0_ext10.Minutes); - - if (type0_ext10.UTC_flag) { - Get_Bits(6, &type0_ext10.Seconds); - Get_Bits(2, &temp1); - Get_Bytes(1, &temp2); - type0_ext10.Milliseconds = (temp1 << 8) | temp2; - } - - if (fic_cmd) { - ENS_DESC.date_time_info.MJD = type0_ext10.MJD; - ENS_DESC.date_time_info.LSI = type0_ext10.LSI; - ENS_DESC.date_time_info.conf_ind = type0_ext10.Conf_ind; - ENS_DESC.date_time_info.utc_flag = type0_ext10.UTC_flag; - ENS_DESC.date_time_info.hours = type0_ext10.Hours; - ENS_DESC.date_time_info.minutes = type0_ext10.Minutes; - if (type0_ext10.UTC_flag) { - ENS_DESC.date_time_info.seconds - = type0_ext10.Seconds; - ENS_DESC.date_time_info.milliseconds - = type0_ext10.Milliseconds; - } - - ENS_DESC.date_time_info.get_flag |= TIME_FLAG; - } - } - - return RTV_OK; -} - -/* Region Definition */ -S32 Get_FIG0_EXT11(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -S32 Get_FIG0_EXT12(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} - - -static INLINE void update_ens_desc_type0_ext13( - struct FIG_TYPE0_Ext13 *type0_ext13) -{ -UINT i, k, j, p, cnt; - -for (i = 0; i < ENS_DESC.svr_num; i++) { - if (type0_ext13->Sid == ENS_DESC.svr_desc[i].Sid) { - for (cnt = 0; cnt < ENS_DESC.svr_desc[i].Num_ser_comp; cnt++) { - j = ENS_DESC.svr_desc[i].ser_comp_num[cnt]; - ENS_DESC.svr_comp[j].Num_User_App - = type0_ext13->Num_User_App; - for (k = 0; k < type0_ext13->Num_User_App; k++) { - ENS_DESC.svr_comp[j].User_APP_Type[k] - = type0_ext13->User_APP_Type[k]; - ENS_DESC.svr_comp[j].User_APP_data_length[k] - = type0_ext13->User_APP_data_length[k]; - for (p = 0; - p < type0_ext13->User_APP_data_length[k]; p++) - ENS_DESC.svr_comp[j].User_APP_data[p] - = type0_ext13->User_APP_data[p]; - } - } - } -} - -} - -/* User Application Information */ -S32 Get_FIG0_EXT13(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2, temp3, temp4; - UINT k, p; - - struct FIG_TYPE0_Ext13 type0_ext13; - - while (fig_data.byte_cnt < fig_data.length) { - if (P_D) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - Get_Bytes(1, &temp4); - type0_ext13.Sid = (temp1 << 24) | (temp2 << 16) - | (temp3 << 8) | temp4; - } else { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext13.Sid = (temp1 << 8) | temp2; - } - - Get_Bits(4, &type0_ext13.SCidS); - Get_Bits(4, &type0_ext13.Num_User_App); - - for (k = 0; k < type0_ext13.Num_User_App; k++) { - Get_Bytes(1, &temp1); - Get_Bits(3, &temp2); - type0_ext13.User_APP_Type[k] = (temp1 << 3) | temp2; - - Get_Bits(5, &type0_ext13.User_APP_data_length[k]); -/* - if (type0_ext13.User_APP_data_length[k]> 2) { - Get_Bits(1, &type0_ext13.CA_flag); - Get_Bits(1, &type0_ext13.CA_Org_flag); - Get_Bits(1, &temp1); - Get_Bits(5, &type0_ext13.X_PAD_App_Ty); - Get_Bits(1, &type0_ext13.DG_flag); - Get_Bits(1, &temp2); - Get_Bits(6, &type0_ext13.DSCTy); - - if (type0_ext13.CA_Org_flag) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext13.CA_Org - = (temp1 << 8) | temp2; - } - } -*/ - for (p = 0; p < type0_ext13.User_APP_data_length[k] - ; p++) - Get_Bytes(1, &type0_ext13.User_APP_data[p]); - - } - - if (fic_cmd) - update_ens_desc_type0_ext13(&type0_ext13); - } - - return RTV_OK; -} - -/* FEC sub-channel organization */ -S32 Get_FIG0_EXT14(U8 fic_cmd, U8 P_D, U8 C_N) -{ -UINT cnt; - -struct FIG_TYPE0_Ext14 type0_ext14; - -while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(6, &type0_ext14.SubChid); - Get_Bits(2, &type0_ext14.FEC_scheme); - - if (fic_cmd) { - if (C_N) { - for (cnt = 0; - cnt < NEXT_ENS_DESC.svr_comp_num; cnt++) { - if (type0_ext14.SubChid - == NEXT_ENS_DESC.svr_comp[cnt].SubChid) - NEXT_ENS_DESC.svr_comp[cnt].FEC_scheme - = type0_ext14.FEC_scheme; - } - } else { - for (cnt = 0; cnt < ENS_DESC.svr_comp_num; cnt++) { - if (type0_ext14.SubChid - == ENS_DESC.svr_comp[cnt].SubChid) - ENS_DESC.svr_comp[cnt].FEC_scheme - = type0_ext14.FEC_scheme; - } - } - } -} - -return RTV_OK; -} - -S32 Get_FIG0_EXT15(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} - -/* Program Number */ -S32 Get_FIG0_EXT16(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2; - /*U8 cnt;*/ - - struct FIG_TYPE0_Ext16 type0_ext16; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext16.Sid = (temp1 << 8) | temp2; - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext16.PNum = (temp1 << 8) | temp2; - Get_Bits(2, &temp1); - Get_Bits(4, &temp2); - Get_Bits(1, &type0_ext16.Continuation_flag); - Get_Bits(1, &type0_ext16.Update_flag); - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext16.New_Sid = (temp1 << 8) | temp2; - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext16.New_PNum = (temp1 << 8) | temp2; -#if 0 - if (fic_cmd) { - for (cnt = 0; cnt < ENS_DESC.svr_num; cnt++) { - if (type0_ext16.Sid - == ENS_DESC.svr_desc[cnt].Sid) - /* Not yet implementation */ - - } - } -#endif - } - - return RTV_OK; -} - -/* Program Type */ -S32 Get_FIG0_EXT17(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2; - U8 cnt; - - struct FIG_TYPE0_Ext17 type0_ext17; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext17.Sid = (temp1 << 8) | temp2; - - Get_Bits(1, &type0_ext17.S_D); - Get_Bits(1, &type0_ext17.P_S); - Get_Bits(1, &type0_ext17.L_flag); - Get_Bits(1, &type0_ext17.CC_flag); - Get_Bits(4, &temp1); - - if (type0_ext17.L_flag) - Get_Bytes(1, &type0_ext17.Language); - - Get_Bits(3, &temp2); - Get_Bits(5, &type0_ext17.Int_code); - - if (type0_ext17.CC_flag) { - Get_Bits(3, &temp1); - Get_Bits(5, &type0_ext17.Comp_code); - } - - if (fic_cmd) { - if (ENS_DESC.svr_num != 0) { - for (cnt = 0; cnt < ENS_DESC.svr_num; cnt++) { - if (type0_ext17.Sid - == ENS_DESC.svr_desc[cnt].Sid) - ENS_DESC.svr_desc[cnt].int_code - = type0_ext17.Int_code; - - } - } - } - } - - return RTV_OK; -} - -/* Announcement support */ -S32 Get_FIG0_EXT18(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2; - U8 i; - /*U8 cnt; */ - - struct FIG_TYPE0_Ext18 type0_ext18; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext18.Sid = (temp1 << 8) | temp2; - - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext18.ASU_flags = (temp1 << 8) | temp2; - - Get_Bits(3, &temp1); - Get_Bits(5, &type0_ext18.Num_clusters); - - - for (i = 0; i < type0_ext18.Num_clusters; i++) - Get_Bytes(1, &type0_ext18.Cluster_ID[i]); - -#if 0 - if (fic_cmd) { - for (cnt = 0; cnt < ENS_DESC.svr_num; cnt++) { - if (type0_ext18.Sid - == ENS_DESC.svr_desc[cnt].Sid) - /* Not yet implementation */ - } - } -#endif - } - - return RTV_OK; -} - -/* Announcement switching */ -S32 Get_FIG0_EXT19(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2; - - struct FIG_TYPE0_Ext19 type0_ext19; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &type0_ext19.Cluster_ID); - - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext19.ASW_flags = (temp1 << 8) | temp2; - - Get_Bits(1, &type0_ext19.New_flag); - Get_Bits(1, &type0_ext19.Region_flag); - Get_Bits(6, &type0_ext19.SubChid); - - if (type0_ext19.Region_flag) { - Get_Bits(2, &temp1); - Get_Bits(6, &type0_ext19.Regionid_Lower_Part); - } -#if 0 - if (fic_cmd) - /* Not yet implementation */ -#endif - } - - return RTV_OK; -} - -S32 Get_FIG0_EXT20(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -/* Frequency Information */ -S32 Get_FIG0_EXT21(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -/* Transmitter Identification Information (TII) database */ -S32 Get_FIG0_EXT22(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2; - U8 i; - - struct FIG_TYPE0_Ext22 type0_ext22; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(1, &type0_ext22.M_S); - if (type0_ext22.M_S) { - Get_Bits(7, &type0_ext22.Mainid); - Get_Bits(5, &temp1); - Get_Bits(3, &type0_ext22.Num_Subid_fields); - - for (i = 0; i < type0_ext22.Num_Subid_fields; i++) { - Get_Bits(5, &type0_ext22.Subid[i]); - Get_Bits(3, &temp1); - Get_Bytes(1, &temp2); - type0_ext22.TD[i] = (temp1 << 8) | temp2; - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext22.Latitude_offset[i] - = (temp1 << 8) | temp2; - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext22.Longitude_offset[i] - = (temp1 << 8) | temp2; - } - } else { - Get_Bits(7, &type0_ext22.Mainid); - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext22.Latitude_coarse = (temp1 << 8) | temp2; - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext22.Longitude_coarse = (temp1 << 8) | temp2; - Get_Bits(4, &type0_ext22.Latitude_fine); - Get_Bits(4, &type0_ext22.Longitude_fine); - } -#if 0 - if (fic_cmd) - /* Not yet implementation */ -#endif - } - - return RTV_OK; -} -S32 Get_FIG0_EXT23(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} - -/* Other Ensemble Service */ -S32 Get_FIG0_EXT24(U8 fic_cmd, U8 P_D, U8 C_N) -{ - U8 temp1, temp2, temp3, temp4; - U8 i; - /* U8 cnt;*/ - - struct FIG_TYPE0_Ext24 type0_ext24; - - while (fig_data.byte_cnt < fig_data.length) { - if (P_D) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - Get_Bytes(1, &temp4); - type0_ext24.Sid - = (temp1 << 24) - | (temp2 << 16) | (temp3 << 8) | temp4; - } else { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext24.Sid = (temp1 << 8) | temp2; - } - - Get_Bits(1, &temp1); - Get_Bits(3, &type0_ext24.CAid); - Get_Bits(4, &type0_ext24.Number_Eids); - - for (i = 0; i < type0_ext24.Number_Eids; i++) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - type0_ext24.Eid[i] = (temp1 << 8) | temp2; - } -#if 0 - if (fic_cmd) { - for (cnt = 0; cnt < ENS_DESC.svr_num; cnt++) { - if (type0_ext24.Sid - == ENS_DESC.svr_desc[cnt].Sid) - /* Not yet implementation*/ - - } - } -#endif - } - - return RTV_OK; -} - -/* Other Ensemble Announcement support */ -S32 Get_FIG0_EXT25(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -/* Other Ensemble Announcement switching */ -S32 Get_FIG0_EXT26(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -/* FM Announcement support */ -S32 Get_FIG0_EXT27(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -/* FM Announcement switching */ -S32 Get_FIG0_EXT28(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -S32 Get_FIG0_EXT29(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -S32 Get_FIG0_EXT30(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} -/* FIC re-direction */ -S32 Get_FIG0_EXT31(U8 fic_cmd, U8 P_D, U8 C_N) -{ - return RTV_OK; -} - - -/* FIG TYPE 1 Extension Function */ -/* Ensemble Label */ -S32 Get_FIG1_EXT0(U8 fic_cmd, U8 Char_Set) -{ - U16 Eid; - U8 label[17]; - S8 i = 0; - U8 temp1, temp2; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Eid = (temp1 << 8) | temp2; - - if (fic_cmd) { - Get_Bytes(16, label); - - if (!ENS_DESC.label_flag) { - for (i = 15; i >= 0; i--) { - if (label[i] != 0x20) { - label[i+1] = '\0'; - break; - } - } - label[16] = '\0'; - - ENS_DESC.charset = Char_Set; - memcpy(ENS_DESC.Label, label, 17); - ENS_DESC.label_flag = 1; - } - } - } - - return RTV_OK; -} - -/* Program Service Label */ -S32 Get_FIG1_EXT1(U8 fic_cmd, U8 Char_Set) -{ -U32 sid; -U8 label[17]; -U8 cnt; -S8 i; -U8 temp1, temp2; - -while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - sid = (temp1 << 8) | temp2; - - if (fic_cmd) { - Get_Bytes(16, label); - - for (cnt = 0; cnt < ENS_DESC.svr_num; cnt++) { - if (sid == ENS_DESC.svr_desc[cnt].Sid) { - if (!ENS_DESC.svr_desc[cnt].label_flag) { - for (i = 15; i >= 0; i--) { - if (label[i] != 0x20) { - label[i+1] = '\0'; - break; - } - } - label[16] = '\0'; - - ENS_DESC.svr_desc[cnt].charset - = Char_Set; - memcpy(ENS_DESC.svr_desc[cnt].Label, - label, 17); - ENS_DESC.svr_desc[cnt].label_flag = 1; - ENS_DESC.label_num++; - } - } - } - } -} - -return RTV_OK; -} - -S32 Get_FIG1_EXT2(U8 fic_cmd, U8 Char_Set) -{ - return RTV_OK; -} - -/* Region Label */ -S32 Get_FIG1_EXT3(U8 fic_cmd, U8 Char_Set) -{ - U8 temp1; - U8 RegionId_Lower_part; - U8 label[17]; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(2, &temp1); - Get_Bits(6, &RegionId_Lower_part); - - if (fic_cmd) - Get_Bytes(16, label); - } - - return RTV_OK; -} - -/* Service Component Label */ -S32 Get_FIG1_EXT4(U8 fic_cmd, U8 Char_Set) -{ - U8 P_D; - U8 SCidS; - U32 sid; - U8 label[17]; - S8 i = 0, k = 0; - U8 temp1, temp2, temp3, temp4; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(1, &P_D); - Get_Bits(3, &temp1); - Get_Bits(4, &SCidS); - - if (P_D) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - Get_Bytes(1, &temp4); - sid = (temp1 << 24) - | (temp2 << 16) | (temp3 << 8) | temp4; - } else { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - sid = (temp1 << 8) | temp2; - } - - if (fic_cmd) { - Get_Bytes(16, label); - - for (k = 0; k < ENS_DESC.svr_comp_num; k++) { - if ((ENS_DESC.svr_comp[k].Sid == sid) - && (ENS_DESC.svr_comp[k].SCidS - == SCidS)) { - for (i = 15; i >= 0; i--) { - if (label[i] != 0x20) { - label[i+1] = '\0'; - break; - } - } - label[16] = '\0'; - - ENS_DESC.svr_comp[k].charset - = Char_Set; - memcpy(ENS_DESC.svr_comp[k].Label, - label, 17); - break; - } - } - } - } - - return RTV_OK; -} - -/* Data Service Label */ -S32 Get_FIG1_EXT5(U8 fic_cmd, U8 Char_Set) -{ -U32 sid; -U8 label[17]; -U8 cnt; -S8 i; -U8 temp1, temp2, temp3, temp4; - -while (fig_data.byte_cnt < fig_data.length) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - Get_Bytes(1, &temp4); - sid = (temp1 << 24) | (temp2 << 16) | (temp3 << 8) | temp4; - - if (fic_cmd) { - Get_Bytes(16, label); - - for (cnt = 0; cnt < ENS_DESC.svr_num; cnt++) { - if (sid == ENS_DESC.svr_desc[cnt].Sid) { - if (!ENS_DESC.svr_desc[cnt].label_flag) { - for (i = 15; i >= 0; i--) { - if (label[i] != 0x20) { - label[i+1] = '\0'; - break; - } - } - label[16] = '\0'; - - ENS_DESC.svr_desc[cnt].charset - = Char_Set; - memcpy(ENS_DESC.svr_desc[cnt].Label, - label, 17); - ENS_DESC.svr_desc[cnt].label_flag = 1; - ENS_DESC.label_num++; - } - } - } - } -} - -return RTV_OK; -} - -/* X-PAD user application label */ -S32 Get_FIG1_EXT6(U8 fic_cmd, U8 Char_Set) -{ - U8 P_D; - U8 SCidS; - U32 sid; - U8 X_PAD_app_type; - U8 label[17]; - U8 temp1, temp2, temp3, temp4; - - while (fig_data.byte_cnt < fig_data.length) { - Get_Bits(1, &P_D); - Get_Bits(3, &temp1); - Get_Bits(4, &SCidS); - - if (P_D) { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - Get_Bytes(1, &temp3); - Get_Bytes(1, &temp4); - sid = (temp1 << 24) - | (temp2 << 16) | (temp3 << 8) | temp4; - } else { - Get_Bytes(1, &temp1); - Get_Bytes(1, &temp2); - sid = (temp1 << 8) | temp2; - } - - Get_Bits(2, &temp1); - Get_Bits(1, &temp2); - Get_Bits(5, &X_PAD_app_type); - - if (fic_cmd) - Get_Bytes(16, label); - } - - return RTV_OK; -} - -S32 Get_FIG1_EXT7(U8 fic_cmd, U8 Char_Set) -{ - return RTV_OK; -} - - -/* FIG TYPE 2 Extension Function */ -/* Ensemble Label */ -S32 Get_FIG2_EXT0(U8 fic_cmd, U8 Seg_Index) -{ - return RTV_OK; -} - -/* Program Service Label */ -S32 Get_FIG2_EXT1(U8 fic_cmd, U8 Seg_Index) -{ - return RTV_OK; -} - -S32 Get_FIG2_EXT2(U8 fic_cmd, U8 Seg_Index) -{ - return RTV_OK; -} - -/* Region Label */ -S32 Get_FIG2_EXT3(U8 fic_cmd, U8 Seg_Index) -{ - return RTV_OK; -} - -/* Service Component Label */ -S32 Get_FIG2_EXT4(U8 fic_cmd, U8 Seg_Index) -{ - return RTV_OK; -} - -/* Data Service Label */ -S32 Get_FIG2_EXT5(U8 fic_cmd, U8 Seg_Index) -{ - return RTV_OK; -} - -/* X-PAD user application label */ -S32 Get_FIG2_EXT6(U8 fic_cmd, U8 Seg_Index) -{ - return RTV_OK; -} - -/* Character Definition */ -S32 Get_FIG2_EXT7(U8 fic_cmd, U8 Seg_Index) -{ - return RTV_OK; -} - - -/* FIG TYPE 5 Extension Function */ -/* Paging */ -S32 Get_FIG5_EXT0(U8 D1, U8 D2, U8 fic_cmd, U8 TCid) -{ - U8 cnt = 0; - U8 FIDC_ID; - - FIDC_ID = (TCid << 3) | 0x00; - - if (fic_cmd) { - for (cnt = 0; cnt < ENS_DESC.svr_comp_num; cnt++) { - if (FIDC_ID == ENS_DESC.svr_comp[cnt].FIDCid) { - ENS_DESC.svr_comp[cnt].TCid = TCid; - ENS_DESC.svr_comp[cnt].Ext = 0; - } - } - } - - return RTV_OK; -} - -/* Traffic Message Channel (TMC) */ -S32 Get_FIG5_EXT1(U8 D1, U8 D2, U8 fic_cmd, U8 TCid) -{ - U8 cnt = 0; - U8 FIDC_ID; - - FIDC_ID = (TCid << 3) | 0x01; - - if (fic_cmd) { - for (cnt = 0; cnt < ENS_DESC.svr_comp_num; cnt++) { - if (FIDC_ID == ENS_DESC.svr_comp[cnt].FIDCid) { - ENS_DESC.svr_comp[cnt].TCid = TCid; - ENS_DESC.svr_comp[cnt].Ext = 1; - } - } - } - - return RTV_OK; -} - -/* Emergency Warning System (EWS) */ -S32 Get_FIG5_EXT2(U8 D1, U8 D2, U8 fic_cmd, U8 TCid) -{ - U8 cnt = 0; - U8 FIDC_ID; - - FIDC_ID = (TCid << 3) | 0x02; - - if (fic_cmd) { - for (cnt = 0; cnt < ENS_DESC.svr_comp_num; cnt++) { - if (FIDC_ID == ENS_DESC.svr_comp[cnt].FIDCid) { - ENS_DESC.svr_comp[cnt].TCid = TCid; - ENS_DESC.svr_comp[cnt].Ext = 2; - } - } - } - - return RTV_OK; -} - - -U8 GET_SUBCH_INFO(struct FIG_TYPE0_Ext1 *type0_ext1, - S32 *BIT_RATE, S32 *SUB_CH_Size, S32 *P_L) -{ -/*Indicate the option used for the long form coding(Equal Error Protection)*/ - if (type0_ext1->S_L_form) { - *SUB_CH_Size = type0_ext1->Sub_ch_size; - *P_L = ((type0_ext1->S_L_form<<7) - | (type0_ext1->Option<<6) - | type0_ext1->Protection_Level); - - if (type0_ext1->Option == 0x1) { - switch (type0_ext1->Protection_Level) { - case 0: - *BIT_RATE = (type0_ext1->Sub_ch_size)*32/27; - break; - case 1: - *BIT_RATE = (type0_ext1->Sub_ch_size)*32/21; - break; - case 2: - *BIT_RATE = (type0_ext1->Sub_ch_size)*32/18; - break; - case 3: - *BIT_RATE = (type0_ext1->Sub_ch_size)*32/15; - break; - } - } else if (type0_ext1->Option == 0x0) { - switch (type0_ext1->Protection_Level) { - case 0: - *BIT_RATE = (type0_ext1->Sub_ch_size)*2/3; - break; - case 1: - *BIT_RATE = (type0_ext1->Sub_ch_size); - break; - case 2: - *BIT_RATE = (type0_ext1->Sub_ch_size)*4/3; - break; - case 3: - *BIT_RATE = (type0_ext1->Sub_ch_size)*2; - break; - } - } - } else { - *SUB_CH_Size = SUBCH_UEP_TABLE[type0_ext1->Table_index][0]; - *P_L = SUBCH_UEP_TABLE[type0_ext1->Table_index][1]; - *BIT_RATE = SUBCH_UEP_TABLE[type0_ext1->Table_index][2]; - } - - return RTV_OK; -} - -U8 GET_DATE_TIME(struct DATE_TIME_INFO *time_desc) -{ - U16 MJD_Ref[2] = {2000, 51544}; /*2000.01.01 reference day*/ - U8 month0_table[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - U8 month1_table[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - U16 UTC_hours, MJD_temp, day_temp; - U8 increase_year, leap_year_num; - U8 normal_year_num, offset_flag, offset_value; - U16 MJDRef_year; - U16 MJDRef_month; - U16 MJDRef_day = 0; - U8 week; - U8 k = 0, i = 0; - -/* sense of the Local Time Offset (0: positive offset 1: negative offset)*/ - offset_flag = (ENS_DESC.date_time_info.LTO & 0x20) >> 5; - - /* Local time offset value (0 ~ 23)*/ - offset_value = (ENS_DESC.date_time_info.LTO & 0x1f) / 2; - - /* UTC hours */ - UTC_hours = ENS_DESC.date_time_info.hours; - - if (offset_flag) { - if (UTC_hours < offset_value) - time_desc->time_flag = 0; - else - time_desc->time_flag = 1; - } else { - if (((23-offset_value) < UTC_hours) && (UTC_hours < 24)) - time_desc->time_flag = 0; - else - time_desc->time_flag = 1; - } - - /* current MJD - ref MJD */ - MJD_temp = ENS_DESC.date_time_info.MJD - MJD_Ref[1]; - increase_year = MJD_temp / 365; /* 2000 + x year */ - - /* detection 2000 + x year */ - time_desc->years = MJD_Ref[0] + increase_year; - leap_year_num = (increase_year - 1) / 4; /* 366 year number */ - normal_year_num = (increase_year - 1) % 4;/* 365 year number */ - - /* first MJD for current year */ - MJDRef_year - = MJD_Ref[1] + 366 * (leap_year_num + 1) - + 365 * ((3 * leap_year_num) + normal_year_num); - - - if (time_desc->time_flag) - MJDRef_month = ENS_DESC.date_time_info.MJD - MJDRef_year; - else { - if (offset_flag) - MJDRef_month - = ENS_DESC.date_time_info.MJD - - MJDRef_year - 1; - else - MJDRef_month = ENS_DESC.date_time_info.MJD - - MJDRef_year + 1; - } - - for (k = 0; k < 12; k++) { - day_temp = MJDRef_month - MJDRef_day; - - if (normal_year_num == 3) { - if (day_temp >= month1_table[k]) - MJDRef_day += month1_table[k]; - else { - /* detection month */ - time_desc->months_dec = k + 1; - strcpy((char *)time_desc->months_ste, - MONTH_TABLE[k]); - - /* detection day */ - time_desc->days = day_temp + 1; - break; - } - } else { - if (day_temp >= month0_table[k]) - MJDRef_day += month0_table[k]; - else { - /* detection month */ - time_desc->months_dec = k + 1; - strcpy((char *)time_desc->months_ste, - MONTH_TABLE[k]); - /* detection day */ - time_desc->days = day_temp + 1; - break; - } - } - } - - week = MJD_temp % 7; - for (i = 0; i < 7; i++) { - if (i == week) { - if (time_desc->time_flag) { - strcpy((char *)time_desc->weeks, - WEEK_TABLE[i]); - } else { - if (offset_flag) - strcpy((char *)time_desc->weeks, - WEEK_TABLE[i-1]); - else - strcpy((char *)time_desc->weeks, - WEEK_TABLE[i+1]); - } - break; - } - } - - if (ENS_DESC.date_time_info.utc_flag) { - if (time_desc->time_flag) { - time_desc->hours - = ENS_DESC.date_time_info.hours + offset_value; - if (time_desc->hours < 12) - time_desc->apm_flag = 0; - else if (time_desc->hours == 12) - time_desc->apm_flag = 1; - else { - time_desc->hours = time_desc->hours - 12; - time_desc->apm_flag = 1; - } - } else { - if (offset_flag) { - time_desc->hours - = (ENS_DESC.date_time_info.hours + 12) - - offset_value; - time_desc->apm_flag = 1; - } else { - time_desc->hours - = (ENS_DESC.date_time_info.hours - + offset_value) - 24; - time_desc->apm_flag = 0; - } - } - - time_desc->minutes = ENS_DESC.date_time_info.minutes; - time_desc->seconds = ENS_DESC.date_time_info.seconds; - time_desc->milliseconds = ENS_DESC.date_time_info.milliseconds; - } else { - if (time_desc->time_flag) { - time_desc->hours - = ENS_DESC.date_time_info.hours + offset_value; - if (time_desc->hours < 12) - time_desc->apm_flag = 0; - else if (time_desc->hours == 12) - time_desc->apm_flag = 1; - else { - time_desc->hours = time_desc->hours - 12; - time_desc->apm_flag = 1; - } - } else { - if (offset_flag) { - time_desc->hours - = (ENS_DESC.date_time_info.hours + 12) - - offset_value; - time_desc->apm_flag = 1; - } else { - time_desc->hours - = (ENS_DESC.date_time_info.hours - + offset_value) - 24; - time_desc->apm_flag = 0; - } - } - - time_desc->minutes = ENS_DESC.date_time_info.minutes; - } - - return RTV_OK; -} - - -char *PROGRAM_TYPE_CODE16[32] = { - "None", "News", "Current_Affairs", "Information", "Sport", - "Education", "Drama", "Arts", "Science", "Talk", - "Pop_Music", "Rock_Music", "Easy_Listening", - "Light_Classical", "Classical_Music", - "Other_Music", "Weather", "Finance", "Children's", "Factual", - "Religion", "Phone_In", "Travel", "Leisure", "Jazz_and_Blues", - "Country_Music", "National_Music", - "Oldies_Music", "Folk_Music", "Documentary" -}; - -char *PROGRAM_TYPE_CODE8[32] = { - "None", "News", "Affairs", "Info", "Sport", - "Educate", "Drama", "Arts", "Science", "Talk", - "Pop", "Rock", "Easy", "Classics", "Classics", - "Other_M", "Weather", "Finance", "Children", "Factual", - "Religion", "Phone_In", "Travel", "Leisure", "Jazz", - "Country", "Nation_M", "Oldies", "Folk", "Document" -}; - -char *USER_APP_TYPE_CODE[11] = { - "Reserved", "Not used", "MOT Slideshow", "MOT BWS", "TPEG", - "DGPS", "TMC", "EPG", "DAB Java", "DMB", "Reserved" -}; - -char *FIDC_EXT_CODE[3] = { - "Paging", "Traffic Message(TMC)", "Emergency Warning(EWS)" -}; - -char *ASCTy[3] = { - "Foreground Sound", "Background Sound", "Multi-CH Audio" -}; - -char *DSCTy[11] = { - "Unspecified Data", "Traffic Message(TMC)", "Emergency Warning(EWS)", - "ITTS", "Paging", "TDC", - "KDMB", "Embedded IP", "MOT", "Proprietary Service", "Reserved" -}; - -char *ANNOUNCEMENT_TYPE_CODE[12] = { - "Alarm", "Road Traffic flash", "Transport flash", "Warning/Service", - "News flash", "Area weather flash", - "Event announcement", "Special event", "Programme information", - "Sport report", "Financial report", - "Reserved for future definition" -}; - -int SUBCH_SIZE_TABLE[64] = { 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, - 56, 56, 56, 56, 64, 64, 64, 64, 64, 80, - 80, 80, 80, 80, 96, 96, 96, 96, 96, 112, - 112, 112, 112, 128, 128, 128, 128, 128, 160, 160, - 160, 160, 160, 192, 192, 192, 192, 192, 224, 224, - 224, 224, 224, 256, 256, 256, 256, 256, 320, 320, - 320, 384, 384, 384}; - -int SUBCH_UEP_TABLE[64][3] = { - /* 0 {Sub-channel size, Protection level, Bit rate} */ - {16, 5, 32}, {21, 4, 32}, {24, 3, 32}, {29, 2, 32}, - {35, 1, 32}, {24, 5, 48}, {29, 4, 48}, {35, 3, 48}, /*4 */ - {42, 4, 48}, {52, 1, 48}, {29, 5, 56}, {35, 4, 56}, /* 8 */ - {42, 3, 56}, {52, 2, 56}, {32, 5, 64}, {42, 4, 64}, /* 12 */ - {48, 3, 64}, {58, 2, 64}, {70, 1, 64}, {40, 5, 80}, /* 16 */ - {52, 4, 80}, {58, 3, 80}, {70, 2, 80}, {84, 1, 80}, /* 20 */ - {48, 5, 96}, {58, 4, 96}, {70, 3, 96}, {84, 2, 96}, /* 24 */ - {104, 1, 96}, {58, 5, 112}, {70, 4, 112}, {84, 3, 112}, /* 28 */ - {104, 2, 112}, {64, 5, 128}, {84, 4, 128}, {96, 3, 128}, /* 32 */ - {116, 2, 128}, {140, 1, 128}, {80, 5, 160}, {104, 4, 160},/* 36 */ - {116, 3, 160}, {140, 2, 160}, {168, 1, 160}, {96, 5, 192}, /* 40 */ - {116, 4, 192}, {140, 3, 192}, {168, 2, 192}, {208, 1, 192}, /* 44 */ - {116, 5, 224}, {140, 4, 224}, {168, 3, 224}, {208, 2, 224}, /* 48 */ - {232, 1, 224}, {128, 5, 256}, {168, 4, 256}, {192, 3, 256}, /* 52 */ - {232, 2, 256}, {280, 1, 256}, {160, 5, 320}, {208, 4, 320}, /* 56 */ - {280, 2, 320}, {192, 5, 384}, {280, 3, 384}, {416, 1, 384}, /* 60 */ -}; - -char *MONTH_TABLE[12] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -char *WEEK_TABLE[8] = { - "SAT", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" -}; -/* -int MJD_TABLE[][] ={ - {53370, 1, 2005}, {53735, 1, 2006}, - {54100, 1, 2007}, {54465, 1, 2008}, - {53401, 2, 2005}, {53766, 2, 2006}, - {54131, 2, 2007}, {54496, 2, 2008}, - {53429, 3, 2005}, {53794, 3, 2006}, - {54159, 3, 2007}, {54525, 3, 2008}, - {53460, 4, 2005}, {53825, 4, 2006}, - {54190, 4, 2007}, {54556, 4, 2008}, - {53490, 5, 2005}, {53855, 5, 2006}, - {54220, 5, 2007}, {54586, 5, 2008}, - {53521, 6, 2005}, {53866, 6, 2006}, - {54251, 6, 2007}, {54617, 6, 2008}, - {53551, 7, 2005}, {53916, 7, 2006}, - {54281, 7, 2007}, {54647, 7, 2008}, - {53582, 8, 2005}, {53947, 8, 2006}, - {54312, 8, 2007}, {54678, 8, 2008}, - {53613, 9, 2005}, {53978, 9, 2006}, - {54343, 9, 2007}, {54709, 9, 2008}, - {53643, 10, 2005}, {54008, 10, 2006}, - {54373, 10, 2007}, {54739, 10, 2008}, - {53674, 11, 2005}, {54039, 11, 2006}, - {54404, 11, 2007}, {54770, 11, 2008}, - {53704, 12, 2005}, {54069, 12, 2006}, - {54434, 12, 2007}, {54800, 12, 2008}, -}; -*/ - -char *EWS_PRIORITY_TABLE[4] = { - "Unknown", "º¸Åë", "±ä±Þ", "¸Å¿ì±ä±Þ" -}; - -char *EWS_REGION_FORM_TABLE[4] = { - "´ëÇѹα¹ Àü±¹", - "´ëÇѹα¹ Á¤ºÎ ÁöÁ¤", - "ÇàÀںΠÇàÁ¤µ¿ Ç¥±â", - "Rfa" -}; - -char *EWS_OFFICIAL_ORGANIZATION_TABLE[4] = { - "¼Ò¹æ¹æÀçû", "½Ã,µµ", "±º,µµ", "Rfa" -}; - -char *EWS_CATEGORY[67][3] = { - {"È£¿ì ÁÖÀǺ¸", "HRA", "Heavy Rain Watch"}, - {"È£¿ì °æº¸", "HRW", "Heavy Rain Warning"}, - {"´ë¼³ ÁÖÀǺ¸", "HSW", "Heavy Snow Watch"}, - {"´ë¼³ °æº¸", "HAS", "Heavy Snow Warning"}, - {"ÆødzÇØÀÏÁÖÀǺ¸", "SSA", "Storm Surge Watch"}, - {"ÆødzÇØÀÏ °æº¸", "SSW", "Storm Surge Warning"}, - {"Ȳ»ç °æº¸", "YSW", "Yellow Sand Warning"}, - {"ÇÑÆÄ ÁÖÀǺ¸", "CWA", "Cold Wave Watch"}, - {"ÇÑÆÄ °æº¸", "CWW", "Cold Wave Warning"}, - {"dz¶û °æº¸", "WWW", "Wind and Waves Warning"}, - {"°ÇÁ¶ °æº¸", "HAW", "Heavy Arid Warning"}, - {"»êºÒ °æº¸", "MFW", "Mountain Fire Warning"}, - {"±³Åë ÅëÁ¦", "RTW", "Regulate Traffic Warning"}, - {"±¹°¡ ºñ»ó »óȲ ¹ß»ý", - "EAN", "Emergency Action Notification(National only)"}, - {"±¹°¡ ºñ»ó »óȲ Á¾·á", - "EAT", "Emergency Action Termination(National only)"}, - {"Áß¾Ó Àç³­ ¾ÈÀü ´ëÃ¥ º»ºÎ", - "NIC", "National Information Center"}, - {"Àü±¹Àû ÁÖ±â Å×½ºÆ®", "NPT", "National Periodic Test"}, - {"Àü±¹Àû ¿ùº° Àǹ« Å×½ºÆ®", "RMT", "Required Monthly Test"}, - {"Àü±¹Àû ÁÖ°£º° Àǹ« Å×½ºÆ®", "RWT", "Required Weekly Test"}, - {"Ư¼ö ¼ö½Å±â Å×½ºÆ®", "STT", "Special Terminal Test"}, - {"ÇàÁ¤ ¸Þ½ÃÁö", "ADR", "Administrative Message"}, - {"»ê»çÅ °æº¸", "AVW", "Avalanche Warning"}, - {"»ê»çÅ ÁÖÀǺ¸", "AVA", "Avalanche Watch"}, - {"Æødz¼³°æº¸", "BZW", "Blizzard Warning"}, - {"¾î¸°ÀÌ À¯±« ±ä±Þ »óȲ", - "CAE", "Child Abduction Emergency"}, - {"½Ã¹Î À§Çè »óȲ °æº¸", "CDW", "Civil Danger Warning"}, - {"½Ã¹Î ÀÀ±Þ »óȲ ¸Þ½ÃÁö", "CEM", "Civil Emergency Message"}, - {"ÇØ¾È Ä§¼ö °æº¸", "CFW", "Coastal Flood Warning"}, - {"ÇØ¾È Ä§¼ö ÁÖÀǺ¸", "CFA", "Coastal Flood Watch"}, - {"¸ð·¡ Æødz °æº¸", "DSW", "Dust Storm Warning"}, - {"ÁöÁø °æº¸", "EQW", "Earthquake Warning"}, - {"Áï½Ã ´ëÇÇ", "EVI", "Evacuation Immediate"}, - {"È­Àç °æº¸", "FRW", "Fire Warning"}, - {"±ä±Þ È«¼ö °æº¸", "FFW", "Flash Flood Warning"}, - {"±ä±Þ È«¼ö ÁÖÀǺ¸", "FFA", "Flash Flood Watch"}, - {"±ä±Þ È«¼ö »óȲ", "FFS", "Flash Flood Statement"}, - {"È«¼ö °æº¸", "FLW", "Flood Warning"}, - {"È«¼ö ÁÖÀǺ¸", "FLA", "Flood Watch"}, - {"È«¼ö »óȲ", "FLS", "Flood Statement"}, - {"À§Çè ¹°Áú °æº¸", - "HMW", "Hazardous Materials Warning"}, - {"°­Ç³ °æº¸", "HWW", "High Wind Warning"}, - {"°­Ç³ ÁÖÀǺ¸", "HWA", "High Wind Watch"}, - {"ÅÂdz °æº¸", "HUW", "Hurricane Warning"}, - {"ÅÂdz ÁÖÀǺ¸", "HUA", "Hurricane Watch"}, - {"ÅÂdzÁ¤º¸", "HLS", "Hurricane Statement"}, - {"¹ýÁýÇà °æ°í", "LEW", "Law Enforcement Warning"}, - {"Áö¿ª ±ä±Þ »óȲ", "LAE", "Local Area Emergency"}, - {"Åë½Å ¸ÞÁö½Ã ¾Ë¸²", - "NMN", "Network Message Notification"}, - {"119 ÀüÈ­ ºÒÅë ÀÀ±Þ »óȲ", - "TOE", "119 Telephone Outage Emergency"}, - {"ÇÙ¹ßÀü¼Ò °ü·Ã °æº¸", - "NUW", "Nuclear Power Plant Warning"}, - {"½ÇÁ¦/¿¬½À °æº¸", "DMO", "Practice/Demo Warning"}, - {"¹æ»ç´É À§Çè °æº¸", - "RHW", "Radiological Hazard Warning"}, - {"³ú¿ì °æº¸", "SVR", "Severe Thunderstorm Warning"}, - {"³ú¿ì ÁÖÀǺ¸", "SVA", "Severe Thunderstorm Watch"}, - {"¾Ç±â»óÁ¤º¸", "SVS", "Severe Weather Statement"}, - {"¾ÈÀüÇÑ Àå¼Ò·Î Çdz­ °æº¸", - "SPW", "Shelter in Place Warning"}, - {"Ư¼ö ÇØ¾ç °æº¸", "SMW", "Special Marine Warning"}, - {"ƯÀÌ ±â»ó Á¤º¸", "SPS", "Special Weather Statement"}, - {"Åä³×À̵µ °æº¸", "TOR", "Tornado Warning"}, - {"Åä³×À̵µ ÁÖÀǺ¸", "TOA", "Tornado Watch"}, - {"¿­´ë Æødz(ÅÂdz) °æº¸", "TRW", "Tropical Storm Warning"}, - {"¿­´ë Æødz(ÅÂdz) ÁÖÀǺ¸", "TRA", "Tropical Storm Watch"}, - {"ÁöÁøÇØÀÏ °æº¸", "TSW", "Tsunami Warning"}, - {"ÁöÁøÇØÀÏ ÁÖÀǺ¸", "TSA", "Tsunami Watch"}, - {"È­»ê °æº¸", "VOW", "Volcano Warning"}, - {"´«Æødz °æº¸", "WSW", "Winter Storm Warning"}, - {"´«Æødz ÁÖÀǺ¸", "WSA", "Winter Storm Watch"} -}; - -static const U16 crc_ccitt_tab[] = { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, - 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, - 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, - 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, - 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, - 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, - 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, - 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, - 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, - 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, - 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, - 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, - 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, - 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, - 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, - 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, - 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, - 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, - 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, - 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, - 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, - 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, - 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 -}; - -static S32 CRC_CHECK(U8 *data, U16 data_len) -{ - - U16 crc = 0xffff; - U16 crc2 = 0xffff; - U16 crc_val, i; - U8 crc_cal_data; - - for (i = 0; i < (data_len - 2); i++) { - crc_cal_data = *(data+i); - crc = (crc<<8)^crc_ccitt_tab[(crc>>8)^(crc_cal_data)++]; - } - - crc_val = *(data+i)<<8; - crc_val = crc_val | *(data+i+1); - - crc2 = (crc_val^crc2); - - if (crc == crc2) - return RTV_OK; - else - return RTV_FAIL; -} - - -/*****************************/ -/* FIC Information Variable */ -/*****************************/ -struct ENSEMBLE_DESC ENS_DESC, NEXT_ENS_DESC; -U32 FIC_CONUT; - - -static UINT fib_crc_err_cnt; -S32 FIC_Init_Dec(U8 *fic, U8 fib_num, U8 CN) -{ - U32 i; - U32 ret; - unsigned int fib_crc_pos = 0; - FIC_CONUT++; - - for (i = 0; i < fib_num; i++) { - if (CRC_CHECK(fic+fib_crc_pos, 32) != RTV_OK) { - fib_crc_pos += 32; - fib_crc_err_cnt++; - return FIC_CRC_ERR; - } - - ret = FIB_INIT_DEC(fic+fib_crc_pos); - - if (ENS_DESC.svr_num) { - if ((ENS_DESC.svr_num == ENS_DESC.label_num) - &&/* (FIC_CONUT > 5) - &&*/ (ENS_DESC.label_flag == 1)) { - FIC_CONUT = 0; - return FIC_DONE; - } - } - fib_crc_pos += 32; - } - return FIC_GOING; -} - -#ifdef USER_APPLICATION_TYPE -static UINT rtvTDMB_SetVisualRadioInfo(SubChInfoType *subChInfo) -{ - UINT i = 0, j = 0; - - subChInfo->bVisualRadio = 0; - - /* UA Type - TV, Visual Radio : 0x009 */ - for (i = 0; i < subChInfo->NumberofUserAppl; i++) { - if (subChInfo->UserApplType[i] == 0x009) { - for (j = 0; j < subChInfo->UserApplLength[i]; j++) { - if ((subChInfo->UserApplData[j][0] == 0x01) - && (subChInfo->UserApplData[j][1] - == 0x02)) { - subChInfo->bVisualRadio = 1; - return 1; - } - } - } - } - return 0; -} -#endif - - -static BOOL fic_decode_run; - - -BOOL rtvFICDEC_Decode(U32 ch_freq_khz) -{ - UINT ret; - UINT cnt = 0; - U8 int_type_val1; - U8 fic_buf[384+1]; - /*UINT crc_err_cnt = 0; */ - UINT read_cnt = 0; - unsigned long diff_jiffies = get_jiffies_64(); - unsigned long diff_jiffies_1; - - fic_decode_run = TRUE; - fib_crc_err_cnt = 0; - - FIC_CONUT = 0; - memset(&ENS_DESC, 0, sizeof(struct ENSEMBLE_DESC)); - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(INT_E_UCLRL, 0x01); - - while (++cnt <= 408) { - if (fic_decode_run == FALSE) - break; - - int_type_val1 = RTV_REG_GET(INT_E_STATL); - - /* RTV_DBGMSG0("FIC_Check rootine!\n");*/ - if (int_type_val1 & FIC_E_INT) { - read_cnt++; - - RTV_REG_MAP_SEL(FIC_PAGE); - RTV_REG_BURST_GET(0x10, fic_buf, 384+1); - - /* FIC interrupt status clear */ - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(INT_E_UCLRL, 0x01); - - ret = FIC_Init_Dec(&fic_buf[1], 12, 0); - if (ret == FIC_DONE) { - diff_jiffies_1 = get_jiffies_64(); - RTV_DBGMSG2\ - ("[mtv] CNT: %u, FICread time ms (%u)\n", - read_cnt, - jiffies_to_msecs(diff_jiffies_1-diff_jiffies)); - - /*RTV_DBGMSG1\ - ("[mtv] FIC_Parseing DONE time ms (%u)\n\n", - jiffies_to_msecs(get_jiffies_64() - diff_jiffies_1));*/ - - RTV_GUARD_FREE; - - return TRUE; - } - /* added 2011/12/27*/ - else if (ret == FIC_CRC_ERR) { - RTV_GUARD_FREE; - return FALSE; - } - } - - RTV_DELAY_MS(12); - } - - RTV_GUARD_FREE; - - diff_jiffies_1 = get_jiffies_64(); - RTV_DBGMSG2("[mtv] CNT: %u, FIC_read time ms (%u)\n\n", - read_cnt, jiffies_to_msecs(diff_jiffies_1 - diff_jiffies)); - - - return FALSE; -} - - -void rtvFICDEC_Stop(void) -{ - rtvTDMB_CloseFIC(); - - /* Set the flag.*/ - fic_decode_run = FALSE; -} - -struct ensemble_info_type *rtvFICDEC_GetEnsembleInfo(unsigned long freq) -{ - UINT i, j; - UINT Comp_Index = 0; - UINT nSubChIdx = 0; - - struct ENSEMBLE_DESC *desc = &ENS_DESC; - - ensble.ensem_freq = freq; - ensble.ensem_id = desc->id; - - strncpy(ensble.ensem_label, desc->Label, ENSEMBLE_LABEL_MAX); - - for (i = 0; i < desc->svr_num; i++) { - for (j = 0; j < desc->svr_desc[i].Num_ser_comp; j++) { - Comp_Index = desc->svr_desc[i].ser_comp_num[j]; - switch (desc->svr_comp[Comp_Index].TMID) { - case MSC_STREAM_AUDIO: - ensble.sub_ch[nSubChIdx].sub_ch_id - = desc->svr_comp[Comp_Index].SubChid; - ensble.sub_ch[nSubChIdx].start_addr - = desc->svr_comp[Comp_Index].START_Addr; - ensble.sub_ch[nSubChIdx].tmid - = desc->svr_comp[Comp_Index].TMID; - ensble.sub_ch[nSubChIdx].svc_type - = desc->svr_comp[Comp_Index].ASCTy; - ensble.sub_ch[nSubChIdx].svc_id - = desc->svr_desc[i].Sid; - memcpy(ensble.sub_ch[nSubChIdx].svc_label, - desc->svr_desc[i].Label, SVC_LABEL_MAX); - nSubChIdx++; - break; - - case MSC_STREAM_DATA: - ensble.sub_ch[nSubChIdx].sub_ch_id - = desc->svr_comp[Comp_Index].SubChid; - ensble.sub_ch[nSubChIdx].start_addr - = desc->svr_comp[Comp_Index].START_Addr; - ensble.sub_ch[nSubChIdx].tmid - = desc->svr_comp[Comp_Index].TMID; - ensble.sub_ch[nSubChIdx].svc_type - = desc->svr_comp[Comp_Index].DSCTy; - ensble.sub_ch[nSubChIdx].svc_id - = desc->svr_desc[i].Sid; - memcpy(ensble.sub_ch[nSubChIdx].svc_label, - desc->svr_desc[i].Label, SVC_LABEL_MAX); - nSubChIdx++; - break; - - case FIDC: /* No service */ -/* - ensble.sub_ch[nSubChIdx].tmid - = desc->svr_comp[Comp_Index].TMID; - ensble.sub_ch[nSubChIdx].svc_id - = desc->svr_desc[i].Sid; - memcpy(ensble.sub_ch[nSubChIdx].svc_label, - desc->svr_desc[i].Label, SVC_LABEL_MAX); -*/ - break; - - case MSC_PACKET_DATA: -/* - ensble.sub_ch[nSubChIdx].sub_ch_id - = desc->svr_comp[Comp_Index].SubChid; - ensble.sub_ch[nSubChIdx].start_addr - = desc->svr_comp[Comp_Index].START_Addr; - ensble.sub_ch[nSubChIdx].tmid - = desc->svr_comp[Comp_Index].TMID; - ensble.sub_ch[nSubChIdx].svc_type - = desc->svr_comp[Comp_Index].DSCTy; - ensble.sub_ch[nSubChIdx].svc_id - = desc->svr_desc[i].Sid; - memcpy(ensble.sub_ch[nSubChIdx].svc_label, - desc->svr_desc[i].Label, SVC_LABEL_MAX); -*/ - break; - default: - RTV_DBGMSG0("NO TMID\n"); - break; - } - -/* - RTV_DBGMSG2("ensble->sub_ch[%d].sub_ch_id: %d\n", - nSubChIdx, ensble->sub_ch[nSubChIdx].sub_ch_id); - RTV_DBGMSG2("ensble->sub_ch[%d].start_addr: %d\n", - nSubChIdx, ensble->sub_ch[nSubChIdx].start_addr); - RTV_DBGMSG2("ensble->sub_ch[%d].tmid: %d\n", - nSubChIdx, ensble->sub_ch[nSubChIdx].tmid); - RTV_DBGMSG2("ensble->sub_ch[%d].svc_type: %d\n", - nSubChIdx, ensble->sub_ch[nSubChIdx].svc_type); - RTV_DBGMSG2("ensble->sub_ch[%d].svc_id: 0x%lX\n", - nSubChIdx, ensble->sub_ch[nSubChIdx].svc_id); - - desc->svr_desc[i].Label[SVC_LABEL_MAX] = '\0'; - RTV_DBGMSG2("ensble->sub_ch[%d].ServiceLabel: %s\n\n", - nSubChIdx, desc->svr_desc[i].Label); -*/ - } - } - - ensble.tot_sub_ch = nSubChIdx; -/* - RTV_DBGMSG1("ensble->TotalSubChNumber: %d\n\n", ensble->tot_sub_ch); -*/ - - return &ensble; -} - diff --git a/drivers/media/tdmb/mtv318/raontv_ficdec.h b/drivers/media/tdmb/mtv318/raontv_ficdec.h deleted file mode 100644 index 07034b2..0000000 --- a/drivers/media/tdmb/mtv318/raontv_ficdec.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv_ficdec.h - * - * Description : RAONTECH FIC Decoder API header file. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __RAONTV_FICDEC_H__ -#define __RAONTV_FICDEC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "raontv.h" -#include "tdmb.h" - -struct ensemble_info_type *rtvFICDEC_GetEnsembleInfo(unsigned long freq); -void rtvFICDEC_Stop(void); -BOOL rtvFICDEC_Decode(U32 ch_freq_khz); - -#ifdef __cplusplus -} -#endif - -#endif /* __RAONTV_FICDEC_H__ */ - diff --git a/drivers/media/tdmb/mtv318/raontv_ficdec_internal.h b/drivers/media/tdmb/mtv318/raontv_ficdec_internal.h deleted file mode 100644 index 85d50ee..0000000 --- a/drivers/media/tdmb/mtv318/raontv_ficdec_internal.h +++ /dev/null @@ -1,699 +0,0 @@ -/* -* -* File name: drivers/media/tdmb/mtv318/src/raontv_ficdec_internal.h -* -* Description : RAONTECH TV FIC Decoder internal header file. -* -* Copyright (C) (2011, RAONTECH) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ -#ifndef __RAONTV_FICDEC_INTERNAL_H__ -#define __RAONTV_FICDEC_INTERNAL_H__ - -/********************/ -/* Header Files */ -/********************/ -#include - -#include "raontv_ficdec.h" - - -#define RTV_FAIL (-1) -#define RTV_UNLOCK (-10) -#define RTV_OK 0 -#define RTV_SCAN_OK 1 -#define RTV_LOCK_CHECK 10 -#define RTV_NOTHING 2 - - -#define FIC_GOING 0 -#define FIC_LABEL 0x01 -#define FIC_APP_TYPE 0x10 -#define FIC_DONE 0x11 -#define FIC_CRC_ERR 0x44 - - -/**************************/ -/* FIC Definition */ -/**************************/ -#define MSC_STREAM_AUDIO 0x00 -#define MSC_STREAM_DATA 0x01 -#define FIDC 0x02 -#define MSC_PACKET_DATA 0x03 - -/* Ensemble, service, service component label number */ -#define LABEL_NUM 17 - -/* maximum service component number in Ensemble channel */ -#define MAX_SERV_COMP 64 - -/* maximum service component number in one service */ -#define MAX_SUB_CH_NUM 12 - -/* maximum service number in one ensemble */ -#define MAX_SERVICE_NUM 20 - -/*maximum number of user applications */ -#define USER_APP_NUM 6 - -/* get FIC Time information complete */ -#define ALL_FLAG_MATCH 0x11 - -/* get FIC type0 extension10 complete */ -#define TIME_FLAG 0x01 - -/* get FIC type0 extension9 complete */ -#define LTO_FLAG 0x10 - -#define Unspec_DATA 0 -#define TMC_Type 1 -#define EWS_Type 2 -#define ITTS_Type 3 -#define Paging_Type 4 -#define TDC_Type 5 -#define KDMB_Type 24 -#define Em_IP_Type 59 -#define MOT_Type 60 -#define PS_noDSCTy 61 - -/****************************/ -/* FIC Data structure */ -/****************************/ -/*! Date and Time information for Application user */ -struct DATE_TIME_INFO { - U32 MJD; - U8 LSI; - U8 conf_ind; - U8 utc_flag; - U8 apm_flag; - U8 time_flag; - U8 get_flag; - U16 years; - U8 months_dec; - char months_ste[4]; - char weeks[4]; - U8 days; - U8 hours; - U8 minutes; - U8 seconds; - U16 milliseconds; - U8 LTO; /*Local Time Offset */ -}; - -/*! Service Component Descriptor for Application user */ -struct SVR_COM_DESP { - S32 BIT_RATE; - S32 P_L; - S32 START_Addr; - S32 SUB_CH_Size; - U8 TMID; - U8 ASCTy; - U8 SubChid; - U8 P_S; - U8 CA_flag; - U8 DSCTy; - U8 FIDCid; - U8 TCid; - U8 Ext; - U16 SCid; - U8 DG_flag; - U16 Packet_add; - U16 CA_Org; - U8 FEC_scheme; - U8 language; - U8 charset; - char Label[LABEL_NUM]; - U32 Sid; - U8 SCidS; - U8 Num_User_App; - U16 User_APP_Type[USER_APP_NUM]; - U8 User_APP_data_length[USER_APP_NUM]; - U8 User_APP_data[24]; -}; - -/*! Service Descriptor for Application user */ -struct SERVICE_DESC { - /*MCI Information*/ - U32 Sid; - U8 Country_id; - U32 Service_ref; - U8 ECC; - U8 Local_flag; - U8 CAID; - U8 Num_ser_comp; - U8 P_D; - /*SI Information */ - U8 label_flag; - U8 charset; - char Label[LABEL_NUM]; - /*Program type */ - U8 int_code; - U8 ser_comp_num[MAX_SUB_CH_NUM]; -}; - -/*! FIDC Descriptor for Application user */ -struct FIDC_EWS_Region { - U8 Sub_Region[11]; -}; - -struct FIDC_DESC { - U8 EWS_current_segmemt; - U8 EWS_total_segmemt; - U8 EWS_Message_ID; - S8 EWS_category[4]; - U8 EWS_priority; - U32 EWS_time_MJD; - U8 EWS_time_Hours; - U8 EWS_time_Minutes; - U8 EWS_region_form; - U8 EWS_region_num; - U8 EWS_Rev; - struct FIDC_EWS_Region EWS_Region[15]; - U8 EWS_short_sentence[409]; -}; - -/*! Ensemble Descriptor for Application user */ -struct ENSEMBLE_DESC { - /*COMMON Information*/ - U32 svr_num; - U32 svr_comp_num; - U32 label_num; - /*MCI Information*/ - U16 id; - U8 change_flag; - U8 Alarm_flag; - /*SI Information*/ - U8 charset; - char Label[LABEL_NUM]; - U32 freq; - U8 label_flag; - - struct DATE_TIME_INFO date_time_info; - struct SERVICE_DESC svr_desc[MAX_SERVICE_NUM]; - struct SVR_COM_DESP svr_comp[MAX_SERV_COMP]; - struct FIDC_DESC fidc_desc; - -}; - - -/*****************/ -/* EXTERNS */ -/*****************/ -extern char *PROGRAM_TYPE_CODE16[32]; -extern char *USER_APP_TYPE_CODE[11]; -extern char *FIDC_EXT_CODE[3]; -extern char *ASCTy[3]; -extern char *DSCTy[11]; -extern char *ANNOUNCEMENT_TYPE_CODE[12]; -extern S32 SUBCH_UEP_TABLE[64][3]; -extern char *WEEK_TABLE[8]; -extern char *MONTH_TABLE[12]; -extern struct ENSEMBLE_DESC ENS_DESC, NEXT_ENS_DESC; -extern struct ENSEMBLE_DESC ENS_DESC1, NEXT_ENS_DESC1; -extern struct ENSEMBLE_DESC ENS_DESC2, NEXT_ENS_DESC2; -extern char *EWS_CATEGORY[67][3]; -extern char *EWS_PRIORITY_TABLE[4]; -extern char *EWS_REGION_FORM_TABLE[4]; -extern char *EWS_OFFICIAL_ORGANIZATION_TABLE[4]; - - - -/********************/ -/* FIC Definition */ -/********************/ -#define PN_FIB_END_MARKER (0xFF) - -/****************************/ -/* FIC Parser function */ -/****************************/ -S32 FIB_Init_Dec(U8 *); -S32 MCI_SI_DEC(U8); -S32 SI_LABEL_DEC1(U8); -S32 SI_LABEL_DEC2(U8); -S32 FIDC_DEC(U8); -S32 CA_DEC(U8); -S32 RESERVED1(U8); -S32 RESERVED2(U8); -S32 RESERVED3(U8); - -/*****************************/ -/* FIG Data Type structure */ -/*****************************/ -struct FIG_DATA { - U8 type; - U8 length; - U8 *data; - U8 byte_cnt; - U8 bit_cnt; -}; - -/****************************/ -/* FIG type 0 data field */ -/****************************/ -struct FIG_TYPE0 { - U8 C_N; - U8 OE; - U8 P_D; - U8 Ext; -}; - -/* Ensemble Information */ -struct FIG_TYPE0_Ext0 { - U16 Eid; - U8 Country_ID; - U32 Ensemble_Ref; - U8 Change_flag; - U8 AI_flag; - U8 CIF_Count0; - U8 CIF_Count1; - U8 Occurence_Change; -}; - -/* Structure of the sub-channel organization field */ -struct FIG_TYPE0_Ext1 { - U8 SubChid; - U32 StartAdd; - U8 S_L_form; - U32 Size_Protection; - U8 Table_sw; - U8 Table_index; - U8 Option; - U8 Protection_Level; - U32 Sub_ch_size; -}; - -/* Structure of the service organization field */ -struct FIG_TYPE0_Ext2_ser_comp_des { - U8 TMID; - U8 ASCTy; - U8 SubChid; - U8 P_S; - U8 CA_flag; - U8 DSCTy; - U8 FIDCid; - U8 TCid; - U8 Ext; - U16 SCid; -}; - -/* Basic service and service component definition structure */ -struct FIG_TYPE0_Ext2 { - U32 Sid; - U8 Country_id; - U32 Service_ref; - U8 ECC; - U8 Local_flag; - U8 CAID; - U8 Num_ser_comp; - struct FIG_TYPE0_Ext2_ser_comp_des svr_comp_des[MAX_SERV_COMP]; -}; - -/* Structure of the service component in packet mode */ -struct FIG_TYPE0_Ext3 { - U16 SCid; - U8 CA_Org_flag; - U8 DG_flag; - U8 DSCTy; - U8 SubChid; - U16 Packet_add; - U16 CA_Org; -}; - -/* Structure of the service component field in Stream mode or FIC */ -struct FIG_TYPE0_Ext4 { - U8 M_F; - U8 SubChid; - U8 FIDCid; - U16 CA_Org; -}; - -/* Structure of the service component language field */ -struct FIG_TYPE0_Ext5 { - U8 L_S_flag; - U8 MSC_FIC_flag; - U8 SubChid; - U8 FIDCid; - U16 SCid; - U8 Language; -}; - -/* Service Linking Information */ -struct FIG_TYPE0_Ext6 { - U8 id_list_flag; - U8 LA; - U8 S_H; - U8 ILS; - U32 LSN; - U8 id_list_usage; - U8 idLQ; - U8 Shd; - U8 Num_ids; - U16 id[12]; - U8 ECC[12]; - U32 Sid[12]; -}; - -/* Structure of the service component global definition field */ -struct FIG_TYPE0_Ext8 { - U32 Sid; - U8 Ext_flag; - U8 SCidS; - U8 L_S_flag; - U8 MSC_FIC_flag; - U8 SubChid; - U8 FIDCid; - U32 SCid; -}; - -/* Structure of Country, LTO International field */ -struct FIG_TYPE0_Ext9 { - U8 Ext_flag; - U8 LTO_unique; - U8 Ensemble_LTO; - U8 Ensemble_ECC; - U8 Inter_Table_ID; - U8 Num_Ser; - U8 LTO; - U8 ECC; - U32 Sid[11]; -}; - -/* Structure of the data and time field */ -struct FIG_TYPE0_Ext10 { - U32 MJD; - U8 LSI; - U8 Conf_ind; - U8 UTC_flag; - U32 UTC; - U8 Hours; - U8 Minutes; - U8 Seconds; - U16 Milliseconds; -}; - -/* Structure of the Region Definition */ -struct FIG_TYPE0_Ext11 { - U8 GATy; - U8 G_E_flag; - U8 Upper_part; - U8 Lower_part; - U8 length_TII_list; - U8 Mainid[12]; - U8 Length_Subid_list; - U8 Subid[36]; - U32 Latitude_Coarse; - U32 Longitude_coarse; - U32 Extent_Latitude; - U32 Extent_Longitude; -}; - -/* Structure of the User Application Information */ -struct FIG_TYPE0_Ext13 { - U32 Sid; - U8 SCidS; - U8 Num_User_App; - U16 User_APP_Type[6]; - U8 User_APP_data_length[6]; - U8 CA_flag; - U8 CA_Org_flag; - U8 X_PAD_App_Ty; - U8 DG_flag; - U8 DSCTy; - U16 CA_Org; - U8 User_APP_data[24]; -}; - -/* FEC sub-channel organization */ -struct FIG_TYPE0_Ext14 { - U8 SubChid; - U8 FEC_scheme; -}; - -/* Program Number structure */ -struct FIG_TYPE0_Ext16 { - U16 Sid; - U16 PNum; - U8 Continuation_flag; - U8 Update_flag; - U16 New_Sid; - U16 New_PNum; -}; - -/* Program Type structure */ -struct FIG_TYPE0_Ext17 { - U16 Sid; - U8 S_D; - U8 P_S; - U8 L_flag; - U8 CC_flag; - U8 Language; - U8 Int_code; - U8 Comp_code; -}; - -/* Announcement support */ -struct FIG_TYPE0_Ext18 { - U16 Sid; - U16 ASU_flags; - U8 Num_clusters; - U8 Cluster_ID[23]; -}; - -/* Announcement switching */ -struct FIG_TYPE0_Ext19 { - U8 Cluster_ID; - U16 ASW_flags; - U8 New_flag; - U8 Region_flag; - U8 SubChid; - U8 Regionid_Lower_Part; -}; - -/* Frequency Information */ -struct FIG_TYPE0_Ext21 { - U16 ResionID; - U8 Length_of_FI_list; - U16 id_field; - U8 R_M; - U8 Continuity_flag; - U8 Length_Freq_list; - U8 Control_field[5]; - U8 id_field2[4]; - U32 Freq_a[5]; - U8 Freq_b[17]; - U16 Freq_c[8]; - U16 Freq_d[7]; -}; - -/* Transmitter Identification Information (TII) database */ -struct FIG_TYPE0_Ext22 { - U8 M_S; - U8 Mainid; - U32 Latitude_coarse; - U32 Longitude_coarse; - U8 Latitude_fine; - U8 Longitude_fine; - U8 Num_Subid_fields; - U8 Subid[4]; - U16 TD[4]; - U16 Latitude_offset[4]; - U16 Longitude_offset[4]; -}; - -/* Other Ensemble Service */ -struct FIG_TYPE0_Ext24 { - U32 Sid; - U8 CAid; - U8 Number_Eids; - U16 Eid[12]; -}; - -/* Other Ensemble Announcement support */ -struct FIG_TYPE0_Ext25 { - U32 Sid; - U32 ASU_flag; - U8 Number_Eids; - U8 Eid[12]; -}; - -/* Other Ensemble Announcement switching */ -struct FIG_TYPE0_Ext26 { - U8 Cluster_id_Current_Ensemble; - U32 Asw_flags; - U8 New_flag; - U8 Region_flag; - U8 Region_id_current_Ensemble; - U32 Eid_Other_Ensemble; - U8 Cluster_id_other_Ensemble; - U8 Region_id_Oter_Ensemble; -}; - -/* FM Announcement support */ -struct FIG_TYPE0_Ext27 { - U32 Sid; - U8 Number_PI_Code; - U32 PI[12]; -}; - -/* FM Announcement switching */ -struct FIG_TYPE0_Ext28 { - U8 Cluster_id_Current_Ensemble; - U8 New_flag; - U8 Region_id_Current_Ensemble; - U32 PI; -}; - -/* FIC re-direction */ -struct FIG_TYPE0_Ext31 { - U32 FIG0_flag_field; - U8 FIG1_flag_field; - U8 FIG2_flag_field; -}; - -/****************************/ -/* FIG type 5 data field */ -/****************************/ -struct FIG_TYPE5 { - U8 D1; - U8 D2; - U8 TCid; - U8 Ext; -}; - -/* Paging */ -struct FIG_TPE5_Ext0 { - U8 SubChid; - U16 Packet_add; - U8 F1; - U8 F2; - U16 LFN; - U8 F3; - U16 Time; - U8 CAid; - U16 CA_Org; - U32 Paging_user_group; -}; - -/* TMC */ -struct FIG_TYPE5_Ext1 { - U32 TMC_User_Message[30]; - U16 TMC_System_Message[30]; -}; - -/* EWS */ -struct FIG_EWS_Region { - U8 Sub_Region[11]; -}; - -struct FIG_TYPE5_Ext2 { - U8 current_segmemt; - U8 total_segmemt; - U8 Message_ID; - S8 category[4]; - U8 priority; - U32 time_MJD; - U8 time_Hours; - U8 time_Minutes; - U8 region_form; - U8 region_num; - U8 Rev; - struct FIG_EWS_Region Region[15]; - U8 data[409]; -}; - -/****************************/ -/* FIG type 6 data field */ -/****************************/ -struct FIG_TYPE6 { - U8 C_N; - U8 OE; - U8 P_D; - U8 LEF; - U8 ShortCASysId; - U32 Sid; - U16 CASysId; - U16 CAIntChar; -}; - -/***************************/ -/* Function declarations */ -/***************************/ - -/* FIG TYPE 0 function */ -S32 Get_FIG0_EXT0(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT1(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT2(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT3(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT4(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT5(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT6(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT7(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT8(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT9(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT10(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT11(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT12(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT13(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT14(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT15(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT16(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT17(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT18(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT19(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT20(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT21(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT22(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT23(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT24(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT25(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT26(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT27(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT28(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT29(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT30(U8 fic_cmd, U8 P_D, U8 C_N); -S32 Get_FIG0_EXT31(U8 fic_cmd, U8 P_D, U8 C_N); - -/* FIG TYPE 1 function */ -S32 Get_FIG1_EXT0(U8 fic_cmd, U8 Char_Set); -S32 Get_FIG1_EXT1(U8 fic_cmd, U8 Char_Set); -S32 Get_FIG1_EXT2(U8 fic_cmd, U8 Char_Set); -S32 Get_FIG1_EXT3(U8 fic_cmd, U8 Char_Set); -S32 Get_FIG1_EXT4(U8 fic_cmd, U8 Char_Set); -S32 Get_FIG1_EXT5(U8 fic_cmd, U8 Char_Set); -S32 Get_FIG1_EXT6(U8 fic_cmd, U8 Char_Set); -S32 Get_FIG1_EXT7(U8 fic_cmd, U8 Char_Set); - -/* FIG TYPE 2 function */ -S32 Get_FIG2_EXT0(U8 fic_cmd, U8 Seg_Index); -S32 Get_FIG2_EXT1(U8 fic_cmd, U8 Seg_Index); -S32 Get_FIG2_EXT2(U8 fic_cmd, U8 Seg_Index); -S32 Get_FIG2_EXT3(U8 fic_cmd, U8 Seg_Index); -S32 Get_FIG2_EXT4(U8 fic_cmd, U8 Seg_Index); -S32 Get_FIG2_EXT5(U8 fic_cmd, U8 Seg_Index); -S32 Get_FIG2_EXT6(U8 fic_cmd, U8 Seg_Index); -S32 Get_FIG2_EXT7(U8 fic_cmd, U8 Seg_Index); - -/* FIG TYPE 5 function */ -S32 Get_FIG5_EXT0(U8 D1, U8 D2, U8 fic_cmd, U8 TCid); -S32 Get_FIG5_EXT1(U8 D1, U8 D2, U8 fic_cmd, U8 TCid); -S32 Get_FIG5_EXT2(U8 D1, U8 D2, U8 fic_cmd, U8 TCid); - - - -U8 GET_SUBCH_INFO(struct FIG_TYPE0_Ext1 *type0_ext1 - , S32 *BIT_RATE, S32 *SUB_CH_Size, S32 *P_L); -U8 GET_DATE_TIME(struct DATE_TIME_INFO *time_desc); -U8 GET_EWS_TIME(struct DATE_TIME_INFO *time_desc); - - - -#endif /* __RAONTV_FICDEC_INTERNAL_H__ */ diff --git a/drivers/media/tdmb/mtv318/raontv_internal.h b/drivers/media/tdmb/mtv318/raontv_internal.h deleted file mode 100644 index 1e41350..0000000 --- a/drivers/media/tdmb/mtv318/raontv_internal.h +++ /dev/null @@ -1,796 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv_internal.h - * - * Description : RAONTECH TV internal header file. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __RAONTV_INTERNAL_H__ -#define __RAONTV_INTERNAL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "raontv.h" - -/* Do not modify the order! */ -enum E_RTV_TV_MODE_TYPE { - RTV_TV_MODE_TDMB = 0, /* Band III Korea */ - RTV_TV_MODE_DAB_B3 = 1, /* Band III*/ - RTV_TV_MODE_DAB_L = 2, /* L-Band*/ - RTV_TV_MODE_1SEG = 3, /* UHF*/ - RTV_TV_MODE_FM = 4, /* FM*/ - MAX_NUM_RTV_MODE -}; - -struct RTV_REG_INIT_INFO { - U8 bReg; - U8 bVal; -}; - -struct RTV_REG_MASK_INFO { - U8 bReg; - U8 bMask; - U8 bVal; -}; - -#if defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) -#if defined(RTV_TSIF_CLK_SPEED_DIV_2) /* Host Clk/2*/ -#define RTV_COMM_CON47_CLK_SEL (0<<6) -#elif defined(RTV_TSIF_CLK_SPEED_DIV_4) /* Host Clk/4*/ -#define RTV_COMM_CON47_CLK_SEL (1<<6) -#elif defined(RTV_TSIF_CLK_SPEED_DIV_6) /* Host Clk/6*/ -#define RTV_COMM_CON47_CLK_SEL (2<<6) -#elif defined(RTV_TSIF_CLK_SPEED_DIV_8) /* Host Clk/8*/ -#define RTV_COMM_CON47_CLK_SEL (3<<6) -#else -#error "Code not present" -#endif -#endif - -#define MSC1_E_OVER_FLOW 0x40 -#define MSC1_E_UNDER_FLOW 0x20 -#define MSC1_E_INT 0x10 -#define MSC0_E_OVER_FLOW 0x08 -#define MSC0_E_UNDER_FLOW 0x04 -#define MSC0_E_INT 0x02 -#define FIC_E_INT 0x01 -#define RE_CONFIG_E_INT 0x04 - -#define MSC1_INTR_BITS (MSC1_E_INT|MSC1_E_UNDER_FLOW|MSC1_E_OVER_FLOW) -#define MSC0_INTR_BITS (MSC0_E_INT|MSC0_E_UNDER_FLOW|MSC0_E_OVER_FLOW) - -/* [2]MSC1 int clear [1]MSC0 int clear [0]FIC int clear */ -#define INT_E_UCLRL (0x35) - -/* [6]OFDM TII done clear */ -#define INT_E_UCLRH (0x36) - -/* [7]OFDM Lock status [6]MSC1 overrun [5]MSC1 underrun - * [4]MSC1 int [3]MSC0 overrun [2]MSC0 underrun [1]MSC0 int [0]FIC int */ -#define INT_E_STATL (0x33) - -/* [7]OFDM NIS [6]OFDM TII [5]OFDM scan [4]OFDM window position - * [3]OFDM unlock [2]FEC re-configuration [1]FEC CIF end [0]FEC soft reset*/ -#define INT_E_STATH (0x34) - -/* [7]Buf_en [6]PKT_CRC_MODE:enable (stored) [5]MPEG_HEAD [4]MPEG-2TS_EN - * [3]EPKT_MODE [2]CAS_MODE [1]FIDC_MODE [0]FIC_INIT_EN == 1:enable*/ -#define DD_E_TOPCON (0x45) - -/* [4]FIC_CRC stored- 1:enable [3]FIC uclear-1 - * [2]FIC_Update - 1:dependent by user - * [1]FIC_EN [0]FIG_EN - 1:only FIG 6 dump*/ -#define FIC_E_DDCON (0x46) - -/* [3]MSC0 uclear-1 - * [2]MSC0_en - * [1]MSC0 read length -1:user length, 0:interrupt length - * [0]MSC0 interrupt sel-1:user th, 0:CIF end*/ -#define MSC0_E_CON (0x47) - -/* [5]MSC1_length-0:subch+length [4]MSC1 header-0:disable [3]MSC1 uclear-1 - * [2]MSC1_en [1]MSC1 read length -1:user length, 0:interrupt length - * [0]MSC1 interrupt sel-1:user th, 0:CIF end*/ -#define MSC1_E_CON (0x48) - -/* [3]NIS uclear-1 [2]NIS_Update - 1:dependent by user - * [1]TII status clear -1:user set only, 0:user set & internal event - * [0]TII_Update - 1:dependent by user*/ -#define OFDM_E_DDCON (0x49) - -/* [11:8] setting in MSC0 read length for interrupt clear*/ -#define MSC0_E_RSIZE_H (0x4E) - -/* [7:0]*/ -#define MSC0_E_RSIZE_L (0x4F) - -/* [11:8] MSC0 interrupt threshold*/ -#define MSC0_E_INTTH_H (0x50) - -/* [7:0]*/ -#define MSC0_E_INTTH_L (0x51) - -/* [11:8]*/ -#define MSC0_E_TSIZE_L (0x52) - -/* [7:0] MSC0 total size which you can read*/ -#define MSC0_E_TSIZE_H (0x53) - -/* [11:8] setting in MSC1 read length for interrupt clear*/ -#define MSC1_E_RSIZE_H (0x54) -#define MSC1_E_RSIZE_L (0x55) /* [7:0]*/ -#define MSC1_E_INTTH_H (0x56) /* [11:8] MSC1 interrupt threshold*/ -#define MSC1_E_INTTH_L (0x57) /* [7:0]*/ -#define MSC1_E_TSIZE_L (0x58) /* [11:8]*/ -#define MSC1_E_TSIZE_H (0x59) /* [7:0] MSC1 read length*/ - -#define MODE1 2 -#define MODE2 1 -#define MODE3 0 - -#define MAP_SEL_REG 0x03 - -#define OFDM_PAGE 0x02 /* for 1seg */ -#define FEC_PAGE 0x03 /* for 1seg */ -#define COMM_PAGE 0x04 -#define FM_PAGE 0x06 /* T-DMB OFDM/FM */ -#define HOST_PAGE 0x07 -#define CAS_PAGE 0x08 -#define DD_PAGE 0x09 /* FEC for TDMB, DAB, FM */ -#define FIC_PAGE 0x0A -#define MSC0_PAGE 0x0B -#define MSC1_PAGE 0x0C -#define RF_PAGE 0x0F - -#define DEMOD_0SC_DIV2_ON 0x80 -#define DEMOD_0SC_DIV2_OFF 0x00 - -#if (RTV_SRC_CLK_FREQ_KHz >= 32000) -#define DEMOD_OSC_DIV2 DEMOD_0SC_DIV2_ON -#else -#define DEMOD_OSC_DIV2 DEMOD_0SC_DIV2_OFF -#endif - -#define MAP_SEL_VAL(page) (DEMOD_OSC_DIV2|page) -#define RTV_REG_MAP_SEL(page) RTV_REG_SET(MAP_SEL_REG, MAP_SEL_VAL(page)) - -#define RTV_TS_STREAM_DISABLE_DELAY 20 /* ms */ - -/* ISDB-T Channel */ -#define ISDBT_CH_NUM_START__JAPAN 13 -#define ISDBT_CH_NUM_END__JAPAN 62 -#define ISDBT_CH_FREQ_START__JAPAN 473143 -#define ISDBT_CH_FREQ_STEP__JAPAN 6000 - -#define ISDBT_CH_NUM_START__BRAZIL 14 -#define ISDBT_CH_NUM_END__BRAZIL 69 -#define ISDBT_CH_FREQ_START__BRAZIL 473143 -#define ISDBT_CH_FREQ_STEP__BRAZIL 6000 - -#define ISDBT_CH_NUM_START__ARGENTINA 14 -#define ISDBT_CH_NUM_END__ARGENTINA 69 -#define ISDBT_CH_FREQ_START__ARGENTINA 473143 -#define ISDBT_CH_FREQ_STEP__ARGENTINA 6000 - -/* T-DMB Channel */ -#define TDMB_CH_FREQ_START__KOREA 175280 -#define TDMB_CH_FREQ_STEP__KOREA 1728 /* about... */ -/* DAB Channel */ -#define DAB_CH_BAND3_START_FREQ_KHz 174928 -#define DAB_CH_BAND3_STEP_FREQ_KHz 1712 /* in KHz */ -#define DAB_CH_LBAND_START_FREQ_KHz 1452960 -#define DAB_CH_LBAND_STEP_STEP_FREQ_KHz 1712 /*in KHz */ - -extern enum E_RTV_ADC_CLK_FREQ_TYPE g_eRtvAdcClkFreqType; -extern enum E_RTV_COUNTRY_BAND_TYPE g_eRtvCountryBandType; - -#ifdef RTV_DAB_ENABLE -extern enum E_RTV_TV_MODE_TYPE g_curDabSetType; -#endif - -/* Use SPI/EBI2 interrupt handler to prevent the changing of register map. */ -extern BOOL g_fRtvChannelChange; -extern BOOL g_fRtvStreamEnabled; - -extern UINT g_nRtvMscThresholdSize; - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -extern U8 g_bRtvIntrMaskRegL; - -#else -#if !defined(RTV_CIF_MODE_ENABLED) || !defined(RTV_FIC_POLLING_MODE) -/* T-DMB: Single sub channel and Serial TSIF */ -extern U8 g_bRtvIntrMaskRegL; -#endif -#endif - -/*See PLL table in raontv_rf_pll_data_fm.h */ -#define FM_MIN_FREQ_KHz 75950 -#define FM_MAX_FREQ_KHz 108050 -#define FM_SCAN_STEP_FREQ_KHz (RTV_FM_CH_STEP_FREQ_KHz/2) - -#if (RTV_FM_CH_MIN_FREQ_KHz < FM_MIN_FREQ_KHz) \ - || (RTV_FM_CH_MAX_FREQ_KHz > FM_MAX_FREQ_KHz) -#error "Invalid FM freq range" -#endif - -/*============================================================================ - * - * Common inline functions. - * - *===========================================================================*/ - -/* Forward prototype. */ -static INLINE void rtv_SetupMemory_MSC1(U16 wThresholdSize); - -static INLINE enum E_RTV_TV_MODE_TYPE rtv_GetDabTvMode(U32 dwChFreqKHz) -{ - if (dwChFreqKHz >= DAB_CH_LBAND_START_FREQ_KHz) { - /*RTV_DBGMSG0("return RTV_TV_MODE_DAB_L;\n");*/ - return RTV_TV_MODE_DAB_L; /* L-Band */ - } else { - switch (dwChFreqKHz) { - case 175280/*7A*/: case 177008/*7B*/: case 178736/*7C*/: - case 181280/*8A*/: case 183008/*8B*/: case 184736/*8C*/: - case 187280/*9A*/: case 189008/*9B*/: case 190736/*9C*/: - case 193280/*10A*/: case 195008/*10B*/: case 196736/*10C*/: - case 199280/*11A*/: case 201008/*11B*/: case 202736/*11C*/: - case 205280/*12A*/: case 207008/*12B*/: case 208736/*12C*/: - case 211280/*13A*/: case 213008/*13B*/: case 214736/*13C*/: - /*RTV_DBGMSG0("return RTV_TV_MODE_TDMB;\n");*/ - return RTV_TV_MODE_TDMB; /*Korea TDMB.*/ - - default: - /*RTV_DBGMSG0("return RTV_TV_MODE_DAB_B3;\n"); */ - return RTV_TV_MODE_DAB_B3; /* DAB Band-III */ - } - } -} - -/* Pause straem */ -static INLINE void rtv_StreamDisable(enum E_RTV_TV_MODE_TYPE eTvMode) -{ -#ifndef RTV_IF_MPEG2_PARALLEL_TSIF - if (g_fRtvStreamEnabled == FALSE) - return; - - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(HOST_PAGE); - /* FIC, MSC0, MSC1 */ - RTV_REG_SET(0x62, - g_bRtvIntrMaskRegL|MSC0_INTR_BITS|MSC1_INTR_BITS); - -#elif defined(RTV_IF_MPEG2_SERIAL_TSIF) \ - || defined(RTV_IF_SPI_SLAVE)\ - || defined(RTV_IF_QUALCOMM_TSIF) - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x29, 0x08); - RTV_DELAY_MS(RTV_TS_STREAM_DISABLE_DELAY); -#endif - break; -#endif /* RTV_ISDBT_ENABLE */ - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(HOST_PAGE); - /* FIC, MSC0, MSC1 */ - RTV_REG_SET(0x62, - g_bRtvIntrMaskRegL|MSC0_INTR_BITS|MSC1_INTR_BITS); - -#elif defined(RTV_IF_MPEG2_SERIAL_TSIF) \ - || defined(RTV_IF_SPI_SLAVE) \ - || defined(RTV_IF_QUALCOMM_TSIF) - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x29, 0x08); - RTV_DELAY_MS(RTV_TS_STREAM_DISABLE_DELAY); -#endif - break; -#endif/* RTV_FM_ENABLE */ - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(HOST_PAGE); - - /* FIC, MSC0, MSC1 */ - RTV_REG_SET(0x62, - g_bRtvIntrMaskRegL|MSC0_INTR_BITS|MSC1_INTR_BITS|FIC_E_INT); -#elif defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x29, 0x08); - RTV_DELAY_MS(RTV_TS_STREAM_DISABLE_DELAY); - -#ifndef RTV_CIF_MODE_ENABLED /* Individual Mode */ -#ifndef RTV_FIC_POLLING_MODE - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL|FIC_E_INT); -#endif -#else /* CIF Mode. */ - -#endif -#endif - break; -#endif /* RTV_TDMB_ENABLE */ - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - case RTV_TV_MODE_TDMB: -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, - g_bRtvIntrMaskRegL|MSC0_INTR_BITS|MSC1_INTR_BITS|FIC_E_INT); - -#elif defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x29, 0x08); - RTV_DELAY_MS(RTV_TS_STREAM_DISABLE_DELAY); - -#ifndef RTV_CIF_MODE_ENABLED /* Individual Mode */ -#ifndef RTV_FIC_POLLING_MODE - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL|FIC_E_INT); -#endif -#else /* Multi Sub Channel Mode. */ - -#endif -#endif - break; -#endif /* RTV_DAB_ENABLE */ - - default: - break; - } - - g_fRtvStreamEnabled = FALSE; -#endif -} - - -static INLINE void rtv_StreamRestore(enum E_RTV_TV_MODE_TYPE eTvMode) -{ -#ifndef RTV_IF_MPEG2_PARALLEL_TSIF - if (g_fRtvStreamEnabled == TRUE) - return; - - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x04); /* MSC1 Interrupt status clear. */ - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x04); - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#elif defined(RTV_IF_SERIAL_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x29, 0x00); -#endif - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x07); - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); - -#elif defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x29, 0x00); - -#ifndef RTV_CIF_MODE_ENABLED /* Individual Mode */ -#ifndef RTV_FIC_POLLING_MODE - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x01); - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif -#else /* Multi Sub Channel Mode. */ -#endif -#endif - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - case RTV_TV_MODE_TDMB: -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x07); - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL);/* FIC, MSC0, MSC1 */ - -#elif defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x29, 0x00); - -#ifndef RTV_CIF_MODE_ENABLED /* Individual Mode */ -#ifndef RTV_FIC_POLLING_MODE - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x01); /* FIC Interrupt status clear. */ - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif -#else /* Multi Sub Channel Mode. */ -#endif -#endif - break; -#endif /* RTV_DAB_ENABLE */ - default: - /* RTV_DBGMSG0("[rtv_StreamRestore] Invalid TV mode.\n"); */ - break; - } - - g_fRtvStreamEnabled = TRUE; -#endif -} - -/* Enable the stream path forcely for ISDB-T and FM only! */ -static INLINE void rtv_StreamEnable(void) -{ -#ifndef RTV_IF_MPEG2_PARALLEL_TSIF - if (g_fRtvStreamEnabled == TRUE) - return; - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x04); /* MSC1 Interrupt status clear. */ - - RTV_REG_MAP_SEL(HOST_PAGE); - - /* [6] MSC1 over-run [5] MSC1 under-run [4] MSC1 interrupt */ - g_bRtvIntrMaskRegL = 0x8F; - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); - -#elif defined(RTV_IF_SERIAL_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x29, 0x00); -#endif - - /* Restore MSC1 memory. */ - rtv_SetupMemory_MSC1(g_nRtvMscThresholdSize); - - g_fRtvStreamEnabled = TRUE; -#endif /* #ifndef RTV_IF_MPEG2_PARALLEL_TSIF */ -} - -static INLINE void rtv_ConfigureTsifFormat(void) -{ - RTV_REG_MAP_SEL(COMM_PAGE); - -#if defined(RTV_IF_MPEG2_SERIAL_TSIF) || defined(RTV_IF_SPI_SLAVE) -#if defined(RTV_TSIF_FORMAT_1) - RTV_REG_SET(0x45, 0x00); -#elif defined(RTV_TSIF_FORMAT_2) - RTV_REG_SET(0x45, 0x02); -#elif defined(RTV_TSIF_FORMAT_3) - RTV_REG_SET(0x45, 0x21); -#elif defined(RTV_TSIF_FORMAT_4) - RTV_REG_SET(0x45, 0x23); -#else -#error "Code not present" -#endif - -#elif defined(RTV_IF_QUALCOMM_TSIF) -#if defined(RTV_TSIF_FORMAT_1) - RTV_REG_SET(0x45, 0x00); -#elif defined(RTV_TSIF_FORMAT_2) - RTV_REG_SET(0x45, 0xE9); - -#elif defined(RTV_TSIF_FORMAT_3) - RTV_REG_SET(0x45, 0xE1); -#elif defined(RTV_TSIF_FORMAT_4) - RTV_REG_SET(0x45, 0x40); -#elif defined(RTV_TSIF_FORMAT_5) - RTV_REG_SET(0x45, 0x21); -#else -#error "Code not present" -#endif -#endif - -#if defined(RTV_IF_MPEG2_SERIAL_TSIF) - RTV_REG_SET(0x46, 0x80); -#elif defined(RTV_IF_QUALCOMM_TSIF) - RTV_REG_SET(0x46, 0xA0); -#elif defined(RTV_IF_SPI_SLAVE) - RTV_REG_SET(0x46, 0x82); -#endif -} - -static INLINE void rtv_ResetMemory_MSC0(void) -{ - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x47, 0x00); /* MSC0 memory control register clear. */ -} - -static INLINE void rtv_ResetMemory_MSC1(void) -{ -#ifndef RTV_IF_MPEG2_PARALLEL_TSIF - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x48, 0x00); /* MSC1 memory control register clear. */ -#endif -} - -/* Only for T-DMB and DAB. */ -static INLINE void rtv_ClearAndSetupMemory_MSC0(void) -{ -#ifndef RTV_IF_MPEG2_PARALLEL_TSIF - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -#ifdef RTV_MSC_INTR_ISTAUS_ACC_CLR_MODE - U8 msc0_int_usel = 0; /* 0: auto&uclr, 1: user set only */ -#else - U8 msc0_int_usel = 1; -#endif -#else - U8 msc0_int_usel = 0; -#endif - -#ifndef RTV_CIF_MODE_ENABLED /* Individual Mode */ - U8 int_type = 1; /* 0: CIF end, 1: Threshold */ -#else - U8 int_type = 0; -#endif - - RTV_REG_SET(0x47, 0x00); - RTV_REG_SET(0x47, (msc0_int_usel<<3) | (1/*msc0_en*/<<2) | int_type); -#endif /* #ifndef RTV_IF_MPEG2_PARALLEL_TSIF */ -} - -/* Only for T-DMB and DAB. */ -static INLINE void rtv_SetupMemory_MSC0(U16 wThresholdSize) -{ -#ifndef RTV_IF_MPEG2_PARALLEL_TSIF - RTV_REG_MAP_SEL(DD_PAGE); - - RTV_REG_SET(0x50, ((wThresholdSize>>8) & 0x0F)); - RTV_REG_SET(0x51, (wThresholdSize & 0xFF)); - - rtv_ClearAndSetupMemory_MSC0(); - - RTV_REG_SET(0x35, 0x02); /* MSC0 Interrupt clear. */ - -#endif /* #ifndef RTV_IF_MPEG2_PARALLEL_TSIF */ -} - -/* For SPI interface ISR. */ -static INLINE void rtv_ClearAndSetupMemory_MSC1(void) -{ -#ifndef RTV_IF_MPEG2_PARALLEL_TSIF -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -#ifdef RTV_MSC_INTR_ISTAUS_ACC_CLR_MODE - U8 msc1_int_usel = 0; /* 0: auto&uclr, 1: user set only */ -#else - U8 msc1_int_usel = 1; -#endif -#else - /* TSIF */ - U8 msc1_int_usel = 0; -#endif - - U8 int_type = 1; /* 0: CIF end, 1: Threshold (for SPI, Header OFF) */ - - RTV_REG_SET(0x48, 0x00); - RTV_REG_SET(0x48, - (0<<5) | (0<<4) | (msc1_int_usel<<3) | (1/*msc1_en*/<<2) | int_type); - -#endif /* #ifndef RTV_IF_MPEG2_PARALLEL_TSIF */ -} - -static INLINE void rtv_SetupMemory_MSC1(U16 wThresholdSize) -{ -#ifndef RTV_IF_MPEG2_PARALLEL_TSIF - RTV_REG_MAP_SEL(DD_PAGE); - - /* The below settings are not applied to CIF of TDMB/DAB. */ - RTV_REG_SET(0x56, ((wThresholdSize>>8) & 0x0F)); - RTV_REG_SET(0x57, (wThresholdSize & 0xFF)); - - rtv_ClearAndSetupMemory_MSC1(); -#endif /* #ifndef RTV_IF_MPEG2_PARALLEL_TSIF */ -} - -/* Only this sub channel contains the RS decoder. */ -static INLINE void rtv_Set_MSC1_SUBCH0(UINT nSubChID, - BOOL fSubChEnable, BOOL fRsEnable) -{ - RTV_REG_MAP_SEL(DD_PAGE); - -#if !defined(RTV_IF_MPEG2_PARALLEL_TSIF) - RTV_REG_SET(0x3A, (fSubChEnable << 7) | (fRsEnable << 6) | nSubChID); -#else - if (fRsEnable == TRUE) { - RTV_REG_SET(0xFF, 0x00); - RTV_REG_SET(0x3A, - (fSubChEnable << 7) | (fRsEnable << 6) | nSubChID); - - } else { - RTV_REG_SET(0x3A, 0x00); - RTV_REG_SET(0xFF, (fSubChEnable << 7) | nSubChID); - } -#endif -} - -static INLINE void rtv_Set_MSC1_SUBCH1(UINT nSubChID, BOOL fSubChEnable) -{ - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x3B, (fSubChEnable << 7) | nSubChID); -} - -static INLINE void rtv_Set_MSC1_SUBCH2(UINT nSubChID, BOOL fSubChEnable) -{ - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x3C, (fSubChEnable << 7) | nSubChID); -} - -static INLINE void rtv_Set_MSC0_SUBCH3(UINT nSubChID, BOOL fSubChEnable) -{ - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x3D, (fSubChEnable << 7) | nSubChID); -} - -static INLINE void rtv_Set_MSC0_SUBCH4(UINT nSubChID, BOOL fSubChEnable) -{ - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x3E, (fSubChEnable << 7) | nSubChID); -} - -static INLINE void rtv_Set_MSC0_SUBCH5(UINT nSubChID, BOOL fSubChEnable) -{ - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x3F, (fSubChEnable << 7) | nSubChID); -} - -static INLINE void rtv_Set_MSC0_SUBCH6(UINT nSubChID, BOOL fSubChEnable) -{ - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x42, (fSubChEnable << 7) | nSubChID); -} - -/*============================================================================= - * - * T-DMB inline functions. - * - *===========================================================================*/ -static INLINE void rtv_SetupMemory_FIC(void) -{ - RTV_REG_MAP_SEL(DD_PAGE); - /* auto user clr, get fic CRC 2byte including[4] */ - RTV_REG_SET(0x46, 0x10); - RTV_REG_SET(0x46, 0x16); /* FIC enable */ -} - -static INLINE void rtv_ResetMemory_FIC(void) -{ - - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x46, 0x00); -} - -/*============================================================================== - * - * Parallel TSIF inline functions. - * - *============================================================================*/ -#ifdef RTV_IF_MPEG2_PARALLEL_TSIF -#if defined(RTV_ISDBT_ENABLE) -static INLINE void rtv_SetParallelTsif_1SEG_Only(void) -{ - RTV_REG_MAP_SEL(FEC_PAGE); - -#if defined(RTV_TSIF_FORMAT_1) - RTV_REG_SET(0x6E, 0x11); -#elif defined(RTV_TSIF_FORMAT_2) - RTV_REG_SET(0x6E, 0x13); -#elif defined(RTV_TSIF_FORMAT_3) - RTV_REG_SET(0x6E, 0x10); -#elif defined(RTV_TSIF_FORMAT_4) - RTV_REG_SET(0x6E, 0x12); -#else -#error "Code not present" -#endif - RTV_REG_SET(0x6F, 0x02); - RTV_REG_SET(0x70, 0x88); -} - -#elif defined(RTV_TDMB_ENABLE) -static INLINE void rtv_SetParallelTsif_TDMB_Only(void) -{ - RTV_REG_MAP_SEL(0x09); - -#if defined(RTV_TSIF_FORMAT_1) - RTV_REG_SET(0xDD, 0xD0); -#elif defined(RTV_TSIF_FORMAT_2) - RTV_REG_SET(0xDD, 0xD2); -#elif defined(RTV_TSIF_FORMAT_3) - RTV_REG_SET(0xDD, 0xD1); -#elif defined(RTV_TSIF_FORMAT_4) - RTV_REG_SET(0xDD, 0xD3); -#else -#error "Code not present" -#endif - RTV_REG_SET(0xDE, 0x12); - RTV_REG_SET(0x45, 0xB0); -} -#else -#error "Code not present" -#endif -#endif - -/*============================================================================== - * External functions for RAONTV driver core. - *============================================================================*/ -void rtv_ConfigureHostIF(void); -INT rtv_InitSystem(enum E_RTV_TV_MODE_TYPE eTvMode, - enum E_RTV_ADC_CLK_FREQ_TYPE eAdcClkFreqType); - -#ifdef RTV_CIF_HEADER_INSERTED -void rtvCIFDEC_Init(void); -void rtvCIFDEC_Deinit(void); -void rtvCIFDEC_DeleteSubChannelID(UINT nSubChID); -void rtvCIFDEC_AddSubChannelID(UINT nSubChID); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __RAONTV_INTERNAL_H__ */ - -/* - WINDOWS - #define INLINE __inline - #define FORCE_INLINE __forceinline - #define NAKED __declspec(naked) - - __GNUC__ - #define INLINE __inline__ - #define FORCE_INLINE __attribute__((always_inline)) __inline__ - #define NAKED __attribute__((naked)) - - ARM RVDS compiler - #define INLINE __inline - #define FORCE_INLINE __forceinline - #define NAKED __asm - */ - diff --git a/drivers/media/tdmb/mtv318/raontv_port.c b/drivers/media/tdmb/mtv318/raontv_port.c deleted file mode 100644 index 1251a8c..0000000 --- a/drivers/media/tdmb/mtv318/raontv_port.c +++ /dev/null @@ -1,169 +0,0 @@ -/* -* -* File name: drivers/media/tdmb/mtv318/src/raontv_port.c -* -* Description : RAONTECH TV OEM source driver. -* -* Copyright (C) (2011, RAONTECH) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include "raontv.h" -#include "raontv_internal.h" -#include - -#include "tdmb.h" - -/* Declares a variable of gurad object if neccessry. */ -#if defined(RTV_IF_SPI) || ((defined(RTV_TDMB_ENABLE) \ - || defined(RTV_DAB_ENABLE)) && !defined(RTV_FIC_POLLING_MODE)) - #if defined(__KERNEL__) - struct mutex raontv_guard; - #elif defined(WINCE) - CRITICAL_SECTION raontv_guard; - #else - /* non-OS and RTOS. */ - #endif -#endif - -void rtvOEM_ConfigureInterrupt(void) -{ -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) \ - || ((defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE)) \ - && !defined(RTV_FIC_POLLING_MODE)) - - RTV_REG_SET(0x09, 0x00); - /* [6]INT1 [5]INT0 - 1: Input mode, 0: Output mode */ - RTV_REG_SET(0x0B, 0x00); - /* [2]INT1 PAD disable [1]INT0 PAD disable */ - - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x28, 0x01); - /* [5:3]INT1 out sel [2:0] INI0 out sel - - 0:Toggle 1:Level,, 2:"0", 3:"1"*/ - - #if defined(RTV_MSC_INTR_ISTAUS_ACC_CLR_MODE) - RTV_REG_SET(0x29, 0x08); - /*[3] Interrupt status register clear condition - - 0:read data by memory access 1:status register access*/ - #else - RTV_REG_SET(0x29, 0x00); - /*[3] Interrupt status register clear condition - - 0:read data by memory access 1:status register access*/ - #endif - RTV_REG_SET(0x2A, 0x13); - /* [5]INT1 pol [4]INT0 pol - - 0:Active High, 1:Active Low [3:0] Period = (INT_TIME+1)/8MHz*/ -#endif -} - -#if defined(RTV_IF_SPI) -unsigned char mtv_spi_read(unsigned char reg) -{ - int ret; - u8 out_buf[2], read_out_buf[2]; - u8 in_buf[2]; - struct spi_message msg; - struct spi_transfer msg_xfer0 = { - .tx_buf = out_buf, - .len = 2, - .cs_change = 1, - }; - - struct spi_transfer msg_xfer1 = { - .tx_buf = read_out_buf, - .rx_buf = in_buf, - .len = 2, - .cs_change = 0, - }; - - spi_message_init(&msg); - - out_buf[0] = RAONTV_CHIP_ADDR; - out_buf[1] = reg; - spi_message_add_tail(&msg_xfer0, &msg); - - read_out_buf[0] = RAONTV_CHIP_ADDR|0x1; - read_out_buf[1] = 0xFF; - spi_message_add_tail(&msg_xfer1, &msg); - - ret = spi_sync(tdmb_get_spi_handle(), &msg); - if (ret) { - printk(KERN_ERR "[mtv818_spi_read] mtv818_spi_read() error: %d\n", - ret); - return 0xFF; - } - - /* printk(KERN_ERR - "[mtv818_spi_read] in_buf[0]: 0x%02X, in_buf[1]: 0x%02X\n", - in_buf[0], in_buf[1]); */ - - return in_buf[1]; -} - -void mtv_spi_read_burst(unsigned char reg, unsigned char *buf, int size) -{ - int ret; - u8 out_buf[2], read_out_buf[2]; - struct spi_message msg; - struct spi_transfer msg_xfer0 = { - .tx_buf = out_buf, - .len = 2, - .cs_change = 1, - }; - - struct spi_transfer msg_xfer1 = { - .tx_buf = read_out_buf, - .rx_buf = buf, - .len = size, - .cs_change = 0, - }; - - spi_message_init(&msg); - out_buf[0] = RAONTV_CHIP_ADDR; - out_buf[1] = reg; - spi_message_add_tail(&msg_xfer0, &msg); - - read_out_buf[0] = RAONTV_CHIP_ADDR|0x1; - spi_message_add_tail(&msg_xfer1, &msg); - - ret = spi_sync(tdmb_get_spi_handle(), &msg); - if (ret) - printk(KERN_ERR "[mtv818_spi_read_burst] error: %d\n", ret); -} - -void mtv_spi_write(unsigned char reg, unsigned char val) -{ - u8 out_buf[3]; - u8 in_buf[3]; - struct spi_message msg; - struct spi_transfer msg_xfer = { - .len = 3, - .cs_change = 0, - }; - int ret; - - spi_message_init(&msg); - - out_buf[0] = 0x86; - out_buf[1] = reg; - out_buf[2] = val; - - msg_xfer.tx_buf = out_buf; - msg_xfer.rx_buf = in_buf; - spi_message_add_tail(&msg_xfer, &msg); - - ret = spi_sync(tdmb_get_spi_handle(), &msg); - if (ret) - printk(KERN_ERR "[mtv818_spi_write] error: %d\n", ret); -} -#endif diff --git a/drivers/media/tdmb/mtv318/raontv_port.h b/drivers/media/tdmb/mtv318/raontv_port.h deleted file mode 100644 index 85b55d9..0000000 --- a/drivers/media/tdmb/mtv318/raontv_port.h +++ /dev/null @@ -1,432 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv_port.h - * - * Description : RAONTECH TV configuration header file. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __RAONTV_PORT_H__ -#define __RAONTV_PORT_H__ - -/*============================================================================== - * Includes the user header files if neccessry. - *============================================================================*/ -#if defined(__KERNEL__) /* Linux kernel */ -#include -#include -#include -#include -#include - -#elif defined(WINCE) -#include -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/*############################################################################## - # - # COMMON configurations - # - #############################################################################*/ -/*============================================================================== - * The slave address for I2C and SPI, the base address for EBI2. - *============================================================================*/ -#define RAONTV_CHIP_ADDR 0x86 - -/*============================================================================== - * Modifies the basic data types if neccessry. - *============================================================================*/ -#define BOOL int -#define S8 s8 -#define U8 u8 -#define S16 s16 -#define U16 u16 -#define S32 s32 -#define U32 u32 - -#define INT int -#define UINT unsigned int -#define LONG long -#define ULONG unsigned long - -#define INLINE inline - -/*============================================================================== - * Selects the TV mode(s) to target product. - *============================================================================*/ -/*#define RTV_ISDBT_ENABLE*/ -#define RTV_TDMB_ENABLE -/*#define RTV_FM_ENABLE*/ -/*#define RTV_DAB_ENABLE*/ - -/*============================================================================== - * Defines the package type of chip to target product. - *============================================================================*/ -#define RAONTV_CHIP_PKG_WLCSP /* MTV220/318*/ -/*#define RAONTV_CHIP_PKG_QFN // MTV818*/ -/* #define RAONTV_CHIP_PKG_LGA MTV250/350 */ -/*============================================================================== - * Defines the external source freqenecy in KHz. - * Ex> #define RTV_SRC_CLK_FREQ_KHz 36000 // 36MHz - *============================================================================== - * MTV250 : #define RTV_SRC_CLK_FREQ_KHz 32000 //must be defined - * MTV350 : #define RTV_SRC_CLK_FREQ_KHz 24576 //must be defined - *============================================================================*/ -#define RTV_SRC_CLK_FREQ_KHz 24576 - -/*============================================================================== - * Define the power type. - *============================================================================*/ -/*#define RTV_PWR_EXTERNAL*/ -#define RTV_PWR_LDO -/* #define RTV_PWR_DCDC */ - -/*============================================================================== - * Defines the I/O voltage. - *============================================================================*/ -#define RTV_IO_1_8V -/*#define RTV_IO_2_5V*/ -/*#define RTV_IO_3_3V*/ - -#if defined(RTV_IO_2_5V) || defined(RTV_IO_3_3V) -#error "If VDDIO pin is connected with IO voltage," - " RTV_IO_1_8V must be defined,please check the HW pin connection" -#error "If VDDIO pin is connected with GND," - " IO voltage must be defined same as AP IO voltage" -#endif - -/*============================================================================== - * Defines the Host interface. - *============================================================================*/ -/*#define RTV_IF_MPEG2_SERIAL_TSIF*/ /* I2C + TSIF Master Mode. */ -/*#define RTV_IF_MPEG2_PARALLEL_TSIF*/ /* I2C + TSIF Master Mode. - Support only 1seg &TDMB Application!*/ -/*#define RTV_IF_QUALCOMM_TSIF*/ /* I2C + TSIF Master Mode */ -#define RTV_IF_SPI /* AP: SPI Master Mode */ -/*#define RTV_IF_SPI_SLAVE*/ /* AP: SPI Slave Mode */ -/*#define RTV_IF_EBI2*/ /* External Bus Interface Slave Mode */ - -/*============================================================================== - * Defines the clear mode of interrupts for EBI/SPI in Individual mode . - *============================================================================*/ -#define RTV_MSC_INTR_ISTAUS_ACC_CLR_MODE /* for Nested ISR and TSIF. */ -/* #define RTV_MSC_INTR_MEM_ACC_CLR_MODE */ /* for NOT nested ISR.*/ - -/*============================================================================== - * Defines the delay macro in milliseconds. - *============================================================================*/ -#if defined(__KERNEL__)/* Linux kernel */ -#define RTV_DELAY_MS(ms) mdelay(ms) - -#elif defined(WINCE) -#define RTV_DELAY_MS(ms) Sleep(ms) - -#else -extern void mtv818_delay_ms(int ms); -#define RTV_DELAY_MS(ms) mtv818_delay_ms(ms) /* TODO */ -#endif - -/*============================================================================== - * Defines the debug message macro. - *============================================================================*/ -#if 1 -#define RTV_DBGMSG0(fmt) printk(fmt) -#define RTV_DBGMSG1(fmt, arg1) printk(fmt, arg1) -#define RTV_DBGMSG2(fmt, arg1, arg2) printk(fmt, arg1, arg2) -#define RTV_DBGMSG3(fmt, arg1, arg2, arg3) printk(fmt, arg1, arg2, arg3) -#else -/* To eliminates the debug messages. */ -#define RTV_DBGMSG0(fmt) ((void)0) -#define RTV_DBGMSG1(fmt, arg1) ((void)0) -#define RTV_DBGMSG2(fmt, arg1, arg2) ((void)0) -#define RTV_DBGMSG3(fmt, arg1, arg2, arg3) ((void)0) -#endif -/*#### End of Common ###########*/ - -/*############################################################################## - # - # ISDB-T specific configurations - # - #############################################################################*/ -/*============================================================================== - * Defines the NOTCH FILTER setting Enable. - * In order to reject GSM/CDMA blocker, NOTCH FILTER must be defined. - * This feature used for module company in the JAPAN. - *============================================================================*/ -/* -//#if defined(RTV_ISDBT_ENABLE) //Do not use -// #ifdef RAONTV_CHIP_PKG_WLCSP -// #define RTV_NOTCH_FILTER_ENABLE -// #endif -//#endif -*/ -/*############################################################################## - # - # T-DMB/DAB specific configurations - # - #############################################################################*/ -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) -#define RTV_FIC_POLLING_MODE - -/* Defines the maximum number of Sub Channel to be open simultaneously. */ -#define RTV_MAX_NUM_SUB_CHANNEL_USED 1 - -/* Defines CIF or Individual Mode for T-DMB/DAB BY RAONTECH. */ -/*#define RTV_CIF_MODE_ENABLED*/ -/*#define RTV_CIF_HEADER_INSERTED*/ -/* Select the copying method of CIF decoded data(FIC and MSC) - which copy_to_user() or memcpy() to fast operation for LINUX Kernel. */ -/*#define RTV_CIF_LINUX_USER_SPACE_COPY_USED*/ -#endif /* #if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) */ - -/*############################################################################## - # - # FM specific configurations - # - #############################################################################*/ -#define RTV_FM_CH_MIN_FREQ_KHz 76000 -#define RTV_FM_CH_MAX_FREQ_KHz 108000 -#define RTV_FM_CH_STEP_FREQ_KHz 100 /* in KHz */ -/*############################################################################## - # - # Host Interface specific configurations - # - #############################################################################*/ -#if defined(RTV_IF_MPEG2_SERIAL_TSIF) || defined(RTV_IF_QUALCOMM_TSIF) \ - || defined(RTV_IF_MPEG2_PARALLEL_TSIF) -#define RTV_IF_TSIF -#endif - -#if defined(RTV_IF_MPEG2_SERIAL_TSIF) || defined(RTV_IF_QUALCOMM_TSIF) - #define RTV_IF_SERIAL_TSIF -#endif - - -#if defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) -/*============================================================================== - * Defines the TSIF interface for MPEG2 or QUALCOMM TSIF. - *============================================================================*/ -/*#define RTV_TSIF_FORMAT_1*/ -/*#define RTV_TSIF_FORMAT_2*/ -#define RTV_TSIF_FORMAT_3 -/*#define RTV_TSIF_FORMAT_4*/ -/*#define RTV_TSIF_FORMAT_5*/ - -/*#define RTV_TSIF_CLK_SPEED_DIV_2 // Host Clk/2*/ -#define RTV_TSIF_CLK_SPEED_DIV_4 /* Host Clk/4 */ -/*#define RTV_TSIF_CLK_SPEED_DIV_6 // Host Clk/6*/ -/*#define RTV_TSIF_CLK_SPEED_DIV_8 // Host Clk/8*/ - -/*========================================================================== - * Defines the register I/O macros. - *========================================================================*/ -unsigned char mtv818_i2c_read(U8 reg); -void mtv818_i2c_read_burst(U8 reg, U8 *buf, int size); -void mtv818_i2c_write(U8 reg, U8 val); -#define RTV_REG_GET(reg) \ - mtv818_i2c_read((U8)(reg)) -#define RTV_REG_BURST_GET(reg, buf, size) \ - mtv818_i2c_read_burst((U8)(reg), buf, size) -#define RTV_REG_SET(reg, val) \ - mtv818_i2c_write((U8)(reg), (U8)(val)) -#define RTV_REG_MASK_SET(reg, mask, val)\ -do { \ - U8 tmp; \ - tmp = (RTV_REG_GET(reg)|(U8)(mask)) & (U8)((~(mask))|(val)); \ - RTV_REG_SET(reg, tmp); \ -} while (0) - -#elif defined(RTV_IF_SPI) -/*========================================================================= - * Defines the register I/O macros. - *========================================================================*/ -unsigned char mtv_spi_read(unsigned char reg); -void mtv_spi_read_burst(unsigned char reg, unsigned char *buf, int size); -void mtv_spi_write(unsigned char reg, unsigned char val); - -#define RTV_REG_GET(reg) \ - (U8)mtv_spi_read((U8)(reg)) -#define RTV_REG_BURST_GET(reg, buf, size) \ - mtv_spi_read_burst((U8)(reg), buf, size) -#define RTV_REG_SET(reg, val) \ - mtv_spi_write((U8)(reg), (U8)(val)) -#define RTV_REG_MASK_SET(reg, mask, val) \ -do { \ - U8 tmp; \ - tmp = (RTV_REG_GET(reg)|(U8)(mask)) & (U8)((~(mask))|(val)); \ - RTV_REG_SET(reg, tmp); \ -} while (0) - - - -#else -#error "Must define the interface definition !" -#endif - -#if defined(RTV_IF_SPI) \ - || ((defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE)) \ - && !defined(RTV_FIC_POLLING_MODE)) -#if defined(__KERNEL__) -extern struct mutex raontv_guard; -#define RTV_GUARD_INIT mutex_init(&raontv_guard) -#define RTV_GUARD_LOCK mutex_lock(&raontv_guard) -#define RTV_GUARD_FREE mutex_unlock(&raontv_guard) -#define RTV_GUARD_DEINIT ((void)0) - -#elif defined(WINCE) -extern CRITICAL_SECTION raontv_guard; -#define RTV_GUARD_INIT InitializeCriticalSection(&raontv_guard) -#define RTV_GUARD_LOCK EnterCriticalSection(&raontv_guard) -#define RTV_GUARD_FREE LeaveCriticalSection(&raontv_guard) -#define RTV_GUARD_DEINIT DeleteCriticalSection(&raontv_guard) -#else -/* temp: TODO */ -#define RTV_GUARD_INIT ((void)0) -#define RTV_GUARD_LOCK ((void)0) -#define RTV_GUARD_FREE ((void)0) -#define RTV_GUARD_DEINIT ((void)0) -#endif - -#else -#define RTV_GUARD_INIT ((void)0) -#define RTV_GUARD_LOCK ((void)0) -#define RTV_GUARD_FREE ((void)0) -#define RTV_GUARD_DEINIT ((void)0) -#endif - -#if defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE)\ -|| defined(__KERNEL__) || defined(WINCE) - #ifdef RTV_MSC_INTR_MEM_ACC_CLR_MODE - #undef RTV_MSC_INTR_MEM_ACC_CLR_MODE - #endif - - #ifndef RTV_MSC_INTR_ISTAUS_ACC_CLR_MODE - #define RTV_MSC_INTR_ISTAUS_ACC_CLR_MODE - #endif -#endif - - -/*============================================================================== - * Check erros - *============================================================================*/ -#if !defined(RAONTV_CHIP_PKG_WLCSP) \ - && !defined(RAONTV_CHIP_PKG_QFN) \ - && !defined(RAONTV_CHIP_PKG_LGA) -#error "Must define the package type !" -#endif - -#if !defined(RTV_PWR_EXTERNAL) \ - && !defined(RTV_PWR_LDO) \ - && !defined(RTV_PWR_DCDC) -#error "Must define the power type !" -#endif - -#if !defined(RTV_IO_1_8V) \ - && !defined(RTV_IO_2_5V) \ - && !defined(RTV_IO_3_3V) -#error "Must define I/O voltage!" -#endif - -#if defined(RTV_IF_MPEG2_SERIAL_TSIF) \ - || defined(RTV_IF_SPI_SLAVE) \ - || defined(RTV_IF_MPEG2_PARALLEL_TSIF) \ - || defined(RTV_IF_QUALCOMM_TSIF) \ - || defined(RTV_IF_SPI) -#if (RAONTV_CHIP_ADDR >= 0xFF) -#error "Invalid chip address" -#endif -#elif defined(RTV_IF_EBI2) -#if (RAONTV_CHIP_ADDR <= 0xFF) -#error "Invalid chip address" -#endif - -#else -#error "Must define the interface definition !" -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) -#ifndef RTV_MAX_NUM_SUB_CHANNEL_USED -#error "Should be define!" -#endif - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -#if (RTV_MAX_NUM_SUB_CHANNEL_USED < 0) || (RTV_MAX_NUM_SUB_CHANNEL_USED > 5) -#error "Must from 1 to 5" -#endif -#else -#if (RTV_MAX_NUM_SUB_CHANNEL_USED < 0) || (RTV_MAX_NUM_SUB_CHANNEL_USED > 4) -#error "Must from 1 to 4" -#endif -#endif -#else -#ifdef RTV_MAX_NUM_SUB_CHANNEL_USED -#undef RTV_MAX_NUM_SUB_CHANNEL_USED -#define RTV_MAX_NUM_SUB_CHANNEL_USED 1 /* To not make error. */ -#else -#define RTV_MAX_NUM_SUB_CHANNEL_USED 1 -#endif -#endif - -#ifdef RTV_IF_MPEG2_PARALLEL_TSIF -#if defined(RTV_FM_ENABLE) \ - || defined(RTV_DAB_ENABLE) \ - || defined(RAONTV_CHIP_PKG_WLCSP) \ - || defined(RAONTV_CHIP_PKG_LGA) -#error "Not support parallel TSIF!" -#endif - -#if defined(RTV_TDMB_ENABLE) && (RTV_MAX_NUM_SUB_CHANNEL_USED > 1) -#error "Not support T-DMB multi sub channel mode!" -#endif - -#if defined(RTV_DAB_ENABLE) && (RTV_MAX_NUM_SUB_CHANNEL_USED > 1) -#error "Not support DAB multi sub channel mode!" -#endif -#endif - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -#if !defined(RTV_MSC_INTR_MEM_ACC_CLR_MODE) \ - && !defined(RTV_MSC_INTR_ISTAUS_ACC_CLR_MODE) -#error " Should selects an interrupt clear mode" -#endif - -#if defined(RTV_MSC_INTR_MEM_ACC_CLR_MODE) \ - && defined(RTV_MSC_INTR_ISTAUS_ACC_CLR_MODE) -#error " Should selects an interrupt clear mode" -#endif -#endif - -#if defined(RTV_DAB_ENABLE) && defined(RTV_TDMB_ENABLE) -#error "Should select RTV_DAB_ENABLE(B3, L-BAND, B3-Korea) " - "or RTV_TDMB_ENABLE(B3-Korea)" -#endif - -#if defined(RTV_CIF_HEADER_INSERTED) && !defined(RTV_CIF_MODE_ENABLED) -#error "Should defines RTV_CIF_MODE_ENABLED" -#endif - -void rtvOEM_ConfigureInterrupt(void); -void rtvOEM_PowerOn(int on); - -#ifdef __cplusplus -} -#endif - -#endif /* __RAONTV_PORT_H__ */ - diff --git a/drivers/media/tdmb/mtv318/raontv_rf.c b/drivers/media/tdmb/mtv318/raontv_rf.c deleted file mode 100644 index d4e436a..0000000 --- a/drivers/media/tdmb/mtv318/raontv_rf.c +++ /dev/null @@ -1,1532 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv_rf.c - * - * Description : RAONTECH TV RF services source driver. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "raontv_rf.h" - -#if defined(RTV_ISDBT_ENABLE) -#include "raontv_rf_pll_data_isdbt.h" -#endif - -#if defined(RTV_TDMB_ENABLE) -#include "raontv_rf_pll_data_tdmb.h" -#endif - -#if defined(RTV_FM_ENABLE) -#include "raontv_rf_pll_data_fm.h" -#endif - -#if defined(RTV_DAB_ENABLE) -#include "raontv_rf_pll_data_dab.h" -#include "raontv_rf_pll_data_tdmb.h" -#endif - -#include "raontv_rf_adc_data.h" - -#ifdef RTV_ISDBT_ENABLE - -static const RTV_REG_INIT_INFO t_ISDBT_INIT[] = { - { 0x27, 0x6a}, - { 0x2a, 0x07}, - { 0x2B, 0x88}, - { 0x2d, 0xec}, - { 0x2e, 0xb0}, - { 0x31, 0x04}, - { 0x34, 0xc0}, - { 0x3a, 0x77}, - { 0x3b, 0xff}, - { 0x3c, 0x79}, - { 0x3e, 0x67}, - { 0x3f, 0x00}, - { 0x42, 0x14}, - { 0x44, 0x40}, - { 0x47, 0xc0}, - { 0x49, 0x4f}, - { 0x4a, 0x10}, - { 0x4b, 0x80}, - { 0x53, 0x20}, - { 0x55, 0xfc}, - { 0x57, 0x10}, - { 0x5a, 0x83}, - { 0x60, 0x13}, - { 0x6b, 0x85}, -#if defined(RAONTV_CHIP_PKG_QFN) - { 0x6c, 0x8d}, - { 0x6d, 0x7d}, - -#elif defined(RAONTV_CHIP_PKG_WLCSP) - { 0x6c, 0x80}, - { 0x6d, 0x70}, - -#elif defined(RAONTV_CHIP_PKG_LGA) - { 0x6c, 0x80}, - { 0x6d, 0x70}, -#else -#error "Code not present" -#endif - { 0x72, 0xb0}, - { 0x73, 0xca}, - { 0x77, 0x89}, - { 0x84, 0x87}, - { 0x85, 0x95}, - { 0x86, 0x42}, - { 0x87, 0x60}, - { 0x8a, 0xf6}, - { 0x8b, 0x89}, - { 0x8c, 0x78}, - { 0x90, 0x07}, - { 0x93, 0x2F}, - { 0xb5, 0x1b}, - { 0xae, 0x37}, - { 0xc0, 0x31}, - { 0xc1, 0xe8}, - { 0xc3, 0xa2}, - { 0xc4, 0xac}, - { 0xc6, 0xeb}, - { 0xca, 0x38}, - { 0xcb, 0x8c}, - { 0xcd, 0xa1}, - { 0xce, 0xfc}, - { 0xd0, 0x3f}, - { 0xd4, 0x13}, - { 0xd5, 0xf9}, - { 0xd7, 0xa6}, - { 0xd8, 0xac}, - { 0xd9, 0x16}, - { 0xda, 0x79}, - { 0xde, 0x37}, - { 0xdf, 0x3d}, - { 0xe1, 0xa0}, - { 0xe2, 0x0c}, - { 0xe4, 0x3a}, - { 0xa5, 0x00}, - { 0xe9, 0xc1}, - /*CKO_D24_EN = 0, CK_16M clock, SET_IIR clock disable*/ - { 0xae, 0x77}, - { 0xe9, 0xd1} - /*CKO_D24_EN = 1, CK_16M clock, SET_IIR clock enable*/ -}; -#endif /* RTV_ISDBT_ENABLE */ - -#ifdef RTV_FM_ENABLE -static const RTV_REG_INIT_INFO t_FM_INIT[] = { - { 0x27, 0xc2}, - { 0x2B, 0x88}, - { 0x2d, 0xec}, - { 0x2e, 0xb0}, - { 0x31, 0x04}, - { 0x34, 0xf8}, - { 0x3a, 0x55}, - { 0x3b, 0x73}, - { 0x3c, 0x00}, - { 0x3e, 0x00}, - { 0x3f, 0x00}, - { 0x40, 0x10}, - { 0x42, 0x40}, - { 0x44, 0x64}, - { 0x47, 0xb1}, - { 0x4b, 0x80}, - { 0x53, 0x20}, - { 0x55, 0xd6}, - { 0x5a, 0x83}, - { 0x57, 0x10}, - { 0x60, 0x11}, - { 0x6b, 0xc5}, - { 0x72, 0xf0}, - { 0x73, 0xc8}, - { 0x74, 0x70}, - { 0x77, 0x80}, - { 0x78, 0x47}, - { 0x86, 0x80}, - { 0x87, 0x98}, - { 0x8a, 0xf6}, - { 0x8b, 0x80}, - { 0x8c, 0x74}, - { 0xaf, 0x01}, - { 0xb5, 0x5b}, - { 0xae, 0x37}, - { 0xbd, 0x3f}, - { 0xbe, 0x37}, - { 0xbf, 0x3c}, - { 0xc0, 0x3f}, - { 0xc1, 0x39}, - { 0xc3, 0xdb}, - { 0xc4, 0x3c}, - { 0xc5, 0x1e}, - { 0xc6, 0x6c}, - { 0xc8, 0x7b}, - { 0xc9, 0xec}, - { 0xca, 0x39}, - { 0xcb, 0x03}, - { 0xcd, 0xb4}, - { 0xce, 0xec}, - { 0xcf, 0x1d}, - { 0xd0, 0xa6}, - { 0xd1, 0x41}, - { 0xd2, 0x16}, - { 0xd3, 0xec}, - { 0xd4, 0x3f}, - { 0xd5, 0xc3}, - { 0xd7, 0xbd}, - { 0xd8, 0xbc}, - { 0xd9, 0x1b}, - { 0xda, 0x4b}, - { 0xdb, 0x3b}, - { 0xdc, 0x55}, - { 0xdd, 0xdc}, - { 0xde, 0x1a}, - { 0xdf, 0xed}, - { 0xe1, 0xa7}, - { 0xe2, 0xcc}, - { 0xe3, 0x1a}, - { 0xe4, 0x55}, - { 0xe5, 0x43}, - { 0xe6, 0x00}, - { 0xe7, 0x0f}, - { 0xa5, 0x00}, - { 0xe9, 0x41}, - { 0xae, 0x77}, - { 0xe9, 0x51} -}; -#endif /* RTV_FM_ENABLE */ - -#ifdef RTV_DAB_ENABLE -static const RTV_REG_INIT_INFO t_DAB_INIT[] = { - { 0x27, 0x96}, - { 0x2B, 0x88}, - { 0x2d, 0xec}, - { 0x2e, 0xb0}, - { 0x31, 0x04}, - { 0x34, 0xf8}, - { 0x35, 0x14}, - { 0x3a, 0x62}, - { 0x3b, 0x74}, - { 0x3c, 0xa8}, - { 0x43, 0x36}, - { 0x44, 0x70}, - { 0x46, 0x07}, - { 0x49, 0x1f}, - { 0x4a, 0x50}, - { 0x4b, 0x80}, - { 0x53, 0x20}, - { 0x55, 0xd6}, - { 0x5a, 0x83}, - { 0x60, 0x13}, - { 0x6b, 0x85}, - { 0x6e, 0x88}, - { 0x6f, 0x78}, - { 0x72, 0xf0}, - { 0x73, 0xca}, - { 0x77, 0x80}, - { 0x78, 0x47}, - { 0x84, 0x80}, - { 0x85, 0x90}, - { 0x86, 0x80}, - { 0x87, 0x98}, - { 0x8a, 0xf6}, - { 0x8b, 0x80}, - { 0x8c, 0x75}, - { 0x8f, 0xf9}, - { 0x90, 0x91}, - { 0x93, 0x2d}, - { 0x94, 0x23}, - { 0x99, 0x77}, - { 0x9a, 0x2d}, - { 0x9b, 0x1e}, - { 0x9c, 0x47}, - { 0x9d, 0x3a}, - { 0x9e, 0x03}, - { 0x9f, 0x1e}, - { 0xa0, 0x22}, - { 0xa1, 0x33}, - { 0xa2, 0x51}, - { 0xa3, 0x36}, - { 0xa4, 0x0c}, - { 0xae, 0x37}, - { 0xb5, 0x9b}, - { 0xbd, 0x45}, - { 0xbe, 0x68}, - { 0xbf, 0x5c}, - { 0xc0, 0x33}, - { 0xc1, 0xca}, - { 0xc2, 0x43}, - { 0xc3, 0x90}, - { 0xc4, 0xec}, - { 0xc5, 0x17}, - { 0xc6, 0xda}, - { 0xc7, 0x41}, - { 0xc8, 0x49}, - { 0xc9, 0xbc}, - { 0xca, 0x3a}, - { 0xcb, 0x20}, - { 0xcc, 0x43}, - { 0xcd, 0xa6}, - { 0xce, 0x4c}, - { 0xcf, 0x1f}, - { 0xd0, 0x8d}, - { 0xd1, 0x3d}, - { 0xd2, 0xdf}, - { 0xd3, 0xa4}, - { 0xd4, 0x30}, - { 0xd5, 0x00}, - { 0xd6, 0x41}, - { 0xd7, 0x81}, - { 0xd8, 0xd0}, - { 0xd9, 0x00}, - { 0xda, 0x00}, - { 0xdb, 0x41}, - { 0xdc, 0x6d}, - { 0xdd, 0xac}, - { 0xde, 0x39}, - { 0xdf, 0x4e}, - { 0xe0, 0x43}, - { 0xe1, 0xa0}, - { 0xe2, 0x4c}, - { 0xe3, 0x1d}, - { 0xe4, 0x99}, - { 0xe5, 0x3b}, - { 0xe6, 0x00}, - { 0xe7, 0x0d}, - { 0xa5, 0x00}, - { 0xe9, 0x41}, - { 0xae, 0x77}, - { 0xe9, 0x51} -}; - -static const RTV_REG_INIT_INFO t_BAND3_INIT[] = { - { 0x27, 0x96}, - { 0x34, 0xf8}, - { 0x3b, 0x74}, - { 0x43, 0x36}, - { 0x44, 0x70}, - { 0x46, 0x07}, - { 0x49, 0x1f}, - { 0x4a, 0x50}, - { 0x55, 0xd6}, - { 0x60, 0x13}, - { 0x6e, 0x88}, - { 0x6f, 0x78}, - { 0x84, 0x80}, - { 0x85, 0x90}, - { 0x86, 0x80}, - { 0x87, 0x98}, - { 0x8b, 0x80}, - { 0x8c, 0x75}, - { 0x8f, 0xf9}, - { 0x90, 0x91}, - { 0x93, 0x2d}, - { 0x94, 0x23} -}; - -static const RTV_REG_INIT_INFO t_LBAND_INIT[] = { - { 0x27, 0x3e}, - { 0x34, 0x70}, - { 0x3b, 0xf7}, - { 0x43, 0x34}, - { 0x44, 0x00}, - { 0x46, 0x03}, - { 0x49, 0xbf}, - { 0x4a, 0x18}, - { 0x55, 0xfa}, - { 0x60, 0x43}, - { 0x6e, 0x80}, - { 0x6f, 0x70}, - { 0x84, 0x70}, - { 0x85, 0x98}, - { 0x86, 0x70}, - { 0x87, 0x88}, - { 0x8b, 0x86}, - { 0x8c, 0x7a}, - { 0x8f, 0xfa}, - { 0x90, 0x05}, - { 0x93, 0x2f}, - { 0x94, 0x26} - -}; - -static const RTV_REG_INIT_INFO t_DAB_TDMB_INIT[] = { - - { 0x27, 0x96}, - { 0x34, 0xf8}, - { 0x3a, 0x62}, - { 0x3b, 0x74}, - { 0x3c, 0x81}, - { 0x3d, 0x48}, - { 0x43, 0x36}, - { 0x44, 0x70}, - { 0x46, 0x07}, - { 0x49, 0x1f}, - { 0x4a, 0x50}, - { 0x55, 0xd6}, - { 0x60, 0x13}, - { 0x6e, 0x88}, - { 0x6f, 0x78}, - { 0x84, 0x80}, - { 0x85, 0x90}, - { 0x86, 0x80}, - { 0x87, 0x98}, - { 0x8b, 0x80}, - { 0x8c, 0x75}, - { 0x8f, 0xf9}, - { 0x90, 0x91}, - { 0x93, 0x2d}, - { 0x94, 0x23} - -}; -#endif /* RTV_DAB_ENABLE */ - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO t_TDMB_INIT[] = { - { 0x2B, 0x88 }, - { 0x2d, 0xec }, - { 0x2e, 0xb0 }, - { 0x31, 0x04 }, - { 0x34, 0xf8 }, - { 0x3a, 0x62 }, - { 0x3b, 0x74 }, - { 0x3c, 0x81 }, - { 0x3d, 0x48 }, - { 0x4b, 0x80 }, - { 0x53, 0x20 }, - { 0x55, 0xd6 }, - { 0x5a, 0x83 }, - { 0x60, 0x13 }, - { 0x6b, 0x85 }, - { 0x72, 0xf0 }, - { 0x73, 0xca }, - { 0x77, 0x80 }, - { 0x78, 0x47 }, - { 0x85, 0x90 }, - { 0x86, 0x80 }, - { 0x87, 0x98 }, - { 0x8a, 0xf6 }, - { 0x8b, 0x80 }, - { 0x8c, 0x75 }, - { 0x8f, 0xf9 }, - { 0x90, 0x91 }, - { 0x94, 0x23 }, - { 0x99, 0x77 }, - { 0x9a, 0x2d }, - { 0x9b, 0x1e }, - { 0x9c, 0x47 }, - { 0x9d, 0x3a }, - { 0x9e, 0x03 }, - { 0x9f, 0x1e }, - { 0xa0, 0x22 }, - { 0xa1, 0x33 }, - { 0xa2, 0x51 }, - { 0xa3, 0x36 }, - { 0xa4, 0x0c }, - { 0xae, 0x37 }, - { 0xb5, 0x9b }, - { 0xbd, 0x45 }, - { 0xbe, 0x68 }, - { 0xbf, 0x5c }, - { 0xc0, 0x33 }, - { 0xc1, 0xca }, - { 0xc2, 0x43 }, - { 0xc3, 0x90 }, - { 0xc4, 0xec }, - { 0xc5, 0x17 }, - { 0xc6, 0xda }, - { 0xc7, 0x41 }, - { 0xc8, 0x49 }, - { 0xc9, 0xbc }, - { 0xca, 0x3a }, - { 0xcb, 0x20 }, - { 0xcc, 0x43 }, - { 0xcd, 0xa6 }, - { 0xce, 0x4c }, - { 0xcf, 0x1f }, - { 0xd0, 0x8d }, - { 0xd1, 0x3d }, - { 0xd2, 0xdf }, - { 0xd3, 0xa4 }, - { 0xd4, 0x30 }, - { 0xd5, 0x00 }, - { 0xd6, 0x41 }, - { 0xd7, 0x81 }, - { 0xd8, 0xd0 }, - { 0xd9, 0x00 }, - { 0xda, 0x00 }, - { 0xdb, 0x41 }, - { 0xdc, 0x6d }, - { 0xdd, 0xac }, - { 0xde, 0x39 }, - { 0xdf, 0x4e }, - { 0xe0, 0x43 }, - { 0xe1, 0xa0 }, - { 0xe2, 0x4c }, - { 0xe3, 0x1d }, - { 0xe4, 0x99 }, - { 0xe5, 0x3b }, - { 0xe6, 0x00 }, - { 0xe7, 0x0d }, - { 0xa5, 0x00 }, - { 0xe9, 0x41 }, - { 0xae, 0x77 }, - { 0xe9, 0x51 } }; -#endif /* RTV_TDMB_ENABLE */ - -/*============================================================================== - * rtvRF_ConfigurePowerType - * - * DESCRIPTION : - * This function returns - * - * - * ARGUMENTS : none. - * RETURN VALUE : none. - *============================================================================*/ -void rtvRF_ConfigurePowerType(enum E_RTV_TV_MODE_TYPE eTvMode) -{ -#if defined(RTV_IO_2_5V) - U8 io_type = 0; -#elif defined(RTV_IO_3_3V) - U8 io_type = 1; -#elif defined(RTV_IO_1_8V) - U8 io_type = 2; -#else -#error "Code not present" -#endif - U8 REG2F = 0x61; /*DCDC_OUTSEL = 0x03,*/ - U8 REG30 = 0xF2 & 0xF0; /*IOLDOCON__REG*/ - U8 REG52 = 0x07; /*LDODIG_HT = 0x07;*/ - U8 REG54 = 0x0C; - - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - REG54 = 0x1C; - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: - REG54 = 0x1C; - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: - REG54 = 0x1C; - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - case RTV_TV_MODE_TDMB: - REG54 = 0x1C; - break; -#endif - default: - return; - } - - REG30 = REG30 | (io_type << 1); /*IO Type Select.*/ - -#if defined(RTV_PWR_EXTERNAL) - REG2F = REG2F | 0x14; /*PDDCDC_I2C = 1, PDLDO12_I2C = 1 ;*/ -#elif defined(RTV_PWR_LDO) - REG2F = REG2F | 0x10; /*PDDCDC_I2C = 1, PDLDO12_I2C = 0 ;*/ -#elif defined(RTV_PWR_DCDC) - REG2F = REG2F | 0x04; /*PDDCDC_I2C = 0, PDLDO12_I2C = 1 ;*/ -#else -#error "Code not present" -#endif - - /* Below Power Up sequence is very important.*/ - RTV_REG_MAP_SEL(RF_PAGE); - RTV_REG_SET(0x54, REG54); - RTV_REG_SET(0x52, REG52); - RTV_REG_SET(0x30, REG30); - RTV_REG_SET(0x2F, REG2F); -} - -#define REGE8 (0x46 & 0xC0) -#define REGEA (0x07 & 0xC0) -#define REGEB (0x27 & 0xC0) -#define REGEC (0x1E & 0xC0) -#define REGED (0x18 & 0x00) -#define REGEE (0xB8 & 0x00) - -INT rtvRF_ConfigureAdcClock( - enum E_RTV_TV_MODE_TYPE eTvMode, - enum E_RTV_ADC_CLK_FREQ_TYPE eAdcClkFreqType) -{ - U8 REGE9, RD15; - INT i; - const U8 *pbAdcClkSynTbl = - (const U8 *) &g_abAdcClkSynTbl[eAdcClkFreqType]; - - if (pbAdcClkSynTbl[0] == 0xFF) { - RTV_DBGMSG1("[rtvRF_ConfigureAdcClock] " - "Unsupport ADC clock type: %d\n", eAdcClkFreqType); - return RTV_UNSUPPORT_ADC_CLK; - } - - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - REGE9 = (0xD4 & 0xF0); - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: - REGE9 = (0x54 & 0xF0); - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: - REGE9 = (0x54 & 0xF0); - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_TDMB: - case RTV_TV_MODE_DAB_L: - REGE9 = (0x54 & 0xF0); - break; -#endif - default: - return RTV_INVAILD_TV_MODE; - } - - RTV_REG_MAP_SEL(RF_PAGE); - RTV_REG_SET(0xE8, (REGE8 | pbAdcClkSynTbl[0])); - RTV_REG_SET(0xE9, (REGE9 | pbAdcClkSynTbl[1])); - RTV_REG_SET(0xEA, (REGEA | pbAdcClkSynTbl[2])); - RTV_REG_SET(0xEB, (REGEB | pbAdcClkSynTbl[3])); - RTV_REG_SET(0xEC, (REGEC | pbAdcClkSynTbl[4])); - RTV_REG_SET(0xED, (REGED | pbAdcClkSynTbl[5])); - RTV_REG_SET(0xEE, (REGEE | pbAdcClkSynTbl[6])); - - for (i = 0; i < 10; i++) { - RD15 = RTV_REG_GET(0x15) & 0x01; - if (RD15) { - break; - } else { - RTV_DBGMSG0("[rtvRF_ConfigureAdcClock] " - "CLOCK SYNTH 1st step UnLock..\n"); - } - RTV_DELAY_MS(1); - } - - if (i == 10) { - RTV_DBGMSG0("[rtvRF_ConfigureAdcClock] " - "ADC clock unlocked!Check the power supply.\n"); - return RTV_ADC_CLK_UNLOCKED; - } - -#ifdef RTV_ISDBT_ENABLE - if (eTvMode == RTV_TV_MODE_1SEG) { - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x1A, 0x8B); - RTV_REG_SET(0x18, 0xC0); - RTV_REG_SET(0x19, 0x03); - RTV_REG_SET(0x07, 0xF0); - } -#endif - - /* Save the ADC clock type.*/ - g_eRtvAdcClkFreqType = eAdcClkFreqType; - - /*RTV_DBGMSG1("[rtvRF_ConfigureAdcClock] " - "ADC clk Type: %d\n", g_eRtvAdcClkFreqType[RaonTvChipIdx]);*/ - - return RTV_SUCCESS; -} - -INT rtvRF_ChangeAdcClock( - enum E_RTV_TV_MODE_TYPE eTvMode, - enum E_RTV_ADC_CLK_FREQ_TYPE eAdcClkFreqType) -{ - U8 REGE9, RD15; -#ifdef RTV_PWR_DCDC - U8 RD2F; -#endif - INT i; - const U8 *pbAdcClkSynTbl = - (const U8 *) &g_abAdcClkSynTbl[eAdcClkFreqType]; - - if (eAdcClkFreqType == g_eRtvAdcClkFreqType) - return RTV_SUCCESS; - - if (pbAdcClkSynTbl[0] == 0xFF) { - RTV_DBGMSG1("[rtvRF_ChangeAdcClock] " - "Unsupport ADC clock type: %d\n", eAdcClkFreqType); - return RTV_UNSUPPORT_ADC_CLK; - } - - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - REGE9 = (0xD4 & 0xF0); - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: - REGE9 = (0x54 & 0xF0); - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: - REGE9 = (0x54 & 0xF0); - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - case RTV_TV_MODE_TDMB: - REGE9 = (0x54 & 0xF0); - break; -#endif - default: - return RTV_INVAILD_TV_MODE; - } - - RTV_REG_MAP_SEL(RF_PAGE); - -#ifdef RTV_PWR_DCDC - RD2F = RTV_REG_GET(0x2F); - RTV_REG_SET(0x2F, (RD2F & 0xF7)); -#endif - - RTV_REG_SET(0xE8, (REGE8 | pbAdcClkSynTbl[0])); - RTV_REG_SET(0xE9, (REGE9 | pbAdcClkSynTbl[1])); - RTV_REG_SET(0xEA, (REGEA | pbAdcClkSynTbl[2])); - RTV_REG_SET(0xEB, (REGEB | pbAdcClkSynTbl[3])); - RTV_REG_SET(0xEC, (REGEC | pbAdcClkSynTbl[4])); - RTV_REG_SET(0xED, (REGED | pbAdcClkSynTbl[5])); - RTV_REG_SET(0xEE, (REGEE | pbAdcClkSynTbl[6])); - - for (i = 0; i < 10; i++) { - RD15 = RTV_REG_GET(0x15) & 0x01; - if (RD15) { - break; - } else { - RTV_DBGMSG0("[rtvRF_ChangeAdcClock] " - "CLOCK SYNTH 1st step UnLock..\n"); - } - RTV_DELAY_MS(1); - } - - if (i == 10) { - RTV_DBGMSG0("[rtvRF_ChangeAdcClock] " - "ADC clock unlocked!Check the power supply.\n"); - return RTV_ADC_CLK_UNLOCKED; - } - - switch (eAdcClkFreqType) { - case RTV_ADC_CLK_FREQ_8_MHz: - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x19, 0xff); - RTV_REG_SET(0x1a, 0x08); - RTV_REG_SET(0x1b, 0x82); - RTV_REG_SET(0x1c, 0x20); - - RTV_REG_SET(0x45, 0x10); - RTV_REG_SET(0x46, 0x04); - RTV_REG_SET(0x47, 0x41); - RTV_REG_SET(0x48, 0x10); - - RTV_REG_SET(0x49, 0x00); - RTV_REG_SET(0x4a, 0x00); - RTV_REG_SET(0x4b, 0x00); - RTV_REG_SET(0x4c, 0xF0); - break; -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) - case RTV_TV_MODE_TDMB: - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x6A, 0x01); - - RTV_REG_MAP_SEL(0x06); - RTV_REG_SET(0x3c, 0x4B); - RTV_REG_SET(0x3d, 0x37); - RTV_REG_SET(0x3e, 0x89); - RTV_REG_SET(0x3f, 0x41); - RTV_REG_SET(0x54, 0x58); - break; -#endif - default: - break; - } /* End of switch(eTvMode) */ - break; - - case RTV_ADC_CLK_FREQ_8_192_MHz: - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x19, 0xfd); - RTV_REG_SET(0x1a, 0xfc); - RTV_REG_SET(0x1b, 0xbe); - RTV_REG_SET(0x1c, 0x1f); - - RTV_REG_SET(0x45, 0xF7); - RTV_REG_SET(0x46, 0x7D); - RTV_REG_SET(0x47, 0xDF); - RTV_REG_SET(0x48, 0x0F); - - RTV_REG_SET(0x49, 0x00); - RTV_REG_SET(0x4a, 0x00); - RTV_REG_SET(0x4b, 0x60); - RTV_REG_SET(0x4c, 0xF0); - break; -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) - case RTV_TV_MODE_TDMB: - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x6A, 0x01); - - RTV_REG_MAP_SEL(0x06); - RTV_REG_SET(0x3c, 0x00); - RTV_REG_SET(0x3d, 0x00); - RTV_REG_SET(0x3e, 0x00); - RTV_REG_SET(0x3f, 0x40); - RTV_REG_SET(0x54, 0x58); -#endif - default: - break; - } /* End of switch(eTvMode) */ - break; - - case RTV_ADC_CLK_FREQ_9_MHz: - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x19, 0xe4); - RTV_REG_SET(0x1a, 0x5c); - RTV_REG_SET(0x1b, 0xe5); - RTV_REG_SET(0x1c, 0x1c); - - RTV_REG_SET(0x45, 0x47); - RTV_REG_SET(0x46, 0xAE); - RTV_REG_SET(0x47, 0x72); - RTV_REG_SET(0x48, 0x0E); - - RTV_REG_SET(0x49, 0x72); - RTV_REG_SET(0x4a, 0x1C); - RTV_REG_SET(0x4b, 0xC7); - RTV_REG_SET(0x4c, 0xF1); - break; -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) - case RTV_TV_MODE_TDMB: - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x6A, 0x21); - - RTV_REG_MAP_SEL(0x06); - RTV_REG_SET(0x3c, 0xB5); - RTV_REG_SET(0x3d, 0x14); - RTV_REG_SET(0x3e, 0x41); - RTV_REG_SET(0x3f, 0x3A); - RTV_REG_SET(0x54, 0x58); - break; -#endif - default: - break; - } /* End of switch(eTvMode) */ - break; - - case RTV_ADC_CLK_FREQ_9_6_MHz: - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x19, 0xd7); - RTV_REG_SET(0x1a, 0x08); - RTV_REG_SET(0x1b, 0x17); - RTV_REG_SET(0x1c, 0x1b); - - RTV_REG_SET(0x45, 0x62); - RTV_REG_SET(0x46, 0x83); - RTV_REG_SET(0x47, 0x8B); - RTV_REG_SET(0x48, 0x0D); - - RTV_REG_SET(0x49, 0xAB); - RTV_REG_SET(0x4a, 0xAA); - RTV_REG_SET(0x4b, 0xAA); - RTV_REG_SET(0x4c, 0xF2); - break; -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) - case RTV_TV_MODE_TDMB: - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x6A, 0x31); - - RTV_REG_MAP_SEL(0x06); - RTV_REG_SET(0x3c, 0x69); - RTV_REG_SET(0x3d, 0x03); - RTV_REG_SET(0x3e, 0x9D); - RTV_REG_SET(0x3f, 0x36); - RTV_REG_SET(0x54, 0x58); - break; -#endif - default: - break; - } /* End of switch(eTvMode) */ - break; - - default: - break; - } /* End of switch(eAdcClkFreqType) */ - -#ifdef RTV_PWR_DCDC - RTV_REG_MAP_SEL(RF_PAGE); - RD15 = RTV_REG_GET(0x15) & 0x01; - if (RD15) { - RTV_REG_SET(0x2F, RD2F); - } else { - RTV_DBGMSG0("[rtvRF_ChangeAdcClock] " - "DCDC CLOCK SYNTH UnLock..\n"); - } -#endif - - /*Save the ADC clock type. */ - g_eRtvAdcClkFreqType = eAdcClkFreqType; - - /*RTV_DBGMSG1("[rtvRF_ChangeAdcClock] " - "ADC clk Type: %d\n", g_eRtvAdcClkFreqType[RaonTvChipIdx]);*/ - - return RTV_SUCCESS; -} - -INT rtvRF_SetFrequency(enum E_RTV_TV_MODE_TYPE eTvMode, - UINT nChNum, - U32 dwChFreqKHz) -{ -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) - int nIdx; -#endif - -#ifdef RTV_DAB_ENABLE - UINT nNumTblEntry = 0; - const RTV_REG_INIT_INFO *ptInitTbl = NULL; -#endif -#ifdef RTV_NOTCH_FILTER_ENABLE - U8 notch_nIdx; -#endif - INT nRet = RTV_SUCCESS; - enum E_RTV_ADC_CLK_FREQ_TYPE eAdcClkFreqType = RTV_ADC_CLK_FREQ_8_MHz; - U32 dwPllNF = 0, rd_dwPllNF_Verify_val, wr_dwPllNF_Verify_val; - U8 RD15; - U32 PLL_Verify_cnt = 10; - - /* Get the PLLNF and ADC clock type. */ - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - if ((g_eRtvCountryBandType == RTV_COUNTRY_BAND_BRAZIL) - || (g_eRtvCountryBandType == RTV_COUNTRY_BAND_ARGENTINA)) - nChNum -= 1; - - switch (nChNum) { - case 14: case 22: case 38: case 46: case 54: - eAdcClkFreqType = g_aeAdcClkTypeTbl_ISDBT[1]; - break; - /*case 30:*/ - case 30: - case 61: - eAdcClkFreqType = g_aeAdcClkTypeTbl_ISDBT[2]; - break; - default: - eAdcClkFreqType = g_aeAdcClkTypeTbl_ISDBT[0]; - break; - } - dwPllNF = ISDBT_AUTO_PLLNF; - -#ifdef RTV_NOTCH_FILTER_ENABLE /*=> RTV_1SEG_NOTCH_FILTER_ENABLE ??*/ - switch (nChNum) { - /*notch filter value need to tuning*/ - case 14: - notch_nIdx = 0; - break; - default: - notch_nIdx = 0; - } -#endif - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: - dwPllNF = g_atPllNF_FM[ - (dwChFreqKHz - FM_MIN_FREQ_KHz)/FM_SCAN_STEP_FREQ_KHz]; - eAdcClkFreqType = g_eRtvAdcClkFreqType; /* Only init adc clock type. */ - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: - if (g_eRtvCountryBandType == RTV_COUNTRY_BAND_KOREA) { - nIdx = (dwChFreqKHz - TDMB_CH_FREQ_START__KOREA) - / TDMB_CH_FREQ_STEP__KOREA; - - if (dwChFreqKHz >= 205280) - nIdx -= 2; - else if (dwChFreqKHz >= 193280) - nIdx -= 1; - - eAdcClkFreqType = g_aeAdcClkTypeTbl_TDMB[nIdx]; - dwPllNF = g_atPllNF_TDMB_Korea[nIdx]; - } - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - if (g_curDabSetType != RTV_TV_MODE_DAB_B3) { - ptInitTbl = t_BAND3_INIT; - nNumTblEntry = sizeof(t_BAND3_INIT) - / sizeof(RTV_REG_INIT_INFO); - - RTV_REG_MAP_SEL(RF_PAGE); - do { - RTV_REG_SET(ptInitTbl->bReg, ptInitTbl->bVal); - ptInitTbl++; - } while (--nNumTblEntry); - - g_curDabSetType = RTV_TV_MODE_DAB_B3; - } - - nIdx = (dwChFreqKHz - DAB_CH_BAND3_START_FREQ_KHz) - / DAB_CH_BAND3_STEP_FREQ_KHz; - - if (dwChFreqKHz >= 224096) - nIdx += 3; - else if (dwChFreqKHz >= 217008) - nIdx += 2; - else if (dwChFreqKHz >= 210096) - nIdx += 1; - - eAdcClkFreqType = g_aeAdcClkTypeTbl_DAB_B3[nIdx]; - dwPllNF = g_atPllNF_DAB_BAND3[nIdx]; - break; - - case RTV_TV_MODE_TDMB: - if (g_curDabSetType != RTV_TV_MODE_TDMB) { - ptInitTbl = t_DAB_TDMB_INIT; - nNumTblEntry = sizeof(t_DAB_TDMB_INIT) - / sizeof(RTV_REG_INIT_INFO); - RTV_REG_MAP_SEL(RF_PAGE); - do { - RTV_REG_SET(ptInitTbl->bReg, ptInitTbl->bVal); - ptInitTbl++; - } while (--nNumTblEntry); - } - - /*if(g_eRtvCountryBandType == RTV_COUNTRY_BAND_KOREA)*/ - { - nIdx = (dwChFreqKHz - TDMB_CH_FREQ_START__KOREA) - / TDMB_CH_FREQ_STEP__KOREA; - - if (dwChFreqKHz >= 205280) - nIdx -= 2; - else if (dwChFreqKHz >= 193280) - nIdx -= 1; - - eAdcClkFreqType = g_aeAdcClkTypeTbl_TDMB[nIdx]; - dwPllNF = g_atPllNF_TDMB_Korea[nIdx]; - g_curDabSetType = RTV_TV_MODE_TDMB; - } - break; - - case RTV_TV_MODE_DAB_L: - if (g_curDabSetType != RTV_TV_MODE_DAB_L) { - ptInitTbl = t_LBAND_INIT; - nNumTblEntry = sizeof(t_LBAND_INIT) - / sizeof(RTV_REG_INIT_INFO); - RTV_REG_MAP_SEL(RF_PAGE); - do { - RTV_REG_SET(ptInitTbl->bReg, ptInitTbl->bVal); - ptInitTbl++; - } while (--nNumTblEntry); - - g_curDabSetType = RTV_TV_MODE_DAB_L; - } - - nIdx = (dwChFreqKHz - DAB_CH_LBAND_START_FREQ_KHz) - / DAB_CH_LBAND_STEP_STEP_FREQ_KHz; - - eAdcClkFreqType = g_aeAdcClkTypeTbl_DAB_L[nIdx]; - dwPllNF = g_atPllNF_DAB_LBAND[nIdx]; - break; -#endif - - default: - nRet = RTV_INVAILD_TV_MODE; - goto RF_SET_FREQ_EXIT; - } - - g_fRtvChannelChange = TRUE; - - nRet = rtvRF_ChangeAdcClock(eTvMode, eAdcClkFreqType); - if (nRet != RTV_SUCCESS) - goto RF_SET_FREQ_EXIT; - - RTV_REG_MAP_SEL(RF_PAGE); - - /* Set the PLLNF and channel. */ - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: -#ifdef RTV_NOTCH_FILTER_ENABLE - RTV_REG_SET(0x21, (notch_nIdx<<4) | 0x01); - /*notch filter value need to tuning*/ -#endif - - RTV_REG_SET(0x20, nChNum); - RTV_DELAY_MS(2); /*2ms Delay*/ - - wr_dwPllNF_Verify_val = ( - dwPllNF + (((ISDBT_AUTO_PLL_NFSTEP * 8) & 0xFFFFF0) - * (nChNum >> 3)) - + ((nChNum & 0x07) * (ISDBT_AUTO_PLL_NFSTEP & 0xFFFFF0)) - ) >> 1; - - do { - RD15 = RTV_REG_GET(0x15); - rd_dwPllNF_Verify_val = - (RTV_REG_GET(0x12) << 22) - + (RTV_REG_GET(0x13) << 14) - +(RTV_REG_GET(0x14) << 6) + (RD15 >> 2); - - if ((wr_dwPllNF_Verify_val == rd_dwPllNF_Verify_val) - || (wr_dwPllNF_Verify_val - == (U32)(rd_dwPllNF_Verify_val >> 1))) { - - if ((RD15 & 0x02) == 0x02) - break; - else { - RTV_REG_SET(0x20, nChNum); - RTV_DELAY_MS(2); /*2ms Delay*/ - } - } else { - RTV_REG_SET(0x20, nChNum); - RTV_DELAY_MS(2); /*2ms Delay*/ - /*RTV_DBGMSG3("[rtvRF_SetFrequency] " - "1SEG PLL verify Re-Try!!!" - "PLLNF_I2C = 0x%0x" - "RD_PLLNF = 0x%0x RD_PLLNF*2 = 0x%0x\n", - wr_dwPllNF_Verify_val, - rd_dwPllNF_Verify_val, - rd_dwPllNF_Verify_val>>1);*/ - } - } while (--PLL_Verify_cnt); - - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x11, 0x07); - RTV_REG_SET(0x11, 0x06); - RTV_REG_MAP_SEL(FEC_PAGE); - RTV_REG_SET(0x10, 0x01); - RTV_REG_SET(0x10, 0x00); - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: - RTV_REG_SET(0x23, (dwPllNF>>22)&0xFF); - RTV_REG_SET(0x24, (dwPllNF>>14)&0xFF); - RTV_REG_SET(0x25, (dwPllNF>>6)&0xFF); - RTV_REG_SET(0x26, (((dwPllNF&0x0000003F)<<2)) | 0x00); - RTV_DELAY_MS(1); /*1ms Delay*/ - RTV_REG_SET(0x20, 0x00); - - RTV_DELAY_MS(2);/*2ms Delay*/ - wr_dwPllNF_Verify_val = dwPllNF>>1; - - do { - RD15 = RTV_REG_GET(0x15); - rd_dwPllNF_Verify_val = - (RTV_REG_GET(0x12) << 22) - + (RTV_REG_GET(0x13) << 14) - + (RTV_REG_GET(0x14) << 6) + (RD15 >> 2); - - if (((dwPllNF & ~0x1) == (rd_dwPllNF_Verify_val & ~0x1)) - || (wr_dwPllNF_Verify_val == rd_dwPllNF_Verify_val)) { - - if ((RD15 & 0x02) == 0x02) - break; - else { - RTV_REG_SET(0x20, 0x00); - RTV_DELAY_MS(2); /*2ms Delay*/ - } - } else { - RTV_REG_SET(0x20, 0x00); - RTV_DELAY_MS(2); /*2ms Delay*/ - /*RTV_DBGMSG3("[rtvRF_SetFrequency] " - "FM PLL verify Re-Try!!! " - "PLLNF_I2C = 0x%0x, " - "PLLNF_I2C/2 = 0x%0x, " - "RD_PLLNF = 0x%0x\n", - dwPllNF & ~0x1, - wr_dwPllNF_Verify_val, - rd_dwPllNF_Verify_val & ~0x1);*/ - } - } while (--PLL_Verify_cnt); - - RTV_REG_MAP_SEL(0x06); /* ofdm */ - RTV_REG_SET(0x10, 0x48); - RTV_REG_SET(0x10, 0xC9); - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: - RTV_REG_SET(0x23, (dwPllNF >> 22) & 0xFF); - RTV_REG_SET(0x24, (dwPllNF >> 14) & 0xFF); - RTV_REG_SET(0x25, (dwPllNF >> 6) & 0xFF); - RTV_REG_SET(0x26, (((dwPllNF & 0x0000003F) << 2)) | 0x00); - RTV_DELAY_MS(1); - /*1ms Delay*/ - RTV_REG_SET(0x20, 0x00); - - RTV_DELAY_MS(2); - /*2ms Delay*/ - wr_dwPllNF_Verify_val = dwPllNF >> 1; - - do { - RD15 = - RTV_REG_GET(0x15); - rd_dwPllNF_Verify_val = (RTV_REG_GET(0x12) << 22) - + (RTV_REG_GET(0x13) << 14) - + (RTV_REG_GET(0x14) << 6) - + (RD15 >> 2); - - /*RTV_DBGMSG3("[rtvRF_SetFrequency] " - "TDMB PLL PLLNF_I2C = 0x%0x, " - "PLLNF_I2C/2 = 0x%0x, " - "RD_PLLNF = 0x%0x\n", - dwPllNF & ~0x1, - wr_dwPllNF_Verify_val, - rd_dwPllNF_Verify_val & ~0x1);*/ - - if (((dwPllNF & ~0x1) == (rd_dwPllNF_Verify_val & ~0x1)) - || (wr_dwPllNF_Verify_val - == rd_dwPllNF_Verify_val)) { - - if ((RD15 & 0x02) == 0x02) - break; - else { - RTV_REG_SET(0x20, 0x00); - RTV_DELAY_MS(2); - /*2ms Delay*/ - } - } else { - RTV_REG_SET(0x20, 0x00); - RTV_DELAY_MS(2); - /*2ms Delay*/ - RTV_DBGMSG3("[rtvRF_SetFrequency] " - "TDMB PLL verify Re-Try!!! " - "PLLNF_I2C = 0x%0x, " - "PLLNF_I2C/2 = 0x%0x, " - "RD_PLLNF = 0x%0x\n", - dwPllNF & ~0x1, - wr_dwPllNF_Verify_val, - rd_dwPllNF_Verify_val & ~0x1); - } - } while (--PLL_Verify_cnt); - - RTV_REG_MAP_SEL(0x06); - /*ofdm*/ - RTV_REG_SET(0x10, 0x48); - RTV_REG_SET(0x10, 0xC9); - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - case RTV_TV_MODE_DAB_L: - case RTV_TV_MODE_TDMB: - RTV_REG_SET(0x23, (dwPllNF>>22)&0xFF); - RTV_REG_SET(0x24, (dwPllNF>>14)&0xFF); - RTV_REG_SET(0x25, (dwPllNF>>6)&0xFF); - RTV_REG_SET(0x26, (((dwPllNF&0x0000003F)<<2)) | eTvMode); - RTV_DELAY_MS(1); /*1ms Delay*/ - RTV_REG_SET(0x20, 0x00); - - RTV_DELAY_MS(2); /*2ms Delay*/ - wr_dwPllNF_Verify_val = dwPllNF>>1; - - do { - RD15 = RTV_REG_GET(0x15); - rd_dwPllNF_Verify_val = - (RTV_REG_GET(0x12) << 22) - + (RTV_REG_GET(0x13) << 14) - +(RTV_REG_GET(0x14) << 6) + (RD15 >> 2); - - if (((dwPllNF & ~0x1) == (rd_dwPllNF_Verify_val & ~0x1)) - || (wr_dwPllNF_Verify_val - == rd_dwPllNF_Verify_val)) { - if ((RD15 & 0x02) == 0x02) - break; - else { - RTV_REG_SET(0x20, 0x00); - RTV_DELAY_MS(2); /*2ms Delay*/ - } - } else { - RTV_REG_SET(0x20, 0x00); - RTV_DELAY_MS(2); /*2ms Delay*/ - /*RTV_DBGMSG3("[rtvRF_SetFrequency] " - "DAB PLL verify Re-Try!!! " - "PLLNF_I2C = 0x%0x, " - "PLLNF_I2C/2 = 0x%0x, " - "RD_PLLNF = 0x%0x\n", - dwPllNF & ~0x1, - wr_dwPllNF_Verify_val, - rd_dwPllNF_Verify_val & ~0x1);*/ - } - } while (--PLL_Verify_cnt); - - RTV_REG_MAP_SEL(0x06); /* ofdm */ - RTV_REG_SET(0x10, 0x48); - RTV_REG_SET(0x10, 0xC9); - break; -#endif - - default: - break; - } - - if (PLL_Verify_cnt == 0) { - RTV_DBGMSG0("[rtvRF_SetFrequency] PLL unlocked!\n"); - nRet = RTV_PLL_UNLOCKED; - goto RF_SET_FREQ_EXIT; - } - - RTV_DELAY_MS(1); - /*1ms Delay*/ - -RF_SET_FREQ_EXIT: - g_fRtvChannelChange = FALSE; - - return nRet; -} - -INT rtvRF_Initilize(enum E_RTV_TV_MODE_TYPE eTvMode) -{ - UINT nNumTblEntry = 0, nNumAutoInit = 0; - const struct RTV_REG_INIT_INFO *ptInitTbl = NULL; - const struct RTV_REG_INIT_INFO *ptLNA = NULL; - const struct RTV_REG_MASK_INFO *ptAutoCh = NULL; - U32 dwAutoPllNF = 0, dwAutoPllNFSTEP = 0; - - g_fRtvChannelChange = FALSE; - - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - ptInitTbl = t_ISDBT_INIT; - nNumTblEntry = sizeof(t_ISDBT_INIT) / sizeof(struct RTV_REG_INIT_INFO); - ptLNA = g_atAutoLnaInitData_ISDBT; - ptAutoCh = g_atAutoChInitData_ISDBT; - nNumAutoInit = sizeof(g_atAutoChInitData_ISDBT) - / sizeof(RTV_REG_MASK_INFO); - dwAutoPllNF = ISDBT_AUTO_PLLNF; - dwAutoPllNFSTEP = ISDBT_AUTO_PLL_NFSTEP; - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: - ptInitTbl = t_FM_INIT; - nNumTblEntry = sizeof(t_FM_INIT) / sizeof(struct RTV_REG_INIT_INFO); - ptLNA = g_atAutoLnaInitData_FM; - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: - ptInitTbl = t_TDMB_INIT; - nNumTblEntry = sizeof(t_TDMB_INIT) / sizeof(struct RTV_REG_INIT_INFO); - ptLNA = g_atAutoLnaInitData_TDMB; - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - ptInitTbl = t_DAB_INIT; - nNumTblEntry = sizeof(t_DAB_INIT) / sizeof(struct RTV_REG_INIT_INFO); - ptLNA = g_atAutoLnaInitData_DAB; - g_curDabSetType = RTV_TV_MODE_DAB_B3; - break; -#endif - - default: - return RTV_INVAILD_TV_MODE; - } - - RTV_REG_MAP_SEL(RF_PAGE); - - do { - RTV_REG_SET(ptInitTbl->bReg, ptInitTbl->bVal); - ptInitTbl++; - } while (--nNumTblEntry); - - /* Auto LNA */ - RTV_REG_SET(ptLNA[0].bReg, ptLNA[0].bVal); - RTV_REG_SET(ptLNA[1].bReg, ptLNA[1].bVal); - - /* Auto channel setting. */ - if (eTvMode == RTV_TV_MODE_1SEG) { - do { - RTV_REG_MASK_SET( - ptAutoCh->bReg, - ptAutoCh->bMask, - ptAutoCh->bVal); - ptAutoCh++; - } while (--nNumAutoInit); - - RTV_REG_SET(0x23, (dwAutoPllNF>>22)&0xFF); - RTV_REG_SET(0x24, (dwAutoPllNF>>14)&0xFF); - RTV_REG_SET(0x25, (dwAutoPllNF>>6)&0xFF); - - RTV_REG_SET(0x26, ((dwAutoPllNF&0x0000003F) << 2) | eTvMode); - - RTV_REG_SET(0x62, (dwAutoPllNFSTEP >> 16) & 0xFF); - RTV_REG_SET(0x63, (dwAutoPllNFSTEP >> 8) & 0xFF); - RTV_REG_SET(0x64, (dwAutoPllNFSTEP & 0xFF)); - -#ifdef RAONTV_CHIP_PKG_WLCSP - if (RTV_REG_GET(0x01) == 0x09) - RTV_REG_SET(0x21, 0xF1); -#endif - } - -#ifdef RTV_PWR_DCDC - { - U8 RD15 = RTV_REG_GET(0x15) & 0x01; - U8 RD2F = RTV_REG_GET(0x2F); - if (RD15) { - RD2F |= 0x08; - RTV_REG_SET(0x2F, RD2F); - } else { - RTV_DBGMSG0("[rtvRF_Initilize] Clock Unlock\n"); - } - } -#endif -/****************CODE PATCH FOR OTP****************/ - if (((U16) (RTV_REG_GET(0x10) << 8) - | (U16) (RTV_REG_GET(0x11))) != 0xFFFF) { - - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - RTV_REG_SET(0x2C, 0x48); - RTV_REG_SET(0x47, 0xE0); - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: - RTV_REG_SET(0x2C, 0x48); - RTV_REG_SET(0x47, 0xE1); - RTV_REG_SET(0x35, 0x14); - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: - RTV_REG_SET(0x2C, 0x48); - RTV_REG_SET(0x47, 0xC0); - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - RTV_REG_SET(0x2C, 0x48); - RTV_REG_SET(0x47, 0xE0); - RTV_REG_SET(0x35, 0x04); - break; -#endif - default: - return RTV_INVAILD_TV_MODE; - } - - RTV_REG_SET(0x2A, 0x05); - RTV_REG_SET(0x2D, 0x8c); - RTV_REG_SET(0x61, 0x25); - } else { - switch (eTvMode) { -#ifdef RTV_ISDBT_ENABLE - case RTV_TV_MODE_1SEG: - RTV_REG_SET(0x2C, 0xC8); - RTV_REG_SET(0x47, 0xC0); - break; -#endif - -#ifdef RTV_FM_ENABLE - case RTV_TV_MODE_FM: - RTV_REG_SET(0x2C, 0xC8); - RTV_REG_SET(0x47, 0xB1); - RTV_REG_SET(0x35, 0x14); - break; -#endif - -#ifdef RTV_TDMB_ENABLE - case RTV_TV_MODE_TDMB: - RTV_REG_SET(0x2C, 0xC8); - RTV_REG_SET(0x47, 0xB0); - break; -#endif - -#ifdef RTV_DAB_ENABLE - case RTV_TV_MODE_DAB_B3: - RTV_REG_SET(0x2C, 0xC8); - RTV_REG_SET(0x47, 0xB0); - RTV_REG_SET(0x35, 0x04); - break; -#endif - default: - return RTV_INVAILD_TV_MODE; - } - - RTV_REG_SET(0x2A, 0x07); - RTV_REG_SET(0x2D, 0xec); - RTV_REG_SET(0x61, 0x2a); - } -/****************CODE PATCH FOR OTP****************/ - - return RTV_SUCCESS; -} - diff --git a/drivers/media/tdmb/mtv318/raontv_rf.h b/drivers/media/tdmb/mtv318/raontv_rf.h deleted file mode 100644 index 9b20233..0000000 --- a/drivers/media/tdmb/mtv318/raontv_rf.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv_rf.h - * - * Description : RAONTECH TV RF services header file. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __RAONTV_RF_H__ -#define __RAONTV_RF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "raontv_internal.h" - -INT rtvRF_SetFrequency(enum E_RTV_TV_MODE_TYPE eTvMode, - UINT nChNum, - U32 dwFreqKHz); -INT rtvRF_ChangeAdcClock( - enum E_RTV_TV_MODE_TYPE eTvMode, - enum E_RTV_ADC_CLK_FREQ_TYPE eAdcClkFreqType); -INT rtvRF_ConfigureAdcClock( - enum E_RTV_TV_MODE_TYPE eTvMode, - enum E_RTV_ADC_CLK_FREQ_TYPE eAdcClkFreqType); -void rtvRF_ConfigurePowerType(enum E_RTV_TV_MODE_TYPE eTvMode); -INT rtvRF_Initilize(enum E_RTV_TV_MODE_TYPE eTvMode); - -#ifdef __cplusplus -} -#endif - -#endif /* __RAONTV_RF_H__ */ - diff --git a/drivers/media/tdmb/mtv318/raontv_rf_adc_data.h b/drivers/media/tdmb/mtv318/raontv_rf_adc_data.h deleted file mode 100644 index be21711..0000000 --- a/drivers/media/tdmb/mtv318/raontv_rf_adc_data.h +++ /dev/null @@ -1,1037 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv_rf_adc_data.h - * - * Description : RAONTECH TV RF ADC data header file. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#if (RTV_SRC_CLK_FREQ_KHz == 13000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /*Based 13MHz, 8MHz*/ - {0x0D, 0x01, 0x1F, 0x27, 0x07, 0x80, 0xB9}, - /*Based 13MHz, 8.192MHz*/ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /*Based 13MHz, 9MHz*/ - {0x0D, 0x01, 0x1F, 0x27, 0x07, 0xB0, 0xB9}, - /*Based 13MHz, 9.6MHz*/ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x99}, {0x39, 0x9C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x70}, {0x39, 0x5C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x70}, {0x39, 0x5C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x70}, {0x39, 0x6C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 16000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 16MHz, 8MHz External Clock4 */ - {0x04, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 16MHz, 8.192MHz*/ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 16MHz, 9MHz External Clock5 */ - {0x04, 0x01, 0x0F, 0x27, 0x07, 0x6C, 0xB8}, - /* Based 16MHz, 9.6MHz External Clock6 */ - {0x05, 0x01, 0x1F, 0x27, 0x07, 0x90, 0xB8} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x7D}, {0x39, 0x7C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x5B}, {0x39, 0x4C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x5B}, {0x39, 0x4C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x5B}, {0x39, 0x5C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 16384) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 16.384MHz, 8MHz External Clock8 */ - {0x10, 0x01, 0x1F, 0x27, 0x07, 0x77, 0xB9}, - /* Based 16.384MHz, 8.192MHz External Clock7 */ - {0x04, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 16.384MHz, 9MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 16.384MHz, 9.6MHz External Clock9 */ - {0x08, 0x01, 0x1F, 0x27, 0x06, 0xE1, 0xB8} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x7A}, {0x39, 0x7C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz -}; -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x59}, {0x39, 0x4C} -}; - -static const enum E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_TDMB[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/* 175280: 7A */, - RTV_ADC_CLK_FREQ_8_MHz/* 177008: 7B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 178736: 7C */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 181280: 8A */, - RTV_ADC_CLK_FREQ_8_MHz/* 183008: 8B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 184736: 8C */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 187280: 9A */, - RTV_ADC_CLK_FREQ_8_MHz/* 189008: 9B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 190736: 9C */, - RTV_ADC_CLK_FREQ_8_MHz/* 193280: 10A */, - RTV_ADC_CLK_FREQ_8_MHz/* 195008: 10B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 196736: 10C */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 199280: 11A */, - RTV_ADC_CLK_FREQ_8_MHz/* 201008: 11B */, - RTV_ADC_CLK_FREQ_8_MHz/* 202736: 11C */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 205280: 12A */, - RTV_ADC_CLK_FREQ_8_MHz/* 207008: 12B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 208736: 12C */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 211280: 13A */, - RTV_ADC_CLK_FREQ_8_MHz/* 213008: 13B */, - RTV_ADC_CLK_FREQ_8_MHz/* 214736: 13C */ -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x59}, {0x39, 0x4C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_DAB_B3[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/*5A : 174928*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*5B : 176640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*5C : 178352*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*5D : 180064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6A : 181936*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*6B : 183648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6C : 185360*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6D : 187072*/, - RTV_ADC_CLK_FREQ_8_MHz/*7A : 188928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7B : 190640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7C : 192352*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7D : 194064*/, - RTV_ADC_CLK_FREQ_8_MHz/*8A : 195936*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*8B : 197648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*8C : 199360*/, - RTV_ADC_CLK_FREQ_8_MHz/*8D : 201072*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*9A : 202928*/, - RTV_ADC_CLK_FREQ_8_MHz/*9B : 204640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*9C : 206352*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*9D : 208064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10A: 209936*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10N: 210096*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10B: 211648*/, - RTV_ADC_CLK_FREQ_8_MHz/*10C: 213360*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10D: 215072*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*11A: 216928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11N: 217008*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11B: 218640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11C: 220352*/, - RTV_ADC_CLK_FREQ_8_MHz/*11D: 222064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*12A: 223936*/, - RTV_ADC_CLK_FREQ_8_MHz/*12N: 224096*/, - RTV_ADC_CLK_FREQ_8_MHz/*12B: 225648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*12C: 227360*/, - RTV_ADC_CLK_FREQ_8_MHz/*12D: 229072*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13A: 230784*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13B: 232496*/, - RTV_ADC_CLK_FREQ_8_MHz/*13C: 234208*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13D: 235776*/, - RTV_ADC_CLK_FREQ_8_MHz/*13E: 237488*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13F: 239200*/ -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_DAB_L[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/*LA: 1452960*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LB: 1454672*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LC: 1456384*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LD: 1458096*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LE: 1459808*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LF: 1461520*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LG: 1463232*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LH: 1464944*/, - RTV_ADC_CLK_FREQ_8_MHz/*LI: 1466656*/, - RTV_ADC_CLK_FREQ_8_MHz/*LJ: 1468368*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LK: 1470080*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LL: 1471792*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LM: 1473504*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LN: 1475216*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LO: 1476928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LP: 1478640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LQ: 1480352*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LR: 1482064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LS: 1483776*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LT: 1485488*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LU: 1487200*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LV: 1488912*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LW: 1490624*/ - -}; - -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x59}, {0x39, 0x4C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 18000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 18MHz, 8MHz External Clock10 */ - {0x06, 0x01, 0x13, 0x25, 0x06, 0x80, 0xB4}, - /* Based 18MHz, 8.192MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 18MHz, 9MHz External Clock11*/ - {0x06, 0x01, 0x13, 0x25, 0x06, 0x90, 0xB4}, - /* Based 18MHz, 9.6MHz External Clock12*/ - {0x05, 0x01, 0x13, 0x25, 0x06, 0x80, 0xB4} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x6F}, {0x39, 0x6C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x51}, {0x39, 0x4C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x51}, {0x39, 0x4C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x51}, {0x39, 0x4C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 19200) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 19.2MHz, 8MHz */ - {0x04, 0x01, 0x0B, 0x23, 0x06, 0x50, 0xB0}, - /* Based 19.2MHz, 8.192MHz */ - {0x19, 0x01, 0x1F, 0x3A, 0x0A, 0x00, 0xA2}, - /* Based 19.2MHz, 9MHz */ - {0x04, 0x01, 0x0B, 0x23, 0x06, 0x5A, 0xB0}, - /* Based 19.2MHz, 9.6MHz */ - {0x04, 0x01, 0x0B, 0x23, 0x06, 0x60, 0xB0} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x68}, {0x39, 0x6C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x4C}, {0x39, 0x3C} -}; - -static const enum E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_TDMB[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/* 175280: 7A */, - RTV_ADC_CLK_FREQ_8_MHz/* 177008: 7B */, - RTV_ADC_CLK_FREQ_9_MHz/* 178736: 7C */, - RTV_ADC_CLK_FREQ_9_MHz/* 181280: 8A */, - RTV_ADC_CLK_FREQ_8_MHz/* 183008: 8B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 184736: 8C */, - RTV_ADC_CLK_FREQ_9_MHz/* 187280: 9A */, - RTV_ADC_CLK_FREQ_8_MHz/* 189008: 9B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 190736: 9C */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 193280: 10A */, - RTV_ADC_CLK_FREQ_8_MHz/* 195008: 10B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 196736: 10C */, - RTV_ADC_CLK_FREQ_9_MHz/* 199280: 11A */, - RTV_ADC_CLK_FREQ_8_MHz/* 201008: 11B */, - RTV_ADC_CLK_FREQ_8_MHz/* 202736: 11C */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 205280: 12A */, - RTV_ADC_CLK_FREQ_8_MHz/* 207008: 12B */, - RTV_ADC_CLK_FREQ_8_MHz/* 208736: 12C */, - RTV_ADC_CLK_FREQ_9_MHz/* 211280: 13A */, - RTV_ADC_CLK_FREQ_8_MHz/* 213008: 13B */, - RTV_ADC_CLK_FREQ_8_MHz/* 214736: 13C */ -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x4C}, {0x39, 0x3C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_DAB_B3[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/*5A : 174928*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*5B : 176640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*5C : 178352*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*5D : 180064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6A : 181936*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*6B : 183648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6C : 185360*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6D : 187072*/, - RTV_ADC_CLK_FREQ_8_MHz/*7A : 188928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7B : 190640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7C : 192352*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7D : 194064*/, - RTV_ADC_CLK_FREQ_8_MHz/*8A : 195936*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*8B : 197648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*8C : 199360*/, - RTV_ADC_CLK_FREQ_8_MHz/*8D : 201072*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*9A : 202928*/, - RTV_ADC_CLK_FREQ_8_MHz/*9B : 204640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*9C : 206352*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*9D : 208064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10A: 209936*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10N: 210096*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10B: 211648*/, - RTV_ADC_CLK_FREQ_8_MHz/*10C: 213360*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10D: 215072*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*11A: 216928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11N: 217008*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11B: 218640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11C: 220352*/, - RTV_ADC_CLK_FREQ_8_MHz/*11D: 222064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*12A: 223936*/, - RTV_ADC_CLK_FREQ_8_MHz/*12N: 224096*/, - RTV_ADC_CLK_FREQ_8_MHz/*12B: 225648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*12C: 227360*/, - RTV_ADC_CLK_FREQ_8_MHz/*12D: 229072*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13A: 230784*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13B: 232496*/, - RTV_ADC_CLK_FREQ_8_MHz/*13C: 234208*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13D: 235776*/, - RTV_ADC_CLK_FREQ_8_MHz/*13E: 237488*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13F: 239200*/ -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_DAB_L[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/*LA: 1452960*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LB: 1454672*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LC: 1456384*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LD: 1458096*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LE: 1459808*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LF: 1461520*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LG: 1463232*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LH: 1464944*/, - RTV_ADC_CLK_FREQ_8_MHz/*LI: 1466656*/, - RTV_ADC_CLK_FREQ_8_MHz/*LJ: 1468368*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LK: 1470080*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LL: 1471792*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LM: 1473504*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LN: 1475216*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LO: 1476928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LP: 1478640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LQ: 1480352*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LR: 1482064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LS: 1483776*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LT: 1485488*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LU: 1487200*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LV: 1488912*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LW: 1490624*/ -}; - -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x4C}, {0x39, 0x4C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 24000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 24MHz, 8MHz External Clock17 */ - {0x06, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 24MHz, 8.192MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 24MHz, 9MHz External Clock18 */ - {0x06, 0x01, 0x0F, 0x27, 0x07, 0x6C, 0xB8}, - /* Based 24MHz, 9.6MHz External Clock19 */ - {0x05, 0x01, 0x0B, 0x23, 0x06, 0x60, 0xB0} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x53}, {0x39, 0x5C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x3D}, {0x39, 0x3C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x3D}, {0x39, 0x3C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x3D}, {0x39, 0x3C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 24576) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 24.576MHz, 8MHz External Clock21 */ - {0x08, 0x01, 0x13, 0x25, 0x06, 0x7D, 0xB4}, - /* Based 24.576MHz, 8.192MHz External Clock20 */ - {0x06, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 24.576MHz, 9MHz *//* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 24.576MHz, 9.6MHz External Clock22 */ - {0x0C, 0x01, 0x1F, 0x27, 0x06, 0xE1, 0xB8} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x51}, {0x39, 0x4C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_8_192_MHz -}; -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x3B}, {0x39, 0x2C} -}; - -static const enum E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_TDMB[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/* 175280: 7A */, - RTV_ADC_CLK_FREQ_8_MHz/* 177008: 7B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 178736: 7C */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 181280: 8A */, - RTV_ADC_CLK_FREQ_8_MHz/* 183008: 8B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 184736: 8C */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 187280: 9A */, - RTV_ADC_CLK_FREQ_8_MHz/* 189008: 9B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 190736: 9C */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 193280: 10A */, - RTV_ADC_CLK_FREQ_8_MHz/* 195008: 10B */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 196736: 10C */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 199280: 11A */, - RTV_ADC_CLK_FREQ_8_MHz/* 201008: 11B */, - RTV_ADC_CLK_FREQ_8_MHz/* 202736: 11C */, - RTV_ADC_CLK_FREQ_9_6_MHz/* 205280: 12A */, - RTV_ADC_CLK_FREQ_8_MHz/* 207008: 12B */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 208736: 12C */, - RTV_ADC_CLK_FREQ_8_192_MHz/* 211280: 13A */, - RTV_ADC_CLK_FREQ_8_MHz/* 213008: 13B */, - RTV_ADC_CLK_FREQ_8_MHz/* 214736: 13C */ -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x3B}, {0x39, 0x2C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_DAB_B3[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/*5A : 174928*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*5B : 176640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*5C : 178352*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*5D : 180064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6A : 181936*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*6B : 183648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6C : 185360*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*6D : 187072*/, - RTV_ADC_CLK_FREQ_8_MHz/*7A : 188928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7B : 190640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7C : 192352*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*7D : 194064*/, - RTV_ADC_CLK_FREQ_8_MHz/*8A : 195936*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*8B : 197648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*8C : 199360*/, - RTV_ADC_CLK_FREQ_8_MHz/*8D : 201072*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*9A : 202928*/, - RTV_ADC_CLK_FREQ_8_MHz/*9B : 204640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*9C : 206352*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*9D : 208064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10A: 209936*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10N: 210096*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10B: 211648*/, - RTV_ADC_CLK_FREQ_8_MHz/*10C: 213360*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*10D: 215072*/, - RTV_ADC_CLK_FREQ_9_6_MHz/*11A: 216928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11N: 217008*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11B: 218640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*11C: 220352*/, - RTV_ADC_CLK_FREQ_8_MHz/*11D: 222064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*12A: 223936*/, - RTV_ADC_CLK_FREQ_8_MHz/*12N: 224096*/, - RTV_ADC_CLK_FREQ_8_MHz/*12B: 225648*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*12C: 227360*/, - RTV_ADC_CLK_FREQ_8_MHz/*12D: 229072*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13A: 230784*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13B: 232496*/, - RTV_ADC_CLK_FREQ_8_MHz/*13C: 234208*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13D: 235776*/, - RTV_ADC_CLK_FREQ_8_MHz/*13E: 237488*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*13F: 239200*/ -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_DAB_L[] = { - RTV_ADC_CLK_FREQ_8_192_MHz/*LA: 1452960*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LB: 1454672*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LC: 1456384*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LD: 1458096*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LE: 1459808*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LF: 1461520*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LG: 1463232*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LH: 1464944*/, - RTV_ADC_CLK_FREQ_8_MHz/*LI: 1466656*/, - RTV_ADC_CLK_FREQ_8_MHz/*LJ: 1468368*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LK: 1470080*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LL: 1471792*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LM: 1473504*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LN: 1475216*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LO: 1476928*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LP: 1478640*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LQ: 1480352*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LR: 1482064*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LS: 1483776*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LT: 1485488*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LU: 1487200*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LV: 1488912*/, - RTV_ADC_CLK_FREQ_8_192_MHz/*LW: 1490624*/ -}; - -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x3B}, {0x39, 0x6C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 26000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 26MHz, 8MHz External Clock23*/ - {0x0D, 0x01, 0x1F, 0x27, 0x06, 0xC0, 0xB8}, - /* Based 26MHz, 8.192MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 26MHz, 9MHz External Clock24 */ - {0x0D, 0x01, 0x1F, 0x27, 0x06, 0xD8, 0xB8}, - /* Based 26MHz, 9.6MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x4C}, {0x39, 0x4C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x38}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x38}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x38}, {0x39, 0x3C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 27000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 27MHz, 8MHz External Clock25 */ - {0x09, 0x01, 0x13, 0x25, 0x06, 0x80, 0xB4}, - /* Based 27MHz, 8.192MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 27MHz, 9MHz External Clock26 */ - {0x06, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 27MHz, 9.6MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x4A}, {0x39, 0x4C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x36}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x36}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x36}, {0x39, 0x2C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 32000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 32MHz, 8MHz External Clock27 */ - {0x08, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 32MHz, 8.192MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 32MHz, 9MHz External Clock28 */ - {0x08, 0x01, 0x0F, 0x27, 0x07, 0x6C, 0xB8}, - /* Based 32MHz, 9.6MHz External Clock29 */ - {0x0A, 0x01, 0x1F, 0x27, 0x07, 0x90, 0xB8} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x3E}, {0x39, 0x3C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x2D}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x2D}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x2D}, {0x39, 0x2C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 32768) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 32.768MHz, 8MHz External Clock31 */ - {0x20, 0x01, 0x1F, 0x27, 0x07, 0x77, 0xB9}, - /* Based 32.768MHz, 8.192MHz External Clock30 */ - {0x08, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 32.768MHz, 9MHz */ /* Unsupport Clock */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 32.768MHz, 9.6MHz External Clock32 */ - {0x10, 0x01, 0x1F, 0x27, 0x06, 0xE1, 0xB8} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x3D}, {0x39, 0x3C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x2C}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x2C}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x2C}, {0x39, 0x2C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 36000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 36MHz, 8MHz External Clock33 */ - {0x09, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 36MHz, 8.192MHz */ /* Unsupport */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 36MHz, 9MHz External Clock34 */ - {0x09, 0x01, 0x0F, 0x27, 0x07, 0x6C, 0xB8}, - /* Based 36MHz, 9.6MHz External Clock35 */ - {0x0A, 0x01, 0x13, 0x25, 0x06, 0x80, 0xB4} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x37}, {0x39, 0x3C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#if defined(RTV_TDMB_ENABLE) || defined(RTV_DAB_ENABLE) -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x28}, {0x39, 0x2C} -}; - - -static const enum E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_TDMB[] = { - RTV_ADC_CLK_FREQ_8_MHz/* 175280: 7A */, - RTV_ADC_CLK_FREQ_8_MHz/* 177008: 7B */, - RTV_ADC_CLK_FREQ_8_MHz/* 178736: 7C */, - RTV_ADC_CLK_FREQ_8_MHz/* 181280: 8A */, - RTV_ADC_CLK_FREQ_8_MHz/* 183008: 8B */, - RTV_ADC_CLK_FREQ_8_MHz/* 184736: 8C */, - RTV_ADC_CLK_FREQ_8_MHz/* 187280: 9A */, - RTV_ADC_CLK_FREQ_8_MHz/* 189008: 9B */, - RTV_ADC_CLK_FREQ_8_MHz/* 190736: 9C */, - RTV_ADC_CLK_FREQ_8_MHz/* 193280: 10A */, - RTV_ADC_CLK_FREQ_8_MHz/* 195008: 10B */, - RTV_ADC_CLK_FREQ_8_MHz/* 196736: 10C */, - RTV_ADC_CLK_FREQ_8_MHz/* 199280: 11A */, - RTV_ADC_CLK_FREQ_8_MHz/* 201008: 11B */, - RTV_ADC_CLK_FREQ_8_MHz/* 202736: 11C */, - RTV_ADC_CLK_FREQ_8_MHz/* 205280: 12A */, - RTV_ADC_CLK_FREQ_8_MHz/* 207008: 12B */, - RTV_ADC_CLK_FREQ_8_MHz/* 208736: 12C */, - RTV_ADC_CLK_FREQ_8_MHz/* 211280: 13A */, - RTV_ADC_CLK_FREQ_8_MHz/* 213008: 13B */, - RTV_ADC_CLK_FREQ_8_MHz/* 214736: 13C */ -}; - -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x28}, {0x39, 0x2C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_DAB_B3[] = { - RTV_ADC_CLK_FREQ_8_MHz/*5A : 174928*/, - RTV_ADC_CLK_FREQ_8_MHz/*5B : 176640*/, - RTV_ADC_CLK_FREQ_8_MHz/*5C : 178352*/, - RTV_ADC_CLK_FREQ_8_MHz/*5D : 180064*/, - RTV_ADC_CLK_FREQ_8_MHz/*6A : 181936*/, - RTV_ADC_CLK_FREQ_8_MHz/*6B : 183648*/, - RTV_ADC_CLK_FREQ_8_MHz/*6C : 185360*/, - RTV_ADC_CLK_FREQ_8_MHz/*6D : 187072*/, - RTV_ADC_CLK_FREQ_8_MHz/*7A : 188928*/, - RTV_ADC_CLK_FREQ_8_MHz/*7B : 190640*/, - RTV_ADC_CLK_FREQ_8_MHz/*7C : 192352*/, - RTV_ADC_CLK_FREQ_8_MHz/*7D : 194064*/, - RTV_ADC_CLK_FREQ_8_MHz/*8A : 195936*/, - RTV_ADC_CLK_FREQ_8_MHz/*8B : 197648*/, - RTV_ADC_CLK_FREQ_8_MHz/*8C : 199360*/, - RTV_ADC_CLK_FREQ_8_MHz/*8D : 201072*/, - RTV_ADC_CLK_FREQ_8_MHz/*9A : 202928*/, - RTV_ADC_CLK_FREQ_8_MHz/*9B : 204640*/, - RTV_ADC_CLK_FREQ_8_MHz/*9C : 206352*/, - RTV_ADC_CLK_FREQ_8_MHz/*9D : 208064*/, - RTV_ADC_CLK_FREQ_8_MHz/*10A: 209936*/, - RTV_ADC_CLK_FREQ_8_MHz/*10N: 210096*/, - RTV_ADC_CLK_FREQ_8_MHz/*10B: 211648*/, - RTV_ADC_CLK_FREQ_8_MHz/*10C: 213360*/, - RTV_ADC_CLK_FREQ_8_MHz/*10D: 215072*/, - RTV_ADC_CLK_FREQ_8_MHz/*11A: 216928*/, - RTV_ADC_CLK_FREQ_8_MHz/*11N: 217008*/, - RTV_ADC_CLK_FREQ_8_MHz/*11B: 218640*/, - RTV_ADC_CLK_FREQ_8_MHz/*11C: 220352*/, - RTV_ADC_CLK_FREQ_8_MHz/*11D: 222064*/, - RTV_ADC_CLK_FREQ_8_MHz/*12A: 223936*/, - RTV_ADC_CLK_FREQ_8_MHz/*12N: 224096*/, - RTV_ADC_CLK_FREQ_8_MHz/*12B: 225648*/, - RTV_ADC_CLK_FREQ_8_MHz/*12C: 227360*/, - RTV_ADC_CLK_FREQ_8_MHz/*12D: 229072*/, - RTV_ADC_CLK_FREQ_8_MHz/*13A: 230784*/, - RTV_ADC_CLK_FREQ_8_MHz/*13B: 232496*/, - RTV_ADC_CLK_FREQ_8_MHz/*13C: 234208*/, - RTV_ADC_CLK_FREQ_8_MHz/*13D: 235776*/, - RTV_ADC_CLK_FREQ_8_MHz/*13E: 237488*/, - RTV_ADC_CLK_FREQ_8_MHz/*13F: 239200*/ -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_DAB_L[] = { - - RTV_ADC_CLK_FREQ_8_MHz/*LA: 1452960*/, - RTV_ADC_CLK_FREQ_8_MHz/*LB: 1454672*/, - RTV_ADC_CLK_FREQ_8_MHz/*LC: 1456384*/, - RTV_ADC_CLK_FREQ_8_MHz/*LD: 1458096*/, - RTV_ADC_CLK_FREQ_8_MHz/*LE: 1459808*/, - RTV_ADC_CLK_FREQ_8_MHz/*LF: 1461520*/, - RTV_ADC_CLK_FREQ_8_MHz/*LG: 1463232*/, - RTV_ADC_CLK_FREQ_8_MHz/*LH: 1464944*/, - RTV_ADC_CLK_FREQ_8_MHz/*LI: 1466656*/, - RTV_ADC_CLK_FREQ_8_MHz/*LJ: 1468368*/, - RTV_ADC_CLK_FREQ_8_MHz/*LK: 1470080*/, - RTV_ADC_CLK_FREQ_8_MHz/*LL: 1471792*/, - RTV_ADC_CLK_FREQ_8_MHz/*LM: 1473504*/, - RTV_ADC_CLK_FREQ_8_MHz/*LN: 1475216*/, - RTV_ADC_CLK_FREQ_8_MHz/*LO: 1476928*/, - RTV_ADC_CLK_FREQ_8_MHz/*LP: 1478640*/, - RTV_ADC_CLK_FREQ_8_MHz/*LQ: 1480352*/, - RTV_ADC_CLK_FREQ_8_MHz/*LR: 1482064*/, - RTV_ADC_CLK_FREQ_8_MHz/*LS: 1483776*/, - RTV_ADC_CLK_FREQ_8_MHz/*LT: 1485488*/, - RTV_ADC_CLK_FREQ_8_MHz/*LU: 1487200*/, - RTV_ADC_CLK_FREQ_8_MHz/*LV: 1488912*/, - RTV_ADC_CLK_FREQ_8_MHz/*LW: 1490624*/ -}; - -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x28}, {0x39, 0x2C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 38400) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 38.4MHz, 8MHz External Clock36 */ - {0x08, 0x01, 0x0B, 0x23, 0x06, 0x50, 0xB0}, - /* Based 38.4MHz, 8.192MHz External Clock37 */ - {0x19, 0x01, 0x1F, 0x27, 0x06, 0x00, 0xB9}, - /* Based 38.4MHz, 9MHz External Clock38 */ - {0x08, 0x01, 0x0B, 0x23, 0x06, 0x5A, 0xB0}, - /* Based 38.4MHz, 9.6MHz External Clock39 */ - {0x0A, 0x01, 0x0F, 0x27, 0x07, 0x78, 0xB8} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x34}, {0x39, 0x3C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x26}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x26}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x26}, {0x39, 0x2C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 40000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 40MHz, 8MHz External Clock40 */ - {0x0A, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 40MHz, 8.192MHz */ /* Unsupport */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 40MHz, 9MHz External Clock41 */ - {0x0A, 0x01, 0x0F, 0x27, 0x07, 0x6C, 0xB8}, - /* Based 40MHz, 9.6MHz External Clock42 */ - {0x19, 0x01, 0x1F, 0x27, 0x06, 0x20, 0xB9} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x32}, {0x39, 0x3C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x24}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x24}, {0x39, 0x2C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x24}, {0x39, 0x2C} -}; -#endif - -#elif (RTV_SRC_CLK_FREQ_KHz == 48000) -static const U8 g_abAdcClkSynTbl[MAX_NUM_RTV_ADC_CLK_FREQ_TYPE][7] = { - /* Based 48MHz, 8MHz External Clock43 */ - {0x0C, 0x01, 0x0F, 0x27, 0x07, 0x60, 0xB8}, - /* Based 48MHz, 8.192MHz */ /* Unsupport */ - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - /* Based 48MHz, 9MHz External Clock44 */ - {0x0C, 0x01, 0x0F, 0x27, 0x07, 0x6C, 0xB8}, - /* Based 48MHz, 9.6MHz External Clock45 */ - {0x0A, 0x01, 0x0B, 0x23, 0x06, 0x60, 0xB0} -}; - -#ifdef RTV_ISDBT_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_ISDBT[] = { - {0x37, 0x29}, {0x39, 0x2C} -}; - -static const E_RTV_ADC_CLK_FREQ_TYPE g_aeAdcClkTypeTbl_ISDBT[] = { - RTV_ADC_CLK_FREQ_8_MHz, - RTV_ADC_CLK_FREQ_9_6_MHz, - RTV_ADC_CLK_FREQ_9_MHz -}; -#endif - -#ifdef RTV_TDMB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_TDMB[] = { - {0x37, 0x1E}, {0x39, 0x1C} -}; -#endif - -#ifdef RTV_DAB_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_DAB[] = { - {0x37, 0x1E}, {0x39, 0x1C} -}; -#endif - -#ifdef RTV_FM_ENABLE -static const struct RTV_REG_INIT_INFO g_atAutoLnaInitData_FM[] = { - {0x37, 0x1E}, {0x39, 0x2C} -}; -#endif - -#else -#error "Unsupport external clock freqency!" -#endif - diff --git a/drivers/media/tdmb/mtv318/raontv_rf_pll_data_tdmb.h b/drivers/media/tdmb/mtv318/raontv_rf_pll_data_tdmb.h deleted file mode 100644 index 0f5e132..0000000 --- a/drivers/media/tdmb/mtv318/raontv_rf_pll_data_tdmb.h +++ /dev/null @@ -1,412 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv_rf_pll_data_tdmb.h - * - * Description : RAONTECH TV RF PLL data header file. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#if (RTV_SRC_CLK_FREQ_KHz == 13000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x6BE2115/* 7A: 175280 */, - 0x6CF24B4/* 7B: 177008 */, - 0x6E02854/* 7C: 178736 */, - 0x6F934C6/* 8A: 181280 */, - 0x70A3866/* 8B: 183008 */, - 0x71B3C05/* 8C: 184736 */, - 0x7344877/* 9A: 187280 */, - 0x7454C17/* 9B: 189008 */, - 0x7564FB6/* 9C: 190736 */, - 0x76F5C28/* 10A: 193280 */, - 0x7805FC8/* 10B: 195008 */, - 0x7916368/* 10C: 196736 */, - 0x7AA6FDA/* 11A: 199280 */, - 0x7BB7379/* 11B: 201008 */, - 0x7CC7719/* 11C: 202736 */, - 0x7E5838B/* 12A: 205280 */, - 0x7F6872B/* 12B: 207008 */, - 0x8078ACA/* 12C: 208736 */, - 0x820973C/* 13A: 211280 */, - 0x8319ADC/* 13B: 213008 */, - 0x8429E7B/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 16000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x57A7AE1/* 7A: 175280 */, - 0x5884DD2/* 7B: 177008 */, - 0x59620C4/* 7C: 178736 */, - 0x5AA7AE1/* 8A: 181280 */, - 0x5B84DD2/* 8B: 183008 */, - 0x5C620C4/* 8C: 184736 */, - 0x5DA7AE1/* 9A: 187280 */, - 0x5E84DD2/* 9B: 189008 */, - 0x5F620C4/* 9C: 190736 */, - 0x60A7AE1/* 10A: 193280 */, - 0x6184DD2/* 10B: 195008 */, - 0x62620C4/* 10C: 196736 */, - 0x63A7AE1/* 11A: 199280 */, - 0x6484DD2/* 11B: 201008 */, - 0x65620C4/* 11C: 202736 */, - 0x66A7AE1/* 12A: 205280 */, - 0x6784DD2/* 12B: 207008 */, - 0x68620C4/* 12C: 208736 */, - 0x69A7AE1/* 13A: 211280 */, - 0x6A84DD2/* 13B: 213008 */, - 0x6B620C4/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 16384) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x5599C00/* 7A: 175280 */, - 0x5671C00/* 7B: 177008 */, - 0x5749C00/* 7C: 178736 */, - 0x5887C00/* 8A: 181280 */, - 0x595FC00/* 8B: 183008 */, - 0x5A37C00/* 8C: 184736 */, - 0x5B75C00/* 9A: 187280 */, - 0x5C4DC00/* 9B: 189008 */, - 0x5D25C00/* 9C: 190736 */, - 0x5E63C00/* 10A: 193280 */, - 0x5F3BC00/* 10B: 195008 */, - 0x6013C00/* 10C: 196736 */, - 0x6151C00/* 11A: 199280 */, - 0x6229C00/* 11B: 201008 */, - 0x6301C00/* 11C: 202736 */, - 0x643FC00/* 12A: 205280 */, - 0x6517C00/* 12B: 207008 */, - 0x65EFC00/* 12C: 208736 */, - 0x672DC00/* 13A: 211280 */, - 0x6805C00/* 13B: 213008 */, - 0x68DDC00/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 18000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x4DEA61D/* 7A: 175280 */, - 0x4EAEFD7/* 7B: 177008 */, - 0x4F73992/* 7C: 178736 */, - 0x50950C8/* 8A: 181280 */, - 0x5159A82/* 8B: 183008 */, - 0x521E43C/* 8C: 184736 */, - 0x533FB72/* 9A: 187280 */, - 0x540452D/* 9B: 189008 */, - 0x54C8EE7/* 9C: 190736 */, - 0x55EA61D/* 10A: 193280 */, - 0x56AEFD7/* 10B: 195008 */, - 0x5773992/* 10C: 196736 */, - 0x58950C8/* 11A: 199280 */, - 0x5959A82/* 11B: 201008 */, - 0x5A1E43C/* 11C: 202736 */, - 0x5B3FB72/* 12A: 205280 */, - 0x5C0452D/* 12B: 207008 */, - 0x5CC8EE7/* 12C: 208736 */, - 0x5DEA61D/* 13A: 211280 */, - 0x5EAEFD7/* 13B: 213008 */, - 0x5F73992/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 19200) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x490BBBB/* 7A: 175280 */, - 0x49C40DA/* 7B: 177008 */, - 0x4A7C5F9/* 7C: 178736 */, - 0x4B8BBBB/* 8A: 181280 */, - 0x4C440DA/* 8B: 183008 */, - 0x4CFC5F9/* 8C: 184736 */, - 0x4E0BBBB/* 9A: 187280 */, - 0x4EC40DA/* 9B: 189008 */, - 0x4F7C5F9/* 9C: 190736 */, - 0x508BBBB/* 10A: 193280 */, - 0x51440DA/* 10B: 195008 */, - 0x51FC5F9/* 10C: 196736 */, - 0x530BBBB/* 11A: 199280 */, - 0x53C40DA/* 11B: 201008 */, - 0x547C5F9/* 11C: 202736 */, - 0x558BBBB/* 12A: 205280 */, - 0x56440DA/* 12B: 207008 */, - 0x56FC5F9/* 12C: 208736 */, - 0x580BBBB/* 13A: 211280 */, - 0x58C40DA/* 13B: 213008 */, - 0x597C5F9/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 24000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x3A6FC96/* 7A: 175280 */, - 0x3B033E1/* 7B: 177008 */, - 0x3B96B2D/* 7C: 178736 */, - 0x3C6FC96/* 8A: 181280 */, - 0x3D033E1/* 8B: 183008 */, - 0x3D96B2D/* 8C: 184736 */, - 0x3E6FC96/* 9A: 187280 */, - 0x3F033E1/* 9B: 189008 */, - 0x3F96B2D/* 9C: 190736 */, - 0x406FC96/* 10A: 193280 */, - 0x41033E1/* 10B: 195008 */, - 0x4196B2D/* 10C: 196736 */, - 0x426FC96/* 11A: 199280 */, - 0x43033E1/* 11B: 201008 */, - 0x4396B2D/* 11C: 202736 */, - 0x446FC96/* 12A: 205280 */, - 0x45033E1/* 12B: 207008 */, - 0x4596B2D/* 12C: 208736 */, - 0x466FC96/* 13A: 211280 */, - 0x47033E1/* 13B: 213008 */, - 0x4796B2D/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 24576) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x39112AA/* 7A: 175280 */, - 0x39A12AA/* 7B: 177008 */, - 0x3A312AA/* 7C: 178736 */, - 0x3B052AA/* 8A: 181280 */, - 0x3B952AA/* 8B: 183008 */, - 0x3C252AA/* 8C: 184736 */, - 0x3CF92AA/* 9A: 187280 */, - 0x3D892AA/* 9B: 189008 */, - 0x3E192AA/* 9C: 190736 */, - 0x3EED2AA/* 10A: 193280 */, - 0x3F7D2AA/* 10B: 195008 */, - 0x400D2AA/* 10C: 196736 */, - 0x40E12AA/* 11A: 199280 */, - 0x41712AA/* 11B: 201008 */, - 0x42012AA/* 11C: 202736 */, - 0x42D52AA/* 12A: 205280 */, - 0x43652AA/* 12B: 207008 */, - 0x43F52AA/* 12C: 208736 */, - 0x44C92AA/* 13A: 211280 */, - 0x45592AA/* 13B: 213008 */, - 0x45E92AA/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 26000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x35F108A/* 7A: 175280 */, - 0x367925A/* 7B: 177008 */, - 0x370142A/* 7C: 178736 */, - 0x37C9A63/* 8A: 181280 */, - 0x3851C33/* 8B: 183008 */, - 0x38D9E02/* 8C: 184736 */, - 0x39A243B/* 9A: 187280 */, - 0x3A2A60B/* 9B: 189008 */, - 0x3AB27DB/* 9C: 190736 */, - 0x3B7AE14/* 10A: 193280 */, - 0x3C02FE4/* 10B: 195008 */, - 0x3C8B1B4/* 10C: 196736 */, - 0x3D537ED/* 11A: 199280 */, - 0x3DDB9BC/* 11B: 201008 */, - 0x3E63B8C/* 11C: 202736 */, - 0x3F2C1C5/* 12A: 205280 */, - 0x3FB4395/* 12B: 207008 */, - 0x403C565/* 12C: 208736 */, - 0x4104B9E/* 13A: 211280 */, - 0x418CD6E/* 13B: 213008 */, - 0x4214F3D/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 27000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x33F1969/* 7A: 175280 */, - 0x3474A8F/* 7B: 177008 */, - 0x34F7BB6/* 7C: 178736 */, - 0x35B8B30/* 8A: 181280 */, - 0x363BC57/* 8B: 183008 */, - 0x36BED7D/* 8C: 184736 */, - 0x377FCF7/* 9A: 187280 */, - 0x3802E1E/* 9B: 189008 */, - 0x3885F45/* 9C: 190736 */, - 0x3946EBE/* 10A: 193280 */, - 0x39C9FE5/* 10B: 195008 */, - 0x3A4D10C/* 10C: 196736 */, - 0x3B0E085/* 11A: 199280 */, - 0x3B911AC/* 11B: 201008 */, - 0x3C142D3/* 11C: 202736 */, - 0x3CD524C/* 12A: 205280 */, - 0x3D58373/* 12B: 207008 */, - 0x3DDB49A/* 12C: 208736 */, - 0x3E9C413/* 13A: 211280 */, - 0x3F1F53A/* 13B: 213008 */, - 0x3FA2661/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 32000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x2BD3D70/* 7A: 175280 */, - 0x2C426E9/* 7B: 177008 */, - 0x2CB1062/* 7C: 178736 */, - 0x2D53D70/* 8A: 181280 */, - 0x2DC26E9/* 8B: 183008 */, - 0x2E31062/* 8C: 184736 */, - 0x2ED3D70/* 9A: 187280 */, - 0x2F426E9/* 9B: 189008 */, - 0x2FB1062/* 9C: 190736 */, - 0x3053D70/* 10A: 193280 */, - 0x30C26E9/* 10B: 195008 */, - 0x3131062/* 10C: 196736 */, - 0x31D3D70/* 11A: 199280 */, - 0x32426E9/* 11B: 201008 */, - 0x32B1062/* 11C: 202736 */, - 0x3353D70/* 12A: 205280 */, - 0x33C26E9/* 12B: 207008 */, - 0x3431062/* 12C: 208736 */, - 0x34D3D70/* 13A: 211280 */, - 0x35426E9/* 13B: 213008 */, - 0x35B1062/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 32768) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x2ACCE00/* 7A: 175280 */, - 0x2B38E00/* 7B: 177008 */, - 0x2BA4E00/* 7C: 178736 */, - 0x2C43E00/* 8A: 181280 */, - 0x2CAFE00/* 8B: 183008 */, - 0x2D1BE00/* 8C: 184736 */, - 0x2DBAE00/* 9A: 187280 */, - 0x2E26E00/* 9B: 189008 */, - 0x2E92E00/* 9C: 190736 */, - 0x2F31E00/* 10A: 193280 */, - 0x2F9DE00/* 10B: 195008 */, - 0x3009E00/* 10C: 196736 */, - 0x30A8E00/* 11A: 199280 */, - 0x3114E00/* 11B: 201008 */, - 0x3180E00/* 11C: 202736 */, - 0x321FE00/* 12A: 205280 */, - 0x328BE00/* 12B: 207008 */, - 0x32F7E00/* 12C: 208736 */, - 0x3396E00/* 13A: 211280 */, - 0x3402E00/* 13B: 213008 */, - 0x346EE00/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 36000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x26F530E/* 7A: 175280 */, - 0x27577EB/* 7B: 177008 */, - 0x27B9CC9/* 7C: 178736 */, - 0x284A864/* 8A: 181280 */, - 0x28ACD41/* 8B: 183008 */, - 0x290F21E/* 8C: 184736 */, - 0x299FDB9/* 9A: 187280 */, - 0x2A02296/* 9B: 189008 */, - 0x2A64773/* 9C: 190736 */, - 0x2AF530E/* 10A: 193280 */, - 0x2B577EB/* 10B: 195008 */, - 0x2BB9CC9/* 10C: 196736 */, - 0x2C4A864/* 11A: 199280 */, - 0x2CACD41/* 11B: 201008 */, - 0x2D0F21E/* 11C: 202736 */, - 0x2D9FDB9/* 12A: 205280 */, - 0x2E02296/* 12B: 207008 */, - 0x2E64773/* 12C: 208736 */, - 0x2EF530E/* 13A: 211280 */, - 0x2F577EB/* 13B: 213008 */, - 0x2FB9CC9/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 38400) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x2485DDD/* 7A: 175280 */, - 0x24E206D/* 7B: 177008 */, - 0x253E2FC/* 7C: 178736 */, - 0x25C5DDD/* 8A: 181280 */, - 0x262206D/* 8B: 183008 */, - 0x267E2FC/* 8C: 184736 */, - 0x2705DDD/* 9A: 187280 */, - 0x276206D/* 9B: 189008 */, - 0x27BE2FC/* 9C: 190736 */, - 0x2845DDD/* 10A: 193280 */, - 0x28A206D/* 10B: 195008 */, - 0x28FE2FC/* 10C: 196736 */, - 0x2985DDD/* 11A: 199280 */, - 0x29E206D/* 11B: 201008 */, - 0x2A3E2FC/* 11C: 202736 */, - 0x2AC5DDD/* 12A: 205280 */, - 0x2B2206D/* 12B: 207008 */, - 0x2B7E2FC/* 12C: 208736 */, - 0x2C05DDD/* 13A: 211280 */, - 0x2C6206D/* 13B: 213008 */, - 0x2CBE2FC/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 40000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x230FDF3/* 7A: 175280 */, - 0x2368587/* 7B: 177008 */, - 0x23C0D1B/* 7C: 178736 */, - 0x2443126/* 8A: 181280 */, - 0x249B8BA/* 8B: 183008 */, - 0x24F404E/* 8C: 184736 */, - 0x257645A/* 9A: 187280 */, - 0x25CEBED/* 9B: 189008 */, - 0x2627381/* 9C: 190736 */, - 0x26A978D/* 10A: 193280 */, - 0x2701F21/* 10B: 195008 */, - 0x275A6B5/* 10C: 196736 */, - 0x27DCAC0/* 11A: 199280 */, - 0x2835254/* 11B: 201008 */, - 0x288D9E8/* 11C: 202736 */, - 0x290FDF3/* 12A: 205280 */, - 0x2968587/* 12B: 207008 */, - 0x29C0D1B/* 12C: 208736 */, - 0x2A43126/* 13A: 211280 */, - 0x2A9B8BA/* 13B: 213008 */, - 0x2AF404E/* 13C: 214736 */ - -}; - -#elif (RTV_SRC_CLK_FREQ_KHz == 48000) -static const U32 g_atPllNF_TDMB_Korea[] = { - 0x1D37E4B/* 7A: 175280 */, - 0x1D819F0/* 7B: 177008 */, - 0x1DCB596/* 7C: 178736 */, - 0x1E37E4B/* 8A: 181280 */, - 0x1E819F0/* 8B: 183008 */, - 0x1ECB596/* 8C: 184736 */, - 0x1F37E4B/* 9A: 187280 */, - 0x1F819F0/* 9B: 189008 */, - 0x1FCB596/* 9C: 190736 */, - 0x2037E4B/* 10A: 193280 */, - 0x20819F0/* 10B: 195008 */, - 0x20CB596/* 10C: 196736 */, - 0x2137E4B/* 11A: 199280 */, - 0x21819F0/* 11B: 201008 */, - 0x21CB596/* 11C: 202736 */, - 0x2237E4B/* 12A: 205280 */, - 0x22819F0/* 12B: 207008 */, - 0x22CB596/* 12C: 208736 */, - 0x2337E4B/* 13A: 211280 */, - 0x23819F0/* 13B: 213008 */, - 0x23CB596/* 13C: 214736 */ - -}; - -#else -#error "Code not present" -#endif diff --git a/drivers/media/tdmb/mtv318/raontv_tdmb.c b/drivers/media/tdmb/mtv318/raontv_tdmb.c deleted file mode 100644 index 4b20f7e..0000000 --- a/drivers/media/tdmb/mtv318/raontv_tdmb.c +++ /dev/null @@ -1,1987 +0,0 @@ -/* - * - * File name: drivers/media/tdmb/mtv318/src/raontv_tdmb.c - * - * Description : RAONTECH TV T-DMB services driver. - * - * Copyright (C) (2011, RAONTECH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "raontv_rf.h" - -#ifdef RTV_TDMB_ENABLE - -#undef OFDM_PAGE -#define OFDM_PAGE 0x6 - -#undef FEC_PAGE -#define FEC_PAGE 0x09 - -#define MAX_NUM_TDMB_SUB_CH 64 - -/* Registered sub channel Table. */ -struct RTV_TDMB_REG_SUBCH_INFO { - UINT nSubChID; - UINT nHwSubChIdx; - enum E_RTV_TDMB_SERVICE_TYPE eServiceType; - UINT nThresholdSize; -}; - -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) /* Single Sub Channel */ -#define TDMB_MSC0_SUBCH_USE_MASK 0x00 /* NA */ -#define TDMB_MSC1_SUBCH_USE_MASK 0x01 /* SUBCH 0 */ - -#else /* Multi Sub Channel */ -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -#define TDMB_MSC0_SUBCH_USE_MASK 0x78 /* SUBCH 3,4,5,6 */ -#else -#define TDMB_MSC0_SUBCH_USE_MASK 0x70 /* SUBCH 3,4,5 */ -#endif -#define TDMB_MSC1_SUBCH_USE_MASK 0x01 /* SUBCH 0 */ -#endif - -static struct RTV_TDMB_REG_SUBCH_INFO - g_atTdmbRegSubchInfo[RTV_MAX_NUM_SUB_CHANNEL_USED]; -static UINT g_nRegSubChArrayIdxBits; -static UINT g_nRtvUsedHwSubChIdxBits; -static U32 g_dwTdmbPrevChFreqKHz; -static BOOL g_fRtvTdmbConfiguredFIC; - -#define SUBCH_GRP_IDX(sub_ch_id) (sub_ch_id >> 5) /* Divide by 32 */ -#define MOD32(x) (x & 31) -/* Used sub channel ID bits. [0]: 0 ~ 31, [1]: 32 ~ 63 */ -static U32 g_aRegSubChIdBits[2]; - -/*============================================================================== - * Replace the below code to eliminates the sqrt() and log10() functions. - * In addtion, to eliminates floating operation, - * we multiplied by RTV_TDMB_SNR_DIVIDER to the floating SNR. - * SNR = (double)(100/(sqrt((double)data) - * - log10((double)data)*log10((double)data)) -7); - *============================================================================*/ -static const U16 g_awSNR_15_160[] = { - 33163/* 15 */, - 32214/* 16 */, - 31327/* 17 */, - 30496/* 18 */, - 29714/* 19 */, - 28978/* 20 */, - 28281/* 21 */, - 27622/* 22 */, - 26995/* 23 */, - 26400/* 24 */, - 25832/* 25 */, - 25290/* 26 */, - 24772/* 27 */, - 24277/* 28 */, - 23801/* 29 */, - 23345/* 30 */, - 22907/* 31 */, - 22486/* 32 */, - 22080/* 33 */, - 21690/* 34 */, - 21313/* 35 */, - 20949/* 36 */, - 20597/* 37 */, - 20257/* 38 */, - 19928/* 39 */, - 19610/* 40 */, - 19301/* 41 */, - 19002/* 42 */, - 18712/* 43 */, - 18430/* 44 */, - 18156/* 45 */, - 17890/* 46 */, - 17632/* 47 */, - 17380/* 48 */, - 17135/* 49 */, - 16897/* 50 */, - 16665/* 51 */, - 16438/* 52 */, - 16218/* 53 */, - 16002/* 54 */, - 15792/* 55 */, - 15587/* 56 */, - 15387/* 57 */, - 15192/* 58 */, - 15001/* 59 */, - 14814/* 60 */, - 14631/* 61 */, - 14453/* 62 */, - 14278/* 63 */, - 14107/* 64 */, - 13939/* 65 */, - 13775/* 66 */, - 13615/* 67 */, - 13457/* 68 */, - 13303/* 69 */, - 13152/* 70 */, - 13004/* 71 */, - 12858/* 72 */, - 12715/* 73 */, - 12575/* 74 */, - 12438/* 75 */, - 12303/* 76 */, - 12171/* 77 */, - 12041/* 78 */, - 11913/* 79 */, - 11788/* 80 */, - 11664/* 81 */, - 11543/* 82 */, - 11424/* 83 */, - 11307/* 84 */, - 11192/* 85 */, - 11078/* 86 */, - 10967/* 87 */, - 10857/* 88 */, - 10749/* 89 */, - 10643/* 90 */, - 10539/* 91 */, - 10436/* 92 */, - 10334/* 93 */, - 10235/* 94 */, - 10136/* 95 */, - 10039/* 96 */, - 9944/* 97 */, - 9850/* 98 */, - 9757/* 99 */, - 9666/* 100 */, - 9576/* 101 */, - 9487/* 102 */, - 9400/* 103 */, - 9314/* 104 */, - 9229/* 105 */, - 9145/* 106 */, - 9062/* 107 */, - 8980/* 108 */, - 8900/* 109 */, - 8820/* 110 */, - 8742/* 111 */, - 8664/* 112 */, - 8588/* 113 */, - 8512/* 114 */, - 8438/* 115 */, - 8364/* 116 */, - 8292/* 117 */, - 8220/* 118 */, - 8149/* 119 */, - 8079/* 120 */, - 8010/* 121 */, - 7942/* 122 */, - 7874/* 123 */, - 7807/* 124 */, - 7742/* 125 */, - 7676/* 126 */, - 7612/* 127 */, - 7548/* 128 */, - 7485/* 129 */, - 7423/* 130 */, - 7362/* 131 */, - 7301/* 132 */, - 7241/* 133 */, - 7181/* 134 */, - 7123/* 135 */, - 7064/* 136 */, - 7007/* 137 */, - 6950/* 138 */, - 6894/* 139 */, - 6838/* 140 */, - 6783/* 141 */, - 6728/* 142 */, - 6674/* 143 */, - 6621/* 144 */, - 6568/* 145 */, - 6516/* 146 */, - 6464/* 147 */, - 6412/* 148 */, - 6362/* 149 */, - 6311/* 150 */, - 6262/* 151 */, - 6212/* 152 */, - 6164/* 153 */, - 6115/* 154 */, - 6067/* 155 */, - 6020/* 156 */, - 5973/* 157 */, - 5927/* 158 */, - 5881/* 159 */, - 5835 /* 160 */ -}; - -static void tdmb_InitTOP(void) -{ - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x07, 0x08); - RTV_REG_SET(0x05, 0x17); - RTV_REG_SET(0x06, 0x10); - RTV_REG_SET(0x0A, 0x00); -} - -/*============================================================================== - * Name : tdmb_InitCOMM - * Action : MAP SEL COMM Register Init - * Input : Chip Address - * Output : None - *============================================================================*/ -static void tdmb_InitCOMM(void) -{ - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x10, 0x91); - RTV_REG_SET(0xE1, 0x00); - - RTV_REG_SET(0x35, 0X8B); - RTV_REG_SET(0x3B, 0x3C); - - RTV_REG_SET(0x36, 0x67); - RTV_REG_SET(0x3A, 0x0F); - - RTV_REG_SET(0x3C, 0x20); - RTV_REG_SET(0x3D, 0x0B); - RTV_REG_SET(0x3D, 0x09); - - RTV_REG_SET(0xA6, 0x30); - /*0x30 ==>NO TSOUT@Error packet, 0x10 ==> NULL PID PACKET@Error packet*/ - - RTV_REG_SET(0xAA, 0x01); - /* Enable 0x47 insertion to video frame. */ - - RTV_REG_SET(0xAF, 0x07); - /* FEC */ - -} - -/*============================================================================== - * Name : tdmb_InitHOST - * Action : MAP SEL HOST Register Init - * Input : Chip Address - * Output : None - *============================================================================*/ -static void tdmb_InitHOST(void) -{ - RTV_REG_MAP_SEL(HOST_PAGE); - RTV_REG_SET(0x10, 0x00); - RTV_REG_SET(0x13, 0x16); - RTV_REG_SET(0x14, 0x00); - RTV_REG_SET(0x19, 0x0A); - RTV_REG_SET(0xF0, 0x00); - RTV_REG_SET(0xF1, 0x00); - RTV_REG_SET(0xF2, 0x00); - RTV_REG_SET(0xF3, 0x00); - RTV_REG_SET(0xF4, 0x00); - RTV_REG_SET(0xF5, 0x00); - RTV_REG_SET(0xF6, 0x00); - RTV_REG_SET(0xF7, 0x00); - RTV_REG_SET(0xF8, 0x00); - RTV_REG_SET(0xFB, 0xFF); - -} - -/*============================================================================== - * Name : tdmb_InitOFDM - * Action : MAP SEL OFDM Register Init - * Input : Chip Address - * Output : None - *============================================================================*/ -static void tdmb_InitOFDM(void) -{ - U8 INV_MODE; - U8 PWM_COM; - U8 WAGC_COM; - U8 AGC_MODE; - U8 POST_INIT; - U8 AGC_CYCLE; - - INV_MODE = 1; - PWM_COM = 0x08; - WAGC_COM = 0x03; - AGC_MODE = 0x06; - POST_INIT = 0x09; - AGC_CYCLE = 0x10; - - RTV_REG_MAP_SEL(OFDM_PAGE); - - if (g_eRtvCountryBandType == RTV_COUNTRY_BAND_KOREA) - RTV_REG_SET(0x11, 0x8e); - - RTV_REG_SET(0x12, 0x04); - - RTV_REG_SET(0x13, 0x72); - RTV_REG_SET(0x14, 0x63); - RTV_REG_SET(0x15, 0x64); - - RTV_REG_SET(0x16, 0x6C); - - RTV_REG_SET(0x1a, 0xb4); - - RTV_REG_SET(0x38, 0x01); - - RTV_REG_SET(0x20, 0x5B); - - RTV_REG_SET(0x25, 0x09); - - RTV_REG_SET(0x44, 0x00 | (POST_INIT)); - - RTV_REG_SET(0x46, 0xA0); - RTV_REG_SET(0x47, 0x0F); - - RTV_REG_SET(0x48, 0xB8); - RTV_REG_SET(0x49, 0x0B); - RTV_REG_SET(0x54, 0x58); - - RTV_REG_SET(0x55, 0x06); - - RTV_REG_SET(0x56, 0x00 | (AGC_CYCLE)); - - RTV_REG_SET(0x59, 0x51); - - RTV_REG_SET(0x5A, 0x1C); - - RTV_REG_SET(0x6D, 0x00); - RTV_REG_SET(0x8B, 0x24); - - RTV_REG_SET(0x6B, 0x2D); - RTV_REG_SET(0x85, 0x32); - RTV_REG_SET(0x8E, 0x01); - - RTV_REG_SET(0x33, 0x00 | (INV_MODE<<1)); - RTV_REG_SET(0x53, 0x00 | (AGC_MODE)); - - RTV_REG_SET(0x6F, 0x00 | (WAGC_COM)); - - RTV_REG_SET(0xBA, PWM_COM); - - switch (g_eRtvAdcClkFreqType) { - case RTV_ADC_CLK_FREQ_8_MHz: - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x6A, 0x01); - - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x3c, 0x4B); - RTV_REG_SET(0x3d, 0x37); - RTV_REG_SET(0x3e, 0x89); - RTV_REG_SET(0x3f, 0x41); - break; - - case RTV_ADC_CLK_FREQ_8_192_MHz: - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x6A, 0x01); - - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x3c, 0x00); - RTV_REG_SET(0x3d, 0x00); - RTV_REG_SET(0x3e, 0x00); - RTV_REG_SET(0x3f, 0x40); - break; - - case RTV_ADC_CLK_FREQ_9_MHz: - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x6A, 0x21); - - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x3c, 0xB5); - RTV_REG_SET(0x3d, 0x14); - RTV_REG_SET(0x3e, 0x41); - RTV_REG_SET(0x3f, 0x3A); - break; - - case RTV_ADC_CLK_FREQ_9_6_MHz: - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_SET(0x6A, 0x31); - - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x3c, 0x69); - RTV_REG_SET(0x3d, 0x03); - RTV_REG_SET(0x3e, 0x9D); - RTV_REG_SET(0x3f, 0x36); - break; - - default: - RTV_DBGMSG0("[tdmb_InitOFDM] Upsupport ADC clock type!\n"); - break; - } - - RTV_REG_SET(0x42, 0x00); - RTV_REG_SET(0x43, 0x00); - - RTV_REG_SET(0x94, 0x08); - - RTV_REG_SET(0x98, 0x05); - RTV_REG_SET(0x99, 0x03); - RTV_REG_SET(0x9B, 0xCF); - RTV_REG_SET(0x9C, 0x10); - RTV_REG_SET(0x9D, 0x1C); - RTV_REG_SET(0x9F, 0x32); - RTV_REG_SET(0xA0, 0x90); - - RTV_REG_SET(0xA4, 0x01); - - RTV_REG_SET(0xA8, 0xF6); - RTV_REG_SET(0xA9, 0x89); - RTV_REG_SET(0xAA, 0x0C); - RTV_REG_SET(0xAB, 0x32); - - RTV_REG_SET(0xAC, 0x14); - RTV_REG_SET(0xAD, 0x09); - - RTV_REG_SET(0xAE, 0xFF); - - RTV_REG_SET(0xEB, 0x6B); -} - -/*============================================================================== - * Name : tdmb_InitFEC - * Action : MAP SEL FEC Register Init - * Input : Chip Address - * Output : None - *============================================================================*/ -static void tdmb_InitFEC(void) -{ - RTV_REG_MAP_SEL(FEC_PAGE); - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) - RTV_REG_MASK_SET(0x7D, 0x10, 0x10); - /* 7KB memory use. */ -#endif -#endif - - RTV_REG_SET(0x80, 0x80); - RTV_REG_SET(0x81, 0xFF); - RTV_REG_SET(0x87, 0x07); - RTV_REG_SET(0x45, 0xA0); - RTV_REG_SET(0xDD, 0xD0); - RTV_REG_SET(0x39, 0x07); - RTV_REG_SET(0xE6, 0x10); - RTV_REG_SET(0xA5, 0xA0); -} - -static void tdmb_InitDemod(void) -{ - tdmb_InitTOP(); - tdmb_InitCOMM(); - tdmb_InitHOST(); - tdmb_InitOFDM(); - tdmb_InitFEC(); - - rtv_ResetMemory_FIC(); /* Must disable before transmit con. */ - - /* Configure interrupt. */ -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - rtvOEM_ConfigureInterrupt(); - -#elif defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) -#ifndef RTV_FIC_POLLING_MODE - rtvOEM_ConfigureInterrupt(); /* FIC interrupt */ -#endif -#endif - - /* Configure CIF Header enable or disable for MSC0. */ -#ifndef RTV_CIF_HEADER_INSERTED - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_MASK_SET(0x31, 0x03, 0x00); - /* [0]:MSC0_HEAD_EN, [1]:MSC_HEAD_NBYTE : MSC0 Header OFF */ - -#else /* CIF Header Enable */ - RTV_REG_MAP_SEL(DD_PAGE); -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - /* [0]:MSC0_HEAD_EN, [1]:MSC_HEAD_NBYTE : MSC0 Header ON */ - RTV_REG_MASK_SET(0x31, 0x03, 0x03); -#else - /* [0]:MSC0_HEAD_EN, [1]:MSC_HEAD_NBYTE : MSC0 Header OFF */ - RTV_REG_MASK_SET(0x31, 0x03, 0x00); -#endif -#endif - - /* Configure TSIF. */ -#if defined(RTV_IF_MPEG2_SERIAL_TSIF) - || defined(RTV_IF_SPI_SLAVE) - || defined(RTV_IF_QUALCOMM_TSIF) - - rtv_ConfigureTsifFormat(); - - /* Configure TS memory and mode. */ - RTV_REG_MAP_SEL(COMM_PAGE); -#ifndef RTV_CIF_MODE_ENABLED /* Individual Mode */ - RTV_REG_SET(0x47, 0x13|RTV_COMM_CON47_CLK_SEL); /* MSC1 DD-TSI enable*/ -#else /* CIF Mode */ - /* - [5] CIF_MODE_EN: TSI CIF transmit mode enable. 1 = CIF, 0 = Individual - [4] MSC1_EN: MSC1 transmit enable - [3] MSC0_EN: MSC0 transmit enable - [2] FIC_EN: FIC transmit enable */ - - /* CIF/FIC/MSC0/MSC1 DD-TSI enable */ - RTV_REG_SET(0x47, 0x3F|RTV_COMM_CON47_CLK_SEL); - - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0xD6, 0xF4); -#endif - -#elif defined(RTV_IF_MPEG2_PARALLEL_TSIF) - rtv_SetParallelTsif_TDMB_Only(); -#endif - - rtv_ConfigureHostIF(); -} - -static void tdmb_SoftReset(void) -{ - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x10, 0x48); - /* FEC reset enable */ - RTV_DELAY_MS(1); - RTV_REG_SET(0x10, 0xC9); - /* OFDM & FEC Soft reset */ -} - -void rtvTDMB_StandbyMode(int on) -{ - RTV_GUARD_LOCK; - - if (on) { - RTV_REG_MAP_SEL(RF_PAGE); - RTV_REG_MASK_SET(0x57, 0x04, 0x04); - /* SW PD ALL */ - } else { - RTV_REG_MAP_SEL(RF_PAGE); - RTV_REG_MASK_SET(0x57, 0x04, 0x00); - /* SW PD ALL */ - } - - RTV_GUARD_FREE; -} - -UINT rtvTDMB_GetLockStatus(void) -{ - U8 lock_stat; - UINT lock_st = 0; - - if (g_fRtvChannelChange) { - RTV_DBGMSG0("[rtvTDMB_GetLockStatus] " - "RTV Freqency change state!\n"); - return 0x0; - } - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(DD_PAGE); - lock_stat = RTV_REG_GET(0x37); - if (lock_stat & 0x01) - lock_st = RTV_TDMB_OFDM_LOCK_MASK; - - RTV_REG_MAP_SEL(FEC_PAGE); - lock_stat = RTV_REG_GET(0xFB); - - RTV_GUARD_FREE; - - if ((lock_stat & 0x03) == 0x03) - lock_st |= RTV_TDMB_FEC_LOCK_MASK; - - return lock_st; -} - -U32 rtvTDMB_GetPER(void) -{ - U8 rdata0, rdata1, rs_sync; - - if (g_fRtvChannelChange) { - RTV_DBGMSG0("[rtvTDMB_GetPER] " - "RTV Freqency change state!\n"); - return 0; - } - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(FEC_PAGE); - rdata0 = RTV_REG_GET(0xD7); - rs_sync = (rdata0 & 0x08) >> 3; - if (rs_sync != 0x01) { - RTV_GUARD_FREE; - return 700; - } - - rdata1 = RTV_REG_GET(0xB4); - rdata0 = RTV_REG_GET(0xB5); - - RTV_GUARD_FREE; - - return (rdata1 << 8) | rdata0; -} - -S32 rtvTDMB_GetRSSI(void) -{ - U8 RD00, GVBB, LNAGAIN, RFAGC; - S32 nRssi = 0; - - if (g_fRtvChannelChange) { - RTV_DBGMSG0("[rtvTDMB_GetRSSI] RTV Freqency change state!\n"); - return 0; - } - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(RF_PAGE); - RD00 = RTV_REG_GET(0x00); - GVBB = RTV_REG_GET(0x05); - - RTV_GUARD_FREE; - - LNAGAIN = ((RD00 & 0x30) >> 4); - RFAGC = (RD00 & 0x0F); - - switch (LNAGAIN) { - case 0: - nRssi = -((RFAGC * (S32)(2.75*RTV_TDMB_RSSI_DIVIDER)) - + (GVBB * (S32)(0.36*RTV_TDMB_RSSI_DIVIDER)) - - (S32)(12*RTV_TDMB_RSSI_DIVIDER)); - break; - - case 1: - nRssi = -((RFAGC * (S32)(2.75*RTV_TDMB_RSSI_DIVIDER)) - + (GVBB * (S32)(0.36*RTV_TDMB_RSSI_DIVIDER)) - + (S32)(-2*RTV_TDMB_RSSI_DIVIDER)); - break; - - case 2: - nRssi = -((RFAGC * (S32)(3*RTV_TDMB_RSSI_DIVIDER)) - + (GVBB * (S32)(0.365*RTV_TDMB_RSSI_DIVIDER)) - + (S32)(3*RTV_TDMB_RSSI_DIVIDER)); - break; - - case 3: - nRssi = -((RFAGC * (S32)(3*RTV_TDMB_RSSI_DIVIDER)) - + (GVBB * (S32)(0.5*RTV_TDMB_RSSI_DIVIDER)) - + (S32)(0.5*RTV_TDMB_RSSI_DIVIDER)); - break; - - default: - break; - } - - if (((RD00&0xC0) == 0x40) && (GVBB > 123)) - nRssi -= (S32)(0*RTV_TDMB_RSSI_DIVIDER); - - return nRssi; -} - - -U32 rtvTDMB_GetCNR(void) -{ - U8 data1 = 0, data2 = 0; - U8 data = 0; - U32 SNR = 0; - - if (g_fRtvChannelChange) { - RTV_DBGMSG0("[rtvTDMB_GetCNR] RTV Freqency change state!\n"); - return 0; - } - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(OFDM_PAGE); - - RTV_REG_SET(0x82, 0x01); - data1 = RTV_REG_GET(0x7E); - data2 = RTV_REG_GET(0x7F); - - RTV_GUARD_FREE; - - data = ((data2 & 0x1f) << 8) + data1; - - if (data == 0) - return 0; - else if ((data > 0) && (data < 15)) - SNR = (S32) (33 * RTV_TDMB_CNR_DIVIDER); - else if ((data >= 15) && (data <= 160)) - SNR = g_awSNR_15_160[data - 15]; - else if (data > 160) - SNR = (S32) (5.44 * RTV_TDMB_CNR_DIVIDER); - - return SNR; -} - -/* MSC BER (0 ~ 140) */ -U32 rtvTDMB_GetCER(void) -{ - U8 lock_stat, rcnt3 = 0, rcnt2 = 0, rcnt1 = 0, rcnt0 = 0; - U32 cer_cnt, cer_period_cnt, ret_val; - - if (g_fRtvChannelChange) { - RTV_DBGMSG0("[rtvTDMB_GetBER] RTV Freqency change state!\n"); - return 2000; - } - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(FEC_PAGE); - - lock_stat = RTV_REG_GET(0x37); - if (lock_stat & 0x01) { - /* MSC CER period counter for accumulation */ - rcnt3 = RTV_REG_GET(0x88); - rcnt2 = RTV_REG_GET(0x89); - rcnt1 = RTV_REG_GET(0x8A); - rcnt0 = RTV_REG_GET(0x8B); - /* 442368 */ - cer_period_cnt = (rcnt3 << 24) | (rcnt2 << 16) - | (rcnt1 << 8) | rcnt0; - - rcnt3 = RTV_REG_GET(0x8C); - rcnt2 = RTV_REG_GET(0x8D); - rcnt1 = RTV_REG_GET(0x8E); - rcnt0 = RTV_REG_GET(0x8F); - } else - cer_period_cnt = 0; - - RTV_GUARD_FREE; - - if (cer_period_cnt == 0) - return 2000; /* No service */ - - cer_cnt = (rcnt3 << 24) | (rcnt2 << 16) | (rcnt1 << 8) | rcnt0; - - /*RTV_DBGMSG2("[rtvTDMB_GetCER] cer_cnt: %u, " - "cer_period_cnt: %u\n", - cer_cnt, cer_period_cnt);*/ - - if (cer_cnt <= 4000) - return 0; - else { - ret_val = ((cer_cnt * 1000)/cer_period_cnt) * 10; - if (ret_val <= 1200) - return ret_val; - else - return 2000; - } -} - -/* Pre BER */ -U32 rtvTDMB_GetBER(void) -{ - U8 rdata0 = 0, rdata1 = 0, rdata2 = 0; - U8 rcnt0, rcnt1, rcnt2; - U8 rs_sync; - U32 val; - U32 cnt; - - if (g_fRtvChannelChange) { - RTV_DBGMSG0("[rtvTDMB_GetBER] RTV Freqency change state!\n"); - return 2000; - } - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(FEC_PAGE); - rdata0 = RTV_REG_GET(0xD7); - - rs_sync = (rdata0 & 0x08) >> 3; - if (rs_sync != 0x01) { - RTV_GUARD_FREE; - return 2000; - } - - rcnt2 = RTV_REG_GET(0xA6); - rcnt1 = RTV_REG_GET(0xA7); - rcnt0 = RTV_REG_GET(0xA8); - cnt = (rcnt2 << 16) | (rcnt1 << 8) | rcnt0; - - rdata2 = RTV_REG_GET(0xA9); - rdata1 = RTV_REG_GET(0xAA); - rdata0 = RTV_REG_GET(0xAB); - val = (rdata2 << 16) | (rdata1 << 8) | rdata0; /* max 24 bit */ - - RTV_GUARD_FREE; - - if (cnt == 0) - return 2000; - else - return (val * (U32) RTV_TDMB_BER_DIVIDER) / cnt; -} - - -static UINT g_nTdmbPrevAntennaLevel; - -#define TDMB_MAX_NUM_ANTENNA_LEVEL 7 - -UINT rtvTDMB_GetAntennaLevel(U32 dwCER) -{ - UINT nCurLevel = 0; - UINT nPrevLevel = g_nTdmbPrevAntennaLevel; - static const UINT aAntLvlTbl[TDMB_MAX_NUM_ANTENNA_LEVEL] - = {810, 700, 490, 400, 250, 180, 0}; - - if (dwCER == 2000) - return 0; - - do { - if (dwCER >= aAntLvlTbl[nCurLevel]) /* Use equal for CER 0 */ - break; - } while (++nCurLevel != TDMB_MAX_NUM_ANTENNA_LEVEL); - - if (nCurLevel != nPrevLevel) { - if (nCurLevel < nPrevLevel) - nPrevLevel--; - else - nPrevLevel++; - - g_nTdmbPrevAntennaLevel = nPrevLevel; - } - - return nPrevLevel; -} - - -/* Because that TDMB has the sub channel, -we checks the freq which new or the same when the changsing of channel */ -U32 rtvTDMB_GetPreviousFrequency(void) -{ - return g_dwTdmbPrevChFreqKHz; -} - -/* Interrupts are disabled for SPI - TSIF stream disabled are for TSIF */ -static void tdmb_CloseSubChannel(UINT nRegSubChArrayIdx) -{ - UINT nSubChID; - INT nHwSubChIdx; - - if ((g_nRegSubChArrayIdxBits & (1 << nRegSubChArrayIdx)) == 0) - return; /* not opened! already closed! */ - - nSubChID = g_atTdmbRegSubchInfo[nRegSubChArrayIdx].nSubChID; - nHwSubChIdx = g_atTdmbRegSubchInfo[nRegSubChArrayIdx].nHwSubChIdx; - - /* Disable the specified SUB CH first. */ -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) /* Single Sub Channel */ - rtv_Set_MSC1_SUBCH0(nSubChID, FALSE, FALSE); - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL |= MSC1_INTR_BITS; - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif - - rtv_ResetMemory_MSC1(); /* Disable MSC1 memory. */ - -#else /* Multi Sub Channel */ - switch (nHwSubChIdx) { - case 0: - rtv_Set_MSC1_SUBCH0(nSubChID, FALSE, FALSE); - break; - case 3: - rtv_Set_MSC0_SUBCH3(nSubChID, FALSE); - break; - case 4: - rtv_Set_MSC0_SUBCH4(nSubChID, FALSE); - break; - case 5: - rtv_Set_MSC0_SUBCH5(nSubChID, FALSE); - break; - case 6: - rtv_Set_MSC0_SUBCH6(nSubChID, FALSE); - break; - default: - break; - } - - if ((g_nRtvUsedHwSubChIdxBits & TDMB_MSC1_SUBCH_USE_MASK) == 0) { -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL |= MSC1_INTR_BITS; - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif - rtv_ResetMemory_MSC1(); /* Disable MSC1 memory */ - } - - if ((g_nRtvUsedHwSubChIdxBits & TDMB_MSC0_SUBCH_USE_MASK) == 0) { -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL |= MSC0_INTR_BITS; - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif - rtv_ResetMemory_MSC0(); /* Disable MSC0 memory */ - } -#endif - -#ifdef RTV_CIF_HEADER_INSERTED -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - if (nHwSubChIdx != 0) /* MSC0 only */ -#endif - rtvCIFDEC_DeleteSubChannelID(nSubChID); -#endif - - /* Delete a used sub channel index. */ - g_nRtvUsedHwSubChIdxBits &= ~(1 << nHwSubChIdx); - - /* Delete a registered subch array index. */ - g_nRegSubChArrayIdxBits &= ~(1 << nRegSubChArrayIdx); - - /* Deregister a sub channel ID Bit. */ - g_aRegSubChIdBits[SUBCH_GRP_IDX(nSubChID)] &= - ~(1 << MOD32(nSubChID)); -} - -#if (RTV_MAX_NUM_SUB_CHANNEL_USED > 1) -static void tdmb_CloseAllSubChannel(void) -{ - UINT i = 0; - UINT nRegSubChArrayIdxBits = g_nRegSubChArrayIdxBits; - - while (nRegSubChArrayIdxBits != 0) { - if (nRegSubChArrayIdxBits & 0x01) - tdmb_CloseSubChannel(i); - - nRegSubChArrayIdxBits >>= 1; - i++; - } -} -#endif - -void rtvTDMB_CloseAllSubChannels(void) -{ -#if (RTV_MAX_NUM_SUB_CHANNEL_USED > 1) - UINT i = 0; - UINT nRegSubChArrayIdxBits = g_nRegSubChArrayIdxBits; -#endif - - RTV_GUARD_LOCK; - -/* rtv_StreamDisable(RTV_TV_MODE_TDMB); */ - -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) /* Single Sub Channel */ - tdmb_CloseSubChannel(0); -#else - - while (nRegSubChArrayIdxBits != 0) { - if (nRegSubChArrayIdxBits & 0x01) - tdmb_CloseSubChannel(i); - - nRegSubChArrayIdxBits >>= 1; - i++; - } -#endif - -/* rtv_StreamRestore(RTV_TV_MODE_TDMB); */ - - RTV_GUARD_FREE; -} - -INT rtvTDMB_CloseSubChannel(UINT nSubChID) -{ -#if (RTV_MAX_NUM_SUB_CHANNEL_USED > 1) - UINT i = 0; - UINT nRegSubChArrayIdxBits = g_nRegSubChArrayIdxBits; -#endif - - RTV_GUARD_LOCK; - -/* rtv_StreamDisable(RTV_TV_MODE_TDMB); */ - -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) /* Single Sub Channel */ - tdmb_CloseSubChannel(0); -#else - - while (nRegSubChArrayIdxBits != 0) { - if (nRegSubChArrayIdxBits & 0x01) { - if (nSubChID == g_atTdmbRegSubchInfo[i].nSubChID) - tdmb_CloseSubChannel(i); - } - - nRegSubChArrayIdxBits >>= 1; - i++; - } -#endif - -/* rtv_StreamRestore(RTV_TV_MODE_TDMB); */ - - RTV_GUARD_FREE; - - return RTV_SUCCESS; -} - -static void tdmb_OpenSubChannel( - UINT nSubChID, - enum E_RTV_TDMB_SERVICE_TYPE eServiceType, - UINT nThresholdSize) -{ - INT nHwSubChIdx; - UINT i = 0; - -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) /* Single Subchannel */ - nHwSubChIdx = 0; - - /* Set the sub-channel and enable MSC memory - with the specified sub ID. */ - if (eServiceType == RTV_TDMB_SERVICE_VIDEO) - rtv_Set_MSC1_SUBCH0(nSubChID, TRUE, TRUE); /* RS enable */ - else - rtv_Set_MSC1_SUBCH0(nSubChID, TRUE, FALSE); /* RS Disable */ - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(INT_E_UCLRL, 0x04); - /* MSC1 Interrupt status clear. */ - - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL &= ~(MSC1_INTR_BITS); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); - /* Enable MSC1 interrupts. */ -#endif - - rtv_SetupMemory_MSC1(nThresholdSize); - -#else - /* Multi sub channel enabled */ - if ((eServiceType == RTV_TDMB_SERVICE_VIDEO) - || (eServiceType == RTV_TDMB_SERVICE_AUDIO)) { - nHwSubChIdx = 0; - - if (eServiceType == RTV_TDMB_SERVICE_VIDEO) - /*RS enable*/ - rtv_Set_MSC1_SUBCH0(nSubChID, TRUE, TRUE); - else - /*RS disable*/ - rtv_Set_MSC1_SUBCH0(nSubChID, TRUE, FALSE); - - if ((g_nRtvUsedHwSubChIdxBits - & TDMB_MSC1_SUBCH_USE_MASK) == 0) { - /* First enabled. */ -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(DD_PAGE); - /* MSC1 Interrupt status clear.*/ - RTV_REG_SET(INT_E_UCLRL, 0x04); - - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL &= ~(MSC1_INTR_BITS); - /* Enable MSC1 interrupts and restore FIC . */ - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif - rtv_SetupMemory_MSC1(nThresholdSize); - } - } else { - /* Data */ -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - /* Search an available SUBCH index - for Audio/Data service. (3 ~ 6) */ - for (nHwSubChIdx = 3/* MSC0 base */; - nHwSubChIdx <= 6; - nHwSubChIdx++) { -#else - for (nHwSubChIdx = 3/* MSC0 base */; - nHwSubChIdx <= 5; - nHwSubChIdx++) { -#endif - if ((g_nRtvUsedHwSubChIdxBits & (1< 1) - for (i = 0; i < RTV_MAX_NUM_SUB_CHANNEL_USED; i++) { - if ((g_nRegSubChArrayIdxBits & (1< 1) - break; -} -} -#endif - - /* Add the HW sub channel index. */ - g_nRtvUsedHwSubChIdxBits |= (1 << nHwSubChIdx); - - /* Register a new sub channel ID Bit. */ - g_aRegSubChIdBits[SUBCH_GRP_IDX(nSubChID)] - |= (1 << MOD32(nSubChID)); - - /*RTV_DBGMSG2("[tdmb_OpenSubChannel] " - "nSubChID(%d) use MSC_SUBCH%d\n", - nSubChID, - nHwSubChIdx);*/ -} - -INT rtvTDMB_OpenSubChannel( - U32 dwChFreqKHz, - UINT nSubChID, - enum E_RTV_TDMB_SERVICE_TYPE eServiceType, - UINT nThresholdSize) -{ - INT nRet = RTV_SUCCESS; - - if (nSubChID > (MAX_NUM_TDMB_SUB_CH - 1)) - return RTV_INVAILD_SUB_CHANNEL_ID; - - /* Check for threshold size. */ -#ifndef RTV_CIF_MODE_ENABLED /* Individual Mode */ -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - if (nThresholdSize > (188 * 18)) - return RTV_INVAILD_THRESHOLD_SIZE; -#endif -#endif - - /* Check the previous freq. */ - if (g_dwTdmbPrevChFreqKHz == dwChFreqKHz) { - /* Is registerd sub ch ID? */ - if (g_aRegSubChIdBits[SUBCH_GRP_IDX(nSubChID)] - & (1 << MOD32(nSubChID))) { - RTV_GUARD_LOCK; - /* To restore FIC stream. */ - rtv_StreamRestore(RTV_TV_MODE_TDMB); - RTV_GUARD_FREE; - - RTV_DBGMSG1("[rtvTDMB_OpenSubChannel] " - " Already opened sub channed ID(%d)\n", nSubChID); - - return RTV_SUCCESS; - } - -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1)/* Single Sub Channel Mode */ - RTV_GUARD_LOCK; - /* Max sub channel is 1. So, we close the previous sub ch. */ - tdmb_CloseSubChannel(0); -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x10, 0x48); - RTV_REG_SET(0x10, 0xC9); -#endif - tdmb_OpenSubChannel(nSubChID, eServiceType, nThresholdSize); - RTV_GUARD_FREE; -#else - /* Multi Sub Channel. */ - if ((eServiceType == RTV_TDMB_SERVICE_VIDEO) - || (eServiceType == RTV_TDMB_SERVICE_AUDIO)) { - /* Check if the SUBCH available for Video service ? */ - if ((g_nRtvUsedHwSubChIdxBits - & TDMB_MSC1_SUBCH_USE_MASK) - == TDMB_MSC1_SUBCH_USE_MASK) { - RTV_GUARD_LOCK; - /* To restore FIC stream. */ - rtv_StreamRestore(RTV_TV_MODE_TDMB); - RTV_GUARD_FREE; - /* Only 1 Video/Audio service. - Close other video service.*/ - return RTV_NO_MORE_SUB_CHANNEL; - } - } else { - /* Data */ - /* Check if the SUBCH available for - Audio/Data services for MSC0 ? */ - if ((g_nRtvUsedHwSubChIdxBits - & TDMB_MSC0_SUBCH_USE_MASK) - == TDMB_MSC0_SUBCH_USE_MASK) { - RTV_GUARD_LOCK; - /* To restore FIC stream. */ - rtv_StreamRestore(RTV_TV_MODE_TDMB); - RTV_GUARD_FREE; - - return RTV_NO_MORE_SUB_CHANNEL; - } - } - - RTV_GUARD_LOCK; - tdmb_OpenSubChannel(nSubChID, eServiceType, nThresholdSize); - /* To restore FIC stream. This is NOT the first time. */ - rtv_StreamRestore(RTV_TV_MODE_TDMB); - RTV_GUARD_FREE; -#endif - } else { - /* if(g_dwTdmbPrevChFreqKHz[RaonTvChipIdx] == dwChFreqKHz) */ - g_dwTdmbPrevChFreqKHz = dwChFreqKHz; - - g_fRtvChannelChange = TRUE; /* To prevent get ber, cnr ... */ - - RTV_GUARD_LOCK; - -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) - /* Cloes the previous sub channel - because this channel is a new freq. */ - tdmb_CloseSubChannel(0); -#else - /* Cloes the all sub channel because this channel is a new freq. */ - tdmb_CloseAllSubChannel(); -#endif - - nRet = rtvRF_SetFrequency(RTV_TV_MODE_TDMB, 0, dwChFreqKHz); - - tdmb_OpenSubChannel(nSubChID, eServiceType, nThresholdSize); - - RTV_GUARD_FREE; - - g_fRtvChannelChange = FALSE; - } - - return nRet; -} - -/* - rtvTDMB_ReadFIC() - - This function reads a FIC data in manually. - */ -UINT rtvTDMB_ReadFIC(U8 *pbBuf) -{ -#ifdef RTV_FIC_POLLING_MODE - U8 int_type_val1; - UINT cnt = 0; - U8 tr_mode; - const UINT frame_dur[4] = { - (96) / 2, - (96 / 4) / 2, - (96 / 4) / 2, - (96 / 2) / 2 }; - - if (g_fRtvTdmbConfiguredFIC == FALSE) { - RTV_DBGMSG0("[rtvTDMB_ReadFIC] NOT OPEN FIC\n"); - return 0; - } - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(0x06); - tr_mode = RTV_REG_GET(0x27); /* DAB TX Mode monitoring */ - tr_mode = (tr_mode & 0x30) >> 4; - - RTV_REG_MAP_SEL(DD_PAGE); - while (++cnt <= 10) { - int_type_val1 = RTV_REG_GET(INT_E_STATL); - if (int_type_val1 & FIC_E_INT) /* FIC interrupt */ { - /*printk("FIC_E_INT occured!\n");*/ - - RTV_REG_MAP_SEL(FIC_PAGE); -#if defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_BURST_GET(0x10, pbBuf, 192); - RTV_REG_BURST_GET(0x10, pbBuf+192, 192); - -#elif defined(RTV_IF_SPI) -#if defined(__KERNEL__) || defined(WINCE) - RTV_REG_BURST_GET(0x10, pbBuf, 384+1); -#else - RTV_REG_BURST_GET(0x10, pbBuf, 384); -#endif -#endif - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(INT_E_UCLRL, 0x01); - /* FIC interrupt status clear */ - - RTV_GUARD_FREE; - - return 384; - - } - RTV_DELAY_MS(frame_dur[tr_mode]); - } /* while() */ - - RTV_GUARD_FREE; - - RTV_DBGMSG0("[rtvTDMB_ReadFIC] FIC read timeout\n"); - - return 0; - -#else - - RTV_REG_MAP_SEL(FIC_PAGE); -#if defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) - RTV_REG_BURST_GET(0x10, pbBuf, 192); - RTV_REG_BURST_GET(0x10, pbBuf+192, 192); - -#elif defined(RTV_IF_SPI) -#if defined(__KERNEL__) || defined(WINCE) - RTV_REG_BURST_GET(0x10, pbBuf, 384+1); -#else - RTV_REG_BURST_GET(0x10, pbBuf, 384); -#endif -#endif - - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(INT_E_UCLRL, 0x01); /* FIC interrupt status clear */ - - return 384; -#endif -} - -void rtvTDMB_CloseFIC(void) -{ - if (g_fRtvTdmbConfiguredFIC == FALSE) - return; - - RTV_GUARD_LOCK; - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -#ifndef RTV_FIC_POLLING_MODE - /* Disable the FIC interrupt. */ - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL |= FIC_E_INT; - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif - -#elif defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) /* Single sub channel mode */ -#ifndef RTV_FIC_POLLING_MODE - /* Disable the FIC interrupt. */ - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL |= FIC_E_INT; - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif -#endif -#endif - - rtv_ResetMemory_FIC(); - - g_fRtvTdmbConfiguredFIC = FALSE; - - RTV_GUARD_FREE; -} - -void rtvTDMB_OpenFIC(void) -{ - if (g_fRtvTdmbConfiguredFIC == TRUE) - return; - - g_fRtvTdmbConfiguredFIC = TRUE; - - RTV_GUARD_LOCK; - -#if defined(RTV_IF_SPI) || defined(RTV_IF_EBI2) -#ifndef RTV_FIC_POLLING_MODE - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x01); /* FIC Interrupt status clear. */ - - /* Enable the FIC interrupt. */ - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL &= ~(FIC_E_INT); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif - -#elif defined(RTV_IF_TSIF) || defined(RTV_IF_SPI_SLAVE) -#ifndef RTV_CIF_MODE_ENABLED /* Single sub channel mode */ -#ifndef RTV_FIC_POLLING_MODE - RTV_REG_MAP_SEL(DD_PAGE); - RTV_REG_SET(0x35, 0x01); /* FIC Interrupt status clear. */ - - /* Enable the FIC interrupt. - This mode only use FIC interrupt. - MSC used by TSIF. */ - RTV_REG_MAP_SEL(HOST_PAGE); - g_bRtvIntrMaskRegL &= ~(FIC_E_INT); - RTV_REG_SET(0x62, g_bRtvIntrMaskRegL); -#endif -#endif -#endif - - rtv_SetupMemory_FIC(); /* Enable FIC memory. */ - - RTV_GUARD_FREE; -} - -/* When this function was called, - all sub channel should closed to reduce scan-time !!!!! - FIC can enabled. Usally enabled. */ -INT rtvTDMB_ScanFrequency(U32 dwChFreqKHz) -{ - U8 scan_done, OFDM_L = 0, ccnt = 0, NULL_C = 0, SCV_C = 0; - U8 scan_pwr1 = 0, scan_pwr2 = 0, DAB_Mode = 0xFF, DAB_Mode_Chk = 0xFF; - U8 pre_agc1 = 0, pre_agc2 = 0, pre_agc_mon = 0, ASCV = 0; - INT scan_flag = 0; - U16 SPower = 0, PreGain = 0, PreGainTH = 0, PWR_TH = 0, ILoopTH = 0; - U8 Cfreq_HTH = 0, Cfreq_LTH = 0; - U8 i = 0, j = 0, m = 0, n = 0; - U8 varyLow = 0, varyHigh = 0; - U16 varyMon = 0; - U8 MON_FSM = 0, FsmCntChk = 0; - U8 test0 = 0, test1 = 0; - U16 NullLengthMon = 0; - U16 fail = 0; - U8 FecResetCh = 0xff; - U8 FEC_SYNC = 0xFF, CoarseFreq = 0xFF, NullTh = 0xFF, NullChCnt = 0; - U8 rdata0 = 0, rdata1 = 0; - U16 i_chk = 0, q_chk = 0; - UINT nReTryCnt = 0; - - g_fRtvChannelChange = TRUE; /* To prevent get ber, cnr ... */ - - RTV_GUARD_LOCK; - - /* NOTE: When this rountine executed, all sub channel should closed - and memory(MSC0, MSC1) interrupts are disabled. */ -#if (RTV_MAX_NUM_SUB_CHANNEL_USED == 1) - tdmb_CloseSubChannel(0); -#else - tdmb_CloseAllSubChannel(); -#endif - - scan_flag = rtvRF_SetFrequency(RTV_TV_MODE_TDMB, 0, dwChFreqKHz); - if (scan_flag != RTV_SUCCESS) - goto TDMB_SCAN_EXIT; - - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x54, 0x70); - - tdmb_SoftReset(); - - FecResetCh = 0xff; - fail = 0xFFFF; - - while (1) { - if (++nReTryCnt == 10000) { - /* Up to 400ms */ - RTV_DBGMSG0("[rtvTDMB_ScanFrequency] Scan Timeout!\n"); - scan_flag = RTV_CHANNEL_NOT_DETECTED; - break; - } - - RTV_REG_MAP_SEL(OFDM_PAGE); - /* Scan-done flag & scan-out flag check */ - scan_done = RTV_REG_GET(0xCF); - - RTV_REG_MAP_SEL(COMM_PAGE); - /* Scan-Power monitoring */ - scan_pwr1 = RTV_REG_GET(0x38); - scan_pwr2 = RTV_REG_GET(0x39); - SPower = (scan_pwr2 << 8) | scan_pwr1; - - RTV_REG_MAP_SEL(OFDM_PAGE); - - if (scan_done != 0xff) { - NULL_C = 0; - SCV_C = 0; - pre_agc_mon = - RTV_REG_GET(0x53); - RTV_REG_SET(0x53, (pre_agc_mon | 0x80)); - /* Pre-AGC Gain monitoring One-shot */ - pre_agc1 = RTV_REG_GET(0x66); - pre_agc2 = RTV_REG_GET(0x67); - PreGain = (pre_agc2 << 2) | (pre_agc1 & 0x03); - - /* DAB TX Mode monitoring */ - DAB_Mode = RTV_REG_GET(0x27); - DAB_Mode = (DAB_Mode & 0x30) >> 4; - - switch (g_eRtvAdcClkFreqType) { - case RTV_ADC_CLK_FREQ_8_MHz: - PreGainTH = 405; - /* tr mode */ - switch (DAB_Mode) { - case 0: - PWR_TH = 2400; - ILoopTH = 200; - Cfreq_HTH = 206; - Cfreq_LTH = 55; - break; - case 1: - PWR_TH = 2000; - ILoopTH = 180; - Cfreq_HTH = 242; - Cfreq_LTH = 14; - break; - case 2: - PWR_TH = 1300; - ILoopTH = 180; - Cfreq_HTH = 248; - Cfreq_LTH = 8; - break; - case 3: - PWR_TH = 280; - ILoopTH = 180; - Cfreq_HTH = 230; - Cfreq_LTH = 26; - break; - default: - PWR_TH = 2400; - ILoopTH = 200; - Cfreq_HTH = 206; - Cfreq_LTH = 55; - break; - } - break; - - case RTV_ADC_CLK_FREQ_8_192_MHz: - PreGainTH = 405; - - switch (DAB_Mode) { - case 0: - PWR_TH = 1700; - ILoopTH = 200; - Cfreq_HTH = 206; - Cfreq_LTH = 55; - break; - case 1: - PWR_TH = 1500; - ILoopTH = 180; - Cfreq_HTH = 242; - Cfreq_LTH = 14; - break; - case 2: - PWR_TH = 1200; - ILoopTH = 180; - Cfreq_HTH = 248; - Cfreq_LTH = 8; - break; - case 3: - PWR_TH = 1900; - ILoopTH = 180; - Cfreq_HTH = 230; - Cfreq_LTH = 26; - break; - default: - PWR_TH = 1700; - ILoopTH = 200; - Cfreq_HTH = 206; - Cfreq_LTH = 55; - break; - } - break; - - case RTV_ADC_CLK_FREQ_9_MHz: - PreGainTH = 380; - switch (DAB_Mode) { - case 0: - PWR_TH = 7000; - ILoopTH = 200; - Cfreq_HTH = 206; - Cfreq_LTH = 55; - break; - case 1: - PWR_TH = 5000; - ILoopTH = 180; - Cfreq_HTH = 242; - Cfreq_LTH = 14; - break; - case 2: - PWR_TH = 1300; - ILoopTH = 180; - Cfreq_HTH = 248; - Cfreq_LTH = 8; - break; - case 3: - PWR_TH = 8000; - ILoopTH = 180; - Cfreq_HTH = 230; - Cfreq_LTH = 26; - break; - default: - PWR_TH = 8000; - ILoopTH = 200; - Cfreq_HTH = 206; - Cfreq_LTH = 55; - break; - } - break; - - case RTV_ADC_CLK_FREQ_9_6_MHz: - PreGainTH = 380; - - switch (DAB_Mode) { - case 0: - PWR_TH = 7000; - ILoopTH = 200; - Cfreq_HTH = 206; - Cfreq_LTH = 55; - break; - case 1: - PWR_TH = 5000; - ILoopTH = 180; - Cfreq_HTH = 242; - Cfreq_LTH = 14; - break; - case 2: - PWR_TH = 1300; - ILoopTH = 180; - Cfreq_HTH = 248; - Cfreq_LTH = 8; - break; - case 3: - PWR_TH = 8000; - ILoopTH = 180; - Cfreq_HTH = 230; - Cfreq_LTH = 26; - break; - default: - PWR_TH = 8000; - ILoopTH = 200; - Cfreq_HTH = 206; - Cfreq_LTH = 55; - break; - } - - break; - - default: - scan_flag = RTV_UNSUPPORT_ADC_CLK; - goto TDMB_SCAN_EXIT; - } - -if (scan_done == 0x01) { - /* Not DAB signal channel */ - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xEF01; - - goto TDMB_SCAN_EXIT; - /* Auto-scan result return */ -} else if (scan_done == 0x03) { - /* DAB signal channel */ - RTV_REG_MAP_SEL(OFDM_PAGE); - /* coarse freq */ - CoarseFreq = RTV_REG_GET(0x18); - - if (g_eRtvCountryBandType == RTV_COUNTRY_BAND_KOREA) { - if (DAB_Mode > 0) { - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xE002; - - goto TDMB_SCAN_EXIT; - /*Auto-scan result return */ - } - } - - if ((CoarseFreq < Cfreq_HTH) && (CoarseFreq > Cfreq_LTH)) { - CoarseFreq = 0x33; - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xEF33; - goto TDMB_SCAN_EXIT; - } - - if (SPower < PWR_TH) { - /* Scan Power Threshold */ - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xEF03; - goto TDMB_SCAN_EXIT; - } else { - if ((PreGain < PreGainTH) || (PreGain == 0)) { - /*PreAGC Gain threshold check*/ - scan_flag = - RTV_CHANNEL_NOT_DETECTED; - fail = 0xEF04; - goto TDMB_SCAN_EXIT; - } else { - for (m = 0; m < 16; m++) { - NullTh = RTV_REG_GET(0x1C); - RTV_REG_SET(0x1C, (NullTh | 0x10)); - test0 = RTV_REG_GET(0x26); - test1 = RTV_REG_GET(0x27); - NullLengthMon = ((test1 & 0x0F) << 8) | test0; - - /* DAB TX Mode monitoring */ - DAB_Mode_Chk = RTV_REG_GET(0x27); - DAB_Mode_Chk = (DAB_Mode_Chk & 0x30) >> 4; - if (DAB_Mode != DAB_Mode_Chk) { - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xE000; - goto TDMB_SCAN_EXIT; - } - - if ((NullLengthMon == 0) - || (NullLengthMon > 3000)) { - NullChCnt++; - } - if ((NullChCnt > 10) && (m > 14) - && (PreGain < 400)) { - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xEF05; - goto TDMB_SCAN_EXIT; - } else if (m > 14) { - fail = 0x1111; - scan_flag = RTV_SUCCESS; - break; - } - RTV_DELAY_MS(10); - } - } - if (scan_flag == RTV_SUCCESS) { - for (i = 0; i < /*ILoopTH*/100; i++) { - RTV_DELAY_MS(10); - - RTV_REG_MAP_SEL(OFDM_PAGE); - ASCV = RTV_REG_GET(0x30); - ASCV = ASCV & 0x0F; - if ((SCV_C > 0) && (ASCV > 7)) { - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xFF08; - goto TDMB_SCAN_EXIT; - /* Auto-scan result return */ - } - if (ASCV > 7) - SCV_C++; - - /* DAB TX Mode monitoring */ - DAB_Mode_Chk = - RTV_REG_GET(0x27); - DAB_Mode_Chk = (DAB_Mode_Chk & 0x30) >> 4; - if (DAB_Mode != DAB_Mode_Chk) { - scan_flag = - RTV_CHANNEL_NOT_DETECTED; - fail = 0xF100; - goto TDMB_SCAN_EXIT; - } - - RTV_REG_MAP_SEL(COMM_PAGE); - RTV_REG_MASK_SET(0x4D, 0x04, 0x00); - RTV_REG_MASK_SET(0x4D, 0x04, 0x04); - rdata0 = RTV_REG_GET(0x4E); - rdata1 = RTV_REG_GET(0x4F); - i_chk = (rdata1 << 8) + rdata0; - - rdata0 = RTV_REG_GET(0x50); - rdata1 = RTV_REG_GET(0x51); - q_chk = (rdata1 << 8) + rdata0; - if ((((i_chk > 5) && (i_chk < 65530)) - || ((q_chk > 5) && (q_chk < 65530))) - && (PreGain < 500)) { - scan_flag = - RTV_CHANNEL_NOT_DETECTED; - fail = 0xF200; - goto TDMB_SCAN_EXIT; - } - - RTV_REG_MAP_SEL(OFDM_PAGE); - MON_FSM = RTV_REG_GET(0x37); - MON_FSM = MON_FSM & 0x07; - - if ((MON_FSM == 1) && (PreGain < 600)) { - FsmCntChk++; - if (NullChCnt > 14) - FsmCntChk += 3; - } - if ((MON_FSM == 1) && (FsmCntChk > 9) - && (ccnt < 2)) { - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xFF0A; - FsmCntChk = 0; - - goto TDMB_SCAN_EXIT; - /* Auto-scan result return */ - } -/* ///////////////////////////////////////////////////////////////// */ -/* //////////////// Coarse Freq. check////////////////////////////// */ -/* ///////////////////////////////////////////////////////////////// */ -/* Coarse count check */ -ccnt = RTV_REG_GET(0x17); -ccnt &= 0x1F; - if (ccnt > 1) { - for (j = 0; j < 50; j++) { - RTV_DELAY_MS(10); - RTV_REG_MAP_SEL(OFDM_PAGE); - OFDM_L = RTV_REG_GET(0x12); - RTV_REG_MASK_SET(0x82, 0x01, 0x01); - varyLow = RTV_REG_GET(0x7E); - varyHigh = RTV_REG_GET(0x7F); - varyMon = ((varyHigh & 0x1f) << 8) + varyLow; - if ((OFDM_L & 0x80) && (varyMon > 0)) { - RTV_REG_MAP_SEL(OFDM_PAGE); - RTV_REG_SET(0x54, 0x58); - break; - } - } - if (OFDM_L & 0x80) { - -#if 1 - /* OFDM_Lock & FEC_Sync OK */ - scan_flag = RTV_SUCCESS; - fail = 0xFF7F; - goto TDMB_SCAN_EXIT; - -#else - - RTV_REG_MAP_SEL(FEC_PAGE); - FEC_SYNC = RTV_REG_GET(0xFB); - FEC_SYNC = FEC_SYNC & 0x03; - if (FEC_SYNC == 0x03) { - /* OFDM_Lock & FEC_Sync OK */ - scan_flag = RTV_SUCCESS; - fail = 0xFF70; - goto TDMB_SCAN_EXIT; - } else if (FEC_SYNC == 0x02) { - for (n = 0; n < 20; n++) { - RTV_DELAY_MS(10); - RTV_REG_MAP_SEL(FEC_PAGE); - FEC_SYNC = RTV_REG_GET(0xFB); - FEC_SYNC = FEC_SYNC & 0x03; - RTV_REG_MAP_SEL(OFDM_PAGE); - OFDM_L = RTV_REG_GET(0x12); - OFDM_L = OFDM_L & 0x80; - if (OFDM_L == 0x80) { - if (FEC_SYNC == 0x03) { - scan_flag = RTV_SUCCESS; - fail = 0xFF71; /* FEC_Sync OK */ - goto TDMB_SCAN_EXIT; - } else if (FEC_SYNC == 0x02) { - scan_flag - = RTV_CHANNEL_NOT_DETECTED; - fail = 0xFF72; /* FEC_Sync miss */ - } else { - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xFF73; - } - } else { - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xFF74; - goto TDMB_SCAN_EXIT; - /* Auto-scan result return */ - } - } - } else { - fail = 0xFF75; - /* OFDM_Lock & FEC_Miss */ - scan_flag = RTV_CHANNEL_NOT_DETECTED; - } -#endif - } else { - /* OFDM_Unlock */ - scan_flag = RTV_CHANNEL_NOT_DETECTED; - fail = 0xFF0B; - } - goto TDMB_SCAN_EXIT; - /* Auto-scan result return */ - } else { - scan_flag = RTV_CHANNEL_NOT_DETECTED; - } - } - fail = 0xFF0C; - scan_flag = RTV_CHANNEL_NOT_DETECTED; - goto TDMB_SCAN_EXIT; -} - } - } - } else { - fail = 0xFF0C; - scan_flag = RTV_CHANNEL_NOT_DETECTED; - goto TDMB_SCAN_EXIT; - } - } - - fail = 0xFF0D; - -TDMB_SCAN_EXIT: - - RTV_GUARD_FREE; - - g_fRtvChannelChange = FALSE; - - g_dwTdmbPrevChFreqKHz = dwChFreqKHz; - - RTV_DBGMSG1("[rtvTDMB_ScanFrequency] 0x%04X\n", fail); - - return scan_flag; /* Auto-scan result return */ -} - -void rtvTDMB_DisableStreamOut(void) -{ - RTV_GUARD_LOCK; - - rtv_StreamDisable(RTV_TV_MODE_TDMB); - - RTV_GUARD_FREE; -} - -INT rtvTDMB_Initialize(enum E_RTV_COUNTRY_BAND_TYPE eRtvCountryBandType) -{ - INT nRet; - - switch (eRtvCountryBandType) { - case RTV_COUNTRY_BAND_KOREA: - break; - - default: - return RTV_INVAILD_COUNTRY_BAND; - } - g_eRtvCountryBandType = eRtvCountryBandType; - - g_dwTdmbPrevChFreqKHz = 0; - - g_nRtvUsedHwSubChIdxBits = 0x00; - - g_fRtvTdmbConfiguredFIC = FALSE; - - g_nRegSubChArrayIdxBits = 0x00; - - g_aRegSubChIdBits[0] = 0x00000000; - g_aRegSubChIdBits[1] = 0x00000000; - - nRet = rtv_InitSystem(RTV_TV_MODE_TDMB, RTV_ADC_CLK_FREQ_8_MHz); - if (nRet != RTV_SUCCESS) - return nRet; - - /* Must after rtv_InitSystem() to save ADC clock. */ - tdmb_InitDemod(); - - nRet = rtvRF_Initilize(RTV_TV_MODE_TDMB); - if (nRet != RTV_SUCCESS) - return nRet; - - RTV_DELAY_MS(100); - - RTV_REG_MAP_SEL(RF_PAGE); - RTV_REG_SET(0x6b, 0xC5); - -#ifdef RTV_CIF_HEADER_INSERTED/* CIF Mode */ - rtvCIFDEC_Init(); -#endif - - return RTV_SUCCESS; -} - -#endif /* #ifdef RTV_TDMB_ENABLE */ - diff --git a/drivers/media/tdmb/t3900/INC_FICDEC.c b/drivers/media/tdmb/t3900/INC_FICDEC.c deleted file mode 100644 index a0e779a..0000000 --- a/drivers/media/tdmb/t3900/INC_FICDEC.c +++ /dev/null @@ -1,1535 +0,0 @@ -/***************************************************************************** - Copyright(c) 2011 I&C Inc. All Rights Reserved - - File name : INC_FICDEC.c - - Description : - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*******************************************************************************/ - -#include "INC_INCLUDES.h" - - -struct ST_FICDB_LIST g_stFicDbList; -unsigned char INC_GET_BYTEDATA(struct ST_FIB_INFO *pFibInfo) -{ - return pFibInfo->aucBuff[pFibInfo->ucDataPos++] & 0xff; -} - -unsigned char INC_GETAT_BYTEDATA(struct ST_FIB_INFO *pFibInfo) -{ - return pFibInfo->aucBuff[pFibInfo->ucDataPos] & 0xff; -} - -unsigned short INC_GET_WORDDATA(struct ST_FIB_INFO *pFibInfo) -{ - unsigned short uiData, result; - uiData = - (((unsigned short) pFibInfo->aucBuff[pFibInfo->ucDataPos++] << 8) & - 0xff00); - uiData |= - ((unsigned short) pFibInfo->aucBuff[pFibInfo->ucDataPos++] & 0xff); - result = (uiData & 0xffff); - return result; -} - -unsigned short INC_GETAT_WORDDATA(struct ST_FIB_INFO *pFibInfo) -{ - unsigned short uiData, result; - uiData = - (((unsigned short) pFibInfo->aucBuff[pFibInfo->ucDataPos] << 8) - & 0xff00) | - ((unsigned short) pFibInfo->aucBuff[pFibInfo->ucDataPos + 1] - & 0xff); - result = (uiData & 0xffff); - return result; -} - -unsigned int INC_GET_LONGDATA(struct ST_FIB_INFO *pFibInfo) -{ - unsigned int ulMsb, ulLsb , result; - ulMsb = (unsigned int) INC_GET_WORDDATA(pFibInfo); - ulLsb = (unsigned int) INC_GET_WORDDATA(pFibInfo); - result = (ulMsb << 16 | ulLsb); - return result; -} - -unsigned int INC_GETAT_LONGDATA(struct ST_FIB_INFO *pFibInfo) -{ - unsigned int ulMsb, ulLsb, result; - ulMsb = (unsigned int) INC_GETAT_WORDDATA(pFibInfo); - pFibInfo->ucDataPos += 2; - ulLsb = (unsigned int) INC_GETAT_WORDDATA(pFibInfo); - pFibInfo->ucDataPos -= 2; - result = (ulMsb << 16 | ulLsb); - return result; -} - -unsigned char INC_GETAT_HEADER(struct ST_FIB_INFO *pInfo) -{ - return pInfo->aucBuff[pInfo->ucDataPos]; -} - -unsigned char INC_GETAT_TYPE(struct ST_FIB_INFO *pInfo) -{ - return pInfo->aucBuff[pInfo->ucDataPos + 1]; -} - -unsigned char INC_GET_NULL_BLOCK(union ST_FIG_HEAD *pInfo) -{ - if (pInfo->ucInfo == END_MARKER) - return INC_ERROR; - return INC_SUCCESS; -} - -unsigned char INC_GET_FIND_LENGTH(union ST_FIG_HEAD *pInfo) -{ - if (!pInfo->ITEM.bitLength || pInfo->ITEM.bitLength > FIB_SIZE - 3) - return INC_ERROR; - return INC_SUCCESS; -} - -unsigned short INC_CRC_CHECK(unsigned char *pBuf, unsigned char ucSize) -{ - unsigned char ucLoop; - unsigned short nCrc = 0xFFFF, result; - for (ucLoop = 0; ucLoop < ucSize; ucLoop++) { - nCrc = 0xFFFF & (((nCrc << 8) | (nCrc >> 8)) ^ - (0xFF & pBuf[ucLoop])); - nCrc = nCrc ^ ((0xFF & nCrc) >> 4); - nCrc = 0xFFFF & (nCrc ^ ((((((0xFF & nCrc)) << 8) | - (((0xFF & nCrc)) >> 8))) << 4) ^ - ((0xFF & nCrc) << 5)); - } - result = ((unsigned short) 0xFFFF & (nCrc ^ 0xFFFF)); - return result; -} - -unsigned short INC_FIND_SUB_CHANNEL_SIZE(unsigned char ucTableIndex) -{ - unsigned short wSubCHSize = 0; - switch (ucTableIndex) { - case 0: - wSubCHSize = 16; - break; - case 1: - wSubCHSize = 21; - break; - case 2: - wSubCHSize = 24; - break; - case 3: - wSubCHSize = 29; - break; - case 4: - wSubCHSize = 35; - break; - case 5: - wSubCHSize = 24; - break; - case 6: - wSubCHSize = 29; - break; - case 7: - wSubCHSize = 35; - break; - case 8: - wSubCHSize = 42; - break; - case 9: - wSubCHSize = 52; - break; - case 10: - wSubCHSize = 29; - break; - case 11: - wSubCHSize = 35; - break; - case 12: - wSubCHSize = 42; - break; - case 13: - wSubCHSize = 52; - break; - case 14: - wSubCHSize = 32; - break; - case 15: - wSubCHSize = 42; - break; - case 16: - wSubCHSize = 48; - break; - case 17: - wSubCHSize = 58; - break; - case 18: - wSubCHSize = 70; - break; - case 19: - wSubCHSize = 40; - break; - case 20: - wSubCHSize = 52; - break; - case 21: - wSubCHSize = 58; - break; - case 22: - wSubCHSize = 70; - break; - case 23: - wSubCHSize = 84; - break; - case 24: - wSubCHSize = 48; - break; - case 25: - wSubCHSize = 58; - break; - case 26: - wSubCHSize = 70; - break; - case 27: - wSubCHSize = 84; - break; - case 28: - wSubCHSize = 104; - break; - case 29: - wSubCHSize = 58; - break; - case 30: - wSubCHSize = 70; - break; - case 31: - wSubCHSize = 84; - break; - case 32: - wSubCHSize = 104; - break; - case 33: - wSubCHSize = 64; - break; - case 34: - wSubCHSize = 84; - break; - case 35: - wSubCHSize = 96; - break; - case 36: - wSubCHSize = 116; - break; - case 37: - wSubCHSize = 140; - break; - case 38: - wSubCHSize = 80; - break; - case 39: - wSubCHSize = 104; - break; - case 40: - wSubCHSize = 116; - break; - case 41: - wSubCHSize = 140; - break; - case 42: - wSubCHSize = 168; - break; - case 43: - wSubCHSize = 96; - break; - case 44: - wSubCHSize = 116; - break; - case 45: - wSubCHSize = 140; - break; - case 46: - wSubCHSize = 168; - break; - case 47: - wSubCHSize = 208; - break; - case 48: - wSubCHSize = 116; - break; - case 49: - wSubCHSize = 140; - break; - case 50: - wSubCHSize = 168; - break; - case 51: - wSubCHSize = 208; - break; - case 52: - wSubCHSize = 232; - break; - case 53: - wSubCHSize = 128; - break; - case 54: - wSubCHSize = 168; - break; - case 55: - wSubCHSize = 192; - break; - case 56: - wSubCHSize = 232; - break; - case 57: - wSubCHSize = 280; - break; - case 58: - wSubCHSize = 160; - break; - case 59: - wSubCHSize = 208; - break; - case 60: - wSubCHSize = 280; - break; - case 61: - wSubCHSize = 192; - break; - case 62: - wSubCHSize = 280; - break; - case 63: - wSubCHSize = 416; - break; - } - return wSubCHSize; -} - -void INC_EXTENSION_000(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pstHeader; - union ST_TYPE_0 *pstType; - union ST_TYPE0of0_INFO *pBitStarm; - unsigned int ulBitStram = 0; - pstHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pstType = (union ST_TYPE_0 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - ulBitStram = INC_GET_LONGDATA(pFibInfo); - pBitStarm = (union ST_TYPE0of0_INFO *) &ulBitStram; - INC_ADD_ENSEMBLE_ID(pBitStarm); - if (pBitStarm->ITEM.bitChangFlag) - pFibInfo->ucDataPos += 1; -} - -void INC_EXTENSION_001(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pstHeader; - union ST_TYPE_0 *pstType; - union ST_TYPE0of1Short_INFO *pShortInfo = INC_NULL; - union ST_TYPE0of1Long_INFO *pLongInfo = INC_NULL; - struct ST_FICDB_LIST *pList; - unsigned int ulTypeInfo; - unsigned short uiStartAddr; - unsigned char ucSubChId, ucIndex, ucShortLongFlag; - pList = INC_GET_FICDB_LIST(); - pstHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pstType = (union ST_TYPE_0 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - for (ucIndex = 0; ucIndex < pstHeader->ITEM.bitLength - 1;) { - ucShortLongFlag = - (pFibInfo->aucBuff[pFibInfo->ucDataPos + 2] - >> 7) & 0x01; - if (ucShortLongFlag == 0) { - ulTypeInfo = - INC_GET_LONGDATA(pFibInfo); - pShortInfo = - (union ST_TYPE0of1Short_INFO *) &ulTypeInfo; - pFibInfo->ucDataPos -= 1; - ucSubChId = pShortInfo->ITEM.bitSubChId; - uiStartAddr = pShortInfo->ITEM.bitStartAddr; - } - - else { - ulTypeInfo = INC_GET_LONGDATA(pFibInfo); - pLongInfo = (union ST_TYPE0of1Long_INFO *) &ulTypeInfo; - ucSubChId = pLongInfo->ITEM.bitSubChId; - uiStartAddr = pLongInfo->ITEM.bitStartAddr; - } - if (pList->ucIsSetSimple == SIMPLE_FIC_ENABLE) - INC_FIND_SIMPLE_ORGANIZAION_SUBCHANNEL_ID(ucSubChId, - uiStartAddr, ulTypeInfo); - else - INC_FIND_ORGANIZAION_SUBCHANNEL_ID(ucSubChId, - ulTypeInfo); - ucIndex += (!ucShortLongFlag) ? 3 : 4; - } - if (pList->ucIsSimpleCnt) - pList->ucIsSimpleFIC = 1; -} - -void INC_EXTENSION_002(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pstHeader; - union ST_TYPE_0 *pstType; - union ST_SERVICE_COMPONENT *pService; - unsigned int ulServiceId; - unsigned short uiData; - unsigned char ucService, ucLoop, ucFrame; - pstHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pstType = (union ST_TYPE_0 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - for (ucFrame = 0; ucFrame < pstHeader->ITEM.bitLength - 1;) { - if (pstType->ITEM.bitPD == 0) { - ulServiceId = (unsigned int) INC_GET_WORDDATA(pFibInfo); - ucFrame += 2; - } - - else { - ulServiceId = INC_GET_LONGDATA(pFibInfo); - ucFrame += 4; - } - ucService = INC_GET_BYTEDATA(pFibInfo); - ucFrame += 1; - pService = (union ST_SERVICE_COMPONENT *) &ucService; - for (ucLoop = 0; ucLoop < pService->ITEM.bitNumComponent; - ucLoop++, ucFrame += 2){ - uiData = INC_GET_WORDDATA(pFibInfo); - INC_FIND_BASIC_SERVICE(ulServiceId, uiData); - } - } -} - -void INC_EXTENSION_003(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pstHeader; - union ST_TYPE_0 *pstType; - union ST_TYPE0of3_INFO *pTypeInfo; - union ST_TYPE0of3Id_INFO *pIdInfo; - unsigned int uiId, uiTypeInfo; - unsigned char ucIndex; - pstHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pstType = (union ST_TYPE_0 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - for (ucIndex = 0; ucIndex < pstHeader->ITEM.bitLength - 1;) { - uiTypeInfo = INC_GET_WORDDATA(pFibInfo); - pTypeInfo = (union ST_TYPE0of3_INFO *) &uiTypeInfo; - uiId = INC_GET_WORDDATA(pFibInfo); - uiId = (uiId << 16) | (INC_GET_BYTEDATA(pFibInfo) << 8); - pIdInfo = (union ST_TYPE0of3Id_INFO *) &uiId; - INC_FIND_PACKET_MODE(pTypeInfo, pIdInfo); - ucIndex += 5; - if (pTypeInfo->ITEM.bitCAOrgFlag == 1) { - ucIndex += 2; - pFibInfo->ucDataPos += 2; - } - } -} - -void INC_EXTENSION_008(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pstHeader; - union ST_TYPE_0 *pstType; - union ST_MSC_BIT *pstMsc; - union ST_MSC_SHORT *pstMscShort; - union ST_MSC_LONG *pstMscLong; - unsigned short uiMsgBit; - unsigned int ulSerId = 0; - unsigned char ucMscInfo, ucIndex, ucLSFlag; - pstHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pstType = (union ST_TYPE_0 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - for (ucIndex = 0; ucIndex < pstHeader->ITEM.bitLength - 1;) { - if (!pstType->ITEM.bitPD) { - ulSerId = (unsigned int) INC_GET_WORDDATA(pFibInfo); - ucIndex += 2; - } - - else { - ulSerId = INC_GET_LONGDATA(pFibInfo); - ucIndex += 4; - } - ucMscInfo = INC_GET_BYTEDATA(pFibInfo); - pstMsc = (union ST_MSC_BIT *) &ucMscInfo; - ucIndex += 1; - ucLSFlag = (INC_GETAT_BYTEDATA(pFibInfo) >> 7) & 0x01; - if (ucLSFlag) { - uiMsgBit = INC_GET_WORDDATA(pFibInfo); - ucIndex += 2; - pstMscLong = (union ST_MSC_LONG *) &uiMsgBit; - INC_FIND_GLOBAL_SERVICE_COMPONENT_LONG( - ulSerId, pstMscLong, pstMsc); - } else { - uiMsgBit = (unsigned short) INC_GET_BYTEDATA(pFibInfo); - ucIndex += 1; - pstMscShort = (union ST_MSC_SHORT *) &uiMsgBit; - INC_FIND_GLOBAL_SERVICE_COMPONENT_SHORT( - ulSerId, pstMscShort, pstMsc); - } - if (pstMsc->ITEM.bitExtFlag) { - ucIndex += 1; - pFibInfo->ucDataPos += 1; - } - } -} - -void INC_EXTENSION_010(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pstHeader; - union ST_TYPE_0 *pstType; - union ST_UTC_SHORT_INFO *pstUTC_Short_Info; - union ST_UTC_LONG_INFO *pstUTC_Long_Info; - unsigned int ulUtcInfo; - unsigned short uiUtcLongForm; - struct ST_FICDB_LIST *pList; - pList = INC_GET_FICDB_LIST(); - pstHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pstType = (union ST_TYPE_0 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - ulUtcInfo = INC_GET_LONGDATA(pFibInfo); - pstUTC_Short_Info = (union ST_UTC_SHORT_INFO *) &ulUtcInfo; - MJDtoYMD(pstUTC_Short_Info->ITEM.bitMJD, &pList->stDate); - pList->stDate.ucHour = (pstUTC_Short_Info->ITEM.bitHours + 9) % 24; - pList->stDate.ucMinutes = pstUTC_Short_Info->ITEM.bitMinutes; - if (pstUTC_Short_Info->ITEM.bitUTC_Flag) { - uiUtcLongForm = INC_GET_WORDDATA(pFibInfo); - pstUTC_Long_Info = (union ST_UTC_LONG_INFO *) &uiUtcLongForm; - pList->stDate.ucSeconds = - pstUTC_Long_Info->ITEM.bitSeconds; - pList->stDate.uiMilliseconds = - pstUTC_Long_Info->ITEM.bitMilliseconds; - } -#ifdef INC_FIC_DEBUG_MESSAGE - INC_MSG_PRINTF(1, "\r\n UTC %.4d-%.2d-%.2d: %.2d.%.2d.%.2d[%dms]", - pList->stDate.usYear, pList->stDate.ucMonth, - pList->stDate.ucDay, pList->stDate.ucHour, - pList->stDate.ucMinutes, pList->stDate.ucSeconds, - pList->stDate.uiMilliseconds); -#endif /* */ -} - -#ifdef USER_APPLICATION_TYPE -void INC_EXTENSION_013(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pstHeader; - union ST_TYPE_0 *pstType; - union ST_USER_APP_IDnNUM *pUserAppIdNum; - union ST_USER_APPTYPE *pUserAppType; - union ST_USERAPP_GROUP_INFO stUserApp; - unsigned int ulSid; - unsigned char ucUserAppIdNum; - unsigned char ucFrame, ucIndex, ucDataCnt; - unsigned short uiUserAppType; - pstHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pstType = (union ST_TYPE_0 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - for (ucFrame = 0; ucFrame < pstHeader->ITEM.bitLength - 1;) { - if (pstType->ITEM.bitPD) { - ulSid = INC_GET_LONGDATA(pFibInfo); - ucFrame += 4; - } else { - ulSid = INC_GET_WORDDATA(pFibInfo); - ucFrame += 2; - } - ucUserAppIdNum = INC_GET_BYTEDATA(pFibInfo); - pUserAppIdNum = (union ST_USER_APP_IDnNUM *) &ucUserAppIdNum; - ucFrame += 1; - stUserApp.ucUAppSCId = - pUserAppIdNum->ITEM.bitSCIdS; - stUserApp.ucUAppCount = - pUserAppIdNum->ITEM.bitNomUserApp; - - for (ucIndex = 0; ucIndex < stUserApp.ucUAppCount; - ucIndex++, ucFrame += 2) { - uiUserAppType = - INC_GET_WORDDATA(pFibInfo); - pUserAppType = - (union ST_USER_APPTYPE *) &uiUserAppType; - stUserApp.astUserApp[ucIndex].ucDataLength = - pUserAppType->ITEM.bitUserDataLength; - stUserApp.astUserApp[ucIndex].unUserAppType = - pUserAppType->ITEM.bitUserAppType; - for (ucDataCnt = 0; ucDataCnt < - pUserAppType->ITEM.bitUserDataLength; - ucDataCnt++) { - stUserApp.astUserApp[ucIndex].aucData[ucDataCnt] - = INC_GET_BYTEDATA(pFibInfo); - ucFrame += 1; - } - INC_FIND_USERAPP_TYPE(ulSid, &stUserApp); - } - } -} -#endif /* */ - -unsigned char INC_ADD_USERAPP_TYPE(unsigned int ulSID, - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - short nCnt, struct ST_USERAPP_GROUP_INFO *pstData) -{ - short nLoop; - for (nLoop = 0; nLoop < nCnt; nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSID - && pSvcComponent->ucIsAppData == INC_ERROR) { - pSvcComponent->stUApp = *pstData; - pSvcComponent->ucIsAppData = INC_SUCCESS; -#ifdef INC_FIC_DEBUG_MESSAGE - INC_MSG_PRINTF(1, - "\r\n TYPE[0/13]User Application Type file SID:0x%.8X ", - ulSID); -#endif /* */ - return INC_SUCCESS; - } - } - return INC_ERROR; -} - -void INC_FIND_USERAPP_TYPE(unsigned int ulSID, - struct ST_USERAPP_GROUP_INFO *pstData) -{ - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - pList = INC_GET_FICDB_LIST(); - pStreamInfo = &pList->stDMB; - pSvcComponent = pStreamInfo->astPrimary; - INC_ADD_USERAPP_TYPE(ulSID, pSvcComponent, pStreamInfo->nPrimaryCnt, - pstData); - pSvcComponent = pStreamInfo->astSecondary; - INC_ADD_USERAPP_TYPE(ulSID, pSvcComponent, pStreamInfo->nSecondaryCnt, - pstData); - pStreamInfo = &pList->stDATA; - pSvcComponent = pStreamInfo->astPrimary; - if (INC_ADD_USERAPP_TYPE - (ulSID, pSvcComponent, pStreamInfo->nPrimaryCnt, - pstData) == INC_SUCCESS) - pList->nUserAppCnt++; - pSvcComponent = pStreamInfo->astSecondary; - if (INC_ADD_USERAPP_TYPE - (ulSID, pSvcComponent, pStreamInfo->nSecondaryCnt, - pstData) == INC_SUCCESS) - pList->nUserAppCnt++; -} - -void INC_EXTENSION_110(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pHeader; - union ST_TYPE_1 *pType; - unsigned char ucLoop; - unsigned short uiEId; - unsigned char acBuff[MAX_LABEL_CHAR]; - pHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pType = (union ST_TYPE_1 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - uiEId = INC_GET_WORDDATA(pFibInfo); - for (ucLoop = 0; ucLoop < MAX_LABEL_CHAR; ucLoop++) - acBuff[ucLoop] = INC_GET_BYTEDATA(pFibInfo); - pFibInfo->ucDataPos += 2; - INC_ADD_ENSEMBLE_NAME(uiEId, acBuff); -} - -void INC_EXTENSION_111(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pHeader; - union ST_TYPE_1 *pType; - unsigned short uiSId, ucIndex; - unsigned char acBuff[MAX_LABEL_CHAR]; - - pHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pType = (union ST_TYPE_1 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - uiSId = INC_GET_WORDDATA(pFibInfo); - for (ucIndex = 0; ucIndex < MAX_LABEL_CHAR; ucIndex++) - acBuff[ucIndex] = INC_GET_BYTEDATA(pFibInfo); - - pFibInfo->ucDataPos += 2; - INC_FIND_DATA_SERVICE_COMPONENT_LABEL(uiSId, acBuff); -} - -void INC_EXTENSION_112(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pHeader; - union ST_TYPE_1 *pType; - union ST_EXTENSION_TYPE12 *pType12; - unsigned char ucData; - pHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pType = (union ST_TYPE_1 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - ucData = INC_GET_BYTEDATA(pFibInfo); - pType12 = (union ST_EXTENSION_TYPE12 *) &ucData; - if (pType12->ITEM.bitCF_flag) - pFibInfo->ucDataPos += 1; - pFibInfo->ucDataPos += 19; - if (pType12->ITEM.bitCountry == 1) - pFibInfo->ucDataPos += 2; -} - -void INC_EXTENSION_113(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pHeader; - union ST_TYPE_1 *pType; - pHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pType = (union ST_TYPE_1 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pFibInfo->ucDataPos += 19; -} - -void INC_EXTENSION_114(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pHeader; - union ST_TYPE_1 *pType; - union ST_EXTENSION_TYPE14 *pExtenType; - unsigned int ulSId; - unsigned char ucData, ucIndex; - unsigned char acBuff[MAX_LABEL_CHAR]; - pHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pType = (union ST_TYPE_1 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - ucData = INC_GET_BYTEDATA(pFibInfo); - pExtenType = (union ST_EXTENSION_TYPE14 *) &ucData; - if (!pExtenType->ITEM.bitPD) - ulSId = (unsigned int) INC_GET_WORDDATA(pFibInfo); - - else - ulSId = INC_GET_LONGDATA(pFibInfo); - for (ucIndex = 0; ucIndex < MAX_LABEL_CHAR; ucIndex++) - acBuff[ucIndex] = INC_GET_BYTEDATA(pFibInfo); - pFibInfo->ucDataPos += 2; - INC_FIND_SERVICE_COMPONENT_LABEL(ulSId, acBuff); -} - -void INC_EXTENSION_115(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pHeader; - union ST_TYPE_1 *pType; - unsigned int ulSId; - unsigned char ucIndex, acBuff[MAX_LABEL_CHAR]; - pHeader = - (union ST_FIG_HEAD *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - pType = (union ST_TYPE_1 *) &pFibInfo->aucBuff[pFibInfo->ucDataPos++]; - ulSId = INC_GET_LONGDATA(pFibInfo); - for (ucIndex = 0; ucIndex < MAX_LABEL_CHAR; ucIndex++) - acBuff[ucIndex] = INC_GET_BYTEDATA(pFibInfo); - pFibInfo->ucDataPos += 2; - INC_FIND_DATA_SERVICE_COMPONENT_LABEL(ulSId, acBuff); -} - -void INC_SET_UPDATEFIC(struct ST_FIB_INFO *pstDestData, - unsigned char *pSourData) -{ - unsigned char cuIndex; - unsigned short wCRC, wCRCData; - for (cuIndex = 0; cuIndex < FIB_SIZE; cuIndex++) - pstDestData->aucBuff[cuIndex] = pSourData[cuIndex]; - wCRC = - INC_CRC_CHECK((unsigned char *) pstDestData->aucBuff, - FIB_SIZE - 2); - wCRCData = - ((unsigned short) pstDestData->aucBuff[30] << 8) | - pstDestData->aucBuff[31]; - pstDestData->ucDataPos = 0; - pstDestData->uiIsCRC = wCRC == wCRCData; -} - -unsigned char INC_GET_FIND_TYPE(union ST_FIG_HEAD *pInfo) -{ - if (pInfo->ITEM.bitType <= FIG_IN_HOUSE) - return INC_SUCCESS; - return INC_ERROR; -} - - -void INC_SET_FICTYPE_1(struct ST_FIB_INFO *pFibInfo) -{ - union ST_TYPE_1 *pExtern; - union ST_FIG_HEAD *pHeader; - unsigned char ucType, ucHeader; - ucHeader = INC_GETAT_HEADER(pFibInfo); - ucType = INC_GETAT_TYPE(pFibInfo); - pHeader = (union ST_FIG_HEAD *) &ucHeader; - pExtern = (union ST_TYPE_1 *) &ucType; - switch (pExtern->ITEM.bitExtension) { - case EXTENSION_0: - INC_EXTENSION_110(pFibInfo); - break; - case EXTENSION_1: - INC_EXTENSION_111(pFibInfo); - break; - case EXTENSION_2: - INC_EXTENSION_112(pFibInfo); - break; - case EXTENSION_3: - INC_EXTENSION_113(pFibInfo); - break; - case EXTENSION_4: - INC_EXTENSION_114(pFibInfo); - break; - case EXTENSION_5: - INC_EXTENSION_115(pFibInfo); - break; - default: - pFibInfo->ucDataPos += (pHeader->ITEM.bitLength + 1); - break; - } -} - -unsigned short INC_SET_FICTYPE_0(struct ST_FIB_INFO *pFibInfo) -{ - union ST_FIG_HEAD *pHeader; - union ST_TYPE_0 *pExtern; - unsigned char ucHeader, ucType; - ucHeader = INC_GETAT_HEADER(pFibInfo); - pHeader = (union ST_FIG_HEAD *) &ucHeader; - ucType = INC_GETAT_TYPE(pFibInfo); - pExtern = (union ST_TYPE_0 *) &ucType; - switch (pExtern->ITEM.bitExtension) { - case EXTENSION_0: - INC_EXTENSION_000(pFibInfo); - break; - case EXTENSION_1: - INC_EXTENSION_001(pFibInfo); - break; - case EXTENSION_2: - INC_EXTENSION_002(pFibInfo); - break; - case EXTENSION_3: - INC_EXTENSION_003(pFibInfo); - break; - case EXTENSION_10: - INC_EXTENSION_010(pFibInfo); - break; - -#ifdef USER_APPLICATION_TYPE - case EXTENSION_13: - INC_EXTENSION_013(pFibInfo); - break; - -#endif /* */ - default: - pFibInfo->ucDataPos += pHeader->ITEM.bitLength + 1; - break; - } - return INC_SUCCESS; -} - -unsigned char INC_FICPARSING(unsigned char ucI2CID, unsigned char *pucFicBuff, - int uFicLength, enum ST_SIMPLE_FIC bSimpleFIC) -{ - struct ST_FIC stFIC; - struct ST_FIB_INFO *pstFib; - union ST_FIG_HEAD *pHeader; - struct ST_FICDB_LIST *pList; - unsigned char ucLoop, ucHeader; - pList = INC_GET_FICDB_LIST(); - stFIC.ucBlockNum = uFicLength / FIB_SIZE; - pstFib = &stFIC.stBlock; - pList->ucIsSetSimple = bSimpleFIC; - for (ucLoop = 0; ucLoop < stFIC.ucBlockNum; ucLoop++) { - INC_SET_UPDATEFIC(pstFib, - &pucFicBuff[ucLoop * FIB_SIZE]); - if (!pstFib->uiIsCRC) - continue; - while (pstFib->ucDataPos < FIB_SIZE - 2) { - ucHeader = INC_GETAT_HEADER(pstFib); - pHeader = (union ST_FIG_HEAD *) &ucHeader; - if (!INC_GET_FIND_TYPE(pHeader) - || !INC_GET_NULL_BLOCK(pHeader) - || !INC_GET_FIND_LENGTH(pHeader)) - break; - switch (pHeader->ITEM.bitType) { - case FIG_MCI_SI: - INC_SET_FICTYPE_0(pstFib); - break; - case FIG_LABEL: - INC_SET_FICTYPE_1(pstFib); - break; - case FIG_RESERVED_0: - case FIG_RESERVED_1: - case FIG_RESERVED_2: - case FIG_FICDATA_CHANNEL: - case FIG_CONDITION_ACCESS: - case FIG_IN_HOUSE: - default: - pstFib->ucDataPos += - pHeader->ITEM.bitLength + 1; - break; - } - if (pstFib->ucDataPos == (FIB_SIZE - 1)) - break; - } - } - if (bSimpleFIC == SIMPLE_FIC_ENABLE && pList->ucIsSimpleFIC) - return INC_SUCCESS; - if (pList->nLabelCnt && - pList->nSubChannelCnt && - pList->nEmsembleLabelFlag) { - #ifdef USER_APPLICATION_TYPE - if (pList->nLabelCnt == pList->nSubChannelCnt - && pList->nPacketCnt == pList->nPacketModeCnt - && pList->nUserAppCnt == pList->nPacketCnt - && bSimpleFIC == SIMPLE_FIC_DISABLE) - return INC_SUCCESS; - - #else /* */ - if (pList->nLabelCnt == pList->nSubChannelCnt - && pList->nPacketCnt == pList->nPacketModeCnt - && bSimpleFIC == SIMPLE_FIC_DISABLE) - return INC_SUCCESS; - #endif /* */ - } - return INC_ERROR; -} - -void INC_LABEL_FILTER(unsigned char *pData, short nSize) -{ - short nLoop; - for (nLoop = nSize - 1; nLoop >= 0; nLoop--) { - if (pData[nLoop] == 0x20) - pData[nLoop] = INC_NULL; - else - break; - } -} - -void INC_ADD_SERVICE_LABEL(struct ST_STREAM_INFO *pStreamInfo, - unsigned int ulSID, unsigned char *pcLabel) -{ - struct ST_FICDB_LIST *pList; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - short nLoop; - pList = INC_GET_FICDB_LIST(); - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSID && - !pSvcComponent->ucIsLable) { - memcpy(pSvcComponent->aucLabels, pcLabel, - MAX_LABEL_CHAR); - INC_LABEL_FILTER(pSvcComponent->aucLabels, - MAX_LABEL_CHAR); - pSvcComponent->ucIsLable = 1; - pList->nLabelCnt++; -#ifdef INC_FIC_DEBUG_MESSAGE - INC_MSG_PRINTF(1, - "\r\n TYPE[1/11] SID[0x%.8X] Service label[ %s ] ", - ulSID, pSvcComponent->aucLabels); -#endif /* */ - } - } - - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSID && - !pSvcComponent->ucIsLable) { - memcpy(pSvcComponent->aucLabels, pcLabel, - MAX_LABEL_CHAR); - INC_LABEL_FILTER(pSvcComponent->aucLabels, - MAX_LABEL_CHAR); - pSvcComponent->ucIsLable = 1; - pList->nLabelCnt++; - -#ifdef INC_FIC_DEBUG_MESSAGE - INC_MSG_PRINTF(1, - "\r\n TYPE[1/11] SID[0x%.8X] Service label[ %s ] ", - ulSID, pSvcComponent->aucLabels); -#endif /* */ - } - } -} - -void INC_ADD_SERVICE_COMPONENT_LABEL( - struct ST_STREAM_INFO *pStreamInfo, unsigned int ulSID, - unsigned char *pcLabel) -{ - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - short nLoop; - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSID && - !pSvcComponent->ucIsComponentLabel) { - memcpy(pSvcComponent->aucComponentLabels, pcLabel, - MAX_LABEL_CHAR); - INC_LABEL_FILTER(pSvcComponent->aucComponentLabels, - MAX_LABEL_CHAR); - pSvcComponent->ucIsComponentLabel = 1; - -#ifdef INC_FIC_DEBUG_MESSAGE - INC_MSG_PRINTF(1, - "\r\nSID[0x%.8X] Service Component label[ %s ] ", - ulSID, - pSvcComponent->aucComponentLabels); -#endif /* */ - } - } - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSID && - !pSvcComponent->ucIsComponentLabel) { - memcpy(pSvcComponent->aucComponentLabels, pcLabel, - MAX_LABEL_CHAR); - INC_LABEL_FILTER(pSvcComponent->aucComponentLabels, - MAX_LABEL_CHAR); - pSvcComponent->ucIsComponentLabel = 1; - -#ifdef INC_FIC_DEBUG_MESSAGE - INC_MSG_PRINTF(1, - "\r\nSID[0x%.8X] Service Component label[ %s ] ", - ulSID, - pSvcComponent->aucComponentLabels); - -#endif /* */ - } - } -} - -void INC_FIND_DATA_SERVICE_COMPONENT_LABEL(unsigned int ulSID, - unsigned char *pcLabel) -{ - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - pList = INC_GET_FICDB_LIST(); - pStreamInfo = &pList->stDAB; - INC_ADD_SERVICE_LABEL(pStreamInfo, ulSID, pcLabel); - pStreamInfo = &pList->stDMB; - INC_ADD_SERVICE_LABEL(pStreamInfo, ulSID, pcLabel); - pStreamInfo = &pList->stDATA; - INC_ADD_SERVICE_LABEL(pStreamInfo, ulSID, pcLabel); -} - -void INC_FIND_SERVICE_COMPONENT_LABEL(unsigned int ulSID, - unsigned char *pcLabel) -{ - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - pList = INC_GET_FICDB_LIST(); - pStreamInfo = &pList->stDAB; - INC_ADD_SERVICE_COMPONENT_LABEL(pStreamInfo, ulSID, pcLabel); - pStreamInfo = &pList->stDMB; - INC_ADD_SERVICE_COMPONENT_LABEL(pStreamInfo, ulSID, pcLabel); - - pStreamInfo = &pList->stDATA; - INC_ADD_SERVICE_COMPONENT_LABEL(pStreamInfo, ulSID, pcLabel); -} - -void INC_ADD_GLOBAL_SERVICE_COMPONENT_SHORT(struct ST_STREAM_INFO *pStreamInfo, - unsigned int ulSvcID, - union ST_MSC_SHORT *pstMscShort, - union ST_MSC_BIT *pstMsc) -{ - short nLoop; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - - if (!pstMscShort->ITEM.bitMscFicFlag) { - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSvcID) - pSvcComponent->ucSCidS = pstMsc->ITEM.bitScIds; - } - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSvcID) - pSvcComponent->ucSCidS = pstMsc->ITEM.bitScIds; - } - } -} - -void INC_FIND_GLOBAL_SERVICE_COMPONENT_SHORT(unsigned int ulSvcID, - union ST_MSC_SHORT *pstMscShort, - union ST_MSC_BIT *pstMsc) -{ - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - pList = INC_GET_FICDB_LIST(); - pStreamInfo = &pList->stDMB; - INC_ADD_GLOBAL_SERVICE_COMPONENT_SHORT(pStreamInfo, ulSvcID, - pstMscShort, pstMsc); - pStreamInfo = &pList->stDAB; - INC_ADD_GLOBAL_SERVICE_COMPONENT_SHORT(pStreamInfo, ulSvcID, - pstMscShort, pstMsc); - pStreamInfo = &pList->stDATA; - INC_ADD_GLOBAL_SERVICE_COMPONENT_SHORT(pStreamInfo, ulSvcID, - pstMscShort, pstMsc); -} - -void INC_ADD_GLOBAL_SERVICE_COMPONENT_LONG(struct ST_STREAM_INFO *pStreamInfo, - unsigned int ulSvcID, - union ST_MSC_LONG *pstMscLong, - union ST_MSC_BIT *pstMsc) -{ - short nLoop; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSvcID) - pSvcComponent->ucSubChid = pstMscLong->ITEM.bitScId; - } - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulSvcID) - pSvcComponent->ucSubChid = pstMscLong->ITEM.bitScId; - } -} - -void INC_FIND_GLOBAL_SERVICE_COMPONENT_LONG(unsigned int ulSvcID, - union ST_MSC_LONG *pstMscLong, - union ST_MSC_BIT *pstMsc) -{ - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - pList = INC_GET_FICDB_LIST(); - pStreamInfo = &pList->stDMB; - INC_ADD_GLOBAL_SERVICE_COMPONENT_LONG(pStreamInfo, ulSvcID, pstMscLong, - pstMsc); - pStreamInfo = &pList->stDAB; - INC_ADD_GLOBAL_SERVICE_COMPONENT_LONG(pStreamInfo, ulSvcID, pstMscLong, - pstMsc); - pStreamInfo = &pList->stDATA; - INC_ADD_GLOBAL_SERVICE_COMPONENT_LONG(pStreamInfo, ulSvcID, pstMscLong, - pstMsc); -} - -void INC_FIND_PACKET_MODE(union ST_TYPE0of3_INFO *pTypeInfo, - union ST_TYPE0of3Id_INFO *pIdInfo) -{ - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - short nLoop; - pList = INC_GET_FICDB_LIST(); - pStreamInfo = &pList->stDATA; - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ucSCidS == pTypeInfo->ITEM.bitScid - && !pSvcComponent->IsPacketMode) { - pSvcComponent->ucDSCType = pIdInfo->ITEM.bitDScType; - pSvcComponent->ucSubChid = pIdInfo->ITEM.bitSubChId; - pSvcComponent->unPacketAddr = - pIdInfo->ITEM.bitPacketAddr; - pSvcComponent->IsPacketMode = 1; - pList->nPacketModeCnt++; - } - } - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ucSCidS == pTypeInfo->ITEM.bitScid - && !pSvcComponent->IsPacketMode) { - pSvcComponent->ucDSCType = pIdInfo->ITEM.bitDScType; - pSvcComponent->ucSubChid = pIdInfo->ITEM.bitSubChId; - pSvcComponent->unPacketAddr = - pIdInfo->ITEM.bitPacketAddr; - pSvcComponent->IsPacketMode = 1; - pList->nPacketModeCnt++; - } - } -} - -void INC_GET_SHORT_FORM(struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - union ST_TYPE0of1Short_INFO *pShort) -{ - pSvcComponent->ucShortLong = pShort->ITEM.bitShortLong; - pSvcComponent->ucTableSW = pShort->ITEM.bitTableSw; - pSvcComponent->ucTableIndex = pShort->ITEM.bitTableIndex; - pSvcComponent->ucOption = 0; - pSvcComponent->ucProtectionLevel = 0; - pSvcComponent->uiSubChSize = - INC_FIND_SUB_CHANNEL_SIZE(pSvcComponent->ucTableIndex); - pSvcComponent->uiDifferentRate = 0; - pSvcComponent->uiBitRate = INC_GET_BITRATE(pSvcComponent); -} - -void INC_GET_LONG_FORM(struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - union ST_TYPE0of1Long_INFO *pLong) -{ - pSvcComponent->ucShortLong = pLong->ITEM.bitShortLong; - pSvcComponent->ucTableSW = 0; - pSvcComponent->ucTableIndex = 0; - pSvcComponent->ucOption = pLong->ITEM.bitOption; - pSvcComponent->ucProtectionLevel = pLong->ITEM.bitProtecLevel; - pSvcComponent->uiSubChSize = pLong->ITEM.bitSubChanSize; - - if (pSvcComponent->ucOption == 0) { - switch (pSvcComponent->ucProtectionLevel) { - case 0: - pSvcComponent->uiDifferentRate = - (pSvcComponent->uiSubChSize / 12); - break; - case 1: - pSvcComponent->uiDifferentRate = - (pSvcComponent->uiSubChSize / 8); - break; - case 2: - pSvcComponent->uiDifferentRate = - (pSvcComponent->uiSubChSize / 6); - break; - case 3: - pSvcComponent->uiDifferentRate = - (pSvcComponent->uiSubChSize / 4); - break; - default: - pSvcComponent->uiDifferentRate = 0; - break; - } - } - - else { - switch (pSvcComponent->ucProtectionLevel) { - case 0: - pSvcComponent->uiDifferentRate = - (pSvcComponent->uiSubChSize / 27); - break; - case 1: - pSvcComponent->uiDifferentRate = - (pSvcComponent->uiSubChSize / 21); - break; - case 2: - pSvcComponent->uiDifferentRate = - (pSvcComponent->uiSubChSize / 18); - break; - case 3: - pSvcComponent->uiDifferentRate = - (pSvcComponent->uiSubChSize / 15); - break; - default: - pSvcComponent->uiDifferentRate = 0; - break; - } - } - pSvcComponent->uiBitRate = INC_GET_BITRATE(pSvcComponent); -} - -unsigned short INC_GET_BITRATE(struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent) -{ - unsigned short uiBitRate = 0; - if (!pSvcComponent->ucShortLong) { - if (pSvcComponent->ucTableIndex <= 4) - uiBitRate = 32; - - else if (pSvcComponent->ucTableIndex >= 5 - && pSvcComponent->ucTableIndex <= 9) - uiBitRate = 48; - - else if (pSvcComponent->ucTableIndex >= 10 - && pSvcComponent->ucTableIndex <= 13) - uiBitRate = 56; - - else if (pSvcComponent->ucTableIndex >= 14 - && pSvcComponent->ucTableIndex <= 18) - uiBitRate = 64; - - else if (pSvcComponent->ucTableIndex >= 19 - && pSvcComponent->ucTableIndex <= 23) - uiBitRate = 80; - - else if (pSvcComponent->ucTableIndex >= 24 - && pSvcComponent->ucTableIndex <= 28) - uiBitRate = 96; - - else if (pSvcComponent->ucTableIndex >= 29 - && pSvcComponent->ucTableIndex <= 32) - uiBitRate = 112; - - else if (pSvcComponent->ucTableIndex >= 33 - && pSvcComponent->ucTableIndex <= 37) - uiBitRate = 128; - - else if (pSvcComponent->ucTableIndex >= 38 - && pSvcComponent->ucTableIndex <= 42) - uiBitRate = 160; - - else if (pSvcComponent->ucTableIndex >= 43 - && pSvcComponent->ucTableIndex <= 47) - uiBitRate = 192; - - else if (pSvcComponent->ucTableIndex >= 48 - && pSvcComponent->ucTableIndex <= 52) - uiBitRate = 224; - - else if (pSvcComponent->ucTableIndex >= 53 - && pSvcComponent->ucTableIndex <= 57) - uiBitRate = 256; - - else if (pSvcComponent->ucTableIndex >= 58 - && pSvcComponent->ucTableIndex <= 60) - uiBitRate = 320; - - else if (pSvcComponent->ucTableIndex >= 61 - && pSvcComponent->ucTableIndex <= 63) - uiBitRate = 384; - - else - uiBitRate = 0; - } else { - if (pSvcComponent->ucOption == OPTION_INDICATE0) { - switch (pSvcComponent->ucProtectionLevel) { - case PROTECTION_LEVEL0: - uiBitRate = - (pSvcComponent->uiSubChSize / 12) * 8; - break; - case PROTECTION_LEVEL1: - uiBitRate = - (pSvcComponent->uiSubChSize / 8) * 8; - break; - case PROTECTION_LEVEL2: - uiBitRate = - (pSvcComponent->uiSubChSize / 6) * 8; - break; - case PROTECTION_LEVEL3: - uiBitRate = - (pSvcComponent->uiSubChSize / 4) * 8; - break; - } - } - - else if (pSvcComponent->ucOption == OPTION_INDICATE1) { - switch (pSvcComponent->ucProtectionLevel) { - case PROTECTION_LEVEL0: - uiBitRate = - (pSvcComponent->uiSubChSize / 27) * 32; - break; - case PROTECTION_LEVEL1: - uiBitRate = - (pSvcComponent->uiSubChSize / 21) * 32; - break; - case PROTECTION_LEVEL2: - uiBitRate = - (pSvcComponent->uiSubChSize / 18) * 32; - break; - case PROTECTION_LEVEL3: - uiBitRate = - (pSvcComponent->uiSubChSize / 15) * 32; - break; - } - } - } - return uiBitRate; -} - -void INC_ADD_ORGANIZAION_SUBCHANNEL_ID( - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - unsigned int ulTypeInfo) -{ - union ST_TYPE0of1Long_INFO *pLongInfo; - union ST_TYPE0of1Short_INFO *pShortInfo; - pShortInfo = (union ST_TYPE0of1Short_INFO *) &ulTypeInfo; - pLongInfo = (union ST_TYPE0of1Long_INFO *) &ulTypeInfo; - pSvcComponent->unStartAddr = pShortInfo->ITEM.bitStartAddr; - if (pShortInfo->ITEM.bitShortLong) - INC_GET_LONG_FORM(pSvcComponent, pLongInfo); - else - INC_GET_SHORT_FORM(pSvcComponent, pShortInfo); -} - -void INC_SORT_ORGANIZAION_SUBCHANNEL_ID( - struct ST_STREAM_INFO *pStreamInfo, - unsigned char ucSubChID, - unsigned int ulTypeInfo) -{ - short nLoop; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ucSubChid == ucSubChID - && !pSvcComponent->IsOrganiza) { - INC_ADD_ORGANIZAION_SUBCHANNEL_ID( - pSvcComponent, ulTypeInfo); - pSvcComponent->IsOrganiza = INC_SUCCESS; -#ifdef INC_FIC_DEBUG_MESSAGE - INC_MSG_PRINTF(1, "\r\n TYPE[0/1] SUB CH ID %x", - ucSubChID); -#endif /* */ - } - } - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ucSubChid == ucSubChID - && !pSvcComponent->IsOrganiza) { - INC_ADD_ORGANIZAION_SUBCHANNEL_ID( - pSvcComponent, ulTypeInfo); - pSvcComponent->IsOrganiza = INC_SUCCESS; - -#ifdef INC_FIC_DEBUG_MESSAGE - INC_MSG_PRINTF(1, "\r\n TYPE[0/1] SUB CH ID %x", - ucSubChID); -#endif /* */ - } - } -} - -unsigned char INC_SORT_SIMPLE_ORGANIZAION_SUBCHANNEL_ID( - struct ST_STREAM_INFO *pStreamInfo, unsigned char ucSubChID, - unsigned short unStartAddr, unsigned int ulTypeInfo) -{ - short nLoop; - struct ST_FICDB_LIST *pList; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - pList = INC_GET_FICDB_LIST(); - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pSvcComponent->ucSubChid == ucSubChID - && pSvcComponent->unStartAddr == unStartAddr) { - return INC_ERROR; - } - } - pSvcComponent = - &pStreamInfo->astPrimary[pStreamInfo->nPrimaryCnt]; - pSvcComponent->ucSubChid = ucSubChID; - pSvcComponent->unStartAddr = unStartAddr; - INC_ADD_ORGANIZAION_SUBCHANNEL_ID(pSvcComponent, ulTypeInfo); - pStreamInfo->nPrimaryCnt++; - pList->ucIsSimpleCnt++; - return INC_SUCCESS; -} - -void INC_FIND_SIMPLE_ORGANIZAION_SUBCHANNEL_ID( - unsigned char ucSubChID, - unsigned short unStartAddr, - unsigned int ulTypeInfo) -{ - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - pList = INC_GET_FICDB_LIST(); - pStreamInfo = &pList->stDMB; - INC_SORT_SIMPLE_ORGANIZAION_SUBCHANNEL_ID( - pStreamInfo, ucSubChID, unStartAddr, ulTypeInfo); -} - -void INC_FIND_ORGANIZAION_SUBCHANNEL_ID( - unsigned char ucSubChID, unsigned int ulTypeInfo) -{ - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - pList = INC_GET_FICDB_LIST(); - pStreamInfo = &pList->stDMB; - INC_SORT_ORGANIZAION_SUBCHANNEL_ID(pStreamInfo, ucSubChID, ulTypeInfo); - pStreamInfo = &pList->stDAB; - INC_SORT_ORGANIZAION_SUBCHANNEL_ID(pStreamInfo, ucSubChID, ulTypeInfo); - pStreamInfo = &pList->stDATA; - INC_SORT_ORGANIZAION_SUBCHANNEL_ID(pStreamInfo, ucSubChID, ulTypeInfo); -} - -void INC_ADD_BASIC_SERVICE( - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - unsigned int ulServiceId, unsigned short unData) -{ - union ST_TMId_MSCnFIDC *pMscnFidc; - union ST_MSC_PACKET_INFO *pMscPacket; - pMscnFidc = (union ST_TMId_MSCnFIDC *) &unData; - pMscPacket = (union ST_MSC_PACKET_INFO *) &unData; - pSvcComponent->ulSid = ulServiceId; - pSvcComponent->ucTmID = pMscnFidc->ITEM.bitTMId; - pSvcComponent->ucCAFlag = pMscnFidc->ITEM.bitCAflag; - pSvcComponent->ucPS = pMscnFidc->ITEM.bitPS; - if (pMscnFidc->ITEM.bitTMId == 0x03) - pSvcComponent->ucSCidS = pMscPacket->ITEM.bitSCId; - else { - pSvcComponent->ucSubChid = pMscnFidc->ITEM.bitSubChld; - pSvcComponent->ucDSCType = pMscnFidc->ITEM.bitAscDscTy; - } -} - -void INC_FIND_BASIC_SERVICE(unsigned int ulServiceId, unsigned short unData) -{ - short nLoop, nDataCnt; - struct ST_FICDB_LIST *pList; - struct ST_STREAM_INFO *pStreamInfo; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - union ST_TMId_MSCnFIDC *pMscnFidc; - union ST_MSC_PACKET_INFO *pMscPacket; - pList = INC_GET_FICDB_LIST(); - if (pList->ucIsSetSimple == SIMPLE_FIC_ENABLE) - return; - pMscnFidc = (union ST_TMId_MSCnFIDC *) &unData; - pMscPacket = (union ST_MSC_PACKET_INFO *) &unData; - if (pMscnFidc->ITEM.bitTMId == 0x00) - pStreamInfo = &pList->stDAB; - - else if (pMscnFidc->ITEM.bitTMId == 0x01) - pStreamInfo = &pList->stDMB; - - else if (pMscnFidc->ITEM.bitTMId == 0x02) - pStreamInfo = &pList->stFIDC; - - else - pStreamInfo = &pList->stDATA; - pSvcComponent = (pMscnFidc->ITEM.bitPS) ? pStreamInfo->astPrimary : - pStreamInfo->astSecondary; - nDataCnt = (pMscnFidc->ITEM.bitPS) ? pStreamInfo->nPrimaryCnt : - pStreamInfo->nSecondaryCnt; - - for (nLoop = 0; nLoop < nDataCnt; nLoop++, pSvcComponent++) { - if (pSvcComponent->ulSid == ulServiceId) - return; - } - - if (pMscnFidc->ITEM.bitTMId == 0x03) - pList->nPacketCnt++; - if (pMscnFidc->ITEM.bitTMId != 0x02) { - pList->nSubChannelCnt++; - INC_ADD_BASIC_SERVICE(pSvcComponent, ulServiceId, unData); - if (pMscnFidc->ITEM.bitPS) - pStreamInfo->nPrimaryCnt++; - else - pStreamInfo->nSecondaryCnt++; - } -} - -void INC_ADD_ENSEMBLE_ID(union ST_TYPE0of0_INFO *pIdInfo) -{ - struct ST_FICDB_LIST *pList; - pList = INC_GET_FICDB_LIST(); - pList->unEnsembleID = pIdInfo->ITEM.bitEld; - pList->ucChangeFlag = pIdInfo->ITEM.bitChangFlag; -} - -unsigned char INC_ADD_ENSEMBLE_NAME(unsigned short unEnID, - unsigned char *pcLabel) -{ - struct ST_FICDB_LIST *pList; - pList = INC_GET_FICDB_LIST(); - if (pList->ucIsEnsembleName == INC_SUCCESS) - return INC_ERROR; - pList->unEnsembleID = unEnID; - pList->nEmsembleLabelFlag = 1; - memcpy(pList->aucEnsembleName, pcLabel, MAX_LABEL_CHAR); - INC_LABEL_FILTER(pList->aucEnsembleName, MAX_LABEL_CHAR); - pList->ucIsEnsembleName = INC_SUCCESS; - return INC_SUCCESS; -} - -struct ST_FICDB_LIST *INC_GET_FICDB_LIST() -{ - return &g_stFicDbList; -} - -void INC_INITDB(unsigned char ucI2CID) -{ - struct ST_FICDB_LIST *pList; - pList = INC_GET_FICDB_LIST(); - if (pList == 0) - return; - memset(pList, 0, sizeof(struct ST_FICDB_LIST)); -} diff --git a/drivers/media/tdmb/t3900/INC_INCLUDES.h b/drivers/media/tdmb/t3900/INC_INCLUDES.h deleted file mode 100644 index 18c21f0..0000000 --- a/drivers/media/tdmb/t3900/INC_INCLUDES.h +++ /dev/null @@ -1,1060 +0,0 @@ -/***************************************************************************** - Copyright(c) 2011 I&C Inc. All Rights Reserved - - File name : INC_INCLUDES.h.c - - Description : - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*******************************************************************************/ - -#ifndef _INC_T3700_INCLUDES_H_ -#define _INC_T3700_INCLUDES_H_ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - FALSE = 0, - TRUE = 1 -}; -#define INC_DEBUG_LEVEL 0 - -#ifdef INC_MULTI_CHANNEL_ENABLE -#define INC_MULTI_CHANNEL_FIC_UPLOAD -#define INC_MULTI_HEADER_ENABLE -#endif - -#define INC_MULTI_MAX_CHANNEL 3 -/*************************************************/ -/* FIFO Source »ç¿ë½Ã */ -/*************************************************/ -#define INC_FIFO_SOURCE_ENABLE - -/******************************************/ -/* USer Application type »ç¿ë½Ã */ -/******************************************/ - -#define INC_MPI_INTERRUPT_ENABLE 0x0001 -#define INC_I2C_INTERRUPT_ENABLE 0x0002 -#define INC_EWS_INTERRUPT_ENABLE 0x0040 -#define INC_REC_INTERRUPT_ENABLE 0x0080 -#define INC_TII_INTERRUPT_ENABLE 0x0100 -#define INC_FIC_INTERRUPT_ENABLE 0x0200 -#define INC_CIFS_INTERRUPT_ENABLE 0x0400 -#define INC_FS_INTERRUPT_ENABLE 0x0800 -#define INC_EXT_INTERRUPT_ENABLE 0x1000 -#define INC_MS_INTERRUPT_ENABLE 0x2000 -#define INC_DPLLU_INTERRUPT_ENABLE 0x4000 -#define INC_SSI_INTERRUPT_ENABLE 0x8000 -#define INC_DISABLE_INTERRUPT 0x0000 - -#define INC_INTERRUPT_POLARITY_HIGH 0x0000 -#define INC_INTERRUPT_POLARITY_LOW 0x8000 -#define INC_INTERRUPT_PULSE 0x0000 -#define INC_INTERRUPT_LEVEL 0x4000 -#define INC_INTERRUPT_AUTOCLEAR_DISABLE 0x0000 -#define INC_INTERRUPT_AUTOCLEAR_ENABLE 0x2000 -#define INC_EXT_INTERRUPT_POLARITY_HIGH 0x0000 -#define INC_EXT_INTERRUPT_POLARITY_LOW 0x1000 -#define INC_INTERRUPT_PULSE_COUNT 0x00FF -#define INC_INTERRUPT_PULSE_COUNT_MASK 0x03FF - -#define T3900_SCAN_IF_DELAY 1500 -#define T3900_SCAN_RF_DELAY 1500 -#define T3900_PLAY_IF_DELAY 1000 -#define T3900_PLAY_RF_DELAY 1100 - -#define WORD_SWAP(X) (((X)>>8&0xff)|(((X)<<8)&0xff00)) -#define DWORD_SWAP(X) (((X)>>24&0xff)|(((X)>>8)&0xff00)|\ -(((X)<<8)&0xff0000)|(((X)<<24)&0xff000000)) - -#define INC_REGISTER_CTRL(X) ((X)*0x1000) -#define STREAM_PARALLEL_ADDRESS (0x40000000) -#define STREAM_PARALLEL_ADDRESS_CS (0x50000000) - -#define FIC_REF_TIME_OUT 2500 -#define INC_SUCCESS 1 -#define INC_ERROR 0 -#define INC_NULL 0 -#define INC_RETRY 0xff - -#define INC_CER_PERIOD_TIME 1000 -#define INC_CER_PERIOD (3000 / INC_CER_PERIOD_TIME) -#define INC_BIT_PERIOD (2000 / INC_CER_PERIOD_TIME) - -#define INC_TDMB_LENGTH_MASK 0xFFF -#define TDMB_I2C_ID80 0x80 -#define TDMB_I2C_ID82 0x82 - -#define MPI_CS_SIZE (188*8) -#define INC_MPI_MAX_BUFF (1024*8) -#define INC_INTERRUPT_SIZE (188*20) -#define MAX_SUBCH_SIZE 32 -#define MAX_SUBCHANNEL 64 -#define MAX_LABEL_CHAR 16 -#define SPI_INTERRUPT_SIZE (188*8) - -#define MAX_KOREABAND_FULL_CHANNEL 21 -#define MAX_KOREABAND_NORMAL_CHANNEL 6 -#define MAX_BAND_III_CHANNEL 41 -#define MAX_L_BAND_CHANNEL 23 -#define MAX_CHINA_CHANNEL 31 -#define MAX_ROAMING_CHANNEL 12 - -#define RF500_REG_CTRL 200 - -#define APB_INT_BASE 0x0100 -#define APB_GEN_BASE 0x0200 -#define APB_PHY_BASE 0x0500 -#define APB_DEINT_BASE 0x0600 -#define APB_VTB_BASE 0x0700 -#define APB_I2S_BASE 0x0800 -#define APB_RDI_BASE 0x0900 -#define APB_MPI_BASE 0x0A00 -#define APB_RS_BASE 0x0B00 -#define APB_SPI_BASE 0x0C00 -#define APB_I2C_BASE 0x0D00 -#define APB_RF_BASE 0x0E00 - -#define APB_FIC_BASE 0x1000 -#define APB_STREAM_BASE 0x2000 - -#define TS_ERR_THRESHOLD 0x014C - -#define END_MARKER 0xff -#define FIB_SIZE 32 -#define FIB_WORD_SIZE (FIB_SIZE/2) -#define MAX_FIB_NUM 12 -#define MAX_FIC_SIZE (MAX_FIB_NUM*FIB_SIZE) -#define MAX_FRAME_DURATION 96 -#define MAX_USER_APP_DATA 32 - -enum ST_TRANSMISSION { - TRANSMISSION_MODE1 = 1, - TRANSMISSION_MODE2, - TRANSMISSION_MODE3, - TRANSMISSION_MODE4, - TRANSMISSION_AUTO, - TRANSMISSION_AUTOFAST, -} ; - -enum INC_DPD_MODE { - INC_DPD_OFF = 0, - INC_DPD_ON, -} ; - -enum PLL_MODE { - INPUT_CLOCK_24576KHZ = 0, - INPUT_CLOCK_12000KHZ, - INPUT_CLOCK_19200KHZ, - INPUT_CLOCK_27000KHZ, - INPUT_CLOCK_27120KHZ, -} ; - - -enum ST_EXTENSION_TYPE { - EXTENSION_0 = 0, - EXTENSION_1, - EXTENSION_2, - EXTENSION_3, - EXTENSION_4, - EXTENSION_5, - EXTENSION_6, - EXTENSION_7, - EXTENSION_8, - EXTENSION_9, - EXTENSION_10, - EXTENSION_11, - EXTENSION_12, - EXTENSION_13, - EXTENSION_14, - EXTENSION_15, - EXTENSION_16, - EXTENSION_17, - EXTENSION_18, - EXTENSION_19, - EXTENSION_20, - EXTENSION_21, - EXTENSION_22, - EXTENSION_23, - EXTENSION_24, -} ; - -enum ST_SPI_CONTROL { - SPI_REGREAD_CMD = 0, - SPI_REGWRITE_CMD, - SPI_MEMREAD_CMD, - SPI_MEMWRITE_CMD, -} ; - -enum ST_TMID { - TMID_0 = 0, - TMID_1, - TMID_2, - TMID_3, -} ; - -enum ST_PROTECTION_LEVEL { - PROTECTION_LEVEL0 = 0, - PROTECTION_LEVEL1, - PROTECTION_LEVEL2, - PROTECTION_LEVEL3, -} ; - -enum ST_INDICATE { - OPTION_INDICATE0 = 0, - OPTION_INDICATE1, -} ; - - -enum ST_FICHEADER_TYPE { - FIG_MCI_SI = 0, - FIG_LABEL, - FIG_RESERVED_0, - FIG_RESERVED_1, - FIG_RESERVED_2, - FIG_FICDATA_CHANNEL, - FIG_CONDITION_ACCESS, - FIG_IN_HOUSE, -} ; - -enum ST_SIMPLE_FIC { - SIMPLE_FIC_ENABLE = 1, - SIMPLE_FIC_DISABLE, -} ; - -enum INC_CTRL { - INC_DMB = 1, - INC_DAB, - INC_DATA, - INC_MULTI, - INC_SINGLE, - - FREQ_FREE = 0, - FREQ_LOCK, - FIC_OK = 1, -} ; - -enum INC_ERROR_INFO { - ERROR_NON = 0x0000, - ERROR_PLL = 0xE000, - ERROR_STOP = 0xF000, - ERROR_READY = 0xFF00, - ERROR_SYNC_NO_SIGNAL = 0xFC01, - ERROR_SYNC_LOW_SIGNAL = 0xFD01, - ERROR_SYNC_NULL = 0xFE01, - ERROR_SYNC_TIMEOUT = 0xFF01, - ERROR_FICDECODER = 0xFF02, - ERROR_START_MODEM_CLEAR = 0xFF05, - ERROR_USER_STOP = 0xFA00, - ERROR_MULTI_CHANNEL_COUNT_OVER = 0x8000, - ERROR_MULTI_CHANNEL_COUNT_NON = 0x8001, - ERROR_MULTI_CHANNEL_NULL = 0x8002, - ERROR_MULTI_CHANNEL_FREQ = 0x8003, - ERROR_MULTI_CHANNEL_DMB_MAX = 0x8004, -} ; - - -#define INC_ENSEMBLE_LABLE_MAX 17 -#define INC_SERVICE_MAX 32 -#define INC_USER_APPLICATION_TYPE_LENGTH 32 - -struct ST_USER_APPLICATION_TYPE { - unsigned char ucDataLength; - unsigned short unUserAppType; - unsigned char aucData[MAX_USER_APP_DATA]; -} ; - -struct ST_USERAPP_GROUP_INFO { - unsigned char ucUAppSCId; - unsigned char ucUAppCount; - struct ST_USER_APPLICATION_TYPE - astUserApp[INC_USER_APPLICATION_TYPE_LENGTH]; -} ; - -struct INC_CHANNEL_INFO { - unsigned int ulRFFreq; - unsigned short uiEnsembleID; - unsigned short uiBitRate; - unsigned char uiTmID; - char aucLabel[MAX_LABEL_CHAR+1]; - char aucEnsembleLabel[MAX_LABEL_CHAR+1]; - - unsigned char ucSubChID; - unsigned char ucServiceType; - unsigned short uiStarAddr; - unsigned char ucSlFlag; - unsigned char ucTableIndex; - unsigned char ucOption; - unsigned char ucProtectionLevel; - unsigned short uiDifferentRate; - unsigned short uiSchSize; - - unsigned int ulServiceID; - unsigned short uiPacketAddr; - -#ifdef USER_APPLICATION_TYPE - ST_USERAPP_GROUP_INFO stUsrApp; -#endif -} ; - -struct ST_SUBCH_INFO { - short nSetCnt; - struct INC_CHANNEL_INFO astSubChInfo[MAX_SUBCH_SIZE]; -} ; - -enum UPLOAD_MODE_INFO { - STREAM_UPLOAD_MASTER_SERIAL = 0, - STREAM_UPLOAD_MASTER_PARALLEL, - STREAM_UPLOAD_SLAVE_SERIAL, - STREAM_UPLOAD_SLAVE_PARALLEL, - STREAM_UPLOAD_SPI, - STREAM_UPLOAD_TS, - -} ; - -enum CLOCK_SPEED { - INC_OUTPUT_CLOCK_4096 = 1, - INC_OUTPUT_CLOCK_2048, - INC_OUTPUT_CLOCK_1024, - -} ; - -enum ENSEMBLE_BAND { - KOREA_BAND_ENABLE = 0, - BANDIII_ENABLE, - LBAND_ENABLE, - CHINA_ENABLE, - ROAMING_ENABLE, - EXTERNAL_ENABLE, - -} ; - -enum FREQ_LOCKINFO { - INC_FREQUENCY_UNLOCK = 0, - INC_FREQUENCY_LOCK, -} ; - -enum CTRL_MODE { - INC_I2C_CTRL = 0, - INC_SPI_CTRL, - INC_EBI_CTRL, -} ; - -enum INC_ACTIVE_MODE { - INC_ACTIVE_LOW = 0, - INC_ACTIVE_HIGH, -} ; - -struct INC_TDMB_MODE { - enum ENSEMBLE_BAND m_ucRfBand; - enum UPLOAD_MODE_INFO m_ucUploadMode; - enum CLOCK_SPEED m_ucClockSpeed; - enum INC_ACTIVE_MODE m_ucMPI_CS_Active; - enum INC_ACTIVE_MODE m_ucMPI_CLK_Active; - enum CTRL_MODE m_ucCommandMode; - enum ST_TRANSMISSION m_ucTransMode; - enum PLL_MODE m_ucPLL_Mode; - enum INC_DPD_MODE m_ucDPD_Mode; - unsigned short m_unIntCtrl; -} ; - -#define BER_BUFFER_MAX 3 -#define BER_REF_VALUE 35 - -struct ST_BBPINFO { - unsigned int ulFreq; - enum INC_ERROR_INFO nBbpStatus; - unsigned char ucStop; - enum ST_TRANSMISSION ucTransMode; - - unsigned char ucAntLevel; - unsigned char ucSnr; - unsigned char ucVber; - unsigned short uiCER; - unsigned short wRssi; - unsigned int dPreBER; - unsigned int uiPostBER; - - unsigned int ulReConfigTime; - - unsigned short uiInCAntTick; - unsigned short uiInCERAvg; - unsigned short uiIncPostBER; - unsigned short auiANTBuff[BER_BUFFER_MAX]; - - unsigned char ucProtectionLevel; - unsigned short uiInCBERTick; - unsigned short uiBerSum; - unsigned short auiBERBuff[BER_BUFFER_MAX]; - - unsigned char ucCERCnt; -} ; - -struct ST_FIB_INFO { - unsigned short uiIsCRC; - unsigned char ucDataPos; - unsigned char aucBuff[FIB_SIZE]; -} ; - -struct ST_FIC { - unsigned char ucBlockNum; - struct ST_FIB_INFO stBlock; -} ; - -union ST_FIG_HEAD { - unsigned char ucInfo; - struct { - unsigned char bitLength:5; - unsigned char bitType:3; - } ITEM; -} ; - -union ST_TYPE_0 { - unsigned char ucInfo; - struct { - unsigned char bitExtension:5; - unsigned char bitPD:1; - unsigned char bitOE:1; - unsigned char bitCN:1; - } ITEM; -} ; - -union ST_TYPE_1 { - unsigned char ucInfo; - struct { - unsigned char bitExtension:3; - unsigned char bitOE:1; - unsigned char bitCharset:4; - } ITEM; -} ; - -union ST_USER_APPSERID_16 { - unsigned short uiInfo; - struct { - unsigned short bitServiceID:16; - } ITEM; - -} ; - -union ST_USER_APPSERID_32 { - unsigned int ulInfo; - struct { - unsigned int bitServiceID:32; - } ITEM; - -} ; - -union ST_USER_APP_IDnNUM { - unsigned char ucInfo; - struct { - unsigned char bitNomUserApp:4; - unsigned char bitSCIdS:4; - } ITEM; -} ; - -union ST_USER_APPTYPE { - unsigned short uiInfo; - struct { - unsigned short bitUserDataLength:5; - unsigned short bitUserAppType:11; - } ITEM; -} ; - - -union ST_TYPE0of0_INFO { - unsigned int ulBuff; - struct { - unsigned int bitLow_CIFCnt:8; - unsigned int bitHigh_CIFCnt:5; - unsigned int bitAlFlag:1; - unsigned int bitChangFlag:2; - unsigned int bitEld:16; - } ITEM; -} ; - -union ST_TYPE0of1Short_INFO { - unsigned int nBuff; - struct { - unsigned int bitReserved:8; - unsigned int bitTableIndex:6; - unsigned int bitTableSw:1; - unsigned int bitShortLong:1; - unsigned int bitStartAddr:10; - unsigned int bitSubChId:6; - } ITEM; -} ; - -union ST_TYPE0of1Long_INFO { - unsigned int nBuff; - struct { - unsigned int bitSubChanSize:10; - unsigned int bitProtecLevel:2; - unsigned int bitOption:3; - unsigned int bitShortLong:1; - unsigned int bitStartAddr:10; - unsigned int bitSubChId:6; - } ITEM; -} ; - -union ST_TYPE0of3Id_INFO { - unsigned int ulData; - struct { - unsigned int bitReserved:8; - unsigned int bitPacketAddr:10; - unsigned int bitSubChId:6; - unsigned int bitDScType:6; - unsigned int bitRfu:1; - unsigned int bitFlag:1; - } ITEM; -} ; - -union ST_TYPE0of3_INFO { - unsigned short nData; - struct { - unsigned short bitCAOrgFlag:1; - unsigned short bitReserved:3; - unsigned short bitScid:12; - } ITEM; -} ; - -union ST_SERVICE_COMPONENT { - unsigned char ucData; - struct { - unsigned char bitNumComponent:4; - unsigned char bitCAId:3; - unsigned char bitLocalFlag:1; - } ITEM; -} ; - -union ST_TMId_MSCnFIDC { - unsigned short uiData; - struct { - unsigned short bitCAflag:1; - unsigned short bitPS:1; - unsigned short bitSubChld:6; - unsigned short bitAscDscTy:6; - unsigned short bitTMId:2; - } ITEM; -} ; - -union ST_MSC_PACKET_INFO { - unsigned short usData; - struct { - unsigned short bitCAflag:1; - unsigned short bitPS:1; - unsigned short bitSCId:12; - unsigned short bitTMId:2; - } ITEM; -} ; - -union ST_MSC_BIT { - unsigned char ucData; - struct { - unsigned char bitScIds:4; - unsigned char bitRfa:3; - unsigned char bitExtFlag:1; - } ITEM; -} ; - -union ST_MSC_LONG { - unsigned short usData; - struct { - unsigned short bitScId:12; - unsigned short bitDummy:3; - unsigned short bitLsFlag:1; - } ITEM; -} ; - -union ST_MSC_SHORT { - unsigned char ucData; - struct { - unsigned char bitSUBnFIDCId:6; - unsigned char bitMscFicFlag:1; - unsigned char bitLsFlag:1; - } ITEM; -} ; - -union ST_EXTENSION_TYPE14 { - unsigned char ucData; - struct { - unsigned char bitSCidS:4; - unsigned char bitRfa:3; - unsigned char bitPD:1; - } ITEM; -} ; - -union ST_EXTENSION_TYPE12 { - unsigned char ucData; - struct { - unsigned char bitReserved1:6; - unsigned char bitCF_flag:1; - unsigned char bitCountry:1; - } ITEM; -} ; - -union ST_UTC_SHORT_INFO { - unsigned int ulBuff; - struct { - unsigned int bitMinutes:6; - unsigned int bitHours:5; - unsigned int bitUTC_Flag:1; - unsigned int bitConf_Ind:1; - unsigned int bitLSI:1; - unsigned int bitMJD:17; - unsigned int bitRfu:1; - } ITEM; -} ; - -union ST_UTC_LONG_INFO { - unsigned short unBuff; - struct { - unsigned short bitMilliseconds:10; - unsigned short bitSeconds:6; - } ITEM; -} ; - -struct ST_DATE_T { - unsigned short usYear; - unsigned char ucMonth; - unsigned char ucDay; - unsigned char ucHour; - unsigned char ucMinutes; - unsigned char ucSeconds; - unsigned short uiMilliseconds; - -} ; - - -struct ST_FICDB_SERVICE_COMPONENT { - unsigned int ulSid; - unsigned char ucSCidS; - unsigned char ucSubChid; - unsigned char ucTmID; - unsigned char ucCAFlag; - unsigned char ucPS; - unsigned char ucDSCType; - unsigned char aucComponentLabels[INC_ENSEMBLE_LABLE_MAX]; - unsigned char ucIsComponentLabel; - unsigned char aucLabels[INC_ENSEMBLE_LABLE_MAX]; - unsigned short unEnsembleFlag; - unsigned char ucIsLable; - unsigned short unPacketAddr; - unsigned char ucCAOrgFlag; - unsigned char ucDGFlag; - unsigned short unCAOrg; - unsigned short unStartAddr; - unsigned char ucShortLong; - unsigned char ucTableSW; - unsigned char ucTableIndex; - unsigned char ucOption; - unsigned char ucProtectionLevel; - unsigned short uiSubChSize; - unsigned short uiBitRate; - unsigned short uiDifferentRate; - unsigned char IsOrganiza; - unsigned char IsPacketMode; - unsigned char ucIsAppData; - struct ST_USERAPP_GROUP_INFO stUApp; - -} ; - -struct ST_STREAM_INFO { - short nPrimaryCnt; - short nSecondaryCnt; - struct ST_FICDB_SERVICE_COMPONENT astPrimary[INC_SERVICE_MAX]; - struct ST_FICDB_SERVICE_COMPONENT astSecondary[INC_SERVICE_MAX]; - -} ; - - -struct ST_FICDB_LIST { - short nLabelCnt; - short nEmsembleLabelFlag; - short nSubChannelCnt; - short nPacketCnt; - short nPacketModeCnt; - unsigned char ucIsSimpleFIC; - unsigned char ucIsSimpleCnt; - enum ST_SIMPLE_FIC ucIsSetSimple; - unsigned short unEnsembleID; - unsigned char ucChangeFlag; - unsigned short unCIFCount; - unsigned char ucOccurrence; - - unsigned char aucEnsembleName[INC_ENSEMBLE_LABLE_MAX]; - unsigned short unEnsembleFlag; - unsigned char ucIsEnsembleName; - - struct ST_STREAM_INFO stDMB; - struct ST_STREAM_INFO stDAB; - struct ST_STREAM_INFO stFIDC; - struct ST_STREAM_INFO stDATA; - - struct ST_DATE_T stDate; - short nUserAppCnt; -} ; - -#ifdef INC_FIFO_SOURCE_ENABLE -#define INC_CIF_MAX_SIZE (188*8) -#define INC_FIFO_DEPTH (1024*5) -#define MAX_CHANNEL_FIFO 5 -#define MAX_HEADER_SIZE 16 -#define HEADER_SERACH_SIZE (INC_CIF_MAX_SIZE + MAX_HEADER_SIZE) -#define HEADER_ID_0x33 0x33 -#define HEADER_ID_0x00 0x00 -#define HEADER_SIZE_BITMASK 0x3FF -#define INC_HEADER_CHECK_BUFF (INC_CIF_MAX_SIZE*4) - -enum MULTI_CHANNEL_INFO { - MAIN_INPUT_DATA = 0, - FIC_STREAM_DATA, - CHANNEL1_STREAM_DATA, - CHANNEL2_STREAM_DATA, - CHANNEL3_STREAM_DATA, -} ; - -enum ST_HEADER_INFO { - INC_HEADER_SIZE_ERROR = 0, - INC_HEADER_NOT_SEARACH, - INC_HEADER_GOOD, -} ; - -#define INC_SUB_CHANNEL_ID_MASK 0xFFFF -struct ST_FIFO { - unsigned int ulDepth; - unsigned int ulFront; - unsigned int ulRear; - unsigned short unSubChID; - unsigned char acBuff[INC_FIFO_DEPTH+1]; -} ; - -void INC_MULTI_SORT_INIT(void); -unsigned char INC_QFIFO_INIT(struct ST_FIFO *pFF, unsigned int ulDepth); -unsigned char INC_QFIFO_ADD(struct ST_FIFO *pFF, - unsigned char *pData, unsigned int ulSize); -unsigned char INC_QFIFO_AT(struct ST_FIFO *pFF, - unsigned char *pData, unsigned int ulSize); -unsigned char INC_QFIFO_BRING(struct ST_FIFO *pFF, - unsigned char *pData, unsigned int ulSize); -unsigned char INC_GET_ID_BRINGUP(unsigned short unID, - unsigned char *pData, unsigned int ulSize); -unsigned char INC_MULTI_FIFO_PROCESS( - unsigned char *pData, unsigned int ulSize); - -unsigned int INC_QFIFO_FREE_SIZE(struct ST_FIFO *pFF); -unsigned int INC_QFIFO_GET_SIZE(struct ST_FIFO *pFF); -unsigned int INC_GET_IDS_SIZE(unsigned short unID); - -struct ST_FIFO *INC_GET_CHANNEL_FIFO(enum MULTI_CHANNEL_INFO ucIndex); -enum ST_HEADER_INFO INC_HEADER_CHECK(struct ST_FIFO *pMainFifo); -#endif - - -enum INC_SORT_OPTION { - INC_SUB_CHANNEL_ID = 0, - INC_START_ADDRESS, - INC_BIRRATE, - INC_FREQUENCY, -} ; - -void INC_MSG_PRINTF(char nFlag, char *pFormat, ...); -void INC_SCAN_SETTING(unsigned char ucI2CID); -void INC_AIRPLAY_SETTING(unsigned char ucI2CID); -void INC_DELAY(unsigned short uiDelay); -void INC_MPICLOCK_SET(unsigned char ucI2CID); -void INC_UPLOAD_MODE(unsigned char ucI2CID); -void INC_INTERRUPT_CLEAR(unsigned char ucI2CID, unsigned short uiClrInt); -void INC_INTERRUPT_CTRL(unsigned char ucI2CID); -void INC_INTERRUPT_SET(unsigned char ucI2CID, unsigned short uiSetInt); -void INC_SET_CHANNEL(unsigned char ucI2CID, struct ST_SUBCH_INFO *pChInfo); -void INC_BUBBLE_SORT(struct ST_SUBCH_INFO *pMainInfo, enum INC_SORT_OPTION Opt); -void INC_SWAP(struct ST_SUBCH_INFO *pMainInfo, - unsigned short nNo1, unsigned short nNo2); -void INTERFACE_USER_STOP(unsigned char ucI2CID); -void INTERFACE_USER_STOP_CLEAR(unsigned char ucI2CID); -void INTERFACE_INT_ENABLE(unsigned char ucI2CID, unsigned short unSet); -void INTERFACE_INT_CLEAR(unsigned char ucI2CID, unsigned short unClr); -void INC_INITDB(unsigned char ucI2CID); -void INC_EXTENSION_000(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_001(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_002(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_003(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_008(struct ST_FIB_INFO *pFibInfo); -void INC_INIT_MPI(unsigned char ucI2CID); -#ifdef USER_APPLICATION_TYPE -void INC_EXTENSION_013(struct ST_FIB_INFO *pFibInfo); -#endif -void INC_EXTENSION_110(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_111(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_112(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_113(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_114(struct ST_FIB_INFO *pFibInfo); -void INC_EXTENSION_115(struct ST_FIB_INFO *pFibInfo); -void INC_SET_FICTYPE_1(struct ST_FIB_INFO *pFibInfo); - -void INC_SET_FICTYPE_5(struct ST_FIB_INFO *pFibInfo); -void INC_SET_UPDATEFIC(struct ST_FIB_INFO *pstDestData, - unsigned char *pSourData); -void INTERFACE_UPLOAD_MODE(unsigned char ucI2CID, - enum UPLOAD_MODE_INFO ucUploadMode); -void INC_UPDATE_LIST(struct INC_CHANNEL_INFO *pUpDateCh, - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent); - -unsigned char INC_GET_FIND_TYPE(union ST_FIG_HEAD *pInfo); -unsigned char INTERFACE_PLL_MODE(unsigned char ucI2CID, - enum PLL_MODE ucPllMode); -unsigned char INTERFACE_DBINIT(void); -unsigned char INTERFACE_INIT(unsigned char ucI2CID); -unsigned char INTERFACE_RECONFIG(unsigned char ucI2CID); -unsigned char INTERFACE_STATUS_CHECK(unsigned char ucI2CID); -unsigned char INTERFACE_START(unsigned char ucI2CID, - struct ST_SUBCH_INFO *pChInfo); -unsigned char INTERFACE_START_TEST( - unsigned char ucI2CID, struct ST_SUBCH_INFO *pChInfo); -unsigned char INTERFACE_INT_CHECK(unsigned char ucI2CID); -unsigned char INC_BUBBLE_SORT_by_TYPE(struct ST_SUBCH_INFO *pMainInfo); -unsigned char INTERFACE_SCAN(unsigned char ucI2CID, unsigned int ulFreq); -unsigned char INTERFACE_GET_SNR(unsigned char ucI2CID); -unsigned char INTERFACE_ISR(unsigned char ucI2CID, unsigned char *pBuff); -unsigned char INC_CHECK_SERVICE_DB16(unsigned short *ptr, unsigned short wVal, - unsigned short wNum); -unsigned char INC_CHECK_SERVICE_DB8(unsigned char *ptr, unsigned char cVal, - unsigned char cNum); - -unsigned char INC_GET_BYTEDATA(struct ST_FIB_INFO *pFibInfo); -unsigned char INC_GETAT_BYTEDATA(struct ST_FIB_INFO *pFibInfo); -unsigned char INC_GET_HEADER(struct ST_FIB_INFO *pInfo); - -unsigned char INC_GET_TYPE(struct ST_FIB_INFO *pInfo); -unsigned char INC_GETAT_HEADER(struct ST_FIB_INFO *pInfo); -unsigned char INC_GETAT_TYPE(struct ST_FIB_INFO *pInfo); -unsigned char INC_INIT(unsigned char ucI2CID); -unsigned char INC_READY(unsigned char ucI2CID, unsigned int ulFreq); -unsigned char INC_SYNCDETECTOR(unsigned char ucI2CID, unsigned int ulFreq, - unsigned char ucScanMode); -unsigned char INC_FICDECODER(unsigned char ucI2CID, - enum ST_SIMPLE_FIC bSimpleFIC); -unsigned char INC_FIC_UPDATE(unsigned char ucI2CID, - struct ST_SUBCH_INFO *pChInfo, - enum ST_SIMPLE_FIC bSimpleFIC); -unsigned char INC_START(unsigned char ucI2CID, struct ST_SUBCH_INFO *pChInfo, - unsigned short IsEnsembleSame); -unsigned char INC_STOP(unsigned char ucI2CID); -unsigned char INC_CHANNEL_START(unsigned char ucI2CID, - struct ST_SUBCH_INFO *pChInfo); -unsigned char INC_CHANNEL_START_TEST( - unsigned char ucI2CID, struct ST_SUBCH_INFO *pChInfo); -unsigned char INC_ENSEMBLE_SCAN(unsigned char ucI2CID, unsigned int ulFreq); -unsigned char INC_FIC_RECONFIGURATION_HW_CHECK(unsigned char ucI2CID); -unsigned char INC_STATUS_CHECK(unsigned char ucI2CID); -unsigned char INC_GET_ANT_LEVEL(unsigned char ucI2CID); -unsigned char INC_GET_SNR(unsigned char ucI2CID); -unsigned char INC_GET_VBER(unsigned char ucI2CID); -unsigned char INC_GET_NULLBLOCK(union ST_FIG_HEAD *pInfo); -unsigned char INC_GET_FINDLENGTH(union ST_FIG_HEAD *pInfo); -unsigned char INC_SET_TRANSMIT_MODE(unsigned char ucMode); -unsigned char INC_GET_FINDTYPE(union ST_FIG_HEAD *pInfo); -unsigned char INC_GET_NULL_BLOCK(union ST_FIG_HEAD *pInfo); -unsigned char INC_GET_FIND_LENGTH(union ST_FIG_HEAD *pInfo); -unsigned char INC_FICPARSING(unsigned char ucI2CID, unsigned char *pucFicBuff, - int uFicLength, enum ST_SIMPLE_FIC bSimpleFIC); -unsigned char INC_CMD_WRITE(unsigned char ucI2CID, unsigned short uiAddr, - unsigned short uiData); -unsigned char INC_I2C_WRITE(unsigned char ucI2CID, unsigned short uiAddr, - unsigned short uiData); -unsigned char INC_EBI_WRITE(unsigned char ucI2CID, unsigned short uiAddr, - unsigned short uiData); -unsigned char INC_RE_SYNC(unsigned char ucI2CID); -unsigned char INC_PLL_SET(unsigned char ucI2CID); -unsigned char SAVE_CHANNEL_INFO(char *pStr); -unsigned char LOAD_CHANNEL_INFO(char *pStr); -unsigned char INC_I2C_READ_BURST(unsigned char ucI2CID, unsigned short uiAddr, - unsigned char *pData, unsigned short nSize); -unsigned char INC_SPI_REG_WRITE(unsigned char ucI2CID, unsigned short uiAddr, - unsigned short uiData); -unsigned char INC_CMD_READ_BURST(unsigned char ucI2CID, unsigned short uiAddr, - unsigned char *pData, unsigned short nSize); -unsigned char INC_SPI_READ_BURST(unsigned char ucI2CID, unsigned short uiAddr, - unsigned char *pBuff, unsigned short wSize); -unsigned char INC_CHIP_STATUS(unsigned char ucI2CID); -unsigned char INC_RF500_START(unsigned char ucI2CID, unsigned int ulRFChannel, - enum ENSEMBLE_BAND ucBand, enum PLL_MODE ucPLL); -unsigned char INC_RF500_I2C_WRITE(unsigned char ucI2CID, unsigned char *pucData, - unsigned int uLength); -unsigned char INC_GET_FIB_CNT(enum ST_TRANSMISSION ucMode); -unsigned char INC_EBI_READ_BURST(unsigned char ucI2CID, unsigned short uiAddr, - unsigned char *pData, unsigned short nSize); -unsigned char *INTERFACE_GETENSEMBLE_LABEL(unsigned char ucI2CID); -struct INC_TDMB_MODE *INC_GET_TDMBMODE(unsigned char ucI2CID); -void INC_SET_TDMBMODE(unsigned char ucI2CID, struct INC_TDMB_MODE *stMode); - -short INC_CHECK_SERVICE_CNT16(unsigned short *ptr, unsigned short wVal, - unsigned char cNum, unsigned short wMask); -short INC_CHECK_SERVICE_CNT8(unsigned char *ptr, unsigned char cVal, - unsigned char cNum, unsigned char cMask); -short INC_CHECK_SERVICE_CNT32(unsigned int *ptr, unsigned int wVal, - unsigned char cNum); -short INC_GET_RSSI(unsigned char ucI2CID); -unsigned short INC_EBI_READ(unsigned char ucI2CID, unsigned short uiAddr); -unsigned short INC_FIND_KOR_FREQ(unsigned int ulFreq); -unsigned short INC_CRC_CHECK(unsigned char *pBuf, unsigned char ucSize); -unsigned short INC_SET_FICTYPE_0(struct ST_FIB_INFO *pFibInfo); -unsigned short INC_GET_WORDDATA(struct ST_FIB_INFO *pFibInfo); -unsigned short INC_GETAT_WORDDATA(struct ST_FIB_INFO *pFibInfo); -unsigned short INC_FIND_SUBCH_SIZE(unsigned char ucTableIndex); -unsigned short INTERFACE_GET_CER(unsigned char ucI2CID); -unsigned short INTERFACE_GETDMB_CNT(void); -unsigned short INTERFACE_GETDAB_CNT(void); -unsigned short INTERFACE_GETDATA_CNT(void); -unsigned short INC_CMD_READ(unsigned char ucI2CID, unsigned short uiAddr); -unsigned short INC_I2C_READ(unsigned char ucI2CID, unsigned short ulAddr); -unsigned short INC_SPI_REG_READ(unsigned char ucI2CID, unsigned short uiAddr); -unsigned short INC_GET_FRAME_DURATION(enum ST_TRANSMISSION cTrnsMode); -unsigned short INC_GET_CER(unsigned char ucI2CID); -unsigned short INC_RESYNC_CER(unsigned char ucI2CID); - -unsigned int INC_GET_KOREABAND_FULL_TABLE(unsigned short uiIndex); -unsigned int INC_GET_KOREABAND_NORMAL_TABLE(unsigned short uiIndex); -unsigned int INC_GET_LONGDATA(struct ST_FIB_INFO *pFibInfo); -unsigned int INC_GETAT_LONGDATA(struct ST_FIB_INFO *pFibInfo); -unsigned int YMDtoMJD(struct ST_DATE_T stDate); -void MJDtoYMD(unsigned short wMJD, struct ST_DATE_T *pstDate); - -unsigned int INTERFACE_GET_POSTBER(unsigned char ucI2CID); -unsigned int INTERFACE_GET_PREBER(unsigned char ucI2CID); -unsigned int INC_GET_PREBER(unsigned char ucI2CID); -unsigned int INC_GET_POSTBER(unsigned char ucI2CID); - -struct ST_BBPINFO *INC_GET_STRINFO(unsigned char ucI2CID); -enum INC_ERROR_INFO INTERFACE_ERROR_STATUS(unsigned char ucI2CID); -struct INC_CHANNEL_INFO *INTERFACE_GETDB_DMB(short uiPos); -struct INC_CHANNEL_INFO *INTERFACE_GETDB_DAB(short uiPos); -struct INC_CHANNEL_INFO *INTERFACE_GETDB_DATA(short uiPos); - -unsigned char INC_ADD_ENSEMBLE_NAME( - unsigned short unEnID, unsigned char *pcLabel); -struct ST_FICDB_LIST *INC_GET_FICDB_LIST(void); -void INC_FIND_BASIC_SERVICE(unsigned int ulServiceId, unsigned short unData); -void INC_ADD_BASIC_SERVICE( - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - unsigned int ulServiceId, unsigned short unData); - -void INC_ADD_ORGANIZAION_SUBCHANNEL_ID( - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - unsigned int ulTypeInfo); -void INC_SORT_ORGANIZAION_SUBCHANNEL_ID( - struct ST_STREAM_INFO *pStreamInfo, - unsigned char ucSubChID, unsigned int ulTypeInfo); -unsigned char INC_SORT_SIMPLE_ORGANIZAION_SUBCHANNEL_ID( - struct ST_STREAM_INFO *pStreamInfo, unsigned char ucSubChID, - unsigned short unStartAddr, unsigned int ulTypeInfo); -void INC_FIND_ORGANIZAION_SUBCHANNEL_ID(unsigned char ucSubChID, - unsigned int ulTypeInfo); - -void INC_FIND_SIMPLE_ORGANIZAION_SUBCHANNEL_ID( - unsigned char ucSubChID, - unsigned short unStartAddr, - unsigned int ulTypeInfo); - -unsigned short INC_GET_BITRATE( - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent); -void INC_GET_LONG_FORM( - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - union ST_TYPE0of1Long_INFO *pLong); -void INC_GET_SHORT_FORM( - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - union ST_TYPE0of1Short_INFO *pShort); - -void INC_ADD_ENSEMBLE_ID(union ST_TYPE0of0_INFO *pIdInfo); -void INC_FIND_PACKET_MODE( - union ST_TYPE0of3_INFO *pTypeInfo, - union ST_TYPE0of3Id_INFO *pIdInfo); - -void INC_FIND_GLOBAL_SERVICE_COMPONENT_LONG( - unsigned int ulSvcID, - union ST_MSC_LONG *pstMscLong, union ST_MSC_BIT *pstMsc); -void INC_ADD_GLOBAL_SERVICE_COMPONENT_LONG( - struct ST_STREAM_INFO *pStreamInfo, - unsigned int ulSvcID, - union ST_MSC_LONG *pstMscLong, union ST_MSC_BIT *pstMsc); -void INC_FIND_GLOBAL_SERVICE_COMPONENT_SHORT(unsigned int ulSvcID, - union ST_MSC_SHORT *pstMscShort, union ST_MSC_BIT *pstMsc); -void INC_ADD_GLOBAL_SERVICE_COMPONENT_SHORT( - struct ST_STREAM_INFO *pStreamInfo, unsigned int ulSvcID, - union ST_MSC_SHORT *pstMscShort, union ST_MSC_BIT *pstMsc); -void INC_FIND_SERVICE_COMPONENT_LABEL( - unsigned int ulSID, unsigned char *pcLabel); -void INC_FIND_DATA_SERVICE_COMPONENT_LABEL( - unsigned int ulSID, unsigned char *pcLabel); -unsigned short INC_FIND_SUB_CHANNEL_SIZE(unsigned char ucTableIndex); -void INC_LABEL_FILTER(unsigned char *pData, short nSize); -void INC_ADD_SERVICE_LABEL(struct ST_STREAM_INFO *pStreamInfo, - unsigned int ulSID, unsigned char *pcLabel); -void INC_FIND_USERAPP_TYPE(unsigned int ulSID, - struct ST_USERAPP_GROUP_INFO *pstData); -unsigned char INC_ADD_USERAPP_TYPE(unsigned int ulSID, - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent, - short nCnt, struct ST_USERAPP_GROUP_INFO *pstData); - -unsigned char INC_DB_UPDATE(unsigned int ulFreq, struct ST_SUBCH_INFO *pDMB, - struct ST_SUBCH_INFO *pDAB, struct ST_SUBCH_INFO *pDATA, - struct ST_SUBCH_INFO *pFIDC); -void INC_ADD_SERVICE_COMPONENT_LABEL( - struct ST_STREAM_INFO *pStreamInfo, - unsigned int ulSID, - unsigned char *pcLabel); -void INC_DB_COPY(unsigned int ulFreq, short nCnt, - struct INC_CHANNEL_INFO *pChInfo, - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent); - -unsigned short INC_GET_SAMSUNG_BER(unsigned char ucI2CID); -unsigned char INC_GET_SAMSUNG_ANT_LEVEL(unsigned char ucI2CID); -unsigned short INC_GET_SAMSUNG_BER_FOR_FACTORY_MODE(unsigned char ucI2CID); - -extern struct spi_device *spi_dmb; - -#endif diff --git a/drivers/media/tdmb/t3900/INC_INTERFACE.c b/drivers/media/tdmb/t3900/INC_INTERFACE.c deleted file mode 100644 index bb74397..0000000 --- a/drivers/media/tdmb/t3900/INC_INTERFACE.c +++ /dev/null @@ -1,530 +0,0 @@ -/***************************************************************************** - Copyright(c) 2011 I&C Inc. All Rights Reserved - - File name : INC_INTERFACE.c - - Description : - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*******************************************************************************/ - -#include "INC_INCLUDES.h" -#include "tdmb.h" -#include - -/********************** Comment****************/ -/* Operating Chip set : T3900 */ -/* Software version : version 1.22 */ -/* Software Update : 2011.04.21 */ -/************************************************/ -static DEFINE_MUTEX(tdmb_mutex); - -#define INC_MUTEX_LOCK() mutex_lock(&tdmb_mutex) -#define INC_MUTEX_FREE() mutex_unlock(&tdmb_mutex) -struct ST_SUBCH_INFO g_stDmbInfo; -struct ST_SUBCH_INFO g_stDabInfo; -struct ST_SUBCH_INFO g_stDataInfo; -struct ST_SUBCH_INFO g_stFIDCInfo; - - -void INC_DELAY(unsigned short uiDelay) -{ - msleep(uiDelay); -} - -void INC_MSG_PRINTF(char nFlag, char *pFormat, ...) -{ - va_list Ap; - unsigned short nSize; - char acTmpBuff[1012] = {0}; - va_start(Ap, pFormat); - nSize = vsprintf(acTmpBuff, pFormat, Ap); - va_end(Ap); -} - -unsigned short INC_I2C_READ(unsigned char ucI2CID, unsigned short uiAddr) -{ - unsigned short uiRcvData = 0; - return uiRcvData; -} - -unsigned char INC_I2C_WRITE(unsigned char ucI2CID, unsigned short uiAddr, - unsigned short uiData) -{ - return INC_SUCCESS; -} - -unsigned char INC_I2C_READ_BURST(unsigned char ucI2CID, unsigned short uiAddr, - unsigned char *pData, unsigned short nSize) -{ - return INC_SUCCESS; -} - -unsigned char INC_EBI_WRITE(unsigned char ucI2CID, unsigned short uiAddr, - unsigned short uiData) -{ - unsigned short uiCMD = INC_REGISTER_CTRL(SPI_REGWRITE_CMD) | 1; - unsigned short uiNewAddr = - (ucI2CID == TDMB_I2C_ID82) ? (uiAddr | 0x8000) : uiAddr; - INC_MUTEX_LOCK(); - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiNewAddr >> 8; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiNewAddr & 0xff; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiCMD >> 8; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiCMD & 0xff; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = - (uiData >> 8) & 0xff; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiData & 0xff; - INC_MUTEX_FREE(); - return INC_SUCCESS; -} - -unsigned short INC_EBI_READ(unsigned char ucI2CID, unsigned short uiAddr) -{ - unsigned short uiRcvData = 0; - unsigned short uiCMD = INC_REGISTER_CTRL(SPI_REGREAD_CMD) | 1; - unsigned short uiNewAddr = - (ucI2CID == TDMB_I2C_ID82) ? (uiAddr | 0x8000) : uiAddr; - INC_MUTEX_LOCK(); - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiNewAddr >> 8; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiNewAddr & 0xff; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiCMD >> 8; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiCMD & 0xff; - uiRcvData = - (*(unsigned char *)STREAM_PARALLEL_ADDRESS & 0xff) << 8; - uiRcvData |= (*(unsigned char *)STREAM_PARALLEL_ADDRESS & 0xff); - INC_MUTEX_FREE(); - return uiRcvData; -} - -unsigned char INC_EBI_READ_BURST(unsigned char ucI2CID, unsigned short uiAddr, - unsigned char *pData, unsigned short nSize) -{ - unsigned short uiLoop, nIndex = 0, anLength[2], uiCMD, unDataCnt; - unsigned short uiNewAddr = - (ucI2CID == TDMB_I2C_ID82) ? (uiAddr | 0x8000) : uiAddr; - if (nSize > INC_MPI_MAX_BUFF) - return INC_ERROR; - memset((char *) anLength, 0, sizeof(anLength)); - if (nSize > INC_TDMB_LENGTH_MASK) { - anLength[nIndex++] = INC_TDMB_LENGTH_MASK; - anLength[nIndex++] = nSize - INC_TDMB_LENGTH_MASK; - } else - anLength[nIndex++] = nSize; - - INC_MUTEX_LOCK(); - for (uiLoop = 0; uiLoop < nIndex; uiLoop++) { - uiCMD = - INC_REGISTER_CTRL(SPI_MEMREAD_CMD) | (anLength[uiLoop] & - INC_TDMB_LENGTH_MASK); - *(unsigned char *)STREAM_PARALLEL_ADDRESS = - uiNewAddr >> 8; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = - uiNewAddr & 0xff; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiCMD >> 8; - *(unsigned char *)STREAM_PARALLEL_ADDRESS = uiCMD & 0xff; - for (unDataCnt = 0; unDataCnt < anLength[uiLoop]; - unDataCnt++) { - *pData++ = - *(unsigned char *)STREAM_PARALLEL_ADDRESS & 0xff; - } - } - INC_MUTEX_FREE(); - return INC_SUCCESS; -} - -unsigned short INC_SPI_REG_READ(unsigned char ucI2CID, unsigned short uiAddr) -{ - unsigned short uiRcvData = 0; - unsigned short uiNewAddr = - (ucI2CID == TDMB_I2C_ID82) ? (uiAddr | 0x8000) : uiAddr; - unsigned short uiCMD = INC_REGISTER_CTRL(SPI_REGREAD_CMD) | 1; - unsigned char auiBuff[6]; - unsigned char cCnt = 0; - unsigned char acRxBuff[2]; - struct spi_message msg; - struct spi_transfer transfer[2]; - struct spi_device *_device; - int status; - - _device = tdmb_get_spi_handle(); - - INC_MUTEX_LOCK(); - auiBuff[cCnt++] = uiNewAddr >> 8; - auiBuff[cCnt++] = uiNewAddr & 0xff; - auiBuff[cCnt++] = uiCMD >> 8; - auiBuff[cCnt++] = uiCMD & 0xff; - - memset(&msg, 0, sizeof(msg)); - memset(transfer, 0, sizeof(transfer)); - spi_message_init(&msg); - msg.spi = _device; - transfer[0].tx_buf = (u8 *) auiBuff; - transfer[0].rx_buf = (u8 *) NULL; - transfer[0].len = 4; - transfer[0].bits_per_word = 8; - transfer[0].delay_usecs = 0; - spi_message_add_tail(&(transfer[0]), &msg); - transfer[1].tx_buf = (u8 *) NULL; - transfer[1].rx_buf = (u8 *) acRxBuff; - transfer[1].len = 2; - transfer[1].bits_per_word = 8; - transfer[1].delay_usecs = 0; - spi_message_add_tail(&(transfer[1]), &msg); - status = spi_sync(_device, &msg); - uiRcvData = (unsigned short) (acRxBuff[0] << 8) | - (unsigned short) acRxBuff[1]; - - /* TODO SPI Read code here... */ - INC_MUTEX_FREE(); - return uiRcvData; -} - -unsigned char INC_SPI_REG_WRITE(unsigned char ucI2CID, unsigned short uiAddr, - unsigned short uiData) -{ - unsigned short uiNewAddr = - (ucI2CID == TDMB_I2C_ID82) ? (uiAddr | 0x8000) : uiAddr; - unsigned short uiCMD = INC_REGISTER_CTRL(SPI_REGWRITE_CMD) | 1; - unsigned char auiBuff[6]; - unsigned char cCnt = 0; - - struct spi_message msg; - struct spi_transfer transfer; - struct spi_device *_device; - int status; - - _device = tdmb_get_spi_handle(); - - INC_MUTEX_LOCK(); - auiBuff[cCnt++] = uiNewAddr >> 8; - auiBuff[cCnt++] = uiNewAddr & 0xff; - auiBuff[cCnt++] = uiCMD >> 8; - auiBuff[cCnt++] = uiCMD & 0xff; - auiBuff[cCnt++] = uiData >> 8; - auiBuff[cCnt++] = uiData & 0xff; - memset(&msg, 0, sizeof(msg)); - memset(&transfer, 0, sizeof(transfer)); - spi_message_init(&msg); - msg.spi = _device; - transfer.tx_buf = (u8 *) auiBuff; - transfer.rx_buf = NULL; - transfer.len = 6; - transfer.bits_per_word = 8; - transfer.delay_usecs = 0; - spi_message_add_tail(&transfer, &msg); - status = spi_sync(_device, &msg); - INC_MUTEX_FREE(); - return INC_SUCCESS; -} - -unsigned char INC_SPI_READ_BURST(unsigned char ucI2CID, unsigned short uiAddr, - unsigned char *pBuff, unsigned short wSize) -{ - unsigned short uiNewAddr = - (ucI2CID == TDMB_I2C_ID82) ? (uiAddr | 0x8000) : uiAddr; - unsigned short uiCMD; - unsigned char auiBuff[6]; - - struct spi_message msg; - struct spi_transfer transfer[2]; - struct spi_device *_device; - int status; - - _device = tdmb_get_spi_handle(); - - INC_MUTEX_LOCK(); - auiBuff[0] = uiNewAddr >> 8; - auiBuff[1] = uiNewAddr & 0xff; - uiCMD = INC_REGISTER_CTRL(SPI_MEMREAD_CMD) | (wSize & 0xFFF); - auiBuff[2] = uiCMD >> 8; - auiBuff[3] = uiCMD & 0xff; - memset(&msg, 0, sizeof(msg)); - memset(transfer, 0, sizeof(transfer)); - spi_message_init(&msg); - msg.spi = _device; - transfer[0].tx_buf = (u8 *) auiBuff; - transfer[0].rx_buf = (u8 *) NULL; - transfer[0].len = 4; - transfer[0].bits_per_word = 8; - transfer[0].delay_usecs = 0; - spi_message_add_tail(&(transfer[0]), &msg); - transfer[1].tx_buf = (u8 *) NULL; - transfer[1].rx_buf = (u8 *) pBuff; - transfer[1].len = wSize; - transfer[1].bits_per_word = 8; - transfer[1].delay_usecs = 0; - spi_message_add_tail(&(transfer[1]), &msg); - status = spi_sync(_device, &msg); - INC_MUTEX_FREE(); - return INC_SUCCESS; -} - -unsigned char INTERFACE_DBINIT(void) -{ - memset(&g_stDmbInfo, 0, sizeof(struct ST_SUBCH_INFO)); - memset(&g_stDabInfo, 0, sizeof(struct ST_SUBCH_INFO)); - memset(&g_stDataInfo, 0, sizeof(struct ST_SUBCH_INFO)); - memset(&g_stFIDCInfo, 0, sizeof(struct ST_SUBCH_INFO)); - return INC_SUCCESS; -} - -void INTERFACE_UPLOAD_MODE(unsigned char ucI2CID, - enum UPLOAD_MODE_INFO ucUploadMode) -{ - struct INC_TDMB_MODE *stMode; - stMode = INC_GET_TDMBMODE(ucI2CID); - stMode->m_ucUploadMode = ucUploadMode; - INC_SET_TDMBMODE(ucI2CID, stMode); - - INC_UPLOAD_MODE(ucI2CID); -} - -unsigned char INTERFACE_PLL_MODE(unsigned char ucI2CID, enum PLL_MODE ucPllMode) -{ - struct INC_TDMB_MODE *stMode; - stMode = INC_GET_TDMBMODE(ucI2CID); - stMode->m_ucPLL_Mode = ucPllMode; - INC_SET_TDMBMODE(ucI2CID, stMode); - return INC_PLL_SET(ucI2CID); -} - -unsigned char INTERFACE_INIT(unsigned char ucI2CID) -{ - return INC_INIT(ucI2CID); -} - -enum INC_ERROR_INFO INTERFACE_ERROR_STATUS(unsigned char ucI2CID) -{ - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - return pInfo->nBbpStatus; -} - -/*************************************************/ -/* when Single Channel Select.... */ -/* pChInfo->ucServiceType, pChInfo->ucSubChID, */ -/* pChInfo->ulRFFreq */ -/* pChInfo->nSetCnt must be defined */ -/* When DMB Channel Select */ -/* pChInfo->ucServiceType = 0x18 */ -/* When DAB, DATA Channel Select muse be */ -/* pChInfo->ucServiceType = 0 */ -/*************************************************/ - -unsigned char INTERFACE_START(unsigned char ucI2CID, - struct ST_SUBCH_INFO *pChInfo) -{ - return INC_CHANNEL_START(ucI2CID, pChInfo); -} - - -/* For Factory */ -unsigned char INTERFACE_START_TEST( - unsigned char ucI2CID, struct ST_SUBCH_INFO *pChInfo) -{ - return INC_CHANNEL_START_TEST(ucI2CID, pChInfo); -} - -/************************************************/ -/* Multi Channel Select .. */ -/* pChInfo->ucServiceType, pChInfo->ucSubChID, */ -/*pChInfo->ulRFFreq is muse be */ -/* defined */ -/* When DMB Channel Select */ -/* pChInfo->ucServiceType = 0x18 */ -/* When DAB, DATA Channel Select must be */ -/* pChInfo->ucServiceType = 0 */ -/* pMultiInfo->nSetCnt is count of subChannel */ -/************************************************/ -unsigned char INTERFACE_SCAN(unsigned char ucI2CID, unsigned int ulFreq) -{ - INTERFACE_DBINIT(); - if (!INC_ENSEMBLE_SCAN(ucI2CID, ulFreq)) - return INC_ERROR; - INC_DB_UPDATE(ulFreq, &g_stDmbInfo, &g_stDabInfo, &g_stDataInfo, - &g_stFIDCInfo); - INC_BUBBLE_SORT(&g_stDmbInfo, INC_SUB_CHANNEL_ID); - INC_BUBBLE_SORT(&g_stDabInfo, INC_SUB_CHANNEL_ID); - INC_BUBBLE_SORT(&g_stDataInfo, INC_SUB_CHANNEL_ID); - INC_BUBBLE_SORT(&g_stFIDCInfo, INC_SUB_CHANNEL_ID); - return INC_SUCCESS; -} - - -/**********************************************/ -/* DMB Channel count return when single */ -/* channel scan is finished */ -/**********************************************/ -unsigned short INTERFACE_GETDMB_CNT(void) -{ - return (unsigned short) g_stDmbInfo.nSetCnt; -} - - -/***********************************************/ -/* DAB Channel count return when single channel */ -/* scan is finished */ -/************************************************/ -unsigned short INTERFACE_GETDAB_CNT(void) -{ - return (unsigned short) g_stDabInfo.nSetCnt; -} - - -/************************************************/ -/* DATA Channel count return when single */ -/* channel scan is finished */ -/************************************************/ -unsigned short INTERFACE_GETDATA_CNT(void) -{ - return (unsigned short) g_stDataInfo.nSetCnt; -} - - -/************************************************/ -/* Ensemble Label return when single channel */ -/* scan is finished */ -/************************************************/ - -unsigned char *INTERFACE_GETENSEMBLE_LABEL(unsigned char ucI2CID) -{ - struct ST_FICDB_LIST *pList; - pList = INC_GET_FICDB_LIST(); - return pList->aucEnsembleName; -} - - -/************************************************/ -/* Return the DMB Channel Information */ -/************************************************/ -struct INC_CHANNEL_INFO *INTERFACE_GETDB_DMB(short uiPos) -{ - if (uiPos >= MAX_SUBCH_SIZE) - return INC_NULL; - if (uiPos >= g_stDmbInfo.nSetCnt) - return INC_NULL; - return &g_stDmbInfo.astSubChInfo[uiPos]; -} - - -/************************************************/ -/* REturn the DAB Channel Information */ -/************************************************/ -struct INC_CHANNEL_INFO *INTERFACE_GETDB_DAB(short uiPos) -{ - if (uiPos >= MAX_SUBCH_SIZE) - return INC_NULL; - if (uiPos >= g_stDabInfo.nSetCnt) - return INC_NULL; - return &g_stDabInfo.astSubChInfo[uiPos]; -} - -/************************************************/ -/* REturn the DATA Channel Information */ -/************************************************/ -struct INC_CHANNEL_INFO *INTERFACE_GETDB_DATA(short uiPos) -{ - if (uiPos >= MAX_SUBCH_SIZE) - return INC_NULL; - if (uiPos >= g_stDataInfo.nSetCnt) - return INC_NULL; - return &g_stDataInfo.astSubChInfo[uiPos]; -} - -/* Chech the change of FIC info when watching tv */ -unsigned char INTERFACE_RECONFIG(unsigned char ucI2CID) -{ - return INC_FIC_RECONFIGURATION_HW_CHECK(ucI2CID); -} - -unsigned char INTERFACE_STATUS_CHECK(unsigned char ucI2CID) -{ - return INC_STATUS_CHECK(ucI2CID); -} - -unsigned short INTERFACE_GET_CER(unsigned char ucI2CID) -{ - return INC_GET_CER(ucI2CID); -} - -unsigned char INTERFACE_GET_SNR(unsigned char ucI2CID) -{ - return INC_GET_SNR(ucI2CID); -} - -unsigned int INTERFACE_GET_POSTBER(unsigned char ucI2CID) -{ - return INC_GET_POSTBER(ucI2CID); -} - -unsigned int INTERFACE_GET_PREBER(unsigned char ucI2CID) -{ - return INC_GET_PREBER(ucI2CID); -} - -/***************************************************/ -/* Be Called when Scan, start channel, force stop. */ -/***************************************************/ -void INTERFACE_USER_STOP(unsigned char ucI2CID) -{ - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - pInfo->ucStop = 1; -} - -void INTERFACE_USER_STOP_CLEAR(unsigned char ucI2CID) -{ - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - pInfo->ucStop = 0; -} - -/* Interrupt Enable... */ -void INTERFACE_INT_ENABLE(unsigned char ucI2CID, unsigned short unSet) -{ - INC_INTERRUPT_SET(ucI2CID, unSet); -} - -/* Use when polling mode */ -unsigned char INTERFACE_INT_CHECK(unsigned char ucI2CID) -{ - unsigned short nValue = 0; - nValue = INC_CMD_READ(ucI2CID, APB_INT_BASE + 0x01); - if (!(nValue & INC_MPI_INTERRUPT_ENABLE)) - return INC_ERROR; - - return INC_SUCCESS; -} - -/* Interrupt Clear */ -void INTERFACE_INT_CLEAR(unsigned char ucI2CID, unsigned short unClr) -{ - INC_INTERRUPT_CLEAR(ucI2CID, unClr); -} - -/* Interrupt Service Routine... // SPI Slave Mode or MPI Slave Mode */ -unsigned char INTERFACE_ISR(unsigned char ucI2CID, unsigned char *pBuff) -{ - unsigned short unDataLength; - unDataLength = INC_CMD_READ(ucI2CID, APB_MPI_BASE + 0x6); - if (unDataLength < INC_INTERRUPT_SIZE) - return INC_ERROR; - - INC_CMD_READ_BURST(ucI2CID, APB_STREAM_BASE, pBuff, - INC_INTERRUPT_SIZE); - INTERFACE_INT_CLEAR(ucI2CID, INC_MPI_INTERRUPT_ENABLE); - return INC_SUCCESS; -} diff --git a/drivers/media/tdmb/t3900/INC_PROCESS.c b/drivers/media/tdmb/t3900/INC_PROCESS.c deleted file mode 100644 index ea12eb2..0000000 --- a/drivers/media/tdmb/t3900/INC_PROCESS.c +++ /dev/null @@ -1,1893 +0,0 @@ -/***************************************************************************** - Copyright(c) 2011 I&C Inc. All Rights Reserved - - File name : INC_PROCESS.c - - Description : - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*******************************************************************************/ - -#include "INC_INCLUDES.h" -#include -#include - -static struct ST_BBPINFO g_astBBPRun[2]; -enum ENSEMBLE_BAND m_ucRfBand = KOREA_BAND_ENABLE; -enum CTRL_MODE m_ucCommandMode = INC_SPI_CTRL; -enum ST_TRANSMISSION m_ucTransMode = TRANSMISSION_MODE1; -enum UPLOAD_MODE_INFO m_ucUploadMode = STREAM_UPLOAD_SPI; -enum CLOCK_SPEED m_ucClockSpeed = INC_OUTPUT_CLOCK_4096; -enum INC_ACTIVE_MODE m_ucMPI_CS_Active = INC_ACTIVE_LOW; -enum INC_ACTIVE_MODE m_ucMPI_CLK_Active = INC_ACTIVE_HIGH; -enum PLL_MODE m_ucPLL_Mode = INPUT_CLOCK_19200KHZ; -enum INC_DPD_MODE m_ucDPD_Mode = INC_DPD_OFF; -unsigned short m_unIntCtrl = \ - (INC_INTERRUPT_POLARITY_HIGH \ - | INC_INTERRUPT_PULSE \ - |INC_INTERRUPT_AUTOCLEAR_ENABLE \ - |(INC_INTERRUPT_PULSE_COUNT & INC_INTERRUPT_PULSE_COUNT_MASK)); - -static struct INC_TDMB_MODE g_stMode; - -struct INC_TDMB_MODE *INC_GET_TDMBMODE(unsigned char ucI2CID) -{ - g_stMode.m_ucRfBand = m_ucRfBand; - g_stMode.m_ucCommandMode = m_ucCommandMode; - g_stMode.m_ucTransMode = m_ucTransMode; - g_stMode.m_ucUploadMode = m_ucUploadMode; - g_stMode.m_ucClockSpeed = m_ucClockSpeed; - g_stMode.m_ucMPI_CS_Active = m_ucMPI_CS_Active; - g_stMode.m_ucMPI_CLK_Active = m_ucMPI_CLK_Active; - g_stMode.m_ucPLL_Mode = m_ucPLL_Mode; - g_stMode.m_ucDPD_Mode = m_ucDPD_Mode; - g_stMode.m_unIntCtrl = m_unIntCtrl; - return &g_stMode; -} - -void INC_SET_TDMBMODE(unsigned char ucI2CID, struct INC_TDMB_MODE *stMode) -{ - m_ucRfBand = stMode->m_ucRfBand; - m_ucCommandMode = stMode->m_ucCommandMode; - m_ucTransMode = stMode->m_ucTransMode; - m_ucUploadMode = stMode->m_ucUploadMode; - m_ucClockSpeed = stMode->m_ucClockSpeed; - m_ucMPI_CS_Active = stMode->m_ucMPI_CS_Active; - m_ucMPI_CLK_Active = stMode->m_ucMPI_CLK_Active; - m_ucPLL_Mode = stMode->m_ucPLL_Mode; - m_ucDPD_Mode = stMode->m_ucDPD_Mode; - m_unIntCtrl = stMode->m_unIntCtrl; -} - - -unsigned char INC_CMD_WRITE(unsigned char ucI2CID, - unsigned short uiAddr, unsigned short uiData) -{ - if (m_ucCommandMode == INC_SPI_CTRL) - return INC_SPI_REG_WRITE(ucI2CID, uiAddr, uiData); - else if (m_ucCommandMode == INC_I2C_CTRL) - return INC_I2C_WRITE(ucI2CID, uiAddr, uiData); - else if (m_ucCommandMode == INC_EBI_CTRL) - return INC_EBI_WRITE(ucI2CID, uiAddr, uiData); - return INC_I2C_WRITE(ucI2CID, uiAddr, uiData); -} - -unsigned short INC_CMD_READ(unsigned char ucI2CID, unsigned short uiAddr) -{ - if (m_ucCommandMode == INC_SPI_CTRL) - return INC_SPI_REG_READ(ucI2CID, uiAddr); - else if (m_ucCommandMode == INC_I2C_CTRL) - return INC_I2C_READ(ucI2CID, uiAddr); - else if (m_ucCommandMode == INC_EBI_CTRL) - return INC_EBI_READ(ucI2CID, uiAddr); - return INC_I2C_READ(ucI2CID, uiAddr); -} - -unsigned char INC_CMD_READ_BURST(unsigned char ucI2CID, unsigned short uiAddr, - unsigned char *pData, unsigned short nSize) -{ - if (m_ucCommandMode == INC_SPI_CTRL) - return INC_SPI_READ_BURST(ucI2CID, uiAddr, pData, nSize); - else if (m_ucCommandMode == INC_I2C_CTRL) - return INC_I2C_READ_BURST(ucI2CID, uiAddr, pData, nSize); - else if (m_ucCommandMode == INC_EBI_CTRL) - return INC_EBI_READ_BURST(ucI2CID, uiAddr, pData, nSize); - return INC_I2C_READ_BURST(ucI2CID, uiAddr, pData, nSize); -} - -void INC_INIT_MPI(unsigned char ucI2CID) -{ - unsigned short uiMpiStatus, uiRsStatus; - uiRsStatus = INC_CMD_READ(ucI2CID, APB_RS_BASE + 0); - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0, 0x0000); - INC_DELAY(50); - uiMpiStatus = INC_CMD_READ(ucI2CID, APB_MPI_BASE + 0); - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0, uiMpiStatus | 0x8000); - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0, uiRsStatus | 0x8000); -} - -void INC_MPICLOCK_SET(unsigned char ucI2CID) -{ - if (m_ucUploadMode == STREAM_UPLOAD_TS) { - if (m_ucClockSpeed == INC_OUTPUT_CLOCK_1024) - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x01, 0x9918); - else if (m_ucClockSpeed == INC_OUTPUT_CLOCK_2048) - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x01, 0x440C); - else if (m_ucClockSpeed == INC_OUTPUT_CLOCK_4096) - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x01, 0x3308); - else - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x01, 0x3308); - return; - } - - if (m_ucClockSpeed == INC_OUTPUT_CLOCK_1024) - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x01, 0x9918); - else if (m_ucClockSpeed == INC_OUTPUT_CLOCK_2048) - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x01, 0x440C); - else if (m_ucClockSpeed == INC_OUTPUT_CLOCK_4096) - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x01, 0x2206); - else - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x01, 0x2206); -} - -void INC_UPLOAD_MODE(unsigned char ucI2CID) -{ - unsigned short uiStatus = 0x01; - - if (m_ucCommandMode != INC_EBI_CTRL) { - if (m_ucUploadMode == STREAM_UPLOAD_SPI) - uiStatus = 0x05; - if (m_ucUploadMode == STREAM_UPLOAD_SLAVE_PARALLEL) - uiStatus = 0x04; - if (m_ucUploadMode == STREAM_UPLOAD_TS) - uiStatus = 0x101; - if (m_ucMPI_CS_Active == INC_ACTIVE_HIGH) - uiStatus |= 0x10; - if (m_ucMPI_CLK_Active == INC_ACTIVE_HIGH) - uiStatus |= 0x20; - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x00, uiStatus); - } else { - INC_CMD_WRITE(ucI2CID, APB_I2C_BASE + 0x00, 0x0001); - INC_CMD_WRITE(ucI2CID, APB_SPI_BASE + 0x00, 0x0011); - } - - if (m_ucUploadMode == STREAM_UPLOAD_TS) { - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x02, 188); - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x03, 8); - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x04, 188); - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x05, 0); - } else { - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x02, MPI_CS_SIZE); - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x04, INC_INTERRUPT_SIZE); - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0x05, - INC_INTERRUPT_SIZE - 188); - } -} - -void INC_SWAP(struct ST_SUBCH_INFO *pMainInfo, - unsigned short nNo1, unsigned short nNo2) -{ - struct INC_CHANNEL_INFO stChInfo; - stChInfo = pMainInfo->astSubChInfo[nNo1]; - pMainInfo->astSubChInfo[nNo1] = pMainInfo->astSubChInfo[nNo2]; - pMainInfo->astSubChInfo[nNo2] = stChInfo; -} - -void INC_BUBBLE_SORT(struct ST_SUBCH_INFO *pMainInfo, enum INC_SORT_OPTION Opt) -{ - short nIndex, nLoop; - struct INC_CHANNEL_INFO *pDest; - struct INC_CHANNEL_INFO *pSour; - - if (pMainInfo->nSetCnt <= 1) - return; - - for (nIndex = 0; nIndex < pMainInfo->nSetCnt - 1; nIndex++) { - pSour = &pMainInfo->astSubChInfo[nIndex]; - - for (nLoop = nIndex + 1; nLoop < pMainInfo->nSetCnt; nLoop++) { - pDest = &pMainInfo->astSubChInfo[nLoop]; - - if (Opt == INC_SUB_CHANNEL_ID) { - if (pSour->ucSubChID > pDest->ucSubChID - && pSour->ulRFFreq == pDest->ulRFFreq) { - INC_SWAP(pMainInfo, nIndex, nLoop); - } - } else if (Opt == INC_START_ADDRESS) { - if (pSour->uiStarAddr > pDest->uiStarAddr - && pSour->ulRFFreq == pDest->ulRFFreq) - INC_SWAP(pMainInfo, nIndex, nLoop); - } else if (Opt == INC_BIRRATE) { - if (pSour->uiBitRate > pDest->uiBitRate - && pSour->ulRFFreq == pDest->ulRFFreq) - INC_SWAP(pMainInfo, nIndex, nLoop); - } else if (Opt == INC_FREQUENCY) { - if (pSour->ulRFFreq > pDest->ulRFFreq - && pSour->ulRFFreq == pDest->ulRFFreq) - INC_SWAP(pMainInfo, nIndex, nLoop); - } else { - if (pSour->uiStarAddr > pDest->uiStarAddr - && pSour->ulRFFreq == pDest->ulRFFreq) - INC_SWAP(pMainInfo, nIndex, nLoop); - } - } - } -} - -unsigned char INC_BUBBLE_SORT_by_TYPE(struct ST_SUBCH_INFO *pMainInfo) -{ - short nIndex, nLoop; - struct INC_CHANNEL_INFO *pDest; - struct INC_CHANNEL_INFO *pSour; - - if (pMainInfo->nSetCnt <= 1) - return INC_ERROR; - - for (nIndex = 0; nIndex < pMainInfo->nSetCnt - 1; nIndex++) { - if (pMainInfo->astSubChInfo[nIndex].uiTmID != TMID_1) - continue; - - pSour = &pMainInfo->astSubChInfo[nIndex]; - - for (nLoop = nIndex + 1; nLoop < pMainInfo->nSetCnt; nLoop++) { - if (pMainInfo->astSubChInfo[nLoop].uiTmID == TMID_1) - continue; - pDest = &pMainInfo->astSubChInfo[nLoop]; - INC_SWAP(pMainInfo, nIndex, nLoop); - return INC_SUCCESS; - } - } - return INC_ERROR; -} - -struct ST_BBPINFO *INC_GET_STRINFO(unsigned char ucI2CID) -{ - if (ucI2CID == TDMB_I2C_ID80) - return &g_astBBPRun[0]; - return &g_astBBPRun[1]; -} - -unsigned short INC_GET_FRAME_DURATION(enum ST_TRANSMISSION cTrnsMode) -{ - unsigned short uPeriodFrame; - switch (cTrnsMode) { - case TRANSMISSION_MODE1: - uPeriodFrame = MAX_FRAME_DURATION; - break; - case TRANSMISSION_MODE2: - case TRANSMISSION_MODE3: - uPeriodFrame = MAX_FRAME_DURATION / 4; - break; - case TRANSMISSION_MODE4: - uPeriodFrame = MAX_FRAME_DURATION / 2; - break; - default: - uPeriodFrame = MAX_FRAME_DURATION; - break; - } - return uPeriodFrame; -} - -unsigned char INC_GET_FIB_CNT(enum ST_TRANSMISSION ucMode) -{ - unsigned char ucResult = 0; - switch (ucMode) { - case TRANSMISSION_MODE1: - ucResult = 12; - break; - case TRANSMISSION_MODE2: - ucResult = 3; - break; - case TRANSMISSION_MODE3: - ucResult = 4; - break; - case TRANSMISSION_MODE4: - ucResult = 6; - break; - default: - ucResult = 12; - break; - } - return ucResult; -} - -void INC_INTERRUPT_CTRL(unsigned char ucI2CID) -{ - INC_CMD_WRITE(ucI2CID, APB_INT_BASE + 0x00, m_unIntCtrl); -} - -void INC_INTERRUPT_CLEAR(unsigned char ucI2CID, unsigned short uiClrInt) -{ - INC_CMD_WRITE(ucI2CID, APB_INT_BASE + 0x03, uiClrInt); -} - -void INC_INTERRUPT_SET(unsigned char ucI2CID, unsigned short uiSetInt) -{ - unsigned short uiIntSet; - uiIntSet = ~uiSetInt; - INC_CMD_WRITE(ucI2CID, APB_INT_BASE + 0x02, uiIntSet); -} - -unsigned char INC_CHIP_STATUS(unsigned char ucI2CID) -{ - unsigned short uiChipID; - uiChipID = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x10) & 0xF00; - if (uiChipID != 0xD00 && uiChipID != 0xC00) { - printk(KERN_DEBUG"[TDMB_3900] Chip ID Error : 0x%X\r\n", - uiChipID); - return INC_ERROR; - } - printk(KERN_DEBUG"[TDMB_T3900] Chip ID good : 0x%X\r\n", uiChipID); - return INC_SUCCESS; -} - -unsigned char INC_PLL_SET(unsigned char ucI2CID) -{ - unsigned short wData; - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - - wData = INC_CMD_READ(ucI2CID, APB_GEN_BASE + 0x02) & 0xFE00; - - switch (m_ucPLL_Mode) { - case INPUT_CLOCK_24576KHZ: - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x00, 0x0000); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x06, 0x0002); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x21, 0x3FFF); - break; - - case INPUT_CLOCK_27000KHZ: - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x02, wData | 0x41BE); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x03, 0x310A); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x00, 0x7FFF); - break; - - case INPUT_CLOCK_19200KHZ: - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x01, 0x0003); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x02, 0x0086); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x03, 0x0066); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x04, 0x6666); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x05, 0x0075); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x06, 0x0000); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x07, 0x0000); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x00, 0x0001); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x21, 0x3FFF); - break; - - case INPUT_CLOCK_27120KHZ: - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x01, 0x0001); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x02, 0x001F); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x03, 0x00B7); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x04, 0x8122); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x05, 0x0075); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x06, 0x0000); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x07, 0x0000); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x00, 0x0001); - break; - - case INPUT_CLOCK_12000KHZ: - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x02, wData | 0x4200); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x03, 0x190A); - INC_CMD_WRITE(ucI2CID, APB_GEN_BASE + 0x00, 0x7FFF); - break; - } - - if (m_ucPLL_Mode == INPUT_CLOCK_24576KHZ) - return INC_SUCCESS; - INC_DELAY(10); - - if (!(INC_CMD_READ(ucI2CID, APB_GEN_BASE + 0x09) & 0x0001)) { - pInfo->nBbpStatus = ERROR_PLL; - return INC_ERROR; - } - - return INC_SUCCESS; -} - -void INC_SET_CHANNEL(unsigned char ucI2CID, struct ST_SUBCH_INFO *pMultiInfo) -{ - struct INC_CHANNEL_INFO *pChInfo; - unsigned short uiLoop, wData; - enum INC_CTRL wDmbMode; - -#ifdef INC_MULTI_HEADER_ENABLE - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x00, 0x800); -#endif - - for (uiLoop = 0; uiLoop < pMultiInfo->nSetCnt; uiLoop++) { - pChInfo = &pMultiInfo->astSubChInfo[uiLoop]; - wDmbMode = (pChInfo->ucServiceType == 0x18) ? INC_DMB : INC_DAB; - wData = - INC_CMD_READ(ucI2CID, - APB_VTB_BASE + 0x01) & (~(0x3 << uiLoop * 2)); - - if (wDmbMode == INC_DMB) - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x01, - wData | 0x02 << (uiLoop * 2)); - else - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x01, - wData | 0x01 << (uiLoop * 2)); - - wData = INC_CMD_READ(ucI2CID, APB_RS_BASE + 0x00); - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x00, - wData | (0x40 >> uiLoop)); - } - - wData = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x00); - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x00, wData | 0x0001); - - wData = INC_CMD_READ(ucI2CID, APB_RS_BASE + 0x00); -#ifdef INC_MULTI_CHANNEL_FIC_UPLOAD - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x00, wData | 0x8080); -#else - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x00, wData | 0x8000); -#endif -} - -unsigned char INC_INIT(unsigned char ucI2CID) -{ - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - memset(pInfo, 0, sizeof(struct ST_BBPINFO)); - - if (m_ucTransMode < TRANSMISSION_MODE1 - || m_ucTransMode > TRANSMISSION_AUTOFAST) - return INC_ERROR; - - pInfo->ucTransMode = m_ucTransMode; - - if (INC_PLL_SET(ucI2CID) != INC_SUCCESS) { - printk(KERN_DEBUG"[TDMB_T3900] INC_INIT\n"); - return INC_ERROR; - } - - if (INC_CHIP_STATUS(ucI2CID) != INC_SUCCESS) { - printk(KERN_DEBUG"[TDMB_T3900] INC_CHIP_STATUS\n"); - return INC_ERROR; - } - - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x3B, 0xFFFF); - INC_DELAY(10); - - INC_INTERRUPT_CTRL(ucI2CID); - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x00, 0x8000); - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x01, 0x01C1); - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x05, 0x0008); - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x01, TS_ERR_THRESHOLD); - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x09, 0x000C); - - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x00, 0xF0FF); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x88, 0x2210); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x98, 0x0000); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x41, 0x0CCC); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xB0, 0x8320); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xB4, 0x4C01); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xBC, 0x4088); - - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x40, 0xD05C); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x8C, 0x0183); - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x0A, 0x80F0); - - INC_CMD_WRITE(ucI2CID, APB_DEINT_BASE + 0x01, 0x0001); - switch (m_ucTransMode) { - case TRANSMISSION_AUTO: - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x98, 0x8000); - break; - - case TRANSMISSION_AUTOFAST: - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x98, 0xC000); - break; - - case TRANSMISSION_MODE1: - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xD0, 0x7F1F); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x80, 0x4082); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x90, 0x0430); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xC8, 0x3F31); - break; - - case TRANSMISSION_MODE2: - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xD0, 0x1F07); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x80, 0x4182); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x90, 0x0415); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xC8, 0x1F31); - break; - - case TRANSMISSION_MODE3: - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xD0, 0x0F03); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x80, 0x4282); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x90, 0x0408); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xC8, 0x0331); - break; - - case TRANSMISSION_MODE4: - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xD0, 0x3F0F); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x80, 0x4382); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x90, 0x0420); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xC8, 0x3F31); - break; - } - - INC_MPICLOCK_SET(ucI2CID); - INC_UPLOAD_MODE(ucI2CID); - - switch (m_ucRfBand) { - case KOREA_BAND_ENABLE: - INC_READY(ucI2CID, 175280); - break; - case BANDIII_ENABLE: - INC_READY(ucI2CID, 174928); - break; - case LBAND_ENABLE: - INC_READY(ucI2CID, 1452960); - break; - case CHINA_ENABLE: - INC_READY(ucI2CID, 168160); - break; - case ROAMING_ENABLE: - INC_READY(ucI2CID, 217280); - break; - case EXTERNAL_ENABLE: - break; - } - - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0x0F, 0x40); - if (m_ucPLL_Mode == INPUT_CLOCK_19200KHZ) - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0x10, 0x6A); - if (m_ucPLL_Mode == INPUT_CLOCK_24576KHZ) - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0x10, 0x88); - if (m_ucPLL_Mode == INPUT_CLOCK_27000KHZ) - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0x10, 0x96); - if (m_ucPLL_Mode == INPUT_CLOCK_27120KHZ) - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0x10, 0x96); - - INC_DELAY(100); - printk(KERN_DEBUG"[TDMB_T3900] INC_INIT START GOOD\n"); - return INC_SUCCESS; -} - -unsigned char INC_READY(unsigned char ucI2CID, unsigned int ulFreq) -{ - unsigned short uStatus = 0; - unsigned char bModeFlag = 0; - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - - if (ulFreq == 189008 || ulFreq == 196736 || ulFreq == 205280 - || ulFreq == 213008 || ulFreq == 180064 || ulFreq == 188928 - || ulFreq == 195936 || ulFreq == 204640 || ulFreq == 213360 - || ulFreq == 220352 || ulFreq == 222064 || ulFreq == 229072 - || ulFreq == 237488 || ulFreq == 180144 || ulFreq == 196144 - || ulFreq == 205296 || ulFreq == 212144 || ulFreq == 213856 - || ulFreq == 1466656 || ulFreq == 1475216 || ulFreq == 1482064 - || ulFreq == 1490624) { - bModeFlag = 1; - } - if (m_ucRfBand == ROAMING_ENABLE) - bModeFlag = 1; - - if (bModeFlag) { - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0xC6); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xC6, uStatus | 0x0008); - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x41) & 0xFC00; - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x41, uStatus | 0x111); - } else { - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0xC6); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xC6, uStatus & 0xFFF7); - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x41) & 0xFC00; - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x41, uStatus | 0xCC); - - if (ulFreq == 1461520 || ulFreq == 1463232 || ulFreq == 1475216 - || ulFreq == 1485488) { - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x40); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x40, - uStatus | (1 << 10)); - } else { - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x40); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x40, - uStatus & ~(1 << 10)); - } - } - - if (INC_RF500_START(ucI2CID, ulFreq, m_ucRfBand, m_ucPLL_Mode) - != INC_SUCCESS) { - pInfo->nBbpStatus = ERROR_READY; - return INC_ERROR; - } - - if (m_ucDPD_Mode == INC_DPD_OFF) { - uStatus = INC_CMD_READ(ucI2CID, APB_RF_BASE + 0x03); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0x03, uStatus | 0x80); - } - - return INC_SUCCESS; -} - -unsigned char INC_SYNCDETECTOR(unsigned char ucI2CID, unsigned int ulFreq, - unsigned char ucScanMode) -{ - unsigned short wOperState, wIsNullSync = 0, wSyncRefTime = 800; - unsigned short uiTimeOutCnt = 0, uiRefSleep = 30; - struct ST_BBPINFO *pInfo; - unsigned short awData[2], uiRfNullTime = 240, wFftCnt = 0; - - pInfo = INC_GET_STRINFO(ucI2CID); - INC_SCAN_SETTING(ucI2CID); - if (m_ucDPD_Mode == INC_DPD_ON) { - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xA8, 0x3000); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xAA, 0x0000); - } - - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xBC, 0x4088); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x3A, 0x1); - INC_DELAY(200); - while (1) { - if (pInfo->ucStop) { - pInfo->nBbpStatus = ERROR_USER_STOP; - break; - } - - INC_DELAY(uiRefSleep); - - wOperState = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x10); - wOperState = ((wOperState & 0x7000) >> 12); - - if (!wIsNullSync && wOperState >= 0x2) - wIsNullSync = 1; - - if (!wIsNullSync && wSyncRefTime != 1500) { - awData[0] = - INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x14) & 0x0F00; - awData[1] = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x16); - - if (!awData[0] || !awData[1]) { - pInfo->nBbpStatus = ERROR_SYNC_NO_SIGNAL; - printk(KERN_DEBUG"TDMB Point 1\n"); - break; - } else if (awData[0] <= 0x200 && awData[1] <= 0x4000) { - pInfo->nBbpStatus = ERROR_SYNC_NO_SIGNAL; - printk(KERN_DEBUG"TDMB Point 2\n"); - break; - } else if (awData[0] >= 0x300) { - if (++wFftCnt >= (uiRfNullTime / uiRefSleep)) { - pInfo->nBbpStatus = - ERROR_SYNC_NO_SIGNAL; - printk(KERN_DEBUG"TDMB Point 3\n"); - break; - } else if (awData[1] <= 0x4000) { - if (++wFftCnt >= - (uiRfNullTime / uiRefSleep)) { - pInfo->nBbpStatus = - ERROR_SYNC_NO_SIGNAL; - printk(KERN_DEBUG"TDMB Point 4\n"); - break; - } - } - } - } - - if (wOperState >= 0x5) { - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xBC, 0x4008); - return INC_SUCCESS; - } - - uiTimeOutCnt++; - if (uiTimeOutCnt >= (2500 / uiRefSleep)) { - pInfo->nBbpStatus = ERROR_SYNC_TIMEOUT; - break; - } - } - - return INC_ERROR; -} - -void FILE_SAVE_FUNCTION(char *fname, unsigned char *pData, - unsigned long dwDataSize) -{ -#define DUMP_FILE_NAME "/data/ts_data.ts" - mm_segment_t oldfs; - int ret; - static struct file *fp_ts_data; - - if (fp_ts_data == NULL) { - fp_ts_data = filp_open(DUMP_FILE_NAME, O_APPEND | O_CREAT, 0); - if (fp_ts_data == NULL) { - printk(KERN_DEBUG"file open error!\n"); - return; - } - } - - oldfs = get_fs(); - set_fs(KERNEL_DS); - - if (fp_ts_data != NULL && dwDataSize == 0) { - filp_close(fp_ts_data, current->files); - fp_ts_data = NULL; - return; - } - ret = fp_ts_data->f_op->write(fp_ts_data, - pData, dwDataSize, &fp_ts_data->f_pos); - set_fs(oldfs); -} - -unsigned char INC_FICDECODER(unsigned char ucI2CID, - enum ST_SIMPLE_FIC bSimpleFIC) -{ - unsigned short wFicLen, uPeriodFrame, uFIBCnt, uiRefSleep; - unsigned short nLoop, nFicCnt; - unsigned char abyBuff[MAX_FIC_SIZE]; - struct ST_BBPINFO *pInfo; - -#ifdef USER_APPLICATION_TYPE - unsigned char ucIsUserApp = INC_ERROR; - struct ST_FICDB_LIST *pList; - unsigned char ucTimeOutCnt = 0; - pList = INC_GET_FICDB_LIST(); -#endif - - pInfo = INC_GET_STRINFO(ucI2CID); - - INC_INITDB(ucI2CID); - uFIBCnt = INC_GET_FIB_CNT(m_ucTransMode); - uPeriodFrame = INC_GET_FRAME_DURATION(m_ucTransMode); - uiRefSleep = uPeriodFrame >> 2; - nFicCnt = FIC_REF_TIME_OUT / uiRefSleep; - -#ifdef USER_APPLICATION_TYPE - nFicCnt = (FIC_REF_TIME_OUT + 1000) / uiRefSleep; -#endif - - for (nLoop = 0; nLoop < nFicCnt; nLoop++) { - if (pInfo->ucStop == 1) { - pInfo->nBbpStatus = ERROR_USER_STOP; - break; - } - - INC_DELAY(uiRefSleep); - - if (!(INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x00) & 0x4000)) - continue; - - wFicLen = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x09); - if (!wFicLen) - continue; - wFicLen++; - - if (wFicLen != (uFIBCnt * FIB_SIZE)) - continue; - INC_CMD_READ_BURST(ucI2CID, APB_FIC_BASE, abyBuff, wFicLen); - if (INC_FICPARSING(ucI2CID, abyBuff, wFicLen, bSimpleFIC)) { - if (bSimpleFIC == SIMPLE_FIC_ENABLE) - return INC_SUCCESS; - -#ifdef USER_APPLICATION_TYPE - ucTimeOutCnt++; - - if (ucTimeOutCnt >= 10 && pList->nPacketCnt - && (pList->nPacketCnt == pList->nUserAppCnt)) { - return INC_SUCCESS; - } - ucIsUserApp = INC_SUCCESS; -#else - - return INC_SUCCESS; -#endif - } - } - -#ifdef USER_APPLICATION_TYPE - if (ucIsUserApp == INC_SUCCESS) - return INC_SUCCESS; -#endif - pInfo->nBbpStatus = ERROR_FICDECODER; - - return INC_ERROR; -} - -unsigned char INC_START(unsigned char ucI2CID, struct ST_SUBCH_INFO *pChInfo, - unsigned short IsEnsembleSame) -{ - short nLoop, nSchID; - unsigned short wData; - struct ST_BBPINFO *pInfo; - struct INC_CHANNEL_INFO *pTempChInfo; - - unsigned short wCeil = 0, wIndex = 0, wStartAddr, wEndAddr; - - pInfo = INC_GET_STRINFO(ucI2CID); - INC_BUBBLE_SORT(pChInfo, INC_START_ADDRESS); - - INC_CMD_WRITE(ucI2CID, APB_DEINT_BASE + 0x01, 0x0000); - wData = INC_CMD_READ(ucI2CID, APB_MPI_BASE + 0); - INC_CMD_WRITE(ucI2CID, APB_MPI_BASE + 0, 0x8000 | wData); - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x00, 0x0000); - - for (nLoop = 0; nLoop < 3; nLoop++) { - if (nLoop >= pChInfo->nSetCnt) { - INC_CMD_WRITE(ucI2CID, - APB_DEINT_BASE + 0x02 + (nLoop * 2), - 0x00); - INC_CMD_WRITE(ucI2CID, - APB_DEINT_BASE + 0x03 + (nLoop * 2), - 0x00); - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x02 + nLoop, - 0x00); - continue; - } - pTempChInfo = &pChInfo->astSubChInfo[nLoop]; - - nSchID = (unsigned short) pTempChInfo->ucSubChID & 0x3f; - INC_CMD_WRITE(ucI2CID, APB_DEINT_BASE + 0x02 + (nLoop * 2), - (unsigned short) (((unsigned short) nSchID << 10) + - pTempChInfo->uiStarAddr)); - - if (pTempChInfo->ucSlFlag == 0) { - INC_CMD_WRITE(ucI2CID, - APB_DEINT_BASE + 0x03 + (nLoop * 2), - 0x8000 + - (pTempChInfo->ucTableIndex & 0x3f)); - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x02 + nLoop, - (pTempChInfo->ucTableIndex & 0x3f)); - } else { - INC_CMD_WRITE(ucI2CID, - APB_DEINT_BASE + 0x03 + (nLoop * 2), - 0x8000 + 0x400 + pTempChInfo->uiSchSize); - wData = 0x8000 + ((pTempChInfo->ucOption & 0x7) << 12) - + ((pTempChInfo->ucProtectionLevel & 0x3) << 10) - + pTempChInfo->uiDifferentRate; - INC_CMD_WRITE(ucI2CID, APB_VTB_BASE + 0x02 + nLoop, - wData); - } - - if (m_ucDPD_Mode == INC_DPD_ON) { - switch (pInfo->ucTransMode) { - case TRANSMISSION_MODE1: - wCeil = 3072; - wIndex = 4; - break; - case TRANSMISSION_MODE2: - wCeil = 768; - wIndex = 4; - break; - case TRANSMISSION_MODE3: - wCeil = 384; - wIndex = 9; - break; - case TRANSMISSION_MODE4: - wCeil = 1536; - wIndex = 4; - break; - default: - wCeil = 3072; - break; - } - - wStartAddr = - ((pTempChInfo->uiStarAddr * 64) / wCeil) + wIndex - - 0; - wEndAddr = - (unsigned short) (((pTempChInfo->uiStarAddr + - pTempChInfo->uiSchSize) * 64) / - wCeil) + wIndex + 1; - wData = (wStartAddr & 0xFF) << 8 | (wEndAddr & 0xFF); - - INC_CMD_WRITE(ucI2CID, - APB_PHY_BASE + 0xAA + (nLoop * 2), wData); - wData = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0xA8); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xA8, - wData | (1 << nLoop)); - } else { - INC_CMD_WRITE(ucI2CID, - APB_PHY_BASE + 0xAA + (nLoop * 2), - 0x0000); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0xA8, 0x3000); - } - - wData = INC_CMD_READ(ucI2CID, APB_RS_BASE + 0x00); - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x00, - wData | (0x1 << (6 - nLoop))); - } - - INC_SET_CHANNEL(ucI2CID, pChInfo); - INC_CMD_WRITE(ucI2CID, APB_DEINT_BASE + 0x0, 0x0001); - INC_CMD_WRITE(ucI2CID, APB_DEINT_BASE + 0x1, 0x0001); - - return INC_SUCCESS; -} - -unsigned char INC_STOP(unsigned char ucI2CID) -{ - short nLoop; - unsigned short uStatus; - enum ST_TRANSMISSION ucTransMode; - struct ST_BBPINFO *pInfo; - - pInfo = INC_GET_STRINFO(ucI2CID); - ucTransMode = pInfo->ucTransMode; - memset(pInfo, 0, sizeof(struct ST_BBPINFO)); - pInfo->ucTransMode = ucTransMode; - - INC_CMD_WRITE(ucI2CID, APB_RS_BASE + 0x00, 0x0000); - - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x10) & 0x7000; - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x3B, 0x4000); - - INC_DELAY(25); - - for (nLoop = 0; nLoop < 10; nLoop++) { - INC_DELAY(2); - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x3B) & 0xFFFF; - if (uStatus == 0x8000) - break; - } - - if (nLoop >= 10) { - pInfo->nBbpStatus = ERROR_STOP; - return INC_ERROR; - } - - return INC_SUCCESS; -} - -void INC_SCAN_SETTING(unsigned char ucI2CID) -{ - unsigned short uStatus; - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x41) & 0xFFF; - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x41, uStatus | 0xC000); - - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB6, T3900_SCAN_IF_DELAY & 0xff); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB5, - (T3900_SCAN_IF_DELAY >> 8) & 0xff); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB4, - (T3900_SCAN_IF_DELAY >> 16) & 0xff); - - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB3, T3900_SCAN_RF_DELAY & 0xff); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB2, - (T3900_SCAN_RF_DELAY >> 8) & 0xff); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB1, - (T3900_SCAN_RF_DELAY >> 16) & 0xff); -} - -void INC_AIRPLAY_SETTING(unsigned char ucI2CID) -{ - unsigned short uStatus; - uStatus = INC_CMD_READ(ucI2CID, APB_PHY_BASE + 0x41) & 0xFFF; - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x41, uStatus | 0x4000); - - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB6, T3900_PLAY_IF_DELAY & 0xff); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB5, - (T3900_PLAY_IF_DELAY >> 8) & 0xff); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB4, - (T3900_PLAY_IF_DELAY >> 16) & 0xff); - - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB3, T3900_PLAY_RF_DELAY & 0xff); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB2, - (T3900_PLAY_RF_DELAY >> 8) & 0xff); - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + 0xB1, - (T3900_PLAY_RF_DELAY >> 16) & 0xff); -} - -unsigned char INC_CHANNEL_START(unsigned char ucI2CID, - struct ST_SUBCH_INFO *pChInfo) -{ - unsigned short wEnsemble; - unsigned int ulRFFreq; - struct ST_BBPINFO *pInfo; - - INC_INTERRUPT_SET(ucI2CID, INC_MPI_INTERRUPT_ENABLE); - INC_INTERRUPT_CLEAR(ucI2CID, INC_MPI_INTERRUPT_ENABLE); - pInfo = INC_GET_STRINFO(ucI2CID); - - pInfo->ucStop = 0; - pInfo->nBbpStatus = ERROR_NON; - ulRFFreq = pChInfo->astSubChInfo[0].ulRFFreq; - wEnsemble = pInfo->ulFreq == ulRFFreq; - - printk - (KERN_DEBUG"=== T3900 INC_CHANNEL_START ===\r\n"); - printk - (KERN_DEBUG"== :: Frequency %6d[Khz] ==\r\n", - pChInfo->astSubChInfo[0].ulRFFreq); - printk - (KERN_DEBUG"== :: stChInfo.ucSubChID 0x%.4X ==\r\n", - pChInfo->astSubChInfo[0].ucSubChID); - printk - (KERN_DEBUG"== :: stChInfo.ucServiceType 0x%.4X ==\r\n", - pChInfo->astSubChInfo[0].ucServiceType); - printk - (KERN_DEBUG"======================================\r\n"); - - if (!wEnsemble) { - if (INC_STOP(ucI2CID) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG" T3900 INC_STOP GOOD \r\n"); - if (INC_READY(ucI2CID, ulRFFreq) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG" T3900 INC_READY GOOD \r\n"); - if (INC_SYNCDETECTOR(ucI2CID, ulRFFreq, 0) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG" T3900 INC_SYNCDETECTOR GOOD \r\n"); - if (INC_FICDECODER(ucI2CID, SIMPLE_FIC_ENABLE) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG" T3900 INC_FICDECODER GOOD \r\n"); - if (INC_FIC_UPDATE(ucI2CID, pChInfo, SIMPLE_FIC_ENABLE) != - INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG" T3900 INC_FIC_UPDATE GOOD \r\n"); - if (INC_START(ucI2CID, pChInfo, wEnsemble) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG" T3900 INC_START GOOD \r\n"); - } else { - if (INC_SYNCDETECTOR(ucI2CID, ulRFFreq, 0) != INC_SUCCESS) { - pInfo->ulFreq = 0; - return INC_ERROR; - } - printk(KERN_DEBUG" T3900 INC_SYNCDETECTOR GOOD \r\n"); - if (INC_FIC_UPDATE(ucI2CID, pChInfo, SIMPLE_FIC_ENABLE) != - INC_SUCCESS) - return INC_ERROR; - - printk(KERN_DEBUG"T3900 INC_FIC_UPDATE GOOD \r\n"); - if (INC_START(ucI2CID, pChInfo, wEnsemble) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG"T3900 INC_START GOOD \r\n"); - } - - INC_AIRPLAY_SETTING(ucI2CID); - - pInfo->ucProtectionLevel = pChInfo->astSubChInfo[0].ucProtectionLevel; - pInfo->ulFreq = ulRFFreq; - return INC_SUCCESS; -} - -unsigned char INC_CHANNEL_START_TEST(unsigned char ucI2CID, - struct ST_SUBCH_INFO *pChInfo) -{ - unsigned short wEnsemble; - unsigned int ulRFFreq; - struct ST_BBPINFO *pInfo; - - INC_INTERRUPT_SET(ucI2CID, INC_MPI_INTERRUPT_ENABLE); - INC_INTERRUPT_CLEAR(ucI2CID, INC_MPI_INTERRUPT_ENABLE); - pInfo = INC_GET_STRINFO(ucI2CID); - - pInfo->ucStop = 0; - pInfo->nBbpStatus = ERROR_NON; - ulRFFreq = pChInfo->astSubChInfo[0].ulRFFreq; - - wEnsemble = pInfo->ulFreq == ulRFFreq; - - INC_MSG_PRINTF(1, - "================= T3900 INC_CHANNEL_START_TEST =================\r\n"); - INC_MSG_PRINTF(1, - "== :: Frequency %6d[Khz] ==\r\n", - pChInfo->astSubChInfo[0].ulRFFreq); - INC_MSG_PRINTF(1, - "== :: stChInfo.ucSubChID 0x%.4X ==\r\n", - pChInfo->astSubChInfo[0].ucSubChID); - INC_MSG_PRINTF(1, - "== :: stChInfo.ucServiceType 0x%.4X ==\r\n", - pChInfo->astSubChInfo[0].ucServiceType); - INC_MSG_PRINTF(1, - "===========================================================\r\n"); - - if (!wEnsemble) { - if (INC_STOP(ucI2CID) != INC_SUCCESS) - return INC_ERROR; - INC_MSG_PRINTF(1, " T3900 INC_STOP GOOD \r\n"); - if (INC_READY(ucI2CID, ulRFFreq) != INC_SUCCESS) - return INC_ERROR; - INC_MSG_PRINTF(1, " T3900 INC_READY GOOD \r\n"); - if (INC_SYNCDETECTOR(ucI2CID, ulRFFreq, 0) != INC_SUCCESS) - return INC_ERROR; - INC_MSG_PRINTF(1, " T3900 INC_SYNCDETECTOR GOOD \r\n"); - if (INC_FICDECODER(ucI2CID, SIMPLE_FIC_DISABLE) != INC_SUCCESS) - return INC_ERROR; - INC_MSG_PRINTF(1, " T3900 INC_FICDECODER GOOD \r\n"); - if (INC_FIC_UPDATE(ucI2CID, pChInfo, SIMPLE_FIC_ENABLE) != - INC_SUCCESS) - return INC_ERROR; - INC_MSG_PRINTF(1, " T3900 INC_FIC_UPDATE GOOD \r\n"); - if (INC_START(ucI2CID, pChInfo, wEnsemble) != INC_SUCCESS) - return INC_ERROR; - INC_MSG_PRINTF(1, " T3900 INC_START GOOD \r\n"); - } else { - - if (INC_SYNCDETECTOR(ucI2CID, ulRFFreq, 0) != INC_SUCCESS) { - pInfo->ulFreq = 0; - return INC_ERROR; - } - INC_MSG_PRINTF(1, " T3900 INC_SYNCDETECTOR GOOD \r\n"); - if (INC_FIC_UPDATE(ucI2CID, pChInfo, SIMPLE_FIC_ENABLE) != - INC_SUCCESS) - return INC_ERROR; - INC_MSG_PRINTF(1, " T3900 INC_FIC_UPDATE GOOD \r\n"); - if (INC_START(ucI2CID, pChInfo, wEnsemble) != INC_SUCCESS) - return INC_ERROR; - INC_MSG_PRINTF(1, " T3900 INC_START GOOD \r\n"); - } - - INC_AIRPLAY_SETTING(ucI2CID); - - pInfo->ucProtectionLevel = pChInfo->astSubChInfo[0].ucProtectionLevel; - pInfo->ulFreq = ulRFFreq; - return INC_SUCCESS; -} - -unsigned char INC_ENSEMBLE_SCAN(unsigned char ucI2CID, unsigned int ulFreq) -{ - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - pInfo->nBbpStatus = ERROR_NON; - pInfo->ucStop = 0; - - printk(KERN_DEBUG"[TDMB_T3900] INC_ENSEMBLE_SCAN (%d)\n", ulFreq); - - if (INC_STOP(ucI2CID) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG"[TDMB_T3900] INC_STOP GOOD\n"); - - if (INC_READY(ucI2CID, ulFreq) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG"[TDMB_T3900] INC_READY GOOD\n"); - - if (INC_SYNCDETECTOR(ucI2CID, ulFreq, 1) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG" [TDMB_T3900]INC_SYNCDETECTOR GOOD\n"); - - if (INC_FICDECODER(ucI2CID, SIMPLE_FIC_DISABLE) != INC_SUCCESS) - return INC_ERROR; - printk(KERN_DEBUG"[TDMB_T3900]INC_FICDECODER GOOD\n"); - - return INC_SUCCESS; -} - -unsigned char INC_FIC_RECONFIGURATION_HW_CHECK(unsigned char ucI2CID) -{ - unsigned short wStatus, uiFicLen, wReconf; - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - - wStatus = (unsigned short) INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x00); - if (!(wStatus & 0x4000)) - return INC_ERROR; - uiFicLen = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x09) + 1; - - if (uiFicLen != MAX_FIC_SIZE) - return INC_ERROR; - wReconf = (unsigned short) INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x0A); - - if (wReconf & 0xC0) { - pInfo->ulReConfigTime = - (unsigned short) (INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x0B) & - 0xff) * 24; - return INC_SUCCESS; - } - return INC_ERROR; -} - -unsigned char INC_RE_SYNC(unsigned char ucI2CID) -{ - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x3B, 0x4000); - INC_DELAY(24); - INC_CMD_WRITE(ucI2CID, APB_PHY_BASE + 0x3A, 0x1); - - printk(KERN_DEBUG"[T3900]INC_RE_SYNC\n"); - return INC_SUCCESS; -} - -unsigned short INC_RESYNC_CER(unsigned char ucI2CID) -{ - unsigned short uiVtbErr, unCER; - unsigned short uiVtbData; - - uiVtbErr = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x06); - uiVtbData = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x08); - unCER = - (!uiVtbData) ? 0 : (unsigned short) ((unsigned int) (uiVtbErr * 10000) / - (uiVtbData * 64)); - if (uiVtbErr == 0) - unCER = 2000; - - printk(KERN_DEBUG"[T3900]INC_RESYNC_CER : %d\n", unCER); - return unCER; -} - -unsigned char INC_STATUS_CHECK(unsigned char ucI2CID) -{ - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - - if (INC_RESYNC_CER(ucI2CID) >= 1200) - pInfo->ucCERCnt++; - else - pInfo->ucCERCnt = 0; - - if (pInfo->ucCERCnt >= INC_CER_PERIOD) { - INC_RE_SYNC(ucI2CID); - pInfo->ucCERCnt = 0; - return INC_ERROR; - } - - return INC_SUCCESS; -} - -unsigned short INC_GET_CER(unsigned char ucI2CID) -{ - short nBER, nLoop; - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - - if (pInfo->ucProtectionLevel == 0) - nBER = - (short) ((int) - INC_CMD_READ(ucI2CID, - APB_VTB_BASE + 0x07) * 77 / 100); - else - nBER = (short) INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x07); - if (nBER == 0) - nBER = 2000; - - if (nBER <= BER_REF_VALUE) - pInfo->auiANTBuff[pInfo->uiInCAntTick++ % BER_BUFFER_MAX] = 0; - else - pInfo->auiANTBuff[pInfo->uiInCAntTick++ % BER_BUFFER_MAX] = - (nBER - BER_REF_VALUE); - - for (nLoop = 0, pInfo->uiInCERAvg = 0; nLoop < BER_BUFFER_MAX; nLoop++) - pInfo->uiInCERAvg += pInfo->auiANTBuff[nLoop]; - - pInfo->uiInCERAvg /= BER_BUFFER_MAX; - - pInfo->uiCER = pInfo->uiInCERAvg; - return pInfo->uiCER; -} - -unsigned char INC_GET_ANT_LEVEL(unsigned char ucI2CID) -{ - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - INC_GET_SNR(ucI2CID); - - if (pInfo->ucSnr > 16) - pInfo->ucAntLevel = 6; - else if (pInfo->ucSnr > 13) - pInfo->ucAntLevel = 5; - else if (pInfo->ucSnr > 10) - pInfo->ucAntLevel = 4; - else if (pInfo->ucSnr > 7) - pInfo->ucAntLevel = 3; - else if (pInfo->ucSnr > 5) - pInfo->ucAntLevel = 2; - else if (pInfo->ucSnr > 3) - pInfo->ucAntLevel = 1; - else - pInfo->ucAntLevel = 0; - - return pInfo->ucAntLevel; -} - -unsigned int INC_GET_PREBER(unsigned char ucI2CID) -{ - unsigned short uiVtbErr; - unsigned int uiVtbData; - unsigned int uiPreBER; - - uiVtbErr = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x06); - uiVtbData = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x08); - - uiPreBER = - (!uiVtbData) ? 0 : ((unsigned int) uiVtbErr / (uiVtbData * 64)); - - return uiPreBER; -} - -unsigned int INC_GET_POSTBER(unsigned char ucI2CID) -{ - unsigned short uiRSErrBit; - unsigned short uiRSErrTS; - unsigned short uiError, uiRef; - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - - uiRSErrBit = INC_CMD_READ(ucI2CID, APB_RS_BASE + 0x02); - uiRSErrTS = INC_CMD_READ(ucI2CID, APB_RS_BASE + 0x03); - uiRSErrBit += (uiRSErrTS * 8); - - if (uiRSErrTS == 0) { - uiError = ((uiRSErrBit * 50) / 1000); - uiRef = 0; - if (uiError > 50) - uiError = 50; - } else if ((uiRSErrTS > 0) && (uiRSErrTS < 10)) { - uiError = ((uiRSErrBit * 10) / 2400); - uiRef = 50; - if (uiError > 50) - uiError = 50; - } else if ((uiRSErrTS >= 10) && (uiRSErrTS < 30)) { - uiError = ((uiRSErrBit * 10) / 2400); - uiRef = 60; - if (uiError > 40) - uiError = 40; - } else if ((uiRSErrTS >= 30) && (uiRSErrTS < 80)) { - uiError = ((uiRSErrBit * 10) / 2400); - uiRef = 70; - if (uiError > 30) - uiError = 30; - } else if ((uiRSErrTS >= 80) && (uiRSErrTS < 100)) { - uiError = ((uiRSErrBit * 10) / 2400); - uiRef = 80; - if (uiError > 20) - uiError = 20; - } else { - uiError = ((uiRSErrBit * 10) / 2400); - uiRef = 90; - if (uiError > 10) - uiError = 10; - } - - pInfo->ucVber = 100 - (uiError + uiRef); - pInfo->uiPostBER = (unsigned int) uiRSErrTS / TS_ERR_THRESHOLD; - - return pInfo->uiPostBER; -} - -unsigned char INC_GET_SNR(unsigned char ucI2CID) -{ - unsigned short uiFftVal; - struct ST_BBPINFO *pInfo; - pInfo = INC_GET_STRINFO(ucI2CID); - uiFftVal = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x07); - - if (uiFftVal == 0) - pInfo->ucSnr = 0; - else if (uiFftVal < 11) - pInfo->ucSnr = 20; - else if (uiFftVal < 15) - pInfo->ucSnr = 19; - else if (uiFftVal < 20) - pInfo->ucSnr = 18; - else if (uiFftVal < 30) - pInfo->ucSnr = 17; - else if (uiFftVal < 45) - pInfo->ucSnr = 16; - else if (uiFftVal < 60) - pInfo->ucSnr = 15; - else if (uiFftVal < 75) - pInfo->ucSnr = 14; - else if (uiFftVal < 90) - pInfo->ucSnr = 13; - else if (uiFftVal < 110) - pInfo->ucSnr = 12; - else if (uiFftVal < 130) - pInfo->ucSnr = 11; - else if (uiFftVal < 150) - pInfo->ucSnr = 10; - else if (uiFftVal < 200) - pInfo->ucSnr = 9; - else if (uiFftVal < 300) - pInfo->ucSnr = 8; - else if (uiFftVal < 400) - pInfo->ucSnr = 7; - else if (uiFftVal < 500) - pInfo->ucSnr = 6; - else if (uiFftVal < 600) - pInfo->ucSnr = 5; - else if (uiFftVal < 700) - pInfo->ucSnr = 4; - else if (uiFftVal < 800) - pInfo->ucSnr = 3; - else if (uiFftVal < 900) - pInfo->ucSnr = 2; - else if (uiFftVal < 1000) - pInfo->ucSnr = 1; - else - pInfo->ucSnr = 0; - - return pInfo->ucSnr; -} - -#define INC_RSSI_STEP 5 -#define INC_ADC_STEP_MAX 18 -short INC_GET_RSSI(unsigned char ucI2CID) -{ - short nLoop, nRSSI = 0; - short nResolution, nGapVal; - unsigned int uiAdcValue; - unsigned short aRFAGCTable[INC_ADC_STEP_MAX][2] = { - - {100, 1199} - , - {95, 1160} - , - {90, 1085} - , - {85, 1018} - , - - {80, 953} - , - {75, 875} - , - {70, 805} - , - {65, 720} - , - {60, 655} - , - - {55, 625} - , - {50, 565} - , - {45, 500} - , - {40, 465} - , - {35, 405} - , - - {30, 340} - , - {25, 270} - , - {20, 200} - , - }; - - uiAdcValue = (INC_CMD_READ(ucI2CID, APB_RF_BASE + 0xD4) >> 5) & 0x3FF; - uiAdcValue = (short) ((117302 * (unsigned int) uiAdcValue) / 100000); - - if (!uiAdcValue) - nRSSI = 0; - else if (uiAdcValue >= aRFAGCTable[0][1]) - nRSSI = (short) aRFAGCTable[0][0]; - else if (uiAdcValue <= aRFAGCTable[INC_ADC_STEP_MAX - 1][1]) - nRSSI = (short) aRFAGCTable[INC_ADC_STEP_MAX - 1][0]; - else { - for (nLoop = 1; nLoop < INC_ADC_STEP_MAX; nLoop++) { - if (uiAdcValue < aRFAGCTable[nLoop][1] - || uiAdcValue >= aRFAGCTable[nLoop - 1][1]) - continue; - - nResolution = - (aRFAGCTable[nLoop - 1][1] - - aRFAGCTable[nLoop][1]) / INC_RSSI_STEP; - nGapVal = uiAdcValue - aRFAGCTable[nLoop][1]; - if (nResolution) - nRSSI = - (aRFAGCTable[nLoop][0]) + - (nGapVal / nResolution); - else - nRSSI = (aRFAGCTable[nLoop][0]) + nGapVal; - break; - } - } - return nRSSI; -} - -unsigned int YMDtoMJD(struct ST_DATE_T stDate) -{ - unsigned short wMJD; - unsigned int lYear, lMouth, lDay, L; - unsigned int lTemp1, lTemp2; - - lYear = (unsigned int) stDate.usYear - (unsigned int) 1900; - lMouth = stDate.ucMonth; - lDay = stDate.ucDay; - - if (lMouth == 1 || lMouth == 2) - L = 1; - else - L = 0; - - lTemp1 = (lYear - L) * 36525L / 100L; - lTemp2 = (lMouth + 1L + L * 12L) * 306001L / 10000L; - - wMJD = (unsigned short) (14956 + lDay + lTemp1 + lTemp2); - - return wMJD; -} - -void MJDtoYMD(unsigned short wMJD, struct ST_DATE_T *pstDate) -{ - unsigned int lYear, lMouth, lTemp; - - lYear = (wMJD * 100L - 1507820L) / 36525L; - lMouth = - ((wMJD * 10000L - 149561000L) - - (lYear * 36525L / 100L) * 10000L) / 306001L; - - pstDate->ucDay = - (unsigned char) (wMJD - 14956L - (lYear * 36525L / 100L) - - (lMouth * 306001L / 10000L)); - - if (lMouth == 14 || lMouth == 15) - lTemp = 1; - else - lTemp = 0; - - pstDate->usYear = (unsigned short) (lYear + lTemp + 1900); - pstDate->ucMonth = (unsigned char) (lMouth - 1 - lTemp * 12); -} - -void INC_DB_COPY(unsigned int ulFreq, short nCnt, - struct INC_CHANNEL_INFO *pChInfo, - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent) -{ - short nIndex; - struct ST_FICDB_LIST *pList; - pList = INC_GET_FICDB_LIST(); - - for (nIndex = 0; nIndex < nCnt; nIndex++, pSvcComponent++, pChInfo++) { - - pChInfo->ulRFFreq = ulFreq; - pChInfo->uiEnsembleID = pList->unEnsembleID; - pChInfo->ucSubChID = pSvcComponent->ucSubChid; - pChInfo->ucServiceType = pSvcComponent->ucDSCType; - pChInfo->uiStarAddr = pSvcComponent->unStartAddr; - pChInfo->uiTmID = pSvcComponent->ucTmID; - pChInfo->ulServiceID = pSvcComponent->ulSid; - pChInfo->uiPacketAddr = pSvcComponent->unPacketAddr; - pChInfo->uiBitRate = pSvcComponent->uiBitRate; - pChInfo->ucSlFlag = pSvcComponent->ucShortLong; - pChInfo->ucTableIndex = pSvcComponent->ucTableIndex; - pChInfo->ucOption = pSvcComponent->ucOption; - pChInfo->ucProtectionLevel = pSvcComponent->ucProtectionLevel; - pChInfo->uiDifferentRate = pSvcComponent->uiDifferentRate; - pChInfo->uiSchSize = pSvcComponent->uiSubChSize; - memcpy(pChInfo->aucEnsembleLabel, pList->aucEnsembleName, - MAX_LABEL_CHAR); - memcpy(pChInfo->aucLabel, pSvcComponent->aucLabels, - MAX_LABEL_CHAR); - -#ifdef USER_APPLICATION_TYPE - pChInfo->stUsrApp = pSvcComponent->stUApp; -#endif - } -} - -unsigned char INC_DB_UPDATE(unsigned int ulFreq, struct ST_SUBCH_INFO *pDMB, - struct ST_SUBCH_INFO *pDAB, struct ST_SUBCH_INFO *pDATA, - struct ST_SUBCH_INFO *pFIDC) -{ - struct INC_CHANNEL_INFO *pChInfo; - struct ST_STREAM_INFO *pStreamInfo; - struct ST_FICDB_LIST *pList; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - - pList = INC_GET_FICDB_LIST(); - - /**********************************************/ - /* DMB channel list update */ - /**********************************************/ - pStreamInfo = &pList->stDMB; - pChInfo = &pDMB->astSubChInfo[pDMB->nSetCnt]; - pSvcComponent = pStreamInfo->astPrimary; - - if ((pStreamInfo->nPrimaryCnt + pDMB->nSetCnt) < MAX_SUBCH_SIZE) { - INC_DB_COPY(ulFreq, pStreamInfo->nPrimaryCnt, pChInfo, - pSvcComponent); - pDMB->nSetCnt += pStreamInfo->nPrimaryCnt; - } - - pSvcComponent = pStreamInfo->astSecondary; - if ((pStreamInfo->nSecondaryCnt + pDMB->nSetCnt) < MAX_SUBCH_SIZE) { - INC_DB_COPY(ulFreq, pStreamInfo->nSecondaryCnt, pChInfo, - pSvcComponent); - pDMB->nSetCnt += pStreamInfo->nSecondaryCnt; - } - - /**********************************************/ - /* DAB channel list update */ - /**********************************************/ - pStreamInfo = &pList->stDAB; - pChInfo = &pDAB->astSubChInfo[pDAB->nSetCnt]; - pSvcComponent = pStreamInfo->astPrimary; - if ((pStreamInfo->nPrimaryCnt + pDAB->nSetCnt) < MAX_SUBCH_SIZE) { - INC_DB_COPY(ulFreq, pStreamInfo->nPrimaryCnt, pChInfo, - pSvcComponent); - pDAB->nSetCnt += pStreamInfo->nPrimaryCnt; - } - - pSvcComponent = pStreamInfo->astSecondary; - if ((pStreamInfo->nSecondaryCnt + pDAB->nSetCnt) < MAX_SUBCH_SIZE) { - INC_DB_COPY(ulFreq, pStreamInfo->nSecondaryCnt, pChInfo, - pSvcComponent); - pDAB->nSetCnt += pStreamInfo->nSecondaryCnt; - } - - /**********************************************/ - /* DATA channel list update */ - /**********************************************/ - pStreamInfo = &pList->stDATA; - pChInfo = &pDATA->astSubChInfo[pDATA->nSetCnt]; - pSvcComponent = pStreamInfo->astPrimary; - if ((pStreamInfo->nPrimaryCnt + pDATA->nSetCnt) < MAX_SUBCH_SIZE) { - INC_DB_COPY(ulFreq, pStreamInfo->nPrimaryCnt, pChInfo, - pSvcComponent); - pDATA->nSetCnt += pStreamInfo->nPrimaryCnt; - } - - pSvcComponent = pStreamInfo->astSecondary; - if ((pStreamInfo->nSecondaryCnt + pDATA->nSetCnt) < MAX_SUBCH_SIZE) { - INC_DB_COPY(ulFreq, pStreamInfo->nSecondaryCnt, pChInfo, - pSvcComponent); - pDATA->nSetCnt += pStreamInfo->nSecondaryCnt; - } - - /**********************************************/ - /* FIDC channel list update */ - /***********************************************/ - pStreamInfo = &pList->stFIDC; - pChInfo = &pFIDC->astSubChInfo[pFIDC->nSetCnt]; - pSvcComponent = pStreamInfo->astPrimary; - if ((pStreamInfo->nPrimaryCnt + pFIDC->nSetCnt) < MAX_SUBCH_SIZE) { - INC_DB_COPY(ulFreq, pStreamInfo->nPrimaryCnt, pChInfo, - pSvcComponent); - pFIDC->nSetCnt += pStreamInfo->nPrimaryCnt; - } - - pSvcComponent = pStreamInfo->astSecondary; - if ((pStreamInfo->nSecondaryCnt + pFIDC->nSetCnt) < MAX_SUBCH_SIZE) { - INC_DB_COPY(ulFreq, pStreamInfo->nSecondaryCnt, pChInfo, - pSvcComponent); - pFIDC->nSetCnt += pStreamInfo->nSecondaryCnt; - } - - return INC_SUCCESS; -} - -void INC_UPDATE_LIST(struct INC_CHANNEL_INFO *pUpDateCh, - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent) -{ - pUpDateCh->uiStarAddr = pSvcComponent->unStartAddr; - pUpDateCh->uiBitRate = pSvcComponent->uiBitRate; - pUpDateCh->ucSlFlag = pSvcComponent->ucShortLong; - pUpDateCh->ucTableIndex = pSvcComponent->ucTableIndex; - pUpDateCh->ucOption = pSvcComponent->ucOption; - pUpDateCh->ucProtectionLevel = pSvcComponent->ucProtectionLevel; - pUpDateCh->uiDifferentRate = pSvcComponent->uiDifferentRate; - pUpDateCh->uiSchSize = pSvcComponent->uiSubChSize; -} - -unsigned char INC_FIC_UPDATE(unsigned char ucI2CID, - struct ST_SUBCH_INFO *pChInfo, - enum ST_SIMPLE_FIC bSimpleFIC) -{ - short nLoop = 0, nIndex, nGetChCnt = 0; - struct INC_CHANNEL_INFO *pUpDateCh; - struct ST_STREAM_INFO *pStreamInfo; - struct ST_FICDB_SERVICE_COMPONENT *pSvcComponent; - - for (nIndex = 0; nIndex < pChInfo->nSetCnt; nIndex++) { - if (bSimpleFIC == SIMPLE_FIC_ENABLE) { - pUpDateCh = &pChInfo->astSubChInfo[nIndex]; - pStreamInfo = &INC_GET_FICDB_LIST()->stDMB; - pSvcComponent = pStreamInfo->astPrimary; - - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pUpDateCh->ucSubChID != - pSvcComponent->ucSubChid) - continue; - INC_UPDATE_LIST(pUpDateCh, pSvcComponent); - nGetChCnt++; - if (pChInfo->nSetCnt == nGetChCnt) - return INC_SUCCESS; - } - } - } - - for (nIndex = 0; nIndex < pChInfo->nSetCnt; nIndex++) { - pUpDateCh = &pChInfo->astSubChInfo[nIndex]; - - if (pUpDateCh->ucServiceType == 0x18) { - pStreamInfo = &INC_GET_FICDB_LIST()->stDMB; - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pUpDateCh->ucSubChID != - pSvcComponent->ucSubChid) - continue; - INC_UPDATE_LIST(pUpDateCh, pSvcComponent); - nGetChCnt++; - if (pChInfo->nSetCnt == nGetChCnt) - return INC_SUCCESS; - } - - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pUpDateCh->ucSubChID != - pSvcComponent->ucSubChid) - continue; - INC_UPDATE_LIST(pUpDateCh, pSvcComponent); - nGetChCnt++; - if (pChInfo->nSetCnt == nGetChCnt) - return INC_SUCCESS; - } - } else { - pStreamInfo = &INC_GET_FICDB_LIST()->stDAB; - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pUpDateCh->ucSubChID != - pSvcComponent->ucSubChid) - continue; - INC_UPDATE_LIST(pUpDateCh, pSvcComponent); - nGetChCnt++; - if (pChInfo->nSetCnt == nGetChCnt) - return INC_SUCCESS; - } - - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pUpDateCh->ucSubChID != - pSvcComponent->ucSubChid) - continue; - INC_UPDATE_LIST(pUpDateCh, pSvcComponent); - nGetChCnt++; - if (pChInfo->nSetCnt == nGetChCnt) - return INC_SUCCESS; - } - - pStreamInfo = &INC_GET_FICDB_LIST()->stDATA; - pSvcComponent = pStreamInfo->astPrimary; - for (nLoop = 0; nLoop < pStreamInfo->nPrimaryCnt; - nLoop++, pSvcComponent++) { - if (pUpDateCh->ucSubChID != - pSvcComponent->ucSubChid) - continue; - INC_UPDATE_LIST(pUpDateCh, pSvcComponent); - nGetChCnt++; - if (pChInfo->nSetCnt == nGetChCnt) - return INC_SUCCESS; - } - - pSvcComponent = pStreamInfo->astSecondary; - for (nLoop = 0; nLoop < pStreamInfo->nSecondaryCnt; - nLoop++, pSvcComponent++) { - if (pUpDateCh->ucSubChID != - pSvcComponent->ucSubChid) - continue; - INC_UPDATE_LIST(pUpDateCh, pSvcComponent); - nGetChCnt++; - if (pChInfo->nSetCnt == nGetChCnt) - return INC_SUCCESS; - } - } - } - - return INC_ERROR; -} - -/* Samsung */ -unsigned short INC_GET_SAMSUNG_BER(unsigned char ucI2CID) -{ - unsigned int uiVtbErr, uiVtbData; - short nLoop, nCER; - struct ST_BBPINFO *pInfo; - - pInfo = INC_GET_STRINFO(ucI2CID); - - uiVtbErr = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x06); - uiVtbData = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x08); - - if (pInfo->ucProtectionLevel != 0) - nCER = (short) ((((unsigned int) uiVtbErr * 89) / 1000) - 30); - else - nCER = - (!uiVtbData) ? 0 - : (int) ((((unsigned int) uiVtbErr * 3394) / - (uiVtbData * 32)) - 35); - if (uiVtbData == 0) - nCER = 2000; - else { - if (nCER <= 0) - nCER = 0; - } - - pInfo->auiBERBuff[pInfo->uiInCBERTick++ % BER_BUFFER_MAX] = nCER; - pInfo->uiBerSum = 0; - for (nLoop = 0; nLoop < BER_BUFFER_MAX; nLoop++) - pInfo->uiBerSum += pInfo->auiBERBuff[nLoop]; - - pInfo->uiBerSum /= BER_BUFFER_MAX; - return pInfo->uiBerSum; -} - -unsigned char INC_GET_SAMSUNG_ANT_LEVEL(unsigned char ucI2CID) -{ - struct ST_BBPINFO *pInfo; - unsigned short unCER, unLoop, unRefAntLevel = 0; - unsigned short aunAntTable[7][2] = { - {6, 400} - , - {5, 550} - , - {4, 700} - , - {3, 850} - , - {2, 900} - , - {1, 1050} - , - {0, 10000} - , - }; - pInfo = INC_GET_STRINFO(ucI2CID); - INC_GET_CER(ucI2CID); - unCER = pInfo->uiInCERAvg; - for (unLoop = 0; unLoop < 6; unLoop++) { - if (unCER <= aunAntTable[unLoop][1]) { - unRefAntLevel = aunAntTable[unLoop][0]; - break; - } - } - - if (pInfo->ucAntLevel == unRefAntLevel) - pInfo->ucAntLevel = unRefAntLevel; - else if (pInfo->ucAntLevel >= unRefAntLevel) { - if ((pInfo->ucAntLevel - unRefAntLevel) >= 3) - pInfo->ucAntLevel -= 2; - else - pInfo->ucAntLevel--; - } else { - if ((unRefAntLevel - pInfo->ucAntLevel) >= 3) - pInfo->ucAntLevel += 2; - else - pInfo->ucAntLevel++; - } - - printk(KERN_DEBUG"[T3900]ANT LEVEL %d BER AVG[%d]\n", pInfo->ucAntLevel, - pInfo->uiInCERAvg); - return pInfo->ucAntLevel; -} - -unsigned short INC_GET_SAMSUNG_BER_FOR_FACTORY_MODE(unsigned char ucI2CID) -{ - unsigned int uiVtbErr, uiVtbData; - short nCER; - short nBERValue; - struct ST_BBPINFO *pInfo; - - pInfo = INC_GET_STRINFO(ucI2CID); - uiVtbErr = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x06); - uiVtbData = INC_CMD_READ(ucI2CID, APB_VTB_BASE + 0x08); - - if (pInfo->ucProtectionLevel != 0) { - nBERValue = - (short) ((((unsigned int) uiVtbErr * 89) / 1000) - 30); - if (uiVtbData == 0) - nBERValue = 2000; - if (nBERValue <= 0) - nBERValue = 0; - } else { - nCER = (!uiVtbData) ? 0 : - (int) ((((unsigned int) uiVtbErr * 3394) / - (uiVtbData * 32)) - 35); - if (uiVtbData == 0) - nCER = 2000; - else { - if (nCER <= 0) - nCER = 0; - } - nBERValue = nCER; - } - return nBERValue; -} diff --git a/drivers/media/tdmb/t3900/INC_RF_CTRL500.c b/drivers/media/tdmb/t3900/INC_RF_CTRL500.c deleted file mode 100644 index cb5c43a..0000000 --- a/drivers/media/tdmb/t3900/INC_RF_CTRL500.c +++ /dev/null @@ -1,2544 +0,0 @@ -/***************************************************************************** - Copyright(c) 2011 I&C Inc. All Rights Reserved - - File name : INC_RF_CTRL500.c - - Description : - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*******************************************************************************/ - -#include "INC_INCLUDES.h" -static unsigned int g_uiKOREnsembleFullFreq[MAX_KOREABAND_FULL_CHANNEL] = { -175280, 177008, 178736, -181280, 183008, 184736, -187280, 189008, 190736, -193280, 195008, 196736, -199280, 201008, 202736, -205280, 207008, 208736, -211280, 213008, 214736 -}; - -static unsigned int g_uiKOREnsembleNormalFreq[MAX_KOREABAND_NORMAL_CHANNEL] = { - 181280, 183008, 184736, 205280, 207008, 208736 -}; -static unsigned char g_acT3900KorI2CValue_12000 - [MAX_KOREABAND_FULL_CHANNEL][RF500_REG_CTRL] = { - { 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x43, 0x4D, 0x04, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x46, 0x4D, 0x10, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x49, 0x4D, 0x1C, 0x9F, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x80, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x4E, 0x4D, 0x1B, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x42, 0x4D, 0x07, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xBB, 0xB0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x45, 0x4D, 0x13, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x4A, 0x4D, 0x12, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x4D, 0x4D, 0x1E, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x41, 0x4D, 0x0A, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x46, 0x4D, 0x09, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x49, 0x4D, 0x15, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x4D, 0x4D, 0x01, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x42, 0x4D, 0x00, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x45, 0x4D, 0x0C, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x77, 0x70, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x48, 0x4D, 0x18, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x4D, 0x4D, 0x17, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x07, 0xD0, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x41, 0x4D, 0x03, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x44, 0x4D, 0x0F, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x4C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x49, 0x4D, 0x0E, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x4C, 0x4D, 0x1A, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x1A, 0x40, 0x4D, 0x06, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, -}; - -static unsigned char g_acT3900KorI2CValue_19200 - [MAX_KOREABAND_FULL_CHANNEL][RF500_REG_CTRL] = { - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x12, 0x41, 0x4D, 0x0C, 0xE8, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x12, 0x44, 0x4D, 0x09, 0x11, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x12, 0x47, 0x4D, 0x05, 0x3A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x80, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x12, 0x4B, 0x4D, 0x0C, 0xE8, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x1C, 0x45, 0x4D, 0x0D, 0x9A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xBB, 0xB0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x13, 0x41, 0x4D, 0x05, 0x3A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x13, 0x45, 0x4D, 0x0C, 0xE8, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x13, 0x48, 0x4D, 0x09, 0x11, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x13, 0x4B, 0x4D, 0x05, 0x3A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x13, 0x4F, 0x4D, 0x0C, 0xE8, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x14, 0x42, 0x4D, 0x09, 0x12, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x14, 0x45, 0x4D, 0x05, 0x3A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x14, 0x49, 0x4D, 0x0C, 0xE8, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x1F, 0x42, 0x4D, 0x0D, 0x9A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x77, 0x70, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x14, 0x4F, 0x4D, 0x05, 0x3A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x15, 0x43, 0x4D, 0x0C, 0xE8, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x04, 0x00, - 0x2A, 0x4C, 0x4D, 0x12, 0x22, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x15, 0x49, 0x4D, 0x05, 0x3A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x4C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x15, 0x4D, 0x4D, 0x0C, 0xE8, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x16, 0x40, 0x4D, 0x09, 0x11, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x5A, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x16, 0x43, 0x4D, 0x05, 0x3A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, -}; - -static unsigned char g_acT3900KorI2CValue_24576 - [MAX_KOREABAND_FULL_CHANNEL][RF500_REG_CTRL] = { - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x43, 0x4D, 0x04, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x46, 0x4D, 0x10, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x49, 0x4D, 0x1C, 0x9F, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x80, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x4E, 0x4D, 0x1B, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x42, 0x4D, 0x07, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xBB, 0xB0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x45, 0x4D, 0x13, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x4A, 0x4D, 0x12, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x0F, 0x43, 0x4D, 0x1F, 0x15, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x41, 0x4D, 0x0A, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x46, 0x4D, 0x09, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x49, 0x4D, 0x15, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x04, 0x00, - 0x1F, 0x4C, 0x4D, 0x02, 0x2A, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x42, 0x4D, 0x00, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x45, 0x4D, 0x0C, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x77, 0x70, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x48, 0x4D, 0x18, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x10, 0x49, 0x4D, 0x05, 0x15, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x41, 0x4D, 0x03, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x44, 0x4D, 0x0F, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x4C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x49, 0x4D, 0x0E, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x02, 0x00, - 0x11, 0x43, 0x4D, 0x07, 0x15, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x73, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x1A, 0x40, 0x4D, 0x06, 0xA0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, -}; - -static unsigned char - g_acT3900KorI2CValue_27000 - [MAX_KOREABAND_FULL_CHANNEL][RF500_REG_CTRL] = { - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x43, 0x4D, 0x04, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x46, 0x4D, 0x10, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x49, 0x4D, 0x1C, 0x9F, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x80, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x4E, 0x4D, 0x1B, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x42, 0x4D, 0x07, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xBB, 0xB0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x45, 0x4D, 0x13, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x4A, 0x4D, 0x12, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x4D, 0x4D, 0x1E, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x41, 0x4D, 0x0A, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x46, 0x4D, 0x09, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x49, 0x4D, 0x15, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x4D, 0x4D, 0x01, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x42, 0x4D, 0x00, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x45, 0x4D, 0x0C, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x77, 0x70, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x48, 0x4D, 0x18, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x18, 0x4D, 0x4D, 0x17, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x07, 0xD0, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x41, 0x4D, 0x03, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x44, 0x4D, 0x0F, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x4C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x49, 0x4D, 0x0E, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x19, 0x4C, 0x4D, 0x1A, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x00, 0x1F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x72, 0xC0, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x1A, 0x40, 0x4D, 0x06, 0xA0, 0x01, 0xF4, 0xC1, 0x88, 0xEC, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xB0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x44, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x17, - 0x17, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x0F, 0x0C, - 0x00, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, - 0x00, 0x60, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xC0, 0x10, 0x00, 0x08, 0x1C, 0xC0, 0x22, 0x96, - 0xA5, 0xE0, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x27, 0x10, - 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, -}; - -static unsigned char - g_acT3900KorI2CValue_27120 - [MAX_KOREABAND_FULL_CHANNEL][RF500_REG_CTRL] = { - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x13, 0x43, 0x4D, 0x0A, 0x97, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x13, 0x46, 0x4D, 0x0C, 0x75, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x70, - 0x70, 0x80, 0x10, 0x00, 0xEE, 0xE0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xFF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x13, 0x49, 0x4D, 0x0E, 0x54, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x80, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x04, 0x00, - 0x1A, 0x47, 0x4D, 0x1D, 0xE2, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xCC, 0xC0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x14, 0x41, 0x4D, 0x00, 0x48, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xBB, 0xB0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x14, 0x44, 0x4D, 0x02, 0x26, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x14, 0x48, 0x4D, 0x12, 0x3C, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x60, - 0x60, 0x80, 0x10, 0x00, 0xAA, 0xA0, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x14, 0x4B, 0x4D, 0x14, 0x1B, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x14, 0x4E, 0x4D, 0x15, 0xF9, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x43, 0x4D, 0x06, 0x0F, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x50, - 0x50, 0x80, 0x10, 0x00, 0x99, 0x90, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x46, 0x4D, 0x07, 0xEE, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x15, 0x49, 0x4D, 0x09, 0xCC, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xFF, 0xC0, 0x50, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x04, 0x00, - 0x1D, 0x42, 0x4D, 0x0D, 0x2D, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x88, 0x80, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x40, 0x4D, 0x1B, 0xC0, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x77, 0x70, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x43, 0x4D, 0x1D, 0x9F, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x48, 0x4D, 0x0D, 0xB4, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x40, - 0x40, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x04, 0x00, - 0x1E, 0x44, 0x4D, 0x14, 0xC4, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x16, 0x4E, 0x4D, 0x11, 0x71, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x4C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x43, 0x4D, 0x01, 0x87, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x46, 0x4D, 0x03, 0x65, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, - - { - 0x55, 0x9F, 0xF1, 0xF8, 0x02, 0x41, 0xFC, 0x00, 0x00, 0xC0, - 0x00, 0x0C, 0xC3, 0x00, 0xC0, 0x40, 0x7F, 0x80, 0x03, 0xE8, - 0x0C, 0xC0, 0x88, 0x33, 0x08, 0xF0, 0xF0, 0xD0, 0x03, 0x00, - 0x17, 0x49, 0x4D, 0x05, 0x44, 0x03, 0xE8, 0xC1, 0x88, 0x08, - 0xE0, 0x10, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, - 0x00, 0x70, 0x4C, 0xF0, 0x8C, 0xF0, 0x80, 0xC0, 0xC0, 0x20, - 0x20, 0x80, 0x10, 0x00, 0x66, 0x60, 0x33, 0x44, 0x48, 0x33, - 0x6E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x2B, - 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x94, 0x44, 0x00, 0x15, - 0x0F, 0x18, 0x18, 0x0E, 0x04, 0x00, 0x00, 0x00, 0xFB, 0xB0, - 0x68, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x10, 0x54, - 0x0F, 0xAB, 0x00, 0x00, 0xF8, 0x00, 0x04, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x06, 0x00, - 0x01, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x80, 0x00, 0xF8, 0x18, 0x07, 0x80, 0x04, 0x00, 0xF8, 0xFE, - 0xFE, 0x00, 0xF0, 0xBF, 0xC0, 0x80, 0x03, 0x00, 0x05, 0xDC, - 0x00, 0x05, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, - }, -}; - -unsigned int INC_GET_KOREABAND_FULL_TABLE(unsigned short uiIndex) -{ - if (uiIndex >= MAX_KOREABAND_FULL_CHANNEL) - return 0xFFFF; - return g_uiKOREnsembleFullFreq[uiIndex]; -} - -unsigned int INC_GET_KOREABAND_NORMAL_TABLE(unsigned short uiIndex) -{ - if (uiIndex >= MAX_KOREABAND_NORMAL_CHANNEL) - return 0xFFFF; - return g_uiKOREnsembleNormalFreq[uiIndex]; -} - -unsigned short INC_FIND_KOR_FREQ(unsigned int ulFreq) -{ - unsigned short uiLoop; - for (uiLoop = 0; uiLoop < MAX_KOREABAND_FULL_CHANNEL; uiLoop++) { - if (g_uiKOREnsembleFullFreq[uiLoop] == ulFreq) - return uiLoop; - } - return 0xFFFF; -} - -unsigned char INC_RF500_I2C_WRITE(unsigned char ucI2CID, unsigned char *pucData, - unsigned int uLength) -{ - short nLoop; - for (nLoop = 0; nLoop < (short) uLength; nLoop++) { - INC_CMD_WRITE(ucI2CID, APB_RF_BASE + nLoop, - (unsigned short) pucData[nLoop]); - } - return INC_SUCCESS; -} - -unsigned char INC_RF500_START(unsigned char ucI2CID, unsigned int ulRFChannel, - enum ENSEMBLE_BAND ucBand, enum PLL_MODE ucPLL) -{ - unsigned short uiPos; - unsigned char *pDataBuff = INC_NULL; - if (ucBand == KOREA_BAND_ENABLE) { - uiPos = INC_FIND_KOR_FREQ(ulRFChannel); - if (uiPos == 0xFFFF) - return INC_ERROR; - switch (ucPLL) { - case INPUT_CLOCK_12000KHZ: - pDataBuff = g_acT3900KorI2CValue_12000[uiPos]; - break; - case INPUT_CLOCK_19200KHZ: - pDataBuff = g_acT3900KorI2CValue_19200[uiPos]; - break; - case INPUT_CLOCK_24576KHZ: - pDataBuff = g_acT3900KorI2CValue_24576[uiPos]; - break; - case INPUT_CLOCK_27000KHZ: - pDataBuff = g_acT3900KorI2CValue_27000[uiPos]; - break; - case INPUT_CLOCK_27120KHZ: - pDataBuff = g_acT3900KorI2CValue_27120[uiPos]; - break; - default: - pDataBuff = g_acT3900KorI2CValue_19200[uiPos]; - break; - } - } else if (ucBand == EXTERNAL_ENABLE) - return INC_SUCCESS; - - else - return INC_ERROR; - - if (pDataBuff == INC_NULL) - return INC_ERROR; - if (INC_RF500_I2C_WRITE(ucI2CID, pDataBuff, RF500_REG_CTRL) == - INC_ERROR) - return INC_ERROR; - return INC_SUCCESS; -} diff --git a/drivers/media/tdmb/t3900/Makefile b/drivers/media/tdmb/t3900/Makefile deleted file mode 100644 index 2483ed5..0000000 --- a/drivers/media/tdmb/t3900/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -obj-y += INC_FICDEC.o -obj-y += INC_INTERFACE.o -obj-y += INC_PROCESS.o -obj-y += INC_RF_CTRL500.o - -ccflags-y += -Idrivers/media/tdmb diff --git a/drivers/media/tdmb/tcc3170/Makefile b/drivers/media/tdmb/tcc3170/Makefile deleted file mode 100644 index ba12099..0000000 --- a/drivers/media/tdmb/tcc3170/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -obj-y += src/ -#obj-y += tcbd.o - -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcpal -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcbd_diagnosis -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcbd_stream_parser - diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_api_common.h b/drivers/media/tdmb/tcc3170/inc/tcbd_api_common.h deleted file mode 100644 index f798610..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_api_common.h +++ /dev/null @@ -1,365 +0,0 @@ -/* - * tcbd_api_common.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_API_COMMON_H__ -#define __TCBD_API_COMMON_H__ -#include "tcbd_drv_register.h" -#include "tcbd_diagnosis.h" - -/** - * @defgroup ProtectionType - */ -/**@{*/ -#define PROTECTION_TYPE_UEP 0 -#define PROTECTION_TYPE_EEP 1 -/**@}*/ - -/** - * @defgroup ProtectionLevel - * Protection type UEP - * - * - *
UEP1UEP2UEP3UEP4
0x000x010x020x03
- * - * Protection type EEP - * - * - * - * - * - */ - -/* - * @defgroup ServiceType - * Service type for each sub-channel. - */ -/** @{*/ -#define SERVICE_TYPE_DAB 0x01 -#define SERVICE_TYPE_DABPLUS 0x02 -#define SERVICE_TYPE_DATA 0x03 -#define SERVICE_TYPE_DMB 0x04 -#define SERVICE_TYPE_FIC 0x07 -#define SERVICE_TYPE_FIC_WITH_ERR 0x08 -#define SERVICE_TYPE_EWS 0x09 -/**@}*/ - - - -/** - * @defgroup Bitrate - * If protection type is UEP, the values of bitrate are as following. - *
EEP1AEEP2AEEP3AEEP4AEEP1BEEP2BEEP3BEEP4B
0x000x010x020x030x040x050x060x07
- * - * - * - * - * - * - * - * - *
Kbps324856648096112128160192224256320384
value0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D
- * - * If protection type is EEP, the values of bitrate are as following. - * - * - * - * - * - *
kbps123...126
value0x010x020x03...0x7E
- * 0x00 - */ - -/** - * @defgroup ServiceInformation - */ -struct tcbd_service { - s32 type; /**< Type of service. Please refer to @ref ServiceType*/ - s32 ptype; /**< Type of protection Please refer to @ref ProtectionType*/ - s32 subch_id; /**< Sub-channel id */ - s32 size_cu; /**< Size of CU(Capacity Unit) or sub-channel size*/ - s32 start_cu; /**< Start address of CU(Capacity Unit) */ - s32 reconfig; /**< Must be set 0x02*/ - s32 rs_on; /**< If type is DMB, it must be 0x01, or else 0x00 */ - s32 plevel; /**< Protection level Please refer @ref ProtectionLevel*/ - s32 bitrate; /**< Bitrate. Please refer @ref Bitrate*/ -}; - -/** - * @defgroup PreripheralType - * types of interface to read stream - */ -/** @{*/ -enum tcbd_peri_type { - PERI_TYPE_SPI_SLAVE = 1, /**< The stream can be read - * using SPI(slave) */ - PERI_TYPE_SPI_MASTER, /**< The stream can be read - * using SPI(master) */ - PERI_TYPE_PTS, /**< The stream can be read using PTS */ - PERI_TYPE_STS, /**< The stream can be read using STS */ - PERI_TYPE_HPI, /**< The stream can be read using HPI */ - PERI_TYPE_SPI_ONLY /**< The stream can be read using SPI. - * And command use same SPI interface. */ -}; -/**@}*/ - -enum tcbd_band_type { - BAND_TYPE_BAND3 = 1, /**< band III */ - BAND_TYPE_LBAND /**< L band */ -}; - -enum tcbd_div_io_type { - DIV_IO_TYPE_SINGLE = 0, - DIV_IO_TYPE_DUAL, -}; - -enum tcbd_intr_mode { - INTR_MODE_LEVEL_HIGH, /**< Interrupt will be trigered at high level */ - INTR_MODE_LEVEL_LOW, /**< Interrupt will be trigered at low level */ - INTR_MODE_EDGE_RISING, /**< Interrupt will be trigered at rising edge */ - INTR_MODE_EDGE_FALLING /**< Interrupt will be trigered at falling edge */ -}; - -/** - * @defgroup OscillatorType - * supported types of oscillator - */ -/** @{*/ -enum tcbd_clock_type { - CLOCK_19200KHZ, - CLOCK_24576KHZ, - CLOCK_38400KHZ, - CLOCK_MAX -}; -/**}@*/ - -struct tcbd_multi_service { - s32 on_air[TCBD_MAX_NUM_SERVICE]; - s32 service_idx[TCBD_MAX_NUM_SERVICE]; - s32 service_count; - u32 service_info[TCBD_MAX_NUM_SERVICE*2]; -}; - -struct tcbd_device { - u8 chip_addr; /**< Chip address for diversity or dual mode*/ - u32 main_clock; - u8 processor; /**< Activated interrnal processor */ - - u32 selected_buff; - u32 selected_stream; - u8 en_cmd_fifo; - u32 intr_threshold; /**< Interrupt threshold */ -#if defined(__READ_VARIABLE_LENGTH__) - u32 size_more_read; -#endif /*__READ_VARIABLE_LENGTH__*/ - enum tcbd_clock_type clock_type; - enum tcbd_peri_type peri_type; /**< Peripheral type for stream */ - enum tcbd_band_type curr_band; - enum tcbd_band_type prev_band; - - s32 frequency; /**< Last set frequency */ - s32 is_pal_irq_en; - u8 enabled_irq; - struct tcbd_multi_service mult_service; /**< Registered service - infomation */ -}; - -/** - * Change the type of stream. Types are - * - DMB : STREAM_TYPE_DMB - * - DAB : STREAM_TYPE_DAB - * - FIC : STREAM_TYPE_FIC - * - STATUS : STREAM_TYPE_STATUS - * - * You can combine the above types. For more information @ref TypesOfStream - * @param _device Instance of device - * @param _type type of stream - * - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_change_stream_type( - struct tcbd_device *_device, u32 _type); - -TCBB_FUNC s32 tcbd_enable_irq( - struct tcbd_device *_device, u8 _en_bit); -TCBB_FUNC s32 tcbd_disable_irq( - struct tcbd_device *_device, u8 _mask); - -/** - * @brief Change the mode of interrupt. - * @param _device Instance of device - * @param _mode Interrupt mode. For more information of mode. - * Please refer @tcbd_intr_mode - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_change_irq_mode( - struct tcbd_device *_device, enum tcbd_intr_mode _mode); - -/** - * @brief read interrupt and error status. - * @param _device instance of device - * @param _irq_status interrupt status of buffer. Please @ref InterruptStatus - * @param _err_status error status of buffer. Please @ref ErrorStatus - */ -TCBB_FUNC s32 tcbd_read_irq_status( - struct tcbd_device *_device, u8 *_irq_status, u8 *_err_status); - -/** - * @brief clear interrupt status. - * @param _device instance of device - * @param _status status of interrupt. Please @ref InterruptClear - */ -TCBB_FUNC s32 tcbd_clear_irq( - struct tcbd_device *_device, u8 _status); - -/** - * @brief select interface to read stream. - * @param _device instance of device - * @param _peri_type interface type @ref PreripheralType - */ -TCBB_FUNC s32 tcbd_select_peri( - struct tcbd_device *_device, enum tcbd_peri_type _peri_type); - -#define ENABLE_CMD_FIFO 1 -#define DISABLE_CMD_FIFO 0 - -/** - * Initialize stream configuration. - * @param _device Instance of device. - * @param _use_cmd_fifo - * Determin whether or not to use command FIFO when you read - * stream. If you use SPI interface to read stream, you - * should use ENABLE_CMD_FIFO. - * - ENABLE_CMD_FIFO - * - DISABLE_CMD_FIFO - * @param _buffer_mask - * Mask unused buffer. - * For more information, please refer @ref StreamDataConfig - * @param _threshold - * Threshold for triggering interrupt. The threshold can be - * set up to 8Kbyes. If you use STS, this value is meaningless. - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_init_stream_data_config( - struct tcbd_device *_device, - u8 _use_cmd_fifo, - u8 _buffer_mask, - u32 _threshold); - -/** - * Tune frequency. - * @param _device Instance of device - * @param _freq_khz frequency - * @param _bw_khz bandwidth - * - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_tune_frequency( - struct tcbd_device *_device, u32 _freq_khz, s32 _bw_khz); - - -/** - * @brief wait until the frequency is tuned. - * @param _device Instance of device - * @param _status Status. - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_wait_tune( - struct tcbd_device *_device, u8 *_status); - - -/** - * @brief register service(short argument) - * @param _device instance of device - * @param _subch_id sub channel id - * @param _data_mode 0:DAB,DATA 1:DMB - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_register_service( - struct tcbd_device *_device, u8 _subch_id, u8 _data_mode); - -/** - * @brief register service(long argument). - * @param _device Instance of device - * @param _service Sub channel information. @ref ServiceInformation - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_register_service_long( - struct tcbd_device *_device, struct tcbd_service *_service); - -/** - * @brief unregister sub channel. - * @param _device instance of device - * @param _subch_id sub channel information previously registered. - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_unregister_service( - struct tcbd_device *_device, u8 _subch_id); - -/** - * @brief read tream from device - * @param _device instance of device - * @param _buff buffer for stream - * @param _size size of buffer. size must bigger then - * interrupt threshold(TCBD_MAX_THRESHOLD) - * - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_read_stream( - struct tcbd_device *_device, u8 *_buff, s32 *_size); - -/** - * @brief read fic data from internal buffer(I2C/STS interface only) - * @param _device instance of device - * @param _buff buffer for fic data. - * @param _size size of buffer. _size must be 384 bytes. - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_read_fic_data( - struct tcbd_device *_device, u8 *_buff, s32 _size); - -/** - * @brief read signal quality. - * @param _device instance of device - * @param _status_data instance of struct tcbd_status_data - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_read_signal_info( - struct tcbd_device *_device, struct tcbd_status_data *_status_data); - -/** - * @brief _device instance of device. - * @param _comp_en internal processor to enable - * @param _comp_rst internal processor to reset - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_reset_ip( - struct tcbd_device *_device, u8 _comp_en, u8 _comp_rst); - -/** - * @brief start device. - * @param _device instance of device - * @param _clock_type oscillator clock type @ref OscillatorType - * @return success 0, fail -@ref ListOfErrorCode - */ -TCBB_FUNC s32 tcbd_device_start( - struct tcbd_device *_device, enum tcbd_clock_type _clock_type); -#endif /*__TCBD_API_COMMON_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_diagnosis/tcbd_diagnosis.h b/drivers/media/tdmb/tcc3170/inc/tcbd_diagnosis/tcbd_diagnosis.h deleted file mode 100644 index 7e53f0d..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_diagnosis/tcbd_diagnosis.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * tcbd_diagnosis.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_DIAGNOSIS_H__ -#define __TCBD_DIAGNOSIS_H__ - -/* 0 agc, 1 cto, 2 cfo, 3 fto, 4 sync, 5, ofdm */ -#define TCBD_LOCK_AGC 0x01 -#define TCBD_LOCK_CTO 0x02 -#define TCBD_LOCK_CFO 0x03 -#define TCBD_LOCK_FTO 0x04 -#define TCBD_LOCK_SYNC 0x10 -#define TCDD_LOCK_OFDM 0x20 - -struct tcbd_status_data { - u8 lock; - s32 rssi; - s32 snr; - s32 snr_moving_avg; - s32 pcber; - s32 pcber_moving_avg; - s32 vber; - s32 vber_moving_avg; - s32 ts_error_count; - s32 tsper; - s32 tsper_moving_avg; -}; - -TCBB_FUNC void tcbd_update_status( - u8 *_rawData, u32 size, struct tcbd_status_data *_status_data); -TCBB_FUNC void tcbd_init_status_manager(void); - -#endif /*__TCBD_SIGNAL_INFO_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_drv_io.h b/drivers/media/tdmb/tcc3170/inc/tcbd_drv_io.h deleted file mode 100644 index b09d9ca..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_drv_io.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * tcbd_drv_io.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_DRV_COMMON_H__ -#define __TCBD_DRV_COMMON_H__ -#include "tcbd_drv_register.h" -#include "tcbd_error.h" - -#define MB_HOSTMAIL 0x47 -#define MB_SLAVEMAIL 0x74 - -#define DEFAULT_CHIP_ADDRESS 0x50 -struct tcbd_io_data { - s32 chip_addr; - u32 sem; - s32 (*open)(void); - s32 (*close)(void); - s32 (*reg_write)(u8 _addr, u8 _data); - s32 (*reg_read)(u8 _addr, u8 *_data); - s32 (*reg_write_burst_cont)(u8 _addr, u8 *_data, s32 _size); - s32 (*reg_read_burst_cont)(u8 _addr, u8 *_data, s32 _size); - s32 (*reg_write_burst_fix)(u8 _addr, u8 *_data, s32 _size); - s32 (*reg_read_burst_fix)(u8 _addr, u8 *_data, s32 _size); -}; - -#define MAX_MAIL_COUNT 7 -#define MAX_TIME_TO_WAIT_MAIL 1000 -struct tcbd_mail_data { - u8 flag; - u8 count; - u16 cmd; - u32 status; - u32 data[MAX_MAIL_COUNT]; - u8 pad[2]; -}; - -TCBB_FUNC struct tcbd_io_data *tcbd_get_io_struct(void); -TCBB_FUNC void tcpal_set_i2c_io_function(void); -TCBB_FUNC void tcpal_set_cspi_io_function(void); - -TCBB_FUNC s32 tcbd_io_open(struct tcbd_device *_device); -TCBB_FUNC s32 tcbd_io_close(struct tcbd_device *_device); - -TCBB_FUNC s32 tcbd_reg_read( - struct tcbd_device *_handle, u8 _addr, u8 *_data); -TCBB_FUNC s32 tcbd_reg_write( - struct tcbd_device *_handle, u8 _addr, u8 _data); -TCBB_FUNC s32 tcbd_reg_read_burst_cont( - struct tcbd_device *_handle, u8 _addr, u8 *_data, s32 _size); -TCBB_FUNC s32 tcbd_reg_write_burst_cont( - struct tcbd_device *_handle, u8 _addr, u8 *_data, s32 _size); -TCBB_FUNC s32 tcbd_reg_read_burst_fix( - struct tcbd_device *_handle, u8 _addr, u8 *_data, s32 _size); -TCBB_FUNC s32 tcbd_reg_write_burst_fix( - struct tcbd_device *_handle, u8 _addr, u8 *_data, s32 _size); -TCBB_FUNC s32 tcbd_mem_write( - struct tcbd_device *_handle, u32 _addr, u8 *_data, u32 _size); -TCBB_FUNC s32 tcbd_mem_read( - struct tcbd_device *_handle, u32 _addr, u8 *_data, u32 _size); -TCBB_FUNC s32 tcbd_rf_reg_write( - struct tcbd_device *_handle, u8 _addr, u32 _data); -TCBB_FUNC s32 tcbd_rf_reg_read( - struct tcbd_device *_handle, u32 _addr, u32 *_data); - -TCBB_FUNC s32 tcbd_send_mail(struct tcbd_device *_device, - struct tcbd_mail_data *_mail); -TCBB_FUNC s32 tcbd_recv_mail(struct tcbd_device *_device, - struct tcbd_mail_data *_mail); -TCBB_FUNC s32 tcbd_read_mail_box(struct tcbd_device *_device, u16 cmd, - s32 len, u32 *data); -TCBB_FUNC s32 tcbd_write_mail_box(struct tcbd_device *_device, u16 _cmd, - s32 _cnt, u32 *_data); -TCBB_FUNC s32 tcbd_read_file(struct tcbd_device *_device, char *_path, - u8 *_buff, s32 _size); -extern struct spi_device *spi_dmb; /* sukjoon_temp */ -#endif /*__TCBD_DRV_COMMON_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_drv_ip.h b/drivers/media/tdmb/tcc3170/inc/tcbd_drv_ip.h deleted file mode 100644 index 7789d1c..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_drv_ip.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * tcbd_drv_ip.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_DRV_IP_H__ -#define __TCBD_DRV_IP_H__ - -enum tcbd_remap_type { - EP_RAM0_RAM1 = 0, /**< Ep can access RAM0 and RAM1 */ - EP_RAM0_RAM1_PC0, /**< Ep can access RAM0, RAM1 and initial pc is 0 */ - OP_RAM0_RAM1_PC2, /**< Op can access RAM0, RAM1 and initial pc is 0x2000*/ - OP_RAM0_EP_RAM1_PC2 /**< Op can access RAM0. Ep can access RAM1. - * Initial pc is 0x2000 */ -}; - -TCBB_FUNC s32 tcbd_send_spur_data( - struct tcbd_device *_device, s32 _freq_khz); -TCBB_FUNC s32 tcbd_send_agc_data( - struct tcbd_device *_device, enum tcbd_band_type _band_type); -TCBB_FUNC s32 tcbd_send_frequency( - struct tcbd_device *_device, s32 _freq_khz); -TCBB_FUNC s32 tcbd_send_service_info(struct tcbd_device *_device); - -TCBB_FUNC s32 tcbd_get_rom_version( - struct tcbd_device *_device, u32 *_bootVersion); - -TCBB_FUNC s32 tcbd_enable_buffer(struct tcbd_device *_device); -TCBB_FUNC s32 tcbd_disable_buffer(struct tcbd_device *_device); -TCBB_FUNC s32 tcbd_init_buffer_region(struct tcbd_device *_device); -TCBB_FUNC s32 tcbd_change_memory_view( - struct tcbd_device *_device, enum tcbd_remap_type _remap); - -TCBB_FUNC s32 tcbd_demod_tune_frequency( - struct tcbd_device *_device, u32 _freq_khz, s32 _bw_khz); - -TCBB_FUNC s32 tcbd_dsp_cold_start(struct tcbd_device *_device); -TCBB_FUNC s32 tcbd_dsp_warm_start(struct tcbd_device *_device); - -TCBB_FUNC s32 tcbd_change_chip_addr( - struct tcbd_device *_device, u8 addr); -TCBB_FUNC s32 tcbd_enable_slave_command_ack( - struct tcbd_device *_device); - -TCBB_FUNC s32 tcbd_enable_peri(struct tcbd_device *_device); -TCBB_FUNC s32 tcbd_disable_peri(struct tcbd_device *_device); -TCBB_FUNC s32 tcbd_init_bias_key(struct tcbd_device *_device); -TCBB_FUNC u32 tcbd_get_osc_clock(struct tcbd_device *_device); -TCBB_FUNC s32 tcbd_init_pll( - struct tcbd_device *_device, enum tcbd_clock_type _clock_type); -TCBB_FUNC s32 tcbd_init_div_io( - struct tcbd_device *_device, enum tcbd_div_io_type _div_io); -TCBB_FUNC s32 tcbd_init_dsp( - struct tcbd_device *_device, u8 *_boot_code, s32 _size); - -TCBB_FUNC s32 tcbd_check_dsp_status(struct tcbd_device *_device); - -#define FILTER_ENABLE (1<<2) -#define FILTER_SYNCERR (1<<3) -TCBB_FUNC s32 tcbd_set_pid_filter(struct tcbd_device *_device, u32 _filter); -#endif /*__TCBD_DRV_IP_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_drv_register.h b/drivers/media/tdmb/tcc3170/inc/tcbd_drv_register.h deleted file mode 100644 index ca80812..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_drv_register.h +++ /dev/null @@ -1,558 +0,0 @@ -/* - * tcbd_drv_register.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_DRV_REGISTER_H__ -#define __TCBD_DRV_REGISTER_H__ - -#define Bit31 0x80000000 -#define Bit30 0x40000000 -#define Bit29 0x20000000 -#define Bit28 0x10000000 -#define Bit27 0x08000000 -#define Bit26 0x04000000 -#define Bit25 0x02000000 -#define Bit24 0x01000000 -#define Bit23 0x00800000 -#define Bit22 0x00400000 -#define Bit21 0x00200000 -#define Bit20 0x00100000 -#define Bit19 0x00080000 -#define Bit18 0x00040000 -#define Bit17 0x00020000 -#define Bit16 0x00010000 -#define Bit15 0x00008000 -#define Bit14 0x00004000 -#define Bit13 0x00002000 -#define Bit12 0x00001000 -#define Bit11 0x00000800 -#define Bit10 0x00000400 -#define Bit9 0x00000200 -#define Bit8 0x00000100 -#define Bit7 0x00000080 -#define Bit6 0x00000040 -#define Bit5 0x00000020 -#define Bit4 0x00000010 -#define Bit3 0x00000008 -#define Bit2 0x00000004 -#define Bit1 0x00000002 -#define Bit0 0x00000001 -#define BitNONE 0x00000000 - -#define TCBD_SYS_EN 0x00 -#define TCBD_SYS_RESET 0x01 -#define TCBD_IRQ_MODE 0x02 -#define TCBD_IRQ_EN 0x03 -#define TCBD_IRQ_STAT_CLR 0x04 -#define TCBD_IRQ_ERROR 0x05 -#define TCBD_IRQ_LATCH 0x05 -#define TCBD_PLL_6 0x06 -#define TCBD_PLL_7 0x07 -#define TCBD_PLL_8 0x08 -#define TCBD_PLL_9 0x09 -#define TCBD_CHIPADDR 0x0a -#define TCBD_PROGRAMID 0x0b -#define TCBD_CHIPID 0x0c -#define TCBD_INIT_REMAP 0x0d -#define TCBD_INIT_PC 0x0e - -#define TCBD_GPIO_ALT 0x10 -#define TCBD_GPIO_DR 0x12 -#define TCBD_GPIO_LR 0x14 -#define TCBD_GPIO_DRV 0x16 -#define TCBD_GPIO_PE 0x18 -#define TCBD_DIVIO 0x1a - -#define TCBD_STREAM_CFG0 0x1b -#define TCBD_STREAM_CFG1 0x1c -#define TCBD_STREAM_CFG2 0x1d -#define TCBD_STREAM_CFG3 0x1e -#define TCBD_STREAM_CFG4 0x1f - -#define TCBD_CMDDMA_CTRL 0x20 -#define TCBD_CMDDMA_SADDR 0x21 -#define TCBD_CMDDMA_SIZE 0x27 -#define TCBD_CMDDMA_STARTCTRL 0x29 -#define TCBD_CMDDMA_DATA_WIND 0x2a -#define TCBD_TGTBUFF_CIR_MODE 0x2b -#define TCBD_CMDDMA_CRC32 0x2c - -#define TCBD_PERI_CTRL 0x30 -#define TCBD_PERI_MODE0 0x31 -#define TCBD_PERI_MODE1 0x32 -#define TCBD_PERI_MODE2 0x33 -#define TCBD_PERI_MODE3 0x34 -#define TCBD_PERI_TEST0 0x37 -#define TCBD_PERI_TEST1 0x38 -#define TCBD_PERI_TEST2 0x39 -#define TCBD_PERI_TEST3 0x3a -#define TCBD_PERI_TEST4 0x3b - -#define TCBD_MAIL_CTRL 0x3c -#define TCBD_MAIL_FIFO_R 0x3d -#define TCBD_MAIL_FIFO_R_LATCH 0x3d -#define TCBD_MAIL_FIFO_W 0x3e -#define TCBD_MAIL_FIFO_W_LATCH 0x3e -#define TCBD_MAIL_FIFO_WIND 0x3f - -#define TCBD_I2CMST_CTRL 0x40 -#define TCBD_I2CMST_FILTER 0x41 -#define TCBD_I2CMST_PRER_H 0x42 -#define TCBD_I2CMST_PRER_L 0x43 -#define TCBD_I2CMST_DEV_ADDR 0x44 -#define TCBD_I2CMST_TGT_ADDR 0x45 -#define TCBD_I2CMST_TXRX 0x46 -#define TCBD_I2CMST_AUTOCONFIG 0x47 -#define TCBD_I2CMST_START 0x48 -#define TCBD_I2CMST_STAT0 0x49 -#define TCBD_I2CMST_STAT1 0x4A - -#define TCBD_STREAMMIX_CFG0 0x4D - -#define TCBD_OBUFF_CONFIG 0x4e -#define TCBD_OBUFF_INIT 0x4f -#define TCBD_OBUFF_A_SADDR 0x50 -#define TCBD_OBUFF_A_EADDR 0x52 -#define TCBD_OBUFF_A_FIFO_THR 0x54 -#define TCBD_OBUFF_A_CIRBUFF_DATA_ADDR 0x54 -#define TCBD_OBUFF_A_FIFO_STAT 0x56 -#define TCBD_OBUFF_A_CIRBUFF_DATA_SIZE 0x56 -#define TCBD_OBUFF_B_SADDR 0x58 -#define TCBD_OBUFF_B_EADDR 0x5a -#define TCBD_OBUFF_B_FIFO_THR 0x5c -#define TCBD_OBUFF_B_CIRBUFF_DATA_ADDR 0x5c -#define TCBD_OBUFF_B_FIFO_STAT 0x5e -#define TCBD_OBUFF_B_CIRBUFF_DATA_SIZE 0x5e -#define TCBD_OBUFF_C_SADDR 0x60 -#define TCBD_OBUFF_C_EADDR 0x62 -#define TCBD_OBUFF_C_FIFO_THR 0x64 -#define TCBD_OBUFF_C_CIRBUFF_DATA_ADDR 0x64 -#define TCBD_OBUFF_C_FIFO_STAT 0x66 -#define TCBD_OBUFF_C_CIRBUFF_DATA_SIZE 0x66 -#define TCBD_OBUFF_D_SADDR 0x68 -#define TCBD_OBUFF_D_EADDR 0x6a -#define TCBD_OBUFF_D_FIFO_THR 0x6c -#define TCBD_OBUFF_D_CIRBUFF_DATA_ADDR 0x6c -#define TCBD_OBUFF_D_FIFO_STAT 0x6e -#define TCBD_OBUFF_D_CIRBUFF_DATA_SIZE 0x6e - -#define TCBD_RF_CFG0 0x70 -#define TCBD_RF_CFG1 0x71 -#define TCBD_RF_CFG2 0x72 -#define TCBD_RF_CFG3 0x73 -#define TCBD_RF_CFG4 0x74 -#define TCBD_RF_CFG5 0x75 -#define TCBD_RF_CFG6 0x76 -#define TCBD_OP_DEBUG0 0x78 -#define TCBD_OP_DEBUG1 0x79 -#define TCBD_OP_DEBUG2 0x7a -#define TCBD_OP_LDO_CONFIG 0x7b -#define TCBD_OP_XTAL_BIAS 0x7c -#define TCBD_OP_XTAL_BIAS_KEY 0x7d -#define TCBD_OP_STATUS0 0x7e -#define TCBD_OP_STATUS1 0x7f - - -#define TCBD_SYS_COMP_DSP Bit1 -#define TCBD_SYS_COMP_EP Bit0 -#define TCBD_SYS_COMP_ALL (Bit0|Bit1) - -#define TCBD_IRQ_MODE_PAD_ENABLE Bit2 -#define TCBD_IRQ_MODE_TRIGER Bit1 -#define TCBD_IRQ_MODE_LEVEL BitNONE -#define TCBD_IRQ_MODE_RISING Bit0 -#define TCBD_IRQ_MODE_FALLING BitNONE -#define TCBD_IRQ_EN_FIFODINIT Bit7 -#define TCBD_IRQ_EN_FIFOCINIT Bit6 -#define TCBD_IRQ_EN_FIFOBINIT Bit5 -#define TCBD_IRQ_EN_FIFOAINIT Bit4 -#define TCBD_IRQ_EN_DATAINT Bit3 -#define TCBD_IRQ_EN_I2C Bit1 -#define TCBD_IRQ_EN_MAILBOX Bit0 - -/* - * @DEFGROUP INTERRUPTSTATUS - * BIT POSTION OF INTERRUPT. - * @{ - */ -#define TCBD_IRQ_STAT_FIFODINIT Bit7 -#define TCBD_IRQ_STAT_FIFOCINIT Bit6 -#define TCBD_IRQ_STAT_FIFOBINIT Bit5 -#define TCBD_IRQ_STAT_FIFOAINIT Bit4 -#define TCBD_IRQ_STAT_DATAINT Bit3 -#define TCBD_IRQ_STAT_I2C Bit1 -#define TCBD_IRQ_STAT_MAILBOX Bit0 -/**}@*/ - - -/* - * @defgroup InterruptClear - * bit position of insterrupt clear. if you done processing interrupt - * then you must clear corresponding bit. - * @{ - */ -#define TCBD_IRQ_STATCLR_FIFODINIT Bit7 -#define TCBD_IRQ_STATCLR_FIFOCINIT Bit6 -#define TCBD_IRQ_STATCLR_FIFOBINIT Bit5 -#define TCBD_IRQ_STATCLR_FIFOAINIT Bit4 -#define TCBD_IRQ_STATCLR_DATAINT Bit3 -#define TCBD_IRQ_STATCLR_I2C Bit1 -#define TCBD_IRQ_STATCLR_MAILBOX Bit0 -#define TCBD_IRQ_STATCLR_ALL (Bit0|Bit1|Bit3|Bit4|Bit5|Bit6|Bit7) -/**}@*/ - - -/* - * @defgroup ErrorStatus - * error status of interrupt. - * if buffer overflow occurs then this bit is set. - * @{ - */ -#define TCBD_IRQ_ERROR_FIFOD Bit7 -#define TCBD_IRQ_ERROR_FIFOC Bit6 -#define TCBD_IRQ_ERROR_FIFOB Bit5 -#define TCBD_IRQ_ERROR_FIFOA Bit4 -#define TCBD_IRQ_ERROR_DATA Bit3 -#define TCBD_IRQ_ERROR_I2C Bit1 -#define TCBD_IRQ_ERROR_MAILBOX Bit0 -/**}@*/ -#define TCBD_I2CREPEAT_EN Bit2 -#define TCBD_I2CREPEAT_MODE_CONTINUE BitNONE -#define TCBD_I2CREPEAT_MODE_ONESHOT Bit1 -#define TCBD_I2CREPEAT_SCL_CMOS BitNONE -#define TCBD_I2CREPEAT_SCL_OPENDRAIN Bit0 -#define TCBD_I2CREPEAT_START Bit0 -#define TCBD_I2CREPEAT_STARTCTRL 0x4F - -#define TCBD_CMDDMA_DMAEN Bit7 -#define TCBD_CMDDMA_CIRCULARMODE Bit5 -#define TCBD_CMDDMA_CRC32EN Bit4 -#define TCBD_CMDDMA_ADDRFIX Bit3 -#define TCBD_CMDDMA_WRITEMODE Bit2 -#define TCBD_CMDDMA_READMODE BitNONE -#define TCBD_CMDDMA_BYTEMSB Bit1 -#define TCBD_CMDDMA_BITMSB Bit0 -#define TCBD_CMDDMA_START_AUTOCLR Bit7 -#define TCBD_CMDDMA_CRC32INIT_AUTOCLR Bit1 -#define TCBD_CMDDMA_INIT_AUTOCLR Bit0 - -#define TCBD_TGTBUFF_DEFAULT BitNONE -#define TCBD_TGTBUFF_CIR_MODE_C (Bit0|Bit1) -#define TCBD_TGTBUFF_CIR_MODE_B Bit1 -#define TCBD_TGTBUFF_CIR_MODE_A Bit0 - -#define TCBD_PERI_EN Bit7 -#define TCBD_PERI_SEL_SPI Bit4 -#define TCBD_PERI_SEL_TS Bit5 -#define TCBD_PERI_SEL_HPI (Bit4|Bit5) -#define TCBD_PERI_SEL_OTHER BitNONE -#define TCBD_PERI_INIT_AUTOCLR Bit1 -#define TCBD_PERI_HEADER_ON Bit0 -#define TCBD_PERI_SPI_TISSP Bit7 -#define TCBD_PERI_SPI_MOTOROLA_SSP BitNONE -#define TCBD_PERI_SPI_SLAVE Bit6 -#define TCBD_PERI_SPI_MASTER BitNONE -#define TCBD_PERI_SPI_FASTON Bit5 -#define TCBD_PERI_SPI_SIZE8BITB it0 -#define TCBD_PERI_SPI_SIZE16BIT Bit1 -#define TCBD_PERI_SPI_SIZE32BIT BitNONE -#define TCBD_PERI_TS_MSM_SLAVE Bit1 -#define TCBD_PERI_TS_NORMAL_SLAVE BitNONE -#define TCBD_PERI_TS_STS BitNONE -#define TCBD_PERI_TS_PTS Bit6 -#define TCBD_PERI_TS_FASTON Bit5 -#define TCBD_PERI_TS_TSCLKMASKON Bit4 -#define TCBD_PERI_HPI_INTEL Bit7 -#define TCBD_PERI_HPI_MOTOROLA BitNONE -#define TCBD_PERI_HPI_BYTEMSB Bit6 -#define TCBD_PERI_HPI_BITMSB Bit5 -#define TCBD_PERI_SPI_CLKINIT_LOW BitNONE -#define TCBD_PERI_SPI_CLKINIT_HIGH Bit7 -#define TCBD_PERI_SPI_CLKPOL_POS BitNONE -#define TCBD_PERI_SPI_CLKPOL_NEG Bit6 -#define TCBD_PERI_SPI_BYTEMSB1 Bit5 -#define TCBD_PERI_SPI_BITMSB1 Bit4 -#define TCBD_PERI_TS_CLKPHASE_POS BitNONE -#define TCBD_PERI_TS_CLKPHASE_NEG Bit7 -#define TCBD_PERI_TS_SYNC_ACTIVEHIGH BitNONE -#define TCBD_PERI_TS_SYNC_ACTIVELOW Bit6 -#define TCBD_PERI_TS_ENPOL_ACTIVEHIGH BitNONE -#define TCBD_PERI_TS_ENPOL_ACTIVELOW Bit5 -#define TCBD_PERI_TS_STREAM_WAIT_ON Bit4 -#define TCBD_PERI_TS_BYTEMSB Bit7 -#define TCBD_PERI_TS_BITMSB Bit6 -#define TCBD_PERI_TS_ERR_POL Bit1 -#define TCBD_PERI_TS_ERR_SIG_ON Bit0 -#define TCBD_PERI_TS_ERR_SIG_OFF BitNONE -#define TCBD_PERI_TEST0_START Bit7 -#define TCBD_PERI_TEST0_CIRCULAR_EN Bit2 -#define TCBD_PERI_TEST0_TESTMODE Bit1 -#define TCBD_PERI_TEST0_FIXMODE Bit0 - -#define TCBD_MAIL_INIT Bit6 -#define TCBD_MAIL_HOSTMAILPOST Bit5 -#define TCBD_MAIL_OPACCEPTEN Bit4 - -#define TCBD_I2CMST_INIT Bit7 -#define TCBD_I2CMST_EN Bit2 -#define TCBD_I2CMST_NORMALMODE BitNONE -#define TCBD_I2CMST_AUTOMODE Bit1 -#define TCBD_I2CMST_SCL_CMOS BitNONE -#define TCBD_I2CMST_SCL_OPENDRAIN Bit0 -#define TCBD_I2CMST_DEV_ADDR_WRITE BitNONE -#define TCBD_I2CMST_DEV_ADDR_READ Bit0 -#define TCBD_I2CMST_AUTOCONFIG_CMDQUE_ADD Bit7 -#define TCBD_I2CMST_AUTOCONFIG_CMDQUE_INIT Bit6 -#define TCBD_I2CMST_AUTOCONFIG_CMDQUE_CNT4 Bit4 -#define TCBD_I2CMST_AUTOCONFIG_CMDQUE_CNT3 Bit3 -#define TCBD_I2CMST_AUTOCONFIG_CMDQUE_CNT2 Bit2 -#define TCBD_I2CMST_AUTOCONFIG_CMDQUE_CNT1 Bit1 -#define TCBD_I2CMST_AUTOCONFIG_CMDQUE_CNT0 Bit0 -#define TCBD_I2CMST_AUTOSTART Bit7 -#define TCBD_I2CMST_NORMALSTART Bit4 -#define TCBD_I2CMST_NORMALSTOP Bit3 -#define TCBD_I2CMST_NORMALREAD Bit2 -#define TCBD_I2CMST_NORMALWRITE Bit1 -#define TCBD_I2CMST_NORMALACK Bit0 -#define TCBD_I2CMST_STAT0_NORMAL_ACKIN Bit7 -#define TCBD_I2CMST_STAT0_NORMAL_DONE Bit6 -#define TCBD_I2CMST_STAT0_ARBIT_LOST Bit5 -#define TCBD_I2CMST_STAT0_SDA Bit1 -#define TCBD_I2CMST_STAT0_SCL Bit0 -#define TCBD_I2CMST_STAT1_AUTOERR Bit7 -#define TCBD_I2CMST_STAT1_AUTODONE Bit6 -#define TCBD_I2CMST_STAT1_ARBIT_LOST Bit5 -#define TCBD_I2CMST_STAT1_RXRFIFOCNT4 Bit4 -#define TCBD_I2CMST_STAT1_RXRFIFOCNT3 Bit3 -#define TCBD_I2CMST_STAT1_RXRFIFOCNT2 Bit2 -#define TCBD_I2CMST_STAT1_RXRFIFOCNT1 Bit1 -#define TCBD_I2CMST_STAT1_RXRFIFOCNT0 Bit0 - -#define TCBD_RF_MANAGE_ENABLE Bit1 -#define TCBD_RF_MANAGE_DISABLE BitNONE -#define TCBD_RF_READ BitNONE -#define TCBD_RF_WRITE Bit0 -#define TCBD_RF_ACTION Bit0 - -#define TCBD_OBUFF_CONFIG_BUFF_D_EN Bit7 -#define TCBD_OBUFF_CONFIG_BUFF_C_EN Bit6 -#define TCBD_OBUFF_CONFIG_BUFF_B_EN Bit5 -#define TCBD_OBUFF_CONFIG_BUFF_A_EN Bit4 -#define TCBD_OBUFF_CONFIG_BUFF_D_CIRCULAR BitNONE -#define TCBD_OBUFF_CONFIG_BUFF_C_CIRCULAR BitNONE -#define TCBD_OBUFF_CONFIG_BUFF_B_CIRCULAR BitNONE -#define TCBD_OBUFF_CONFIG_BUFF_A_CIRCULAR BitNONE -#define TCBD_OBUFF_CONFIG_BUFF_D_FIFO Bit3 -#define TCBD_OBUFF_CONFIG_BUFF_C_FIFO Bit2 -#define TCBD_OBUFF_CONFIG_BUFF_B_FIFO Bit1 -#define TCBD_OBUFF_CONFIG_BUFF_A_FIFO Bit0 -#define TCBD_OBUFF_DBUFF_STATLATCH Bit7 -#define TCBD_OBUFF_CBUFF_STATLATCH Bit6 -#define TCBD_OBUFF_BBUFF_STATLATCH Bit5 -#define TCBD_OBUFF_ABUFF_STATLATCH Bit4 -#define TCBD_OBUFF_BUFF_D_INIT Bit3 -#define TCBD_OBUFF_BUFF_C_INIT Bit2 -#define TCBD_OBUFF_BUFF_B_INIT Bit1 -#define TCBD_OBUFF_BUFF_A_INIT Bit0 - -/** - * @defgroup StreamDataConfig - * You can mask unused buffer by @ref tcbd_init_stream_data_config - */ -/** @{*/ -#define STREAM_DATA_ENABLE Bit7 -#define STREAM_HEADER_ON Bit6 -#define STREAM_MASK_BUFFERD Bit3 -#define STREAM_MASK_BUFFERC Bit2 -#define STREAM_MASK_BUFFERB Bit1 -#define STREAM_MASK_BUFFERA Bit0 - -#define STREAM_BUFFER_ALL (\ - STREAM_DATA_ENABLE | \ - STREAM_HEADER_ON | \ - STREAM_MASK_BUFFERD | \ - STREAM_MASK_BUFFERC | \ - STREAM_MASK_BUFFERB | \ - STREAM_MASK_BUFFERA) -/**@}*/ - -#define STREAM_CMD_FIFO_MSB Bit0 -#define STREAM_CMD_FIFO_ENABLE Bit1 -#define STREAM_CMD_FIFO_INIT Bit4 -#define STREAM_LATCH_TOTAL_SIZE Bit5 - -/** - * @defgroup TypesOfStream - * Types of stream. - * You can change the type of stream by @ref tcbd_change_stream_type - */ -/** @{*/ -#define STREAM_TYPE_GARBAGE Bit7 -#define STREAM_TYPE_DAB_PLUS Bit6 -#define STREAM_TYPE_EPM Bit5 -#define STREAM_TYPE_DMB Bit4 -#define STREAM_TYPE_DAB Bit3 -#define STREAM_TYPE_FIC Bit2 -#define STREAM_TYPE_FIB_FILTER Bit1 -#define STREAM_TYPE_STATUS Bit0 - -#define STREAM_TYPE_ALL \ - (STREAM_TYPE_DAB_PLUS |\ - STREAM_TYPE_EPM |\ - STREAM_TYPE_DMB |\ - STREAM_TYPE_DAB |\ - STREAM_TYPE_FIC |\ - STREAM_TYPE_FIB_FILTER |\ - STREAM_TYPE_STATUS) - -#define STREAM_SET_GARBAGE(_garbage)\ - (((_garbage >> 2) << 16) | STREAM_TYPE_GARBAGE) -/**@}*/ - -#define IRQ_ERR_MAILBOX Bit0 -#define IRQ_ERR_I2C Bit1 -#define IRQ_ERR_DATA Bit3 -#define IRQ_ERR_BUFFERA Bit4 -#define IRQ_ERR_BUFFERB Bit5 -#define IRQ_ERR_BUFFERC Bit6 -#define IRQ_ERR_BUFFERD Bit7 - -#define MB_CMD_READ 0 -#define MB_CMD_WRITE 1 - -#define MB_ERR_OK 0x00 -#define MB_ERR_CMD 0x01 -#define MB_ERR_PARA 0x02 - -#define MBCMD_SYS (0x00<<11) -#define MBPARA_SYS_WARMBOOT (MBCMD_SYS | 0x00) -#define MBPARA_SYS_START (MBCMD_SYS | 0x01) -#define MBPARA_SYS_SYNC (MBCMD_SYS | 0x02) - -#define MBPARA_SYS_DAB_STREAM_SET (MBCMD_SYS | 0x0D) -#define MBPARA_SYS_DAB_STREAM_ON (MBCMD_SYS | 0x0E) -#define MBPARA_SYS_DAB_RECONFIG_CLR (MBCMD_SYS | 0x12) - -#define MBPARA_SYS_DAB_MCI_UPDATE (MBCMD_SYS | 0x0c) -#define MBPARA_SYS_DAB_DP_FLT (MBCMD_SYS | 0x0f) -#define MBPARA_SYS_DAB_RESYNC_PARAM (MBCMD_SYS | 0x10) -#define MBPARA_SYS_DAB_RESYNC_RESULT (MBCMD_SYS | 0x11) -#define MBPARA_SYS_DAB_RF_FREQ_NO (MBCMD_SYS | 0x20) -#define MBPARA_SYS_DAB_RF_FREQ (MBCMD_SYS | 0x21) -#define MBPARA_SYS_DAB_ASM_VER (MBCMD_SYS | 0xff) - -#define MBCMD_AGC_DAB (0x01<<11) -#define MBCMD_AGC_DAB_CFG (MBCMD_AGC_DAB | 0) -#define MBCMD_AGC_DAB_GAIN (MBCMD_AGC_DAB | 1) -#define MBCMD_AGC_DAB_JAM (MBCMD_AGC_DAB | 2) -#define MBCMD_AGC_DAB_3 (MBCMD_AGC_DAB | 3) -#define MBCMD_AGC_DAB_4 (MBCMD_AGC_DAB | 4) -#define MBCMD_AGC_DAB_5 (MBCMD_AGC_DAB | 5) -#define MBCMD_AGC_DAB_6 (MBCMD_AGC_DAB | 6) -#define MBCMD_AGC_DAB_7 (MBCMD_AGC_DAB | 7) -#define MBCMD_AGC_DAB_8 (MBCMD_AGC_DAB | 8) -#define MBCMD_AGC_DAB_9 (MBCMD_AGC_DAB | 9) -#define MBCMD_AGC_DAB_A (MBCMD_AGC_DAB | 10) -#define MBCMD_AGC_DAB_B (MBCMD_AGC_DAB | 11) -#define MBCMD_AGC_DAB_C (MBCMD_AGC_DAB | 12) -#define MBCMD_AGC_DAB_D (MBCMD_AGC_DAB | 13) -#define MBCMD_AGC_DAB_E (MBCMD_AGC_DAB | 14) -#define MBCMD_AGC_DAB_F (MBCMD_AGC_DAB | 15) - -#define MBCMD_FP_DAB (0x02 << 11) -#define MBCMD_FP_DAB_CFG (MBCMD_FP_DAB | 0) -#define MBCMD_FP_DAB_IIR (MBCMD_FP_DAB | 1) - -#define MBCMD_CTO_DAB (0x04<<11) -#define MBCMD_CTO_DAB_PARAM (MBCMD_CTO_DAB | 0x00) -#define MBCMD_CTO_DAB_RESULT (MBCMD_CTO_DAB | 0x01) - -#define MBCMD_CFO_DAB (0x06<<11) -#define MBCMD_CFO_DAB_PARAM (MBCMD_CFO_DAB | 0x00) -#define MBCMD_CFO_DAB_RESULT (MBCMD_CFO_DAB | 0x01) - -#define MBCMD_FFO_DAB (0x07<<11) -#define MBCMD_FTO_DAB (0x0A<<11) - -#define MBCMD_SFE_DAB (0x0B<<11) -#define MBCMD_SFE_DAB_PARAM (MBCMD_SFE_DAB | 0x00) -#define MBCMD_SFE_DAB_RESULT (MBCMD_SFE_DAB | 0x01) - -#define MBCMD_CIR_DAB (0x0C<<11) -#define MBCMD_CIR_DAB_PARAM (MBCMD_CIR_DAB | 0x00) -#define MBCMD_CIR_DAB_RESULT (MBCMD_CIR_DAB | 0x01) - -#define MBCMD_DP_DAB (0x10<<11) -#define MBCMD_DP_DAB_RESULT (MBCMD_DP_DAB | 0x00) -#define MBCMD_DP_DAB_CFG1 (MBCMD_DP_DAB | 0x01) -#define MBCMD_DP_DAB_CFG2 (MBCMD_DP_DAB | 0x02) - -#define MBCMD_DEBUG_DAB (0x1F<<11) - -#define MBPARA_SYS_VERSION (MBCMD_SYS | 0xFF) - -#define MBPARA_SYS_NUM_FREQ (MBCMD_SYS | 0x20) -#define MBPARA_SYS_FREQ_0_6 (MBCMD_SYS | 0x21) -#define MBPARA_SYS_FREQ_7_13 (MBCMD_SYS | 0x22) -#define MBPARA_SYS_FREQ_14_20 (MBCMD_SYS | 0x23) -#define MBPARA_SYS_FREQ_21_27 (MBCMD_SYS | 0x24) - -#define MBCMD_SEL_CH_INFO (0x13<<11) -#define MBPARA_SEL_CH_INFO_PRAM (MBCMD_SEL_CH_INFO | 0x00) -#define MBPARA_SEL_CH_INFO_RESULT (MBCMD_SEL_CH_INFO | 0x01) - -#define MBCMD_VARI_OSC (0x15<<11) -#define MBCMD_VARI_OSC_SPUR (MBCMD_VARI_OSC | 0x00) -#define MBCMD_VARI_OSC_RCSTEP (MBCMD_VARI_OSC | 0x01) -#define MBCMD_VARI_OSC_RFPLL (MBCMD_VARI_OSC | 0x02) - -#ifndef BITSET -#define BITSET(X, MASK) ((X) |= (u32)(MASK)) -#endif - -#ifndef BITSCLR -#define BITSCLR(X, SMASK, CMASK)\ - ((X) = ((\ - ((u32)(X)) |\ - ((u32)(SMASK))) & ~((u32)(CMASK)))) -#endif -#ifndef BITCSET -#define BITCSET(X, CMASK, SMASK)\ - ((X) = (\ - (((u32)(X)) & ~((u32)(CMASK))) |\ - ((u32)(SMASK)))) -#endif -#ifndef BITCLR -#define BITCLR(X, MASK) ((X) &= ~((u32)(MASK))) -#endif -#ifndef BITXOR -#define BITXOR(X, MASK) ((X) ^= (u32)(MASK)) -#endif -#ifndef ISZERO -#define ISZERO(X, MASK)\ - (!(((u32)(X)) & ((u32)(MASK)))) -#endif - -#ifndef ISSET -#define ISSET(X, MASK) ((u32)(X) & ((u32)(MASK))) -#endif - -#endif /*__TCBD_DRV_REGISTER_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_drv_rf.h b/drivers/media/tdmb/tcc3170/inc/tcbd_drv_rf.h deleted file mode 100644 index fdee599..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_drv_rf.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * tcbd_drv_rf.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_DRV_RF_H__ -#define __TCBD_DRV_RF_H__ - -TCBB_FUNC s32 tcbd_rf_init( - struct tcbd_device *_device, enum tcbd_band_type _band); -TCBB_FUNC s32 tcbd_rf_tune_frequency( - struct tcbd_device *_device, u32 _freq_khz, s32 _bw_khz); - -#endif /*__TCBD_DRV_RF_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_error.h b/drivers/media/tdmb/tcc3170/inc/tcbd_error.h deleted file mode 100644 index 6b66a70..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_error.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * tcbd_error.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_ERROR_H__ -#define __TCBD_ERROR_H__ - -/** - * @defgroup ListOfErrorCode - * If API fails then above error code will be returned. - * Error codes can be combined with each other. - */ -/** @{*/ -#define TCERR_SUCCESS 0x00000000 -#define TCERR_INVALID_ARG 0x00000001 -#define TCERR_BROKEN_MAIL_HEADER 0x00000002 -#define TCERR_UNKNOWN_MAIL_STATUS 0x00000004 -#define TCERR_WAIT_MAIL_TIMEOUT 0x00000008 -#define TCERR_CRC_FAIL 0x00000010 -#define TCERR_ACK_FAIL 0x00000020 -#define TCERR_OS_DRIVER_FAIL 0x00000040 -#define TCERR_CANNOT_ACCESS_MAIL 0x00000080 -#define TCERR_UNKNOWN_BAND 0x00000100 -#define TCERR_TUNE_FAILED 0x00000200 -#define TCERR_MAX_NUM_SERVICE 0x00000400 -#define TCERR_SERVICE_NOT_FOUND 0x00000800 -#define TCERR_NO_FIC_DATA 0x00001000 -#define TCERR_IO_NOT_INITIALIZED 0x00002000 -#define TCERR_WARMBOOT_FAIL 0x00004000 -#define TCERR_AREADY_REGISTERED 0x00008000 -#define TCERR_FATAL_ERROR 0x10000000 -/**@}*/ - - -#endif /*__TCBD_ERROR_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_feature.h b/drivers/media/tdmb/tcc3170/inc/tcbd_feature.h deleted file mode 100644 index 53fb880..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_feature.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * tcbd_feature.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_API_FEATURE_H__ -#define __TCBD_API_FEATURE_H__ - -#define __AGC_TABLE_IN_DSP__ - -#define __CSPI_ONLY__ -#undef __I2C_STS__ - -#undef __ALWAYS_FIC_ON__ -#undef __CALLBACK_BUFFER_HEADER__ - -#if defined(__I2C_STS__) -#define __STATUS_IN_REGISTER__ -#else /*__I2C_STS__*/ -#undef __STATUS_IN_REGISTER__ -#define __STATUS_IN_STREAM__ -#endif /*!__I2C_STS__*/ - -#if defined(__CSPI_ONLY__) -#define __READ_FIXED_LENGTH__ -#undef __READ_VARIABLE_LENGTH__ -#endif /*__CSPI_ONLY__*/ - -#undef __DEBUG_DSP_ROM__ - -#define TCBD_MAX_NUM_SERVICE 6 - -#define TCBD_DEF_BANDWIDTH (1500) -#define TCBD_STATUS_SIZE (32) -#define TCBD_FIC_SIZE (388) -#define TCBD_TS_SIZE (188) -#define TCBD_OP_HEADER_SIZE (4) -#define TCBD_MAX_FIFO_SIZE (1024*16) -#define TCBD_CHIPID_VALUE (0x37) - -#if defined(__STATUS_IN_REGISTER__) -#if defined(__CSPI_ONLY__) -#define TCBD_THRESHOLD_FIC\ - (TCBD_FIC_SIZE + TCBD_STATUS_SIZE + TCBD_OP_HEADER_SIZE*2) -#elif defined(__I2C_STS__) -#define TCBD_THRESHOLD_FIC (TCBD_FIC_SIZE) -#else /*__I2C_STS__*/ -#error "you must define __I2C_STS__ or __CSPI_ONLY__" -#endif /*!__CSPI_ONLY__ && !__I2C_STS__*/ -#else /* __STATUS_IN_REGISTER__ */ -#define TCBD_THRESHOLD_FIC\ - (TCBD_FIC_SIZE+TCBD_STATUS_SIZE+TCBD_OP_HEADER_SIZE*2) -#endif /* !__STATUS_IN_REGISTER__ */ - -#if defined(__CSPI_ONLY__) -#define TCBD_BUFFER_A_SIZE (TCBD_MAX_FIFO_SIZE) -#define TCBD_BUFFER_B_SIZE (0x0) -#define TCBD_BUFFER_C_SIZE (0x0) -#define TCBD_BUFFER_D_SIZE (0x0) - -#define TCBD_MAX_THRESHOLD (((1024*7)>>2)<<2) - -#elif defined(__I2C_STS__) -#define TCBD_BUFFER_A_SIZE (TCBD_THRESHOLD_FIC) -#define TCBD_BUFFER_B_SIZE \ - (((TCBD_MAX_FIFO_SIZE-TCBD_BUFFER_A_SIZE)>>2)<<2) -#define TCBD_BUFFER_C_SIZE (0x0) -#define TCBD_BUFFER_D_SIZE (0x0) - -#define TCBD_MAX_THRESHOLD (((TCBD_BUFFER_B_SIZE>>1)>>2)<<2) -#endif /* __I2C_STS__ */ - -#define PHY_BASE_ADDR (0x80000000) -#define PHY_MEM_FIFO_START_ADDR (0x00000000) -#define PHY_MEM_ADDR_A_START (PHY_BASE_ADDR + 0xa000) -#define PHY_MEM_ADDR_A_END\ - (PHY_MEM_ADDR_A_START+TCBD_BUFFER_A_SIZE-1) -#define PHY_MEM_ADDR_B_START\ - (PHY_MEM_ADDR_A_END+1) -#define PHY_MEM_ADDR_B_END\ - (PHY_MEM_ADDR_B_START+TCBD_BUFFER_B_SIZE-1) -#define PHY_MEM_ADDR_C_START\ - (PHY_MEM_ADDR_B_END+1) -#define PHY_MEM_ADDR_C_END\ - (PHY_MEM_ADDR_C_START+TCBD_BUFFER_C_SIZE-1) -#define PHY_MEM_ADDR_D_START\ - (PHY_MEM_ADDR_C_END+1) -#define PHY_MEM_ADDR_D_END\ - (PHY_MEM_ADDR_D_START+TCBD_BUFFER_D_SIZE-1) - -/* CODE Memory Setting */ -#define START_PC (0x0000) -#define START_PC_OFFSET (0x8000) -#define CODE_MEM_BASE (PHY_BASE_ADDR+START_PC_OFFSET) -#define CODE_TABLEBASE_RAND (0xF0020000) -#define CODE_TABLEBASE_DINT (0xF0024000) -#define CODE_TABLEBASE_DAGU (0xF0028000) -#define CODE_TABLEBASE_COL_ORDER (0xF002C000) - -/* lock check time definition */ -#define TDMB_OFDMDETECT_LOCK (100) -#define TDMB_OFDMDETECT_RETRY (2) -#define TDMB_CTO_LOCK (100) -#define TDMB_CTO_RETRY (3) -#define TDMB_CFO_LOCK (20) -#define TDMB_CFO_RETRY (3) - -#endif /*__TCBD_API_FEATURE_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_hal.h b/drivers/media/tdmb/tcc3170/inc/tcbd_hal.h deleted file mode 100644 index 634381b..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_hal.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * tcbd_hal.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_HAL_H__ -#define __TCBD_HAL_H__ - -#define IRQ_TC317X 6 -/* #define __USE_TC_CPU__ */ - -void tchal_init(void); -void tchal_reset_device(void); -void tchal_power_on_device(void); -void tchal_power_down_device(void); -void tchal_irq_setup(void); - -#endif /*__TCBD_HAL_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcbd_stream_parser/tcbd_stream_parser.h b/drivers/media/tdmb/tcc3170/inc/tcbd_stream_parser/tcbd_stream_parser.h deleted file mode 100644 index f9b0ab1..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcbd_stream_parser/tcbd_stream_parser.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * tcbd_stream_parser.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCBD_STREAM_PARSER_H__ -#define __TCBD_STREAM_PARSER_H__ - -#undef __MERGE_EACH_TYPEOF_STREAM__ - -#define SIZE_BUFF_HEADER 4 /*[TYPE(1)][SUBCH(1)][SIZE(2)]*/ - -enum DATA_TYPE { - DATA_TYPE_MSC = 0, - DATA_TYPE_FIC, - DATA_TYPE_STATUS, - DATA_TYPE_OTHER, - DATA_TYPE_MAX -}; - -typedef s32 (*tcbd_stream_callback)(s32 _dev_idx, u8 *_stream, s32 _size, - u8 _subch_id, u8 _type); - -TCBB_FUNC void tcbd_init_parser(s32 _dev_idx, - tcbd_stream_callback _streamCallback); -TCBB_FUNC s32 tcbd_split_stream(s32 _dev_idx, u8 *_stream, s32 _size); - -#endif /*__TCBD_STREAM_PARSER_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcc317x_boot_tdmb.h b/drivers/media/tdmb/tcc3170/inc/tcc317x_boot_tdmb.h deleted file mode 100644 index b334fce..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcc317x_boot_tdmb.h +++ /dev/null @@ -1,1011 +0,0 @@ -#ifndef __TCC317X_BOOT_TDMB_H__ -#define __TCC317X_BOOT_TDMB_H__ -/* - * asm file: E:\Works\ASM\TCC3500_ASM_BIN\TCC3170\LG\TCC317X_LG_v1_0_17.rom - * Created : 2012-05-04 09:54:27 - */ -#define TCC317X_BOOT_SIZE_TDMB 7996 - -unsigned char TCC317X_BOOT_DATA_TDMB[TCC317X_BOOT_SIZE_TDMB] = { - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1F, 0x14, - 0xAB, 0x00, 0x04, 0x60, 0x17, 0x05, 0x00, 0x00, - 0xAB, 0x00, 0x0C, 0xA0, 0x17, 0x05, 0x00, 0x00, - 0xAB, 0xB4, 0x00, 0xE0, 0x17, 0x05, 0x00, 0x00, - 0xAB, 0xC2, 0x01, 0x20, 0x18, 0x05, 0x00, 0x00, - 0xAB, 0x28, 0x00, 0x60, 0x18, 0x05, 0x00, 0x00, - 0xAB, 0xB4, 0x00, 0xA0, 0x18, 0x05, 0x00, 0x00, - 0xAB, 0x20, 0x00, 0x20, 0x19, 0x05, 0x00, 0x00, - 0xAB, 0x1C, 0x00, 0x60, 0x19, 0x05, 0x00, 0x00, - 0xAB, 0x1C, 0x00, 0xA0, 0x19, 0x05, 0x00, 0x00, - 0xAB, 0x16, 0x00, 0xE0, 0x19, 0x05, 0x00, 0x00, - 0xAB, 0x1A, 0x00, 0x20, 0x1A, 0x05, 0x00, 0x00, - 0xAB, 0x10, 0x00, 0x60, 0x1A, 0x05, 0x00, 0x00, - 0xAB, 0x84, 0x03, 0xA0, 0x1A, 0x05, 0x00, 0x00, - 0xAB, 0xB8, 0x0B, 0xE0, 0x1A, 0x05, 0x00, 0x00, - 0xAB, 0x00, 0x00, 0x20, 0x1B, 0x05, 0x00, 0x00, - 0xAB, 0x00, 0x00, 0x60, 0x1D, 0x05, 0x00, 0x00, - 0xAB, 0x00, 0x00, 0xA0, 0x1D, 0x05, 0x00, 0x00, - 0xAB, 0x30, 0x00, 0xE0, 0x18, 0x05, 0x00, 0x00, - 0xAB, 0x10, 0x00, 0xE0, 0x1D, 0x05, 0x00, 0x00, - 0xAB, 0x74, 0x15, 0x21, 0x1E, 0x05, 0x00, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x44, 0x00, - 0xCB, 0x08, 0x00, 0x00, 0x00, 0x22, 0x44, 0x00, - 0xCB, 0x3C, 0x0A, 0x00, 0x00, 0x26, 0x44, 0x00, - 0xCB, 0x60, 0x20, 0x00, 0x00, 0x2A, 0x44, 0x00, - 0xCB, 0x6E, 0x14, 0xA0, 0x28, 0x2E, 0x44, 0x00, - 0xCB, 0xFE, 0x00, 0x00, 0x00, 0x6A, 0x44, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x44, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0x72, 0x44, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0x76, 0x44, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x44, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x44, 0x00, - 0xCB, 0x88, 0xFE, 0x59, 0x81, 0x83, 0x44, 0x00, - 0xCB, 0x88, 0xFE, 0x59, 0x81, 0x87, 0x44, 0x00, - 0xCB, 0xA6, 0xFE, 0x3D, 0x06, 0x8A, 0x44, 0x00, - 0xCB, 0x0E, 0xFE, 0x3D, 0x02, 0x8E, 0x44, 0x00, - 0xCB, 0x44, 0x00, 0x10, 0x00, 0x92, 0x44, 0x00, - 0xCB, 0x4A, 0x00, 0x00, 0x00, 0x96, 0x44, 0x00, - 0xCB, 0x7E, 0xB1, 0xE4, 0x17, 0x9B, 0x44, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x44, 0x00, - 0xCB, 0x10, 0x04, 0x00, 0x40, 0xFB, 0x45, 0x00, - 0xCB, 0x00, 0x0D, 0x00, 0x40, 0xFF, 0x45, 0x00, - 0xCB, 0xE0, 0x00, 0x00, 0x40, 0x13, 0x46, 0x00, - 0xCB, 0x78, 0x02, 0x00, 0x40, 0x17, 0x46, 0x00, - 0xCB, 0x12, 0xCA, 0xFE, 0x51, 0xA2, 0x44, 0x00, - 0xCB, 0x5A, 0x04, 0x52, 0xE8, 0xA7, 0x44, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0xAB, 0x44, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0xAE, 0x44, 0x00, - 0xCB, 0x58, 0x12, 0xAE, 0xE6, 0xB3, 0x44, 0x00, - 0xCB, 0x06, 0x0A, 0x10, 0x10, 0xB6, 0x44, 0x00, - 0xCB, 0x1C, 0x92, 0x22, 0x00, 0xBA, 0x44, 0x00, - 0xCB, 0x78, 0x82, 0x9E, 0x00, 0xBE, 0x44, 0x00, - 0xCB, 0xF0, 0x04, 0x3D, 0x01, 0xC2, 0x44, 0x00, - 0xCB, 0x3C, 0x8E, 0x4A, 0x00, 0xC6, 0x44, 0x00, - 0xCB, 0x40, 0x06, 0x00, 0x0C, 0xCB, 0x44, 0x00, - 0xCB, 0x80, 0x00, 0x00, 0x00, 0x06, 0x44, 0x01, - 0x01, 0x00, 0xCB, 0xA2, 0xCA, 0x99, 0x35, 0x02, - 0x44, 0x01, 0xCB, 0x40, 0x00, 0x00, 0x00, 0x06, - 0x44, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x0E, 0x04, 0x2A, 0x3F, 0x5E, 0xA2, - 0x6A, 0x3F, 0x88, 0x23, 0xCB, 0x3E, 0xFE, 0xFF, - 0xFF, 0x93, 0x44, 0x01, 0x0F, 0x31, 0x01, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x0F, 0x31, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x2F, 0x03, 0x51, - 0x04, 0x00, 0x00, 0x00, 0x0F, 0x31, 0x1F, 0x0E, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x31, 0x1F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x01, 0x46, 0x22, - 0x8B, 0x05, 0x89, 0x80, 0x8C, 0x51, 0x00, 0x00, - 0x6A, 0x01, 0x1A, 0xA3, 0x8B, 0x25, 0x89, 0x80, - 0x81, 0x51, 0x00, 0x00, 0x8B, 0x2D, 0x89, 0x80, - 0x82, 0x51, 0x00, 0x00, 0x8B, 0x35, 0x89, 0x80, - 0x83, 0x51, 0x00, 0x00, 0x8B, 0x3D, 0x89, 0x80, - 0x8A, 0x51, 0x00, 0x00, 0xCB, 0x06, 0x00, 0x00, - 0x00, 0x02, 0x46, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0xAB, 0x0E, 0x00, 0x20, - 0xE0, 0x14, 0x00, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x12, 0x46, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x16, 0x46, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x1A, 0x46, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x1E, 0x46, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x22, 0x46, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x26, 0x46, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x2E, 0x46, 0x01, 0xAB, 0x02, 0x00, 0xA0, - 0xE0, 0x14, 0x00, 0x00, 0x0F, 0x99, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xAE, 0xC7, 0x00, 0x00, - 0x2E, 0x4F, 0x44, 0x01, 0x6E, 0x50, 0xD8, 0x05, - 0xAE, 0x50, 0x7C, 0x02, 0xEE, 0x50, 0xAC, 0x01, - 0x2E, 0x51, 0x8C, 0x06, 0x6E, 0x51, 0x60, 0x4A, - 0x2E, 0x42, 0x00, 0x08, 0x0F, 0x25, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x37, 0xC3, 0x07, - 0x00, 0x00, 0x01, 0x00, 0xCB, 0x20, 0x00, 0x00, - 0x00, 0x02, 0x40, 0x01, 0xCB, 0x00, 0x0C, 0x01, - 0x28, 0x83, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x20, - 0x00, 0x86, 0x40, 0x01, 0xCB, 0xFE, 0xFF, 0xFF, - 0xFF, 0x8B, 0x40, 0x01, 0xCB, 0x00, 0x70, 0x00, - 0x00, 0x8E, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x3E, 0x93, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x96, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x9A, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x9E, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x40, - 0x08, 0xA2, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xA6, 0x40, 0x01, 0xCB, 0x00, 0x90, 0x00, - 0x00, 0xAA, 0x40, 0x01, 0xCB, 0xFE, 0x9F, 0xFC, - 0x07, 0xAE, 0x40, 0x01, 0xCB, 0x00, 0x80, 0x00, - 0x00, 0xB2, 0x40, 0x01, 0xCB, 0xFE, 0x8F, 0xFC, - 0x07, 0xB6, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xBA, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xBE, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xC2, 0x40, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0x40, 0x01, 0xCB, 0xE0, 0xFF, 0x21, - 0x00, 0x42, 0x47, 0x01, 0xCB, 0x90, 0x08, 0x24, - 0x0D, 0x56, 0x47, 0x01, 0xCB, 0xB6, 0x0D, 0xB6, - 0x0D, 0x5A, 0x47, 0x01, 0xCB, 0xD8, 0x16, 0xDA, - 0x16, 0x5E, 0x47, 0x01, 0xCB, 0x5A, 0x1B, 0xEC, - 0x1F, 0x62, 0x47, 0x01, 0xCB, 0x20, 0x64, 0x88, - 0xA8, 0x66, 0x47, 0x01, 0xCB, 0xAA, 0xCC, 0xEC, - 0xEE, 0x6A, 0x47, 0x01, 0xCB, 0x30, 0x33, 0x55, - 0x75, 0x6F, 0x47, 0x01, 0xCB, 0x76, 0x99, 0xB9, - 0xFD, 0x73, 0x47, 0x01, 0xCB, 0x40, 0x00, 0x48, - 0x02, 0x76, 0x47, 0x01, 0xCB, 0xE0, 0x05, 0xF8, - 0x07, 0x7A, 0x47, 0x01, 0xCB, 0x40, 0x00, 0xC4, - 0x00, 0x7E, 0x47, 0x01, 0xCB, 0x0A, 0x02, 0x96, - 0x03, 0x82, 0x47, 0x01, 0xCB, 0xA0, 0x04, 0x2A, - 0x06, 0x86, 0x47, 0x01, 0xCB, 0x76, 0x07, 0xFC, - 0x07, 0x8A, 0x47, 0x01, 0xCB, 0x02, 0x00, 0x00, - 0x80, 0x33, 0x47, 0x01, 0xCB, 0x04, 0x32, 0x00, - 0x00, 0x36, 0x47, 0x01, 0xCB, 0x6E, 0x01, 0x00, - 0x00, 0x3A, 0x47, 0x01, 0xCB, 0x02, 0x00, 0x00, - 0x80, 0x3F, 0x47, 0x01, 0xCB, 0xFE, 0x07, 0xFE, - 0x07, 0xC2, 0x46, 0x01, 0xCB, 0x1E, 0x00, 0x00, - 0x00, 0xD6, 0x46, 0x01, 0xCB, 0x3E, 0x00, 0x20, - 0x00, 0xDA, 0x46, 0x01, 0xCB, 0xBE, 0x00, 0x40, - 0x00, 0xDE, 0x46, 0x01, 0xCB, 0xDE, 0x00, 0xC0, - 0x00, 0xE2, 0x46, 0x01, 0x8B, 0x65, 0x88, 0x82, - 0xB9, 0x51, 0x00, 0x00, 0xCB, 0x20, 0x02, 0xFE, - 0x03, 0x9E, 0x47, 0x01, 0xCB, 0xFE, 0xFF, 0x43, - 0x20, 0xFA, 0x46, 0x01, 0xCB, 0x22, 0x00, 0x00, - 0x00, 0xBA, 0x47, 0x01, 0xAB, 0x08, 0x01, 0x21, - 0xF0, 0x14, 0x00, 0x00, 0xCB, 0x04, 0xB0, 0x80, - 0x00, 0xDE, 0x47, 0x01, 0xCB, 0x06, 0x16, 0x00, - 0x02, 0xE2, 0x47, 0x01, 0xCB, 0x02, 0x18, 0x00, - 0x08, 0xE6, 0x47, 0x01, 0xCB, 0x00, 0x20, 0x00, - 0x00, 0x16, 0x47, 0x01, 0x0E, 0x03, 0x00, 0x00, - 0x06, 0x20, 0xBD, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xDA, 0x47, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xCE, 0x47, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xD2, 0x47, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xD6, 0x47, 0x00, 0x0F, 0x99, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0xDD, 0x44, 0x2A, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x2B, 0x17, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x46, 0x04, 0x26, 0x04, - 0xAB, 0x00, 0x00, 0x00, 0x0B, 0x03, 0x00, 0x00, - 0xCB, 0x80, 0x10, 0x60, 0x15, 0x4E, 0x47, 0x00, - 0xCB, 0x40, 0x18, 0x20, 0x1D, 0x52, 0x47, 0x00, - 0xCB, 0x00, 0x23, 0x82, 0x18, 0x56, 0x47, 0x00, - 0xCB, 0x62, 0x1D, 0x42, 0x23, 0x5A, 0x47, 0x00, - 0xCB, 0x22, 0x2A, 0x02, 0x34, 0x5E, 0x47, 0x00, - 0xCB, 0x84, 0x1D, 0x64, 0x23, 0x62, 0x47, 0x00, - 0xCB, 0x44, 0x2A, 0x24, 0x34, 0x66, 0x47, 0x00, - 0xCB, 0x86, 0x20, 0x66, 0x2A, 0x6A, 0x47, 0x00, - 0xCB, 0x46, 0x30, 0x26, 0x3A, 0x6E, 0x47, 0x00, - 0xCB, 0x06, 0x46, 0x88, 0x28, 0x72, 0x47, 0x00, - 0xCB, 0x68, 0x34, 0x48, 0x3A, 0x76, 0x47, 0x00, - 0xCB, 0x28, 0x46, 0x08, 0x54, 0x7A, 0x47, 0x00, - 0xCB, 0x8A, 0x30, 0x6A, 0x3A, 0x7E, 0x47, 0x00, - 0xCB, 0x4A, 0x46, 0x2A, 0x54, 0x82, 0x47, 0x00, - 0xCB, 0x0A, 0x68, 0x8C, 0x3A, 0x86, 0x47, 0x00, - 0xCB, 0x6C, 0x46, 0x4C, 0x54, 0x8A, 0x47, 0x00, - 0xCB, 0x2C, 0x68, 0x8E, 0x40, 0x8E, 0x47, 0x00, - 0xCB, 0x6E, 0x54, 0x4E, 0x60, 0x92, 0x47, 0x00, - 0xCB, 0x2E, 0x74, 0x0E, 0x8C, 0x96, 0x47, 0x00, - 0xCB, 0x90, 0x50, 0x70, 0x68, 0x9A, 0x47, 0x00, - 0xCB, 0x50, 0x74, 0x30, 0x8C, 0x9E, 0x47, 0x00, - 0xCB, 0x10, 0xA8, 0x92, 0x60, 0xA2, 0x47, 0x00, - 0xCB, 0x72, 0x74, 0x52, 0x8C, 0xA6, 0x47, 0x00, - 0xCB, 0x32, 0xA8, 0x12, 0xD0, 0xAA, 0x47, 0x00, - 0xCB, 0x94, 0x74, 0x74, 0x8C, 0xAE, 0x47, 0x00, - 0xCB, 0x54, 0xA8, 0x34, 0xD0, 0xB2, 0x47, 0x00, - 0xCB, 0x14, 0xE8, 0x96, 0x80, 0xB6, 0x47, 0x00, - 0xCB, 0x76, 0xA8, 0x56, 0xC0, 0xBA, 0x47, 0x00, - 0xCB, 0x36, 0xE8, 0x16, 0x18, 0xBF, 0x47, 0x00, - 0xCB, 0x98, 0xA0, 0x78, 0xD0, 0xC2, 0x47, 0x00, - 0xCB, 0x38, 0x18, 0x9B, 0xC0, 0xC6, 0x47, 0x00, - 0xCB, 0x5A, 0x18, 0x1B, 0xA0, 0xCB, 0x47, 0x00, - 0x06, 0x02, 0x43, 0x04, 0xCB, 0x06, 0x00, 0x00, - 0x00, 0x02, 0x46, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0xAB, 0x0E, 0x00, 0x20, - 0xE0, 0x14, 0x00, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x12, 0x46, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x16, 0x46, 0x01, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x2E, 0x46, 0x01, 0xAB, 0x02, 0x00, 0xA0, - 0xE0, 0x14, 0x00, 0x00, 0x2A, 0x01, 0x46, 0x22, - 0x8B, 0x05, 0x89, 0x80, 0x8C, 0x51, 0x00, 0x00, - 0x6A, 0x01, 0x1A, 0xA3, 0x0F, 0x99, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xCB, 0x20, 0x00, 0x00, - 0x00, 0x02, 0x40, 0x01, 0x0E, 0x03, 0x01, 0x00, - 0x06, 0x20, 0xBD, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x90, 0x39, 0x03, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xDA, 0x47, 0x00, 0xAB, 0x00, 0x00, 0x60, - 0x1F, 0x05, 0x00, 0x00, 0xCB, 0x00, 0x00, 0x02, - 0x00, 0xAA, 0x46, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xD6, 0x47, 0x00, 0x0F, 0x99, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0xDD, 0x44, 0x2A, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x2B, 0x17, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x46, 0x04, 0x34, 0x04, - 0xAB, 0x00, 0x00, 0x00, 0x0B, 0x03, 0x00, 0x00, - 0x0E, 0x1F, 0x00, 0x00, 0x0A, 0x7A, 0x1C, 0xA3, - 0x6A, 0x25, 0x31, 0xA2, 0x6A, 0x0F, 0x32, 0xA2, - 0x8B, 0xCD, 0x86, 0x80, 0x1A, 0x51, 0x00, 0x00, - 0x8B, 0x55, 0x8D, 0x80, 0x1B, 0x51, 0x00, 0x00, - 0x8B, 0x6D, 0x8F, 0x82, 0x1C, 0x51, 0x00, 0x00, - 0x8B, 0x65, 0x8F, 0x82, 0x1D, 0x51, 0x00, 0x00, - 0x8B, 0x55, 0x8F, 0x82, 0x1E, 0x51, 0x00, 0x00, - 0x8B, 0x5D, 0x8F, 0x82, 0x1F, 0x51, 0x00, 0x00, - 0x2A, 0x3F, 0xE8, 0x23, 0x97, 0x8F, 0x8F, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0xC3, 0x3E, 0x04, 0x2A, 0x1D, 0x34, 0x22, - 0x97, 0x0F, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x66, 0x42, 0x3D, 0x04, 0x0E, 0x17, 0x08, 0x00, - 0x0A, 0x0D, 0xF6, 0x28, 0x2A, 0x03, 0x18, 0xA2, - 0xF6, 0x15, 0x04, 0x40, 0x96, 0x11, 0xFF, 0xFF, - 0x9A, 0x08, 0x08, 0x00, 0x76, 0x1C, 0x00, 0x08, - 0x1B, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, - 0xCB, 0x28, 0x01, 0x00, 0x00, 0x42, 0x44, 0x01, - 0x6A, 0x07, 0x22, 0xA2, 0x6A, 0x0B, 0x24, 0xA2, - 0x8B, 0x65, 0x88, 0x82, 0x15, 0x51, 0x00, 0x00, - 0xCB, 0x02, 0x01, 0x00, 0x00, 0x4E, 0x44, 0x01, - 0x01, 0x00, 0x01, 0x00, 0x6A, 0x25, 0x29, 0xA2, - 0x6A, 0x0F, 0x28, 0xA2, 0x8B, 0xCD, 0x86, 0x80, - 0x14, 0x51, 0x00, 0x00, 0x8B, 0x55, 0x8D, 0x80, - 0x14, 0x51, 0x00, 0x00, 0x8B, 0x6D, 0x8F, 0x82, - 0x14, 0x51, 0x00, 0x00, 0x8B, 0x65, 0x8F, 0x82, - 0x14, 0x51, 0x00, 0x00, 0x8B, 0x55, 0x8F, 0x82, - 0x14, 0x51, 0x00, 0x00, 0x8B, 0x5D, 0x8F, 0x82, - 0x14, 0x51, 0x00, 0x00, 0x2A, 0x07, 0x26, 0xA2, - 0x96, 0x33, 0x80, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x63, 0x3B, 0x04, 0x1A, 0x0C, 0x00, 0x14, - 0x7A, 0x10, 0x0C, 0x08, 0x01, 0x00, 0x01, 0x00, - 0x26, 0x83, 0x3C, 0x04, 0x3A, 0x0C, 0x10, 0x04, - 0x4A, 0x1E, 0xF6, 0x28, 0x4A, 0x1E, 0xF8, 0x28, - 0x4E, 0x14, 0x00, 0x00, 0x6A, 0x0B, 0x14, 0xA2, - 0xCB, 0x02, 0x00, 0x00, 0x7E, 0x2F, 0x44, 0x01, - 0x2A, 0x1D, 0x34, 0x22, 0x97, 0x0F, 0x07, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0xC2, 0x3E, 0x04, 0xF6, 0x75, 0x38, 0x04, - 0x97, 0x0F, 0x07, 0x00, 0x80, 0xFF, 0x7F, 0x00, - 0xF6, 0xFD, 0x7C, 0x40, 0x6A, 0x3F, 0x14, 0xA2, - 0xCB, 0x02, 0x00, 0x00, 0x88, 0x2E, 0x44, 0x01, - 0x2A, 0x3F, 0xE8, 0x23, 0x9A, 0x7C, 0x7C, 0x00, - 0x6A, 0x3F, 0xE8, 0x23, 0x2A, 0x0D, 0x32, 0x22, - 0x7B, 0x0C, 0x0C, 0xC0, 0x4F, 0x2C, 0x00, 0x00, - 0xA6, 0x22, 0x40, 0x04, 0xCB, 0x04, 0x40, 0x00, - 0x00, 0x92, 0x44, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0x40, 0x04, 0xCB, 0x02, 0x80, 0x00, - 0x00, 0x92, 0x44, 0x01, 0xAB, 0x00, 0x02, 0x20, - 0x60, 0x14, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0xAB, 0x00, 0x06, 0x20, - 0xE0, 0x14, 0x00, 0x00, 0x2A, 0x1B, 0x8C, 0xA3, - 0xF6, 0x6D, 0x34, 0x34, 0x96, 0xDD, 0x10, 0x00, - 0x17, 0x07, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x0A, 0xFC, 0x19, 0x2A, 0x76, 0xFC, 0x7C, 0x14, - 0x36, 0x0E, 0x0E, 0x1F, 0x36, 0x92, 0x0E, 0x0D, - 0x4F, 0x24, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0F, 0x37, 0xC3, 0x07, 0x00, 0x00, 0x01, 0x00, - 0x06, 0x10, 0x9A, 0x04, 0x6A, 0x25, 0x11, 0xA2, - 0x2A, 0x3F, 0x0E, 0x22, 0xB7, 0x8F, 0x0F, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x6A, 0x3F, 0x0E, 0x22, - 0xA6, 0x83, 0x0D, 0x6C, 0xF6, 0x05, 0x48, 0x42, - 0x7A, 0x06, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0xA3, 0x51, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x60, 0x5A, 0x04, 0xCB, 0x02, 0x00, 0x00, - 0x00, 0xD2, 0x47, 0x00, 0x2A, 0x15, 0x54, 0x23, - 0x5B, 0x3E, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x46, 0xA3, 0x45, 0x04, 0x8B, 0x4D, 0x8D, 0x80, - 0xAA, 0x11, 0x00, 0x00, 0x2A, 0x17, 0x90, 0x21, - 0x97, 0x85, 0x85, 0x0F, 0x00, 0x00, 0x00, 0x00, - 0x5B, 0x3E, 0x16, 0x3E, 0x00, 0x00, 0x00, 0x00, - 0x46, 0xE3, 0x46, 0x04, 0xCB, 0x7E, 0x14, 0xA0, - 0x28, 0x2E, 0x44, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x22, 0x47, 0x04, 0xCB, 0x6E, 0x14, 0xA0, - 0x28, 0x2E, 0x44, 0x00, 0x0F, 0x99, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCC, 0x00, 0x28, - 0x0A, 0xDC, 0xD8, 0x28, 0x2A, 0x15, 0x18, 0x22, - 0x2A, 0x17, 0x1A, 0x22, 0x5B, 0x3E, 0x18, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x43, 0x51, 0x04, 0x5B, 0x3E, 0x1A, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x42, 0x51, 0x04, 0x2A, 0x3D, 0x54, 0x23, - 0x7B, 0x3E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x66, 0xE2, 0x49, 0x04, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xD6, 0x47, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x4B, 0x04, 0x2A, 0x3D, 0xEA, 0x23, - 0x9A, 0x78, 0x78, 0x00, 0x6A, 0x3D, 0xEA, 0x23, - 0x7B, 0x3E, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0xE6, 0xA2, 0x4B, 0x04, 0x2A, 0x3D, 0x14, 0x23, - 0x9A, 0x78, 0x78, 0x00, 0x6A, 0x3D, 0x14, 0x23, - 0xCB, 0x10, 0x00, 0x00, 0x00, 0x02, 0x40, 0x01, - 0x0F, 0x37, 0xC1, 0x05, 0x00, 0x00, 0x01, 0x00, - 0x06, 0x62, 0x2E, 0x04, 0x2A, 0x1D, 0x34, 0x22, - 0x97, 0x0F, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x66, 0x42, 0x51, 0x04, 0xF6, 0x1D, 0x28, 0x50, - 0x96, 0x33, 0x3F, 0x00, 0x76, 0x34, 0x0C, 0x14, - 0x1B, 0xAE, 0x06, 0x60, 0x29, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0A, 0x35, - 0x00, 0x02, 0x5B, 0x3E, 0x06, 0x1E, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x26, 0x23, 0x4F, 0x04, 0xF6, 0x1D, 0x2C, 0x40, - 0x96, 0x33, 0x03, 0x00, 0x5B, 0x3E, 0x06, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x23, 0x50, 0x04, 0x97, 0x01, 0x49, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x23, 0x50, 0x04, 0xF6, 0x75, 0x38, 0x04, - 0x97, 0x0F, 0x07, 0x00, 0x80, 0xFF, 0x7F, 0x00, - 0xF6, 0xFD, 0x7C, 0x40, 0x6A, 0x3F, 0x14, 0xA2, - 0xCB, 0x02, 0x00, 0x00, 0x88, 0x2E, 0x44, 0x01, - 0x06, 0x42, 0x51, 0x04, 0xF6, 0x6D, 0x38, 0x44, - 0x2A, 0x07, 0xEC, 0x23, 0x7A, 0x7C, 0x34, 0x0C, - 0x26, 0x03, 0x51, 0x04, 0x6A, 0x3F, 0x14, 0xA2, - 0xCB, 0x02, 0x00, 0x00, 0x88, 0x2E, 0x44, 0x01, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0xDA, 0x47, 0x00, - 0xA6, 0x63, 0x2E, 0x34, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x02, 0x00, - 0x46, 0x63, 0x52, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xD0, 0x38, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x03, 0x00, - 0x46, 0x63, 0x53, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x90, 0x7D, 0x03, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0x63, 0x2E, 0x34, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x04, 0x00, - 0x46, 0x63, 0x54, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE0, 0xBD, 0x04, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0x63, 0x2E, 0x34, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x05, 0x00, - 0x46, 0x23, 0x55, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xD0, 0x94, 0x03, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x06, 0x00, - 0x46, 0xE3, 0x55, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x50, 0x98, 0x03, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x07, 0x00, - 0x46, 0xA3, 0x56, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x50, 0x9A, 0x03, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x08, 0x00, - 0x46, 0xA3, 0x57, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xD0, 0x9B, 0x03, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0x63, 0x2E, 0x34, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x00, 0x00, - 0x46, 0x63, 0x58, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x60, 0x63, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x7A, 0x06, 0x01, 0x00, - 0x46, 0x03, 0x43, 0x04, 0x2A, 0x0D, 0x32, 0x22, - 0x7B, 0x0C, 0x0C, 0xC0, 0x4F, 0x2C, 0x00, 0x00, - 0xA6, 0xA2, 0x59, 0x04, 0xCB, 0x04, 0x40, 0x00, - 0x00, 0x92, 0x44, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x59, 0x04, 0xCB, 0x02, 0x80, 0x00, - 0x00, 0x92, 0x44, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x90, 0x79, 0x03, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x43, 0x04, 0x0A, 0x0A, 0x10, 0xA0, - 0x4A, 0x04, 0x76, 0x28, 0xAB, 0x00, 0x00, 0xE0, - 0x80, 0x14, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x10, 0x85, 0x02, 0x0A, 0x0D, 0x08, 0x29, - 0x0A, 0x1D, 0x06, 0x29, 0x5A, 0x0A, 0x00, 0x00, - 0x46, 0x23, 0x5C, 0x04, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x16, 0x47, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x82, 0x5C, 0x04, 0x2A, 0x05, 0x8A, 0x23, - 0x9A, 0x08, 0x08, 0x00, 0x6A, 0x05, 0x8A, 0x23, - 0x5A, 0x0A, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0xA2, 0x5D, 0x04, 0xAB, 0x06, 0x00, 0x20, - 0x60, 0x14, 0x00, 0x00, 0xCB, 0x3E, 0xFE, 0xFF, - 0xFF, 0x93, 0x44, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x5F, 0x04, 0x2A, 0x0D, 0x32, 0x22, - 0x7B, 0x0C, 0x0C, 0xC0, 0x4F, 0x2C, 0x00, 0x00, - 0xA6, 0xA2, 0x5E, 0x04, 0xCB, 0x04, 0x40, 0x00, - 0x00, 0x92, 0x44, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x5E, 0x04, 0xCB, 0x02, 0x80, 0x00, - 0x00, 0x92, 0x44, 0x01, 0x2A, 0x3F, 0x8A, 0x23, - 0x0F, 0x3B, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7A, 0x7C, 0x7C, 0x74, 0x01, 0x00, 0x01, 0x00, - 0x26, 0xE3, 0x5F, 0x04, 0xAB, 0x00, 0x02, 0x20, - 0x60, 0x14, 0x00, 0x00, 0x5A, 0x2A, 0x00, 0x00, - 0x46, 0x63, 0x60, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0xB1, 0x03, 0x0A, 0x0D, 0x00, 0x28, - 0x5A, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x62, 0xBB, 0x03, 0x5A, 0x06, 0x01, 0x00, - 0x46, 0x23, 0xB0, 0x03, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x90, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, - 0xE6, 0x23, 0x62, 0x4C, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xD0, 0x76, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x62, 0x04, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0x91, 0x0B, 0x3B, 0x01, 0x00, 0x01, 0x00, - 0x66, 0xD1, 0x76, 0x39, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0xE1, 0xC1, 0x3C, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0xA3, 0xAA, 0x1B, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x22, 0xA9, 0x03, 0x2A, 0x01, 0x0E, 0x22, - 0x96, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x72, 0x79, 0x03, 0x2A, 0x01, 0x58, 0x22, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x46, 0xA3, 0x64, 0x04, 0xAB, 0x02, 0x00, 0x20, - 0x43, 0x05, 0x00, 0x00, 0x2A, 0x0D, 0x0E, 0x22, - 0x17, 0x03, 0x03, 0x00, 0x00, 0x00, 0x78, 0x00, - 0x7B, 0x3E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x66, 0x62, 0x66, 0x04, 0x7B, 0x3E, 0x0C, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x62, 0x67, 0x04, 0x7B, 0x3E, 0x0C, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x62, 0x6A, 0x04, 0x0F, 0x2F, 0x03, 0x51, - 0x04, 0x00, 0x00, 0x00, 0xCB, 0x4A, 0x00, 0x00, - 0x00, 0x96, 0x44, 0x00, 0xCB, 0x7E, 0xB1, 0xE4, - 0x17, 0x9B, 0x44, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0x6B, 0x04, 0x0F, 0x2F, 0x03, 0x71, - 0x04, 0x00, 0x00, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x96, 0x44, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0x9A, 0x44, 0x00, 0x2A, 0x0D, 0x32, 0x22, - 0x7B, 0x0E, 0x0C, 0xA0, 0xC4, 0x05, 0x00, 0x00, - 0x66, 0x62, 0x69, 0x04, 0x7B, 0x0E, 0x0C, 0xC0, - 0x43, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x62, 0x69, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0x6B, 0x04, 0x0F, 0x2F, 0x03, 0x91, - 0x00, 0x00, 0x00, 0x00, 0xCB, 0x4A, 0x00, 0x00, - 0x00, 0x96, 0x44, 0x00, 0xCB, 0x7E, 0xB1, 0xE4, - 0x17, 0x9B, 0x44, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0x6B, 0x04, 0x0F, 0x2F, 0x03, 0x91, - 0x04, 0x00, 0x00, 0x00, 0xCB, 0x4A, 0x00, 0x00, - 0x00, 0x96, 0x44, 0x00, 0xCB, 0x7E, 0xB1, 0xE4, - 0x17, 0x9B, 0x44, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0x6B, 0x04, 0x0F, 0x31, 0x01, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x0F, 0x31, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x31, 0x1F, 0x0E, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x31, 0x1F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8B, 0x2D, 0x89, 0x80, - 0x82, 0x51, 0x00, 0x00, 0x8B, 0x35, 0x89, 0x80, - 0x83, 0x51, 0x00, 0x00, 0xCB, 0x04, 0x40, 0x00, - 0x00, 0x92, 0x44, 0x01, 0x2A, 0x0D, 0x66, 0x22, - 0x7B, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x46, 0x23, 0x77, 0x03, 0xCB, 0x86, 0x44, 0x22, - 0x2C, 0xCE, 0x44, 0x00, 0xCB, 0x46, 0x44, 0xAC, - 0x01, 0xD2, 0x44, 0x00, 0xCB, 0x22, 0x00, 0x7C, - 0x00, 0xD6, 0x44, 0x00, 0xCB, 0x86, 0x04, 0x44, - 0xB4, 0xDA, 0x44, 0x00, 0xCB, 0x86, 0x10, 0x44, - 0xBC, 0xDE, 0x44, 0x00, 0xCB, 0x86, 0x20, 0x44, - 0xC0, 0xE2, 0x44, 0x00, 0xCB, 0x86, 0x28, 0x44, - 0xC4, 0xE6, 0x44, 0x00, 0xCB, 0x86, 0x38, 0x44, - 0xC8, 0xEA, 0x44, 0x00, 0xCB, 0x86, 0x40, 0x44, - 0xD0, 0xEE, 0x44, 0x00, 0xCB, 0x86, 0x44, 0x44, - 0xD8, 0xF2, 0x44, 0x00, 0xCB, 0x86, 0x50, 0x44, - 0xE0, 0xF6, 0x44, 0x00, 0xCB, 0x86, 0x58, 0x22, - 0x54, 0xFA, 0x44, 0x00, 0xCB, 0x86, 0x68, 0x22, - 0x60, 0xFE, 0x44, 0x00, 0xCB, 0x86, 0x74, 0x22, - 0x68, 0x02, 0x45, 0x00, 0xCB, 0x86, 0x7C, 0x22, - 0x70, 0x06, 0x45, 0x00, 0xCB, 0x86, 0x84, 0x22, - 0x78, 0x0A, 0x45, 0x00, 0xCB, 0x86, 0x8C, 0x22, - 0x7C, 0x0E, 0x45, 0x00, 0xCB, 0x86, 0x98, 0x22, - 0x80, 0x12, 0x45, 0x00, 0xCB, 0x86, 0xA8, 0x22, - 0x88, 0x16, 0x45, 0x00, 0xCB, 0x86, 0xB4, 0x22, - 0x90, 0x1A, 0x45, 0x00, 0xCB, 0x86, 0xBC, 0x22, - 0x94, 0x1E, 0x45, 0x00, 0xCB, 0x86, 0xC0, 0x22, - 0xA0, 0x22, 0x45, 0x00, 0xCB, 0x86, 0xC8, 0x22, - 0xA8, 0x26, 0x45, 0x00, 0xCB, 0x44, 0x48, 0x22, - 0xB4, 0x2A, 0x45, 0x00, 0xCB, 0x44, 0x50, 0x22, - 0xBC, 0x2E, 0x45, 0x00, 0xCB, 0x44, 0x64, 0x22, - 0xC0, 0x32, 0x45, 0x00, 0xCB, 0x44, 0x6C, 0x22, - 0xC4, 0x36, 0x45, 0x00, 0xCB, 0x44, 0x74, 0x22, - 0xCC, 0x3A, 0x45, 0x00, 0xCB, 0x44, 0x7C, 0x22, - 0xD4, 0x3E, 0x45, 0x00, 0xCB, 0x44, 0x84, 0x22, - 0xDC, 0x42, 0x45, 0x00, 0xCB, 0x44, 0x8C, 0x22, - 0xE4, 0x46, 0x45, 0x00, 0xCB, 0x44, 0x90, 0x22, - 0xEC, 0x4A, 0x45, 0x00, 0xCB, 0x44, 0xA0, 0x22, - 0xF4, 0x4E, 0x45, 0x00, 0xCB, 0x44, 0xA8, 0x22, - 0xFC, 0x52, 0x45, 0x00, 0xCB, 0x44, 0xAC, 0x22, - 0xFE, 0x56, 0x45, 0x00, 0xCB, 0x86, 0x58, 0x22, - 0x54, 0x5A, 0x45, 0x00, 0xCB, 0x86, 0x68, 0x22, - 0x60, 0x5E, 0x45, 0x00, 0xCB, 0x86, 0x74, 0x22, - 0x68, 0x62, 0x45, 0x00, 0xCB, 0x86, 0x7C, 0x22, - 0x70, 0x66, 0x45, 0x00, 0xCB, 0x86, 0x84, 0x22, - 0x78, 0x6A, 0x45, 0x00, 0xCB, 0x86, 0x58, 0x44, - 0xE8, 0x6E, 0x45, 0x00, 0xCB, 0x86, 0x68, 0x44, - 0xF0, 0x72, 0x45, 0x00, 0xCB, 0x86, 0x74, 0x44, - 0xF4, 0x76, 0x45, 0x00, 0xCB, 0x86, 0x7C, 0x44, - 0xFC, 0x7A, 0x45, 0x00, 0xCB, 0x86, 0x84, 0x44, - 0xFE, 0x7E, 0x45, 0x00, 0xCB, 0x44, 0x48, 0x22, - 0xB4, 0x82, 0x45, 0x00, 0xCB, 0x44, 0x50, 0x22, - 0xBC, 0x86, 0x45, 0x00, 0xCB, 0x44, 0x64, 0x22, - 0xC0, 0x8A, 0x45, 0x00, 0xCB, 0x44, 0x6C, 0x22, - 0xC4, 0x8E, 0x45, 0x00, 0xCB, 0x44, 0x74, 0x22, - 0xCC, 0x92, 0x45, 0x00, 0xCB, 0x86, 0xD0, 0x22, - 0xB4, 0x96, 0x45, 0x00, 0xCB, 0x86, 0xD8, 0x22, - 0xBC, 0x9A, 0x45, 0x00, 0xCB, 0x86, 0xE4, 0x22, - 0xC0, 0x9E, 0x45, 0x00, 0xCB, 0x86, 0xEC, 0x22, - 0xC4, 0xA2, 0x45, 0x00, 0xCB, 0x86, 0xF4, 0x22, - 0xCC, 0xA6, 0x45, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x22, 0x77, 0x03, 0x0A, 0x08, 0x7A, 0xA7, - 0x17, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x07, 0x00, 0x00, 0x0A, 0xF8, 0x7E, 0xA3, - 0x7A, 0x38, 0x00, 0x04, 0x76, 0x78, 0x78, 0x70, - 0x97, 0x87, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x46, 0x53, 0x97, 0x04, 0x2A, 0x15, 0x18, 0xA2, - 0xF6, 0x5D, 0x28, 0x40, 0x9A, 0x2C, 0x2C, 0x00, - 0x96, 0xAA, 0xFF, 0xFF, 0x76, 0x74, 0x04, 0x0C, - 0x3A, 0x38, 0x30, 0x38, 0x7A, 0x3C, 0x38, 0x2C, - 0x26, 0x03, 0x7E, 0x04, 0x3A, 0x38, 0x3C, 0x28, - 0x76, 0x74, 0x38, 0x08, 0x1B, 0x1C, 0x1C, 0x00, - 0x00, 0x00, 0x00, 0x01, 0xCB, 0x20, 0x01, 0x00, - 0x00, 0x42, 0x44, 0x01, 0x6A, 0x1D, 0x22, 0xA2, - 0xCB, 0x10, 0x00, 0x00, 0x00, 0x4A, 0x44, 0x01, - 0x8B, 0x65, 0x88, 0x82, 0x15, 0x51, 0x00, 0x00, - 0xCB, 0x02, 0x01, 0x00, 0x00, 0x4E, 0x44, 0x01, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x2A, 0x1F, - 0x26, 0xA2, 0x96, 0xFF, 0x80, 0x00, 0x01, 0x00, - 0x46, 0xB3, 0x80, 0x04, 0x8B, 0xA5, 0x88, 0x82, - 0xCB, 0x11, 0x00, 0x00, 0x8B, 0xA5, 0x88, 0x82, - 0xCC, 0x11, 0x00, 0x00, 0x8B, 0xA5, 0x88, 0x82, - 0xCD, 0x11, 0x00, 0x00, 0x8B, 0xA5, 0x88, 0x82, - 0xCE, 0x11, 0x00, 0x00, 0x8B, 0xA5, 0x88, 0x82, - 0xCF, 0x11, 0x00, 0x00, 0x8B, 0xA5, 0x88, 0x82, - 0xD0, 0x11, 0x00, 0x00, 0x8B, 0xA5, 0x88, 0x82, - 0xD1, 0x11, 0x00, 0x00, 0x8B, 0xA5, 0x88, 0x82, - 0xD2, 0x11, 0x00, 0x00, 0x0F, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0x1E, 0x06, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x86, 0x52, 0x97, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x10, 0x98, 0x04, 0x7B, 0x1E, 0x08, 0xFE, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x52, 0x97, 0x04, 0x7B, 0x1E, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x52, 0x97, 0x04, 0x96, 0x45, 0xE0, 0x00, - 0x96, 0x46, 0x1F, 0x00, 0x7B, 0x1E, 0x0C, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x52, 0x97, 0x04, 0x7B, 0x1E, 0x0C, 0x3A, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0x52, 0x97, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x10, 0x98, 0x04, 0x96, 0x4F, 0x1F, 0x00, - 0x36, 0x05, 0x05, 0x0F, 0x7B, 0x1E, 0x0A, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0xE2, 0x87, 0x04, 0x3A, 0x0C, 0x0C, 0x18, - 0xBA, 0x0C, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0x83, 0x04, 0x3A, 0x18, 0x18, 0x0C, - 0x7A, 0xDA, 0x01, 0x00, 0x7B, 0x1E, 0x06, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x86, 0x52, 0x97, 0x04, 0x7A, 0x3C, 0x0C, 0x18, - 0x26, 0x23, 0x89, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0x83, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x10, 0x98, 0x04, 0x96, 0x4A, 0xFC, 0x00, - 0xF6, 0x55, 0x28, 0x08, 0x96, 0x4B, 0x03, 0x00, - 0x76, 0x5C, 0x2C, 0x20, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x10, 0x98, 0x04, 0x36, 0x0B, 0x0B, 0x04, - 0x06, 0x10, 0x98, 0x04, 0x0E, 0x15, 0x10, 0x00, - 0x96, 0x5F, 0x80, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x42, 0x8B, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x10, 0x98, 0x04, 0x0E, 0x25, 0x10, 0x00, - 0x2A, 0x1F, 0x18, 0x22, 0x97, 0x87, 0x07, 0x00, - 0x00, 0xF8, 0x01, 0x00, 0xF6, 0x7D, 0x3C, 0x50, - 0x7A, 0x3C, 0x3C, 0x28, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x23, 0x88, 0x04, 0x96, 0x5F, 0x80, 0x00, - 0x66, 0xE2, 0x92, 0x04, 0x0E, 0x2B, 0x01, 0x00, - 0x96, 0x51, 0x1C, 0x00, 0xF6, 0x0D, 0x04, 0x08, - 0x96, 0x54, 0x03, 0x00, 0x76, 0x24, 0x10, 0x20, - 0x36, 0x04, 0x04, 0x09, 0x7A, 0x2A, 0x00, 0x00, - 0x66, 0x62, 0x8F, 0x04, 0x7A, 0x2A, 0x01, 0x00, - 0x66, 0xE2, 0x8F, 0x04, 0x7A, 0x2A, 0x02, 0x00, - 0x66, 0x62, 0x90, 0x04, 0x7A, 0x2A, 0x03, 0x00, - 0x66, 0x62, 0x90, 0x04, 0x7A, 0x2A, 0x04, 0x00, - 0x66, 0x62, 0x91, 0x04, 0x7A, 0x2A, 0x05, 0x00, - 0x66, 0xE2, 0x91, 0x04, 0x7A, 0x2A, 0x06, 0x00, - 0x66, 0x62, 0x92, 0x04, 0x3F, 0x0E, 0x10, 0x3C, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x92, 0x04, 0x3F, 0x0E, 0x10, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x92, 0x04, 0x3F, 0x0E, 0x10, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x92, 0x04, 0x3F, 0x0E, 0x10, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x92, 0x04, 0x3F, 0x0E, 0x10, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x92, 0x04, 0x3F, 0x0E, 0x10, 0x6C, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x92, 0x04, 0x3F, 0x0E, 0x10, 0x54, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0x92, 0x04, 0x3F, 0x0E, 0x10, 0x48, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x42, 0x95, 0x04, 0x0E, 0x2B, 0x00, 0x00, - 0x96, 0x50, 0x3E, 0x00, 0x96, 0x52, 0x01, 0x00, - 0x76, 0x14, 0x08, 0x10, 0xF6, 0x05, 0x00, 0x04, - 0x1B, 0xAE, 0x00, 0xA6, 0x23, 0x00, 0x00, 0x00, - 0x1B, 0xB0, 0x00, 0xA6, 0x27, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x2A, 0x1C, 0x20, 0x03, - 0xF6, 0x71, 0x70, 0x10, 0x96, 0xE4, 0x80, 0xFF, - 0xF6, 0x25, 0x10, 0x1C, 0x96, 0xE1, 0x70, 0x00, - 0xF6, 0x0D, 0x04, 0x10, 0x96, 0xE3, 0x0F, 0x00, - 0x76, 0x04, 0x10, 0x28, 0x36, 0x00, 0x00, 0x0B, - 0x76, 0x14, 0x28, 0x2C, 0x76, 0x74, 0x04, 0x20, - 0x36, 0x02, 0x02, 0x0E, 0x36, 0x02, 0x02, 0x03, - 0x2A, 0x1D, 0x18, 0x22, 0x2A, 0x1F, 0x1A, 0x22, - 0x36, 0x0E, 0x0E, 0x00, 0x36, 0x0F, 0x0F, 0x02, - 0x6A, 0x1D, 0x18, 0x22, 0x6A, 0x1F, 0x1A, 0x22, - 0x37, 0x49, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xCB, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x47, 0x00, - 0x05, 0x04, 0x9A, 0x04, 0x04, 0x00, 0x7A, 0x40, - 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x26, 0x23, 0x7C, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x05, 0x04, 0xF6, 0x75, 0x0C, 0x08, 0x1B, 0xAE, - 0x1C, 0x96, 0x23, 0x00, 0x00, 0x00, 0x1B, 0xB0, - 0x1C, 0x96, 0x27, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x2A, 0x1C, 0x20, 0x03, 0x96, 0x3F, - 0x03, 0x00, 0x76, 0x7C, 0x3C, 0x0C, 0xF6, 0x21, - 0x70, 0x78, 0x96, 0x44, 0xFF, 0x00, 0x9A, 0x0C, - 0x0C, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x05, 0x04, 0xCB, 0x40, 0x00, 0x00, 0x00, 0x06, - 0x44, 0x01, 0x2A, 0x01, 0x04, 0xA2, 0x17, 0x00, - 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0x00, - 0x66, 0xE2, 0x84, 0x02, 0x2A, 0x01, 0x00, 0xA2, - 0x01, 0x00, 0x97, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x7F, 0x00, 0x7B, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x8E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0xE3, 0x84, 0x02, 0x96, 0x01, 0x00, 0xF8, - 0x96, 0x02, 0xFF, 0x07, 0x97, 0x01, 0x00, 0x00, - 0x00, 0x38, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, - 0x80, 0x03, 0x00, 0x00, 0xF6, 0x1D, 0x0C, 0x50, - 0xF6, 0x25, 0x10, 0x4C, 0xF6, 0x2D, 0x14, 0x40, - 0x0F, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7A, 0x3E, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x62, 0x9E, 0x04, 0x7A, 0x3E, 0x00, 0x98, - 0x66, 0x92, 0x9F, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x03, 0x02, 0x7A, 0x5E, 0x0C, 0x00, - 0x66, 0xE2, 0x9E, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x03, 0x02, 0x2A, 0x0F, 0x00, 0xA2, - 0x4A, 0x3C, 0xD8, 0x28, 0x4A, 0x3D, 0xEA, 0x28, - 0xCB, 0x02, 0x00, 0x00, 0x00, 0xCE, 0x47, 0x00, - 0x05, 0x04, 0x7A, 0x5E, 0x00, 0x00, 0x01, 0x00, - 0x66, 0x62, 0xA0, 0x04, 0x7A, 0x5E, 0x01, 0x00, - 0x66, 0x92, 0xA2, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x83, 0x02, 0x2A, 0x0F, 0x00, 0xA2, - 0x2A, 0x11, 0x00, 0xA2, 0x97, 0x83, 0x03, 0x00, - 0x00, 0xF8, 0x07, 0x00, 0x17, 0x04, 0x04, 0x00, - 0x80, 0x3F, 0x00, 0x00, 0x6A, 0x0F, 0x18, 0x22, - 0x6A, 0x11, 0x1A, 0x22, 0x8B, 0x05, 0x88, 0x82, - 0x0E, 0x11, 0x00, 0x00, 0x8B, 0x05, 0x88, 0x82, - 0x0F, 0x11, 0x00, 0x00, 0x8B, 0x05, 0x88, 0x82, - 0x10, 0x11, 0x00, 0x00, 0x8B, 0x05, 0x88, 0x82, - 0x11, 0x11, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x05, 0x04, 0x8B, 0x05, 0x88, 0x82, 0x12, 0x11, - 0x00, 0x00, 0x8B, 0x05, 0x88, 0x82, 0x13, 0x11, - 0x00, 0x00, 0x8B, 0x05, 0x88, 0x82, 0x14, 0x11, - 0x00, 0x00, 0x8B, 0x05, 0x88, 0x82, 0x15, 0x11, - 0x00, 0x00, 0x8B, 0x05, 0x88, 0x82, 0x16, 0x11, - 0x00, 0x00, 0x8B, 0x05, 0x88, 0x82, 0x17, 0x11, - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x6A, 0x00, 0x04, 0x03, 0x6A, 0x02, 0x04, 0x03, - 0x6A, 0x04, 0x04, 0x03, 0x6A, 0x06, 0x04, 0x03, - 0x6A, 0x08, 0x04, 0x03, 0x6A, 0x0A, 0x04, 0x03, - 0x6A, 0x0C, 0x04, 0x03, 0x6A, 0x0E, 0x04, 0x03, - 0x6A, 0x10, 0x04, 0x03, 0x6A, 0x12, 0x04, 0x03, - 0x6A, 0x14, 0x04, 0x03, 0x6A, 0x16, 0x04, 0x03, - 0x6A, 0x18, 0x04, 0x03, 0x6A, 0x1A, 0x04, 0x03, - 0x6A, 0x1C, 0x04, 0x03, 0x6A, 0x1E, 0x04, 0x03, - 0x6A, 0x20, 0x04, 0x03, 0x6A, 0x98, 0x04, 0x03, - 0x6A, 0xAE, 0x04, 0x03, 0x6A, 0xB0, 0x04, 0x03, - 0x6A, 0xB2, 0x04, 0x03, 0x6A, 0xB4, 0x04, 0x03, - 0x6A, 0xE4, 0x04, 0x03, 0x6A, 0xE6, 0x04, 0x03, - 0x6A, 0xE8, 0x04, 0x03, 0x6A, 0xEA, 0x04, 0x03, - 0x0A, 0x0C, 0x3E, 0x2A, 0x96, 0x01, 0x01, 0x00, - 0x66, 0xE2, 0x59, 0x00, 0x2A, 0x01, 0x5A, 0x23, - 0x96, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0xE3, 0x59, 0x00, 0x96, 0x01, 0x10, 0x00, - 0x46, 0x63, 0xBD, 0x04, 0x2A, 0x05, 0xD2, 0xA3, - 0x0A, 0x38, 0x88, 0xA3, 0x2A, 0x09, 0x46, 0x23, - 0x2A, 0x0B, 0x48, 0x23, 0x2A, 0x0D, 0x4A, 0x23, - 0x2A, 0x0F, 0x4C, 0x23, 0x2A, 0x11, 0x2E, 0x23, - 0x96, 0x22, 0xFF, 0xFF, 0x96, 0x09, 0xE0, 0x1F, - 0x76, 0x4C, 0x24, 0x4C, 0x96, 0x01, 0x00, 0x08, - 0x46, 0xA3, 0xAC, 0x04, 0x1A, 0x18, 0x18, 0x08, - 0x1A, 0x1C, 0x1C, 0x0C, 0x6A, 0x0D, 0x4A, 0x23, - 0x6A, 0x0F, 0x4C, 0x23, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0xAD, 0x04, 0x1A, 0x10, 0x10, 0x08, - 0x1A, 0x14, 0x14, 0x0C, 0x6A, 0x09, 0x46, 0x23, - 0x6A, 0x0B, 0x48, 0x23, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA2, 0xB8, 0x04, 0x96, 0x02, 0x0C, 0x00, - 0x5A, 0x46, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0xA2, 0xB5, 0x04, 0x0A, 0xAD, 0xF8, 0x28, - 0x2A, 0x17, 0x4E, 0x23, 0x2A, 0x19, 0xDA, 0xA3, - 0x2A, 0x09, 0x50, 0x23, 0x2A, 0x0B, 0xD8, 0xA3, - 0x2A, 0x1B, 0x8C, 0xA3, 0xF6, 0x6D, 0x34, 0x34, - 0x96, 0xDD, 0x10, 0x00, 0x17, 0x07, 0xC9, 0xF7, - 0xFF, 0xFF, 0x7F, 0x00, 0x36, 0x92, 0x0E, 0x0D, - 0x7A, 0x08, 0x14, 0x10, 0x7A, 0x0C, 0x30, 0x2C, - 0x66, 0x62, 0xBD, 0x04, 0x8B, 0xDC, 0x9D, 0xE2, - 0x1E, 0x05, 0x00, 0x00, 0x8B, 0xDC, 0x9D, 0x22, - 0x1F, 0x05, 0x00, 0x00, 0x2A, 0x03, 0x64, 0x22, - 0x2A, 0x09, 0x84, 0x23, 0x17, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x62, 0xB2, 0x04, 0x7A, 0x00, 0x08, 0x0C, - 0x46, 0xA3, 0xB1, 0x04, 0xF6, 0x0D, 0x04, 0x60, - 0x96, 0x11, 0x7F, 0x00, 0x3A, 0x10, 0x10, 0x04, - 0x06, 0x42, 0xB2, 0x04, 0xBA, 0x10, 0x10, 0x00, - 0x17, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x66, 0x42, 0xB2, 0x04, 0x0E, 0x13, 0x00, 0x00, - 0x6A, 0x09, 0x84, 0x23, 0x6A, 0x0B, 0x50, 0x23, - 0x6A, 0x19, 0x4E, 0x23, 0x96, 0x81, 0x10, 0x00, - 0x66, 0x62, 0xBD, 0x04, 0x0A, 0x1C, 0xFE, 0xA3, - 0x96, 0x11, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0xA3, 0xB3, 0x04, 0x0F, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7A, 0x0C, 0x0C, 0x08, - 0xBF, 0x0E, 0x0C, 0xBC, 0x00, 0x00, 0x00, 0x00, - 0x4E, 0x0C, 0x28, 0x00, 0xB6, 0x99, 0x01, 0x00, - 0x97, 0x80, 0x81, 0xFF, 0x7F, 0x00, 0x00, 0x00, - 0x66, 0xE2, 0xB4, 0x04, 0x6A, 0x07, 0x14, 0xA2, - 0x6A, 0x13, 0x16, 0xA2, 0x2A, 0x13, 0xEC, 0x23, - 0x97, 0x81, 0x81, 0xFF, 0x7F, 0x00, 0x00, 0x00, - 0x3A, 0x24, 0x24, 0x0C, 0x6A, 0x13, 0xEC, 0x23, - 0x06, 0x62, 0xBD, 0x04, 0x0A, 0xAD, 0xF8, 0x28, - 0x0A, 0xCD, 0xFA, 0x28, 0x3A, 0x30, 0x30, 0x0C, - 0x4A, 0x64, 0xFA, 0x28, 0x8B, 0xE4, 0x9D, 0xE2, - 0x1E, 0x05, 0x00, 0x00, 0x8B, 0xE4, 0x9D, 0x22, - 0x1F, 0x05, 0x00, 0x00, 0xAB, 0x00, 0x00, 0x60, - 0x1F, 0x05, 0x00, 0x00, 0x96, 0x81, 0x08, 0x00, - 0x66, 0x62, 0xBD, 0x04, 0xF6, 0x1D, 0x30, 0x08, - 0x4E, 0x0C, 0x28, 0x00, 0xB6, 0x99, 0x01, 0x00, - 0x6A, 0x07, 0x14, 0xA2, 0x6A, 0x13, 0x16, 0xA2, - 0x2A, 0x13, 0xEC, 0x23, 0x97, 0x81, 0x81, 0xFF, - 0x7F, 0x00, 0x00, 0x00, 0x3A, 0x24, 0x24, 0x0C, - 0x6A, 0x13, 0xEC, 0x23, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0xBD, 0x04, 0x0A, 0xAD, 0xE8, 0x29, - 0x0A, 0xBD, 0x38, 0x2A, 0x0A, 0xCD, 0xF8, 0x28, - 0x0A, 0xDD, 0xFA, 0x28, 0x1A, 0x34, 0x34, 0x0C, - 0x4A, 0x6C, 0xFA, 0x28, 0x8B, 0xE4, 0x9D, 0xE2, - 0x1E, 0x05, 0x00, 0x00, 0x5A, 0x04, 0x28, 0x2C, - 0x46, 0x63, 0xBD, 0x04, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xF6, 0x51, 0x00, 0x8B, 0xE4, 0x9D, 0x22, - 0x1F, 0x05, 0x00, 0x00, 0x2A, 0x01, 0xE6, 0x23, - 0x7A, 0x02, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x62, 0xBC, 0x04, 0x0A, 0x0D, 0xD8, 0x28, - 0x7A, 0x02, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x23, 0xBC, 0x04, 0x37, 0x49, 0x49, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xCB, 0x00, 0x00, 0x00, - 0x00, 0xCE, 0x47, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0xBC, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xA0, 0x7B, 0x04, 0x96, 0x81, 0x04, 0x00, - 0x66, 0x62, 0xBD, 0x04, 0xF6, 0x1D, 0x34, 0x08, - 0x9A, 0x0C, 0x0C, 0x00, 0x4E, 0x0C, 0x30, 0x00, - 0xB6, 0x99, 0x01, 0x00, 0x6A, 0x07, 0x14, 0xA2, - 0x6A, 0x13, 0x16, 0xA2, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x50, 0xBF, 0x02, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x59, 0x00, 0x01, 0x00, 0x01, 0x00, - 0xE6, 0xE3, 0xBD, 0x7C, 0x17, 0x49, 0xC9, 0xFF, - 0xBF, 0xFF, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xD0, 0x52, 0x01, 0x01, 0x00, 0x01, 0x00, - 0xE6, 0x23, 0x89, 0x0B, 0x8B, 0x05, 0x89, 0x80, - 0x8C, 0x51, 0x00, 0x00, 0x2A, 0x01, 0x58, 0x22, - 0x17, 0x07, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, - 0x0A, 0x5C, 0x79, 0x28, 0x7B, 0x3E, 0x2A, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x66, 0x62, 0xC0, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0x89, 0x03, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xD0, 0xCA, 0x00, 0xAB, 0x18, 0x00, 0xE0, - 0x08, 0x05, 0x00, 0x00, 0x0A, 0x2D, 0x78, 0x28, - 0x0A, 0x8D, 0x76, 0x28, 0x0A, 0x9D, 0x22, 0x28, - 0x0F, 0x17, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x2A, 0x1D, 0x04, 0xA0, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0x91, 0x03, 0x0A, 0xAD, 0x0C, 0x28, - 0x0A, 0xBD, 0x10, 0x28, 0x0A, 0xCD, 0x16, 0x28, - 0x0A, 0xDD, 0x18, 0x28, 0x0A, 0xFD, 0x46, 0x28, - 0x0A, 0x0D, 0x1F, 0x28, 0x2A, 0x1D, 0x14, 0x22, - 0xB7, 0x26, 0x05, 0xD0, 0x04, 0x00, 0x00, 0x00, - 0xEE, 0x39, 0x00, 0x0D, 0x6E, 0x3A, 0x00, 0x0E, - 0x0F, 0xA4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0F, 0xDA, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1A, 0x04, 0x2C, 0x2C, 0x1A, 0x08, 0x04, 0x2C, - 0x76, 0x1C, 0x2C, 0x40, 0x37, 0xC4, 0x01, 0x00, - 0x08, 0x00, 0x08, 0x00, 0xB7, 0xC4, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0xB6, 0x22, 0x00, 0x10, - 0x4E, 0x24, 0x0A, 0x00, 0x0E, 0x28, 0x2A, 0x00, - 0x0F, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x55, 0x36, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x46, 0xC4, 0xC5, 0x04, - 0xB3, 0xFF, 0x0A, 0x09, 0x41, 0x83, 0x2F, 0x00, - 0x0A, 0x2D, 0x40, 0x28, 0x2A, 0x4D, 0x96, 0x21, - 0xB6, 0xC0, 0x18, 0x0A, 0xB6, 0xC1, 0x08, 0x00, - 0x0E, 0x34, 0x01, 0x00, 0x0E, 0x28, 0x06, 0x00, - 0x0E, 0x0F, 0x00, 0x00, 0x0E, 0x55, 0x0A, 0x00, - 0x46, 0x04, 0xC8, 0x04, 0x4E, 0x34, 0x0D, 0x00, - 0x4E, 0x28, 0x0E, 0x00, 0x0E, 0x59, 0x36, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x66, 0xC4, 0xC7, 0x04, - 0x53, 0xFF, 0x2A, 0xE4, 0x4E, 0xEE, 0xE0, 0x03, - 0x9A, 0x0C, 0x0C, 0x00, 0xBA, 0x04, 0x34, 0x00, - 0x96, 0xA0, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x63, 0xC9, 0x04, 0xB7, 0x26, 0x06, 0x10, - 0x04, 0x00, 0x00, 0x00, 0xB7, 0x84, 0x00, 0x00, - 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0xC9, 0x04, 0xB7, 0x26, 0x06, 0x0C, - 0x04, 0x00, 0x00, 0x00, 0xB7, 0x84, 0x00, 0x00, - 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x47, 0x06, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xAE, 0xA1, 0x01, 0x00, - 0x0E, 0x55, 0x36, 0x00, 0x31, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x46, 0xC4, 0xCA, 0x04, - 0xB3, 0xFF, 0x0A, 0x04, 0x89, 0x03, 0x00, 0x00, - 0x0E, 0x5B, 0x00, 0x00, 0x0E, 0x5F, 0x00, 0x00, - 0x0E, 0x63, 0x00, 0x00, 0x0E, 0x67, 0x00, 0x00, - 0x0E, 0x58, 0x1C, 0x01, 0x8E, 0x5C, 0x1C, 0x01, - 0x0E, 0x60, 0x20, 0x01, 0x8E, 0x64, 0x20, 0x01, - 0x0E, 0x69, 0x58, 0x00, 0x7A, 0x00, 0x58, 0x5C, - 0xA6, 0x82, 0xCC, 0x04, 0x0E, 0x69, 0x5C, 0x00, - 0x0E, 0x6D, 0x60, 0x00, 0x7A, 0x00, 0x60, 0x64, - 0xA6, 0x02, 0xCD, 0x04, 0x0E, 0x6D, 0x64, 0x00, - 0x0E, 0x59, 0x68, 0x00, 0x7A, 0x00, 0x68, 0x6C, - 0xA6, 0x82, 0xCD, 0x04, 0x0E, 0x59, 0x6C, 0x00, - 0x2A, 0x01, 0xB2, 0x21, 0x7B, 0x3E, 0x00, 0x8C, - 0x3F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0xA2, 0xCE, 0x04, 0xBF, 0x5E, 0x58, 0xCC, - 0xCC, 0x00, 0x00, 0x00, 0x76, 0xBE, 0x5C, 0x44, - 0x06, 0x02, 0xCF, 0x04, 0xBF, 0x5E, 0x58, 0x78, - 0x14, 0x00, 0x00, 0x00, 0x76, 0xBE, 0x5C, 0x44, - 0xF6, 0x05, 0x34, 0x14, 0xAE, 0x27, 0x00, 0x00, - 0x0E, 0x63, 0x00, 0x00, 0x0E, 0x0B, 0x00, 0x00, - 0x0E, 0x0F, 0x00, 0x00, 0x0E, 0x13, 0x00, 0x00, - 0x0E, 0x17, 0x00, 0x00, 0x0E, 0x1B, 0x00, 0x00, - 0x0E, 0x1F, 0x00, 0x00, 0xAE, 0xA1, 0x03, 0x00, - 0x0E, 0x24, 0x5D, 0x00, 0x0E, 0x59, 0x02, 0x00, - 0x66, 0x04, 0xD4, 0x04, 0xAE, 0x4A, 0x10, 0x00, - 0x31, 0x00, 0x01, 0x00, 0x46, 0x04, 0xD1, 0x04, - 0xB3, 0xFF, 0x0A, 0x04, 0x89, 0x03, 0x00, 0x00, - 0x0E, 0x08, 0x1C, 0x01, 0x8E, 0x0C, 0x1C, 0x01, - 0x0E, 0x10, 0x20, 0x01, 0x8E, 0x14, 0x20, 0x01, - 0x79, 0x59, 0xF9, 0x79, 0x7A, 0x10, 0x18, 0x10, - 0x7A, 0x14, 0x18, 0x14, 0xF6, 0x15, 0x08, 0x7C, - 0xF6, 0x1D, 0x0C, 0x7C, 0xF6, 0x25, 0x10, 0x7C, - 0xF6, 0x2D, 0x14, 0x7C, 0x1A, 0x60, 0x60, 0x08, - 0x76, 0x3C, 0x1C, 0x04, 0x76, 0x44, 0x08, 0x60, - 0x36, 0x07, 0x07, 0x08, 0x1A, 0x60, 0x60, 0x0C, - 0x76, 0x44, 0x0C, 0x40, 0x36, 0x07, 0x07, 0x08, - 0x1A, 0x60, 0x60, 0x10, 0x76, 0x44, 0x10, 0x20, - 0x36, 0x07, 0x07, 0x08, 0x1A, 0x60, 0x60, 0x14, - 0x36, 0x07, 0x07, 0x05, 0xAE, 0x2B, 0x00, 0x00, - 0x0E, 0x61, 0x25, 0x00, 0x2E, 0xB1, 0xFF, 0x7F, - 0x76, 0x04, 0x34, 0x08, 0x76, 0x0C, 0x34, 0x04, - 0x0E, 0x55, 0x02, 0x00, 0x31, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x46, 0x44, 0xD5, 0x04, - 0xB3, 0x33, 0x16, 0x04, 0x89, 0x03, 0x00, 0x00, - 0x0E, 0x67, 0x00, 0x00, 0x0E, 0x6B, 0x00, 0x00, - 0x0E, 0x64, 0x14, 0x01, 0x8E, 0x68, 0x14, 0x01, - 0xBA, 0x64, 0x64, 0x00, 0x5A, 0x68, 0x00, 0x68, - 0x0E, 0x79, 0x68, 0x00, 0xF6, 0x75, 0x34, 0x10, - 0x9A, 0x38, 0x38, 0x00, 0x76, 0x74, 0x38, 0x14, - 0x7A, 0x08, 0x68, 0x38, 0x01, 0x00, 0x01, 0x00, - 0xE6, 0x42, 0xD7, 0x04, 0x7A, 0x78, 0x68, 0x00, - 0xF6, 0x8D, 0x68, 0x14, 0xF6, 0x95, 0x64, 0x14, - 0x0F, 0x17, 0xFE, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x0F, 0x19, 0xFE, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x0F, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x21, 0x1C, 0x00, 0xF6, 0x75, 0x34, 0x10, - 0x97, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x66, 0x02, 0xD9, 0x04, 0x0E, 0x2D, 0x54, 0x00, - 0x76, 0x44, 0x20, 0x04, 0x9A, 0x54, 0x54, 0x00, - 0x7A, 0x7C, 0x54, 0x38, 0x01, 0x00, 0x01, 0x00, - 0x26, 0x83, 0xD8, 0x04, 0xF6, 0x75, 0x34, 0x0C, - 0x97, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x66, 0x62, 0xDA, 0x04, 0x0E, 0x31, 0x54, 0x00, - 0x06, 0xE2, 0xDA, 0x04, 0x76, 0x44, 0x20, 0x04, - 0x9A, 0x54, 0x54, 0x00, 0x7A, 0x7C, 0x54, 0x38, - 0x26, 0xC3, 0xD9, 0x04, 0x7A, 0x7C, 0x48, 0x2C, - 0x66, 0xC2, 0xDC, 0x04, 0x76, 0x04, 0x34, 0x08, - 0x7A, 0x7C, 0x2C, 0x30, 0x76, 0xFC, 0x7C, 0x14, - 0x3A, 0x7C, 0x00, 0x7C, 0xBF, 0x0A, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0A, 0x08, 0x28, - 0x00, 0x00, 0x00, 0x00, 0xBA, 0x08, 0x08, 0x00, - 0x7A, 0x7C, 0x7C, 0x08, 0x01, 0x00, 0x01, 0x00, - 0xE6, 0xC2, 0xDC, 0x04, 0x76, 0xCC, 0x2C, 0x14, - 0x7A, 0x6C, 0x64, 0x3C, 0x0E, 0x2D, 0x3C, 0x00, - 0x2A, 0x01, 0x90, 0x21, 0x7B, 0x3E, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0xC2, 0xDD, 0x04, 0x4A, 0x8E, 0x4C, 0x2A, - 0x0A, 0x7D, 0x46, 0x2A, 0x0A, 0x8D, 0x4C, 0x2A, - 0x0A, 0x5D, 0x51, 0x2A, 0x0A, 0x0D, 0x4E, 0x2A, - 0x0A, 0x1D, 0x44, 0x2A, 0x0A, 0x2D, 0x48, 0x2A, - 0xF6, 0x1D, 0x34, 0x10, 0x9A, 0x0C, 0x0C, 0x00, - 0x76, 0x1C, 0x0C, 0x14, 0x7A, 0x7C, 0x64, 0x0C, - 0xE6, 0xA2, 0xDF, 0x04, 0x0E, 0x1F, 0x01, 0x00, - 0x9A, 0x08, 0x08, 0x00, 0x0E, 0x57, 0x00, 0x00, - 0x06, 0xE2, 0xE3, 0x04, 0x7B, 0x3E, 0x0E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0xE3, 0xE3, 0x04, 0x7A, 0x7C, 0x20, 0x44, - 0x46, 0x23, 0xE1, 0x04, 0x0E, 0x2D, 0x78, 0x00, - 0x0E, 0x57, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, - 0x0E, 0x21, 0x44, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0xE3, 0x04, 0x7B, 0x3E, 0x2A, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x63, 0xE3, 0x04, 0x7A, 0x7C, 0x44, 0x00, - 0xA6, 0x22, 0xE2, 0x04, 0x4A, 0xF6, 0x54, 0x2A, - 0x0E, 0x01, 0x44, 0x00, 0x9A, 0x04, 0x04, 0x00, - 0x7B, 0x3E, 0x02, 0x28, 0x00, 0x00, 0x00, 0x00, - 0x26, 0xE3, 0xE3, 0x04, 0x0A, 0xBD, 0x54, 0x2A, - 0x0E, 0x57, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x00, - 0x0E, 0x23, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0xE2, 0xE3, 0x04, 0x0E, 0x57, 0x01, 0x00, - 0x0E, 0x07, 0x01, 0x00, 0x4A, 0xF6, 0x54, 0x2A, - 0x0E, 0x01, 0x44, 0x00, 0x0A, 0x3D, 0x4A, 0x2A, - 0x0A, 0x6D, 0x52, 0x2A, 0x0E, 0x13, 0x14, 0x00, - 0x0E, 0x17, 0x0A, 0x00, 0x2A, 0x3F, 0x90, 0x21, - 0x7B, 0x3E, 0x3E, 0x14, 0x00, 0x00, 0x00, 0x00, - 0xA6, 0x22, 0xE5, 0x04, 0x0E, 0x13, 0x05, 0x00, - 0x0E, 0x17, 0x02, 0x00, 0x7B, 0x3E, 0x0E, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0xE3, 0xE7, 0x04, 0x9A, 0x0C, 0x0C, 0x00, - 0x7B, 0x3E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x46, 0x63, 0xE6, 0x04, 0x0E, 0x19, 0x64, 0x00, - 0x06, 0x22, 0xE8, 0x04, 0x7A, 0x7C, 0x0C, 0x10, - 0x46, 0x23, 0xE8, 0x04, 0x7A, 0x7C, 0x08, 0x14, - 0x26, 0x23, 0xE7, 0x04, 0x76, 0xFC, 0x34, 0x08, - 0x7A, 0x2C, 0x18, 0x7C, 0x0E, 0x1F, 0x00, 0x00, - 0x0E, 0x0F, 0x00, 0x00, 0x0E, 0x0B, 0x00, 0x00, - 0x0E, 0x1B, 0x00, 0x00, 0x0E, 0x21, 0x44, 0x00, - 0x06, 0x22, 0xE8, 0x04, 0x0E, 0x0F, 0x00, 0x00, - 0x0E, 0x0B, 0x00, 0x00, 0x4A, 0x3E, 0x46, 0x2A, - 0x4A, 0x46, 0x4C, 0x2A, 0x4A, 0xAE, 0x50, 0x2A, - 0x4A, 0x06, 0x4E, 0x2A, 0x4A, 0x0E, 0x44, 0x2A, - 0x4A, 0x16, 0x48, 0x2A, 0x4A, 0x1E, 0x4A, 0x2A, - 0x4A, 0x36, 0x52, 0x2A, 0x36, 0x1F, 0x07, 0x15, - 0x7B, 0x3E, 0x3E, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x46, 0xC3, 0xEA, 0x04, 0x7B, 0x3E, 0x3C, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x26, 0xC3, 0xEA, 0x04, 0x7B, 0x3E, 0x3C, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x86, 0xC2, 0xEA, 0x04, 0x0E, 0x2D, 0x78, 0x00, - 0x0A, 0x7D, 0x56, 0x2A, 0x0A, 0x8D, 0x5A, 0x2A, - 0x0A, 0x5D, 0x5D, 0x2A, 0x2A, 0x01, 0x90, 0x21, - 0x7B, 0x3E, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x26, 0x63, 0xF2, 0x04, 0x7A, 0x7C, 0x48, 0x1C, - 0xA6, 0x62, 0xEC, 0x04, 0x7A, 0x7C, 0x48, 0x1C, - 0x26, 0xE3, 0xEE, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x62, 0xF1, 0x04, 0x7B, 0x3E, 0x10, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0xA3, 0xED, 0x04, 0xAB, 0x02, 0x00, 0xA0, - 0x4B, 0x05, 0x00, 0x00, 0xAB, 0x02, 0x00, 0x60, - 0x4B, 0x05, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x22, 0xF3, 0x04, 0x9A, 0x54, 0x54, 0x00, - 0x4A, 0xAE, 0x5C, 0x2A, 0x7B, 0x3E, 0x2A, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x86, 0x62, 0xF1, 0x04, 0xAB, 0x02, 0x00, 0x60, - 0x4B, 0x05, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x22, 0xF3, 0x04, 0x7B, 0x3E, 0x10, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x46, 0x23, 0xF0, 0x04, 0xAB, 0x02, 0x00, 0x60, - 0x4B, 0x05, 0x00, 0x00, 0xAB, 0x04, 0x00, 0xA0, - 0x4B, 0x05, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x22, 0xF3, 0x04, 0x9A, 0x54, 0x54, 0x00, - 0x4A, 0xAE, 0x5C, 0x2A, 0x7B, 0x3E, 0x2A, 0x28, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x86, 0x62, 0xF1, 0x04, 0xAB, 0x04, 0x00, 0x60, - 0x4B, 0x05, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x22, 0xF3, 0x04, 0x4A, 0x96, 0x56, 0x2A, - 0x4A, 0xDE, 0x58, 0x2A, 0xAB, 0x00, 0x00, 0x60, - 0x4B, 0x05, 0x00, 0x00, 0xAB, 0x00, 0x00, 0xA0, - 0x4B, 0x05, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x22, 0xF3, 0x04, 0x4A, 0x96, 0x56, 0x2A, - 0x4A, 0x86, 0x58, 0x2A, 0xAB, 0x00, 0x00, 0x60, - 0x4B, 0x05, 0x00, 0x00, 0xAB, 0x00, 0x00, 0xA0, - 0x4B, 0x05, 0x00, 0x00, 0x0A, 0xFD, 0x59, 0x2A, - 0x7A, 0x70, 0x7C, 0x40, 0x3B, 0x38, 0x38, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x9C, 0xFF, - 0xFF, 0xFF, 0x01, 0x00, 0x0F, 0x05, 0x18, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x70, 0x04, - 0xA6, 0xE2, 0xF4, 0x04, 0x7A, 0x00, 0x60, 0x08, - 0xA6, 0xE2, 0xF4, 0x04, 0x01, 0x00, 0x01, 0x00, - 0x06, 0x02, 0xF5, 0x04, 0x0E, 0x73, 0x00, 0x00, - 0x7A, 0x74, 0x2C, 0x3C, 0x6A, 0x2D, 0xA4, 0x28, - 0x6A, 0x2F, 0xA6, 0x28, 0x6A, 0x31, 0xA8, 0x28, - 0x6A, 0x33, 0xAA, 0x28, 0x6A, 0x35, 0xAC, 0x28, - 0x6A, 0x37, 0xAE, 0x28, 0x6A, 0x39, 0xB0, 0x28, - 0x6A, 0x3B, 0x94, 0x28, 0x0A, 0x1D, 0x77, 0x28, - 0x0A, 0x2D, 0x3B, 0x28, 0x3A, 0x00, 0x44, 0x74, - 0x16, 0x00, 0x00, 0x12, 0x4A, 0x06, 0x76, 0x28, - 0x4A, 0xEC, 0x06, 0xA4, 0x0A, 0x3D, 0x61, 0x28, - 0x5A, 0x00, 0x60, 0x4C, 0x01, 0x00, 0x01, 0x00, - 0xA6, 0xD2, 0xF7, 0x04, 0x37, 0x49, 0x49, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x05, 0x04, 0x17, 0x49, 0xC9, 0xFB, 0xFF, 0xFF, - 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDF, 0x01, 0x9A, 0xFF, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x00, -}; -#endif /* __TCC317X_BOOT_TDMB_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_decoder.h b/drivers/media/tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_decoder.h deleted file mode 100644 index 17f2ed6..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_decoder.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * tcc_fic_decoder.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCC_FIC_DECODER_H__ -#define __TCC_FIC_DECODER_H__ -#include "tcc_fic_fig.h" - -#define CH_UPDATE_NO_DATA 0 -#define CH_UPDATE_ESSENTIAL_DATA 1 -#define CH_UPDATE_FULL_DATA 2 - -#define MAX_FIC_SIZE 384 -#define TCC_FIB_SIZE 32 - -struct fic_parser_matadata { - struct tcc_ensemble esmbl_start; - struct tcc_service svc_start[NUM_SVC]; - struct tcc_service_comp svc_comp_start[NUM_SVC_COMP]; - struct tcc_sub_channel subch_start[NUM_SUB_CH]; - struct tcc_user_app_types user_app_start[NUM_USER_APP]; - struct tcc_program_type prg_start[NUM_SVC_COMP]; - struct tcc_xpad_user_app fig1_6_start[NUM_USER_APP]; - - u8 fig_cn; - u8 fig_oe0; - u8 fig_pd; - u8 fig_oe1; - - u8 reconf_stage; - u8 cif_count_hi; - u8 cif_count_lo; - u16 cif_count; - u8 occur_change; - - u32 fib_cnt; /* max 12 */ -}; - -#define MAX_SVC_COMP_NUM 2 -#define MAX_SVC_NUM 10 - -struct tcc_service_comp_info { - struct tcc_service_comp svc_comp; - struct tcc_sub_channel sub_ch; -}; - -struct tcc_service_info { - struct tcc_service svc; - struct tcc_service_comp_info svc_comp_info[MAX_SVC_COMP_NUM]; -}; - -struct tcc_ensemble_info { - struct tcc_ensemble ensbl; - struct tcc_service_info svc_info[MAX_SVC_NUM]; -}; - -s32 fig0_ext00(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext01(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext02(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext03(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext04(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext05(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext07(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext08(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext13(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); -s32 fig0_ext17(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen); - -s32 fig1_ext00(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen, u8 charset); -s32 fig1_ext01(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen, u8 charset); -s32 fig1_ext04(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen, u8 charset); -s32 fig1_ext05(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen, u8 charset); -s32 fig1_ext06(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 iLen, u8 charset); - -void tcc_fic_parser_init(void); -s32 tcc_fic_run_decoder(u8 *buff, s32 size); - -void tcc_fic_disp_ensbl_info(struct tcc_ensemble_info *ensbl_info); -struct tcc_ensemble_info *tcc_fic_get_ensbl_info(s32 _disp); - -struct tcc_service_comp_info *tcc_fic_get_svc_comp_info(s32 _subch_id); -u8 tcc_fic_get_ptype(struct tcc_service_comp_info *svc_comp_info); -u8 tcc_fic_get_plevel(struct tcc_service_comp_info *svc_comp_info); -u16 tcc_fic_get_cu_start(struct tcc_service_comp_info *svc_comp_info); -u16 tcc_fic_get_cu_size(struct tcc_service_comp_info *svc_comp_info); -u8 tcc_fic_get_subch_id(struct tcc_service_comp_info *svc_comp_info); -u8 tcc_fic_get_bitrate(struct tcc_service_comp_info *svc_comp_info); -u8 tcc_fic_get_rs(struct tcc_service_comp_info *svc_comp_info); - - -#endif /* __TCC_FIC_DECODER_H__ */ diff --git a/drivers/media/tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_fig.h b/drivers/media/tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_fig.h deleted file mode 100644 index 895c13a..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcc_fic_decoder/tcc_fic_fig.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - * tcc_fic_fig.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCC_FIC_FIG_H__ -#define __TCC_FIC_FIG_H__ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#define FICERR_FIG1_5_NOTREADY_SERVICE 11050 -#define FICERR_FIG1_4_NOTREADY_SRVCOMP 11041 -#define FICERR_FIG1_4_NOTREADY_SRVCOMP1 11040 -#define FICERR_FIG1_1_NOTREADY_SERVICE 11010 -#define FICERR_FIG0_13_ALREADY_USERAPPL 10130 -#define FICERR_FIG0_7_BLOCK 10071 -#define FICERR_FIG0_7_RETURN 10070 -#define FICERR_FIG0_5_NOTREADY_SERVICE 10051 -#define FICERR_FIG0_5_NOTREADY_SRVCOMP 10050 -#define FICERR_FIG0_4_NOTREADY_SRVCOMP 10041 -#define FICERR_FIG0_4_ALREADY_CA_FIELD 10040 -#define FICERR_FIG0_3_NOTREADY_SRVCOMP 10032 -#define FICERR_FIG0_3_NOTREADY_SRVCOMP1 10031 -#define FICERR_FIG0_3_ALREADY_SRVCOMP 10030 -#define FICERR_FIG_NODATA 2 -#define FICERR_FIBD_ENDMARKER 1 -#define FICERR_SUCCESS 0 - -#define FICERR_FIBD_FICSYNC_FAILURE -1 -#define FICERR_FIBD_CRC_FAILURE -2 -#define FICERR_FIBD_UNKNOWN_FIGTYPE -3 -#define FICERR_FIBD_INVALID_LENGTH -4 -#define FICERR_FIG0_NEXT_FIG -1000 -#define FICERR_FIG0_NEXT_FIG1 -1001 -#define FICERR_FIG0_0_NO_ENSEMBLEARRAY -10000 -#define FICERR_FIG0_1_FULL_SUBCHARRAY -10010 -#define FICERR_FIG0_1_INVALID_LENGTH -10011 -#define FICERR_FIG0_1_NO_SUBCHARRAY -10012 -#define FICERR_FIG0_2_FULL_SERVICEARRAY -10020 -#define FICERR_FIG0_2_FULL_SRVCOMPARRAY -10021 -#define FICERR_FIG0_2_INVALID_LENGTH -10022 -#define FICERR_FIG0_2_NO_SRVARRAY -10023 -#define FICERR_FIG0_2_NO_SRVCOMPARRAY -10024 -#define FICERR_FIG0_3_INVALID_LENGTH -10030 -#define FICERR_FIG0_3_NO_SRVCOMPARRAY -10031 -#define FICERR_FIG0_4_INVALID_LENGTH -10040 -#define FICERR_FIG0_4_NO_SRVCOMPARRAY -10041 -#define FICERR_FIG0_5_INVALID_LENGTH -10050 -#define FICERR_FIG0_5_NO_SRVCOMPARRAY -10051 -#define FICERR_FIG0_8_INVALID_LENGTH -10080 -#define FICERR_FIG0_8_NO_SRVCOMPARRAY -10081 -#define FICERR_FIG0_13_FULL_USERAPPLARRAY -10130 -#define FICERR_FIG0_13_INVALID_LENGTH -10131 -#define FICERR_FIG0_13_NO_USERAPPLARRAY -10132 -#define FICERR_FIG0_17_OTHER_ENSEMBLE -10170 -#define FICERR_FIG0_17_NO_PROGTYPEARRAY -10171 -#define FICERR_FIG0_17_FULL_PROGTYPEARRAY -10172 -#define FICERR_FIG0_17_INVALID_LENGTH -10073 -#define FICERR_FIG1_1_NO_SERVICEARRAY -11011 -#define FICERR_FIG1_4_NO_SRVCOMPARRAY -11041 -#define FICERR_FIG1_5_NO_SERVICEARRAY -11052 -#define FICERR_FIG1_6_NO_XPADLABELARRAY -11061 - -#define FIG0 0x0 -#define FIG1 0x1 - -#define EXT_00 0 -#define EXT_01 1 -#define EXT_02 2 -#define EXT_03 3 -#define EXT_04 4 -#define EXT_05 5 -#define EXT_06 6 -#define EXT_07 7 -#define EXT_08 8 -#define EXT_09 9 -#define EXT_10 10 -#define EXT_11 11 -#define EXT_12 12 -#define EXT_13 13 -#define EXT_14 14 -#define EXT_15 15 -#define EXT_16 16 -#define EXT_17 17 -#define EXT_18 18 -#define EXT_19 19 -#define EXT_20 20 -#define EXT_21 21 -#define EXT_22 22 -#define EXT_23 23 -#define EXT_24 24 -#define EXT_25 25 -#define EXT_26 26 -#define EXT_27 27 -#define EXT_28 28 -#define EXT_29 29 -#define EXT_30 30 -#define EXT_31 31 - -#define INITVAL_SCIDS 0xff - -#define NUM_SVC 64 /**< max num of struct tcc_service */ -#define NUM_SUB_CH (NUM_SVC + 0) /**< max num of struct tcc_sub_channel */ -#define NUM_SVC_COMP NUM_SUB_CH /**< max num of struct tcc_service_comp */ -#define NUM_PRG_TYPE NUM_SVC_COMP /**< max_num of struct tcc_program_type. */ -#define NUM_USER_APP NUM_SVC /**< max_num of struct tcc_user_app_type. */ - -/**FIG 0/1 */ -struct tcc_sub_channel { - u8 subch_id; /**< 6bits Sub channel Id */ - u8 tbl_index; /**< 6bits TableIndex */ - u8 form_flag; /**< [3] : FormFlag@n - * [2] : Option@n - * [1~0] : protection */ - u16 start_cu; /**< 10bits Start Address */ - u16 size_cu; /**< 10bits Sub channel size */ -}; - -/** FIG 0/2 and FIG1 */ -struct tcc_service_comp { - u8 order; /**< 4bits 0 : primary, 1: secondary */ - u8 tmid; /**< 2bits Transport Mechanism Id */ - u8 ascty_dscty; /**< 6bits Audio Service Component Type */ - u8 fidc_id; /**< 6bits subch_id or FIDCId in FIG 0/4 */ - u8 ca_flag; /**< 1bit CA Flag */ - u8 dg_mf_flag; /**< 1bit DG Flag or MF flag */ - u8 lang; /**< 8bit language field of FIG 0/5 */ - u8 scids; /**< 4bit Service component Identifier - * within ther Service */ - u8 ca_org_flag; /**< 1bit */ - u8 charset; /**< character set */ - u8 label[16]; /**< 16bytes Service component label */ - u16 scid; /**< 12bits Service Component Id */ - u16 pack_add; /**< 10bits Packet Address */ - u16 ca_org; /**< 16bits conditional access organization */ - u16 char_flag; /**< refer to ETSI EN 300 401 5.2.2.1 */ - u32 sid; /**< 32bit */ -}; - - -/** FIG 0/17 */ -struct tcc_program_type { - u8 sd; /**< 1bit */ - u8 ps; /**< 1bit */ - u8 nfc; /**< 2bit */ - u8 lang; /**< 8Bit */ - u8 i18n_code; /**< 5bit */ - u8 coarse_code; /**< 6bit */ - u8 fine_code; /**< 8bit */ - u16 sid; /**< 16bit */ -}; - - -/** FIG 0/2 and FIG1/1 */ -struct tcc_service { - u32 sid; /**< 32bits CountryId + serviceReference - * ECC + CountryId + ServiceReference */ - u8 charset; /**< character set */ - u8 svc_label[16]; /**< 16bytes Service label - * (Program service and Data service) */ - u16 char_flag; /**< refer to ETSI EN 300 401 5.2.2.1 */ - u8 ca_id; /**< 3bit */ - u8 num_svc_comp; /**< 4bits Number of Service Component */ -}; - - -/** FIG 0/0 */ -struct tcc_ensemble { - u8 al_flag; /**< 1bit Al flag */ - u8 num_subch; /**< a number of struct tcc_sub_channel */ - u8 num_svc; /**< a number of struct tcc_service */ - u8 num_program; /**< a number of ProgNumberInfo */ - u8 num_svc_comp; /**< a number of struct tcc_service_comp */ - u8 num_user_app; /**< a number of FIG0/13 */ - u8 num_ann; /**< a number of FIG0/18 */ - u8 num_prg_type; /**< a number of FIG0/17 */ - u8 num_oe_svc; /**< a number of FIG0/24 other ensemble*/ - u8 num_fi; /**< a number of FIG0/21 */ - u8 num_oe_fi; /**< a number of FIG0/21 other ensemble*/ - u8 charset; /**< character set */ - u8 label[16]; /**< 16bytes Ensemble label */ - u16 char_flag; /**< refer to ETSI EN 300 401 5.2.2.1 */ - u16 eid; /**< 16bits country Id Ensemble reference */ -}; - -struct tcc_user_app_type { - u16 type; /**< User application Type */ - u8 len; /**< User Application Type length */ - u8 data[24]; /**< User Application Data */ -}; - -/** FIG 0/13 */ -struct tcc_user_app_types { - u32 sid; /**< Service ID */ - u8 scids; /**< scids */ - u8 num_app; /**< appl */ - struct tcc_user_app_type app_type[6]; -}; - -/** FIG 1/6 */ -struct tcc_xpad_user_app { - u8 charset; /**< character set */ - u8 label[16]; /**< label */ - u16 type; /**< X-PAD application type */ - u32 sid; /**< Service ID */ - u8 scids; /**< scids */ - u16 char_flag; -}; - -#endif /* __TCC_FIC_FIG_H__ */ diff --git a/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_debug.h b/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_debug.h deleted file mode 100644 index cb115b0..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_debug.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * tcpal_debug.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCPAL_DEBUG_H__ -#define __TCPAL_DEBUG_H__ - -#define DEBUG_ERROR 0x00000001 -#define DEBUG_INFO 0x00000002 -#define DEBUG_DRV_IO 0x00000004 -#define DEBUG_API_COMMON 0x00000008 -#define DEBUG_TCPAL_OS 0x00000010 -#define DEBUG_TCHAL 0x00000020 -#define DEBUG_TCPAL_CSPI 0x00000040 -#define DEBUG_DRV_COMP 0x00000080 -#define DEBUG_DRV_RF 0x00000100 -#define DEBUG_TCPAL_I2C 0x00000200 -#define DEBUG_DRV_PERI 0x00000400 -#define DEBUG_STREAM_PARSER 0x00000800 -#define DEBUG_PARSING_TIME 0x00001000 -#define DEBUG_PARSING_PROC 0x00002000 -#define DEBUG_INTRRUPT 0x00004000 -#define DEBUG_STREAM_READ 0x00008000 -#define DEBUG_STREAM_STACK 0x00010000 -#define DEBUG_STATUS 0x00020000 -#define DEBUG_PARSE_HEADER 0x00040000 - -#define MAX_SIZE_DSP_ROM (1024*10) -#define MAX_PATH 128 - -s32 printk(const char *fmt, ...); - -#define tcbd_debug(__class, __msg, ...)\ -do {\ - if (__class&tcbd_debug_class) {\ - if (__class == DEBUG_ERROR)\ - printk(KERN_ERR"[%s:%d] " __msg,\ - __func__, __LINE__, ##__VA_ARGS__);\ - else if (__class == DEBUG_INFO)\ - printk(KERN_INFO __msg, ##__VA_ARGS__);\ - else\ - printk(KERN_INFO"[%s:%d] " __msg,\ - __func__, __LINE__, ##__VA_ARGS__);\ - } \ -} while (0) - -s32 tcbd_debug_spur_dbg(void); -s32 tcbd_debug_rom_from_fs(void); -s32 *tcbd_debug_spur_clk_cfg(void); -char *tcbd_debug_rom_path(void); - -void tcbd_debug_mbox_rx(u16 *_cmd, s32 *_len, u32 **_data); -void tcbd_debug_mbox_tx(u16 *_cmd, s32 *_len, u32 **_data); - -extern u32 tcbd_debug_class; - -#endif /*__TCPAL_DEBUG_H_*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_os.h b/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_os.h deleted file mode 100644 index 85e4a3d..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_os.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * tcpal_os.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCPAL_OS_H__ -#define __TCPAL_OS_H__ -#include "tcpal_types.h" -#include -#include -#include -#include -#include -#include - -/* For TimeCheck */ -#define TCPAL_MAX_TIMECNT 0xFFFFFFFFFFFFFFFFULL -TCBB_FUNC u64 tcpal_get_time(void); -TCBB_FUNC u64 tcpal_diff_time(u64 _start_timeCount); - -/* for sleep */ -TCBB_FUNC void tcpal_msleep(s32 _ms); -TCBB_FUNC void tcpal_usleep(s32 _us); - -/* for memory allocation, free, set */ -TCBB_FUNC void *tcpal_malloc(u32 _size); -TCBB_FUNC void tcpal_free(void *_ptr); - -/* For Semaphore */ -#define TCPAL_INFINITE_SEMAPHORE 0xFFFFFFFFUL - -TCBB_FUNC s32 tcpal_create_lock( - u32 *_semaphore, - char *_name, - u32 _initialCount); -TCBB_FUNC s32 tcpal_destroy_lock(u32 *_semaphore); -TCBB_FUNC s32 tcpal_lock(u32 *_semaphore); -TCBB_FUNC s32 tcpal_unlock(u32 *_semaphore); - -TCBB_FUNC s32 tcpal_irq_register_handler(void *_device); -TCBB_FUNC s32 tcpal_irq_unregister_handler(void); -TCBB_FUNC s32 tcpal_irq_enable(void); -TCBB_FUNC s32 tcpal_irq_disable(void); - -#endif /*__TCPAL_OS_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_queue.h b/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_queue.h deleted file mode 100644 index 05e7982..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_queue.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * tcpal_queue.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __TCBD_QUEUE_H__ -#define __TCBD_QUEUE_H__ - -#define TCBD_QUEUE_SIZE 50 - -struct tcbd_queue_item { - u8 *buffer; - u8 subch_id; - s32 size; - s32 type; -}; - -struct tcbd_queue { - s32 front; - s32 rear; - s32 qsize; - s32 pointer; - s32 buff_size; - u8 *global_buffer; - u32 sem; - struct tcbd_queue_item q[TCBD_QUEUE_SIZE]; -}; - -TCBB_FUNC void tcbd_init_queue( - struct tcbd_queue *_queue, u8* buffer, s32 _buff_size); -TCBB_FUNC void tcbd_deinit_queue(struct tcbd_queue *_queue); - -TCBB_FUNC s32 tcbd_enqueue( - struct tcbd_queue *_queue, u8 *_chunk, s32 _size, - u8 _subch_id, s32 _type); - -TCBB_FUNC s32 tcbd_dequeue( - struct tcbd_queue *_queue, u8 *_chunk, s32 *_size, - u8 *_subch_id, s32 *_type); - -TCBB_FUNC s32 tcbd_dequeue_ptr( - struct tcbd_queue *_queue, u8 **_chunk, s32 *_size, s32 *_type); - -TCBB_FUNC s32 tcbd_get_first_queue_ptr( - struct tcbd_queue *_queue, u8 **_chunk, s32 *_size, s32 *_type); - -TCBB_FUNC s32 tcbd_queue_is_empty(struct tcbd_queue *_queue); -TCBB_FUNC s32 tcbd_queue_is_full(struct tcbd_queue *_queue); -TCBB_FUNC void tcbd_reset_queue(struct tcbd_queue *_queue); -#endif /*__TCBD_QUEUE_H__*/ diff --git a/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_types.h b/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_types.h deleted file mode 100644 index e0bb984..0000000 --- a/drivers/media/tdmb/tcc3170/inc/tcpal/tcpal_types.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * tcpal_types.h - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __TCPAL_TYPES_H__ -#define __TCPAL_TYPES_H__ - -#ifdef NULL - #undef NULL - #define NULL (void *)0 -#else - #define NULL (void *)0 -#endif - -#define TCBB_FUNC - -#define SWAP16(x) \ - ((u16)(\ - (((u16)(x)&(u16)0x00ffU) << 8) |\ - (((u16)(x)&(u16)0xff00U) >> 8))) - -#define SWAP32(x)\ - ((u32)(\ - (((u32)(x)&(u32)0x000000ffUL) << 24)| \ - (((u32)(x)&(u32)0x0000ff00UL) << 8)| \ - (((u32)(x)&(u32)0x00ff0000UL) >> 8)| \ - (((u32)(x)&(u32)0xff000000UL) >> 24))) - -#define MIN(x, y) ((x) < (y) ? (x) : (y)) -#define MAX(x, y) ((x) > (y) ? (x) : (y)) - -#endif diff --git a/drivers/media/tdmb/tcc3170/src/Makefile b/drivers/media/tdmb/tcc3170/src/Makefile deleted file mode 100644 index 8b4cd2e..0000000 --- a/drivers/media/tdmb/tcc3170/src/Makefile +++ /dev/null @@ -1,19 +0,0 @@ - -#obj-y += tcbd_hal.o -obj-y += tcbd_drv_io.o -obj-y += tcbd_drv_rf.o -obj-y += tcbd_drv_peri.o -obj-y += tcbd_drv_dual.o -obj-y += tcbd_drv_ip.o -obj-y += tcbd_api_common.o - -obj-y += tcbd_diagnosis/ -obj-y += tcbd_stream_parser/ -obj-y += tcpal_linux/ -obj-y += tcc_fic_decoder/ - -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcpal -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcbd_diagnosis -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcbd_stream_parser -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcc_fic_decoder diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_api_common.c b/drivers/media/tdmb/tcc3170/src/tcbd_api_common.c deleted file mode 100644 index 986f3d9..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_api_common.c +++ /dev/null @@ -1,648 +0,0 @@ -/* - * tcbd_api_common.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_api_common.h" -#include "tcbd_drv_ip.h" -#include "tcbd_drv_io.h" -#include "tcbd_drv_rf.h" - -#include "tcc317x_boot_tdmb.h" - -s32 tcbd_device_start(struct tcbd_device *_device, - enum tcbd_clock_type _clock_type) -{ - s32 ret = 0, ver; - u8 *dsp_rom = TCC317X_BOOT_DATA_TDMB; - s32 size = TCC317X_BOOT_SIZE_TDMB; -#if defined(__DEBUG_DSP_ROM__) - static u8 dsp_rom_buff[MAX_SIZE_DSP_ROM]; - if (tcbd_debug_rom_from_fs() == 1) { - ret = tcbd_read_file(_device, tcbd_debug_rom_path(), - dsp_rom_buff, MAX_SIZE_DSP_ROM); - if (ret > 0) { - dsp_rom = dsp_rom_buff; - size = ret; - tcbd_debug(DEBUG_ERROR, "rom:%s, size:%d\n", - tcbd_debug_rom_path(), size); - } - } -#endif /*__DEBUG_DSP_ROM__*/ - - /* Initialize PLL */ - tcbd_init_pll(_device, _clock_type); - tcbd_init_buffer_region(_device); - tcbd_init_div_io(_device, DIV_IO_TYPE_SINGLE); - tcbd_enable_buffer(_device); - tcbd_enable_peri(_device); - ret = tcbd_init_dsp(_device, dsp_rom, size); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to initialize dsp!! " - "error:%d\n", ret); - return -TCERR_FATAL_ERROR; - } else { - tcbd_get_rom_version(_device, &ver); - tcbd_debug(DEBUG_API_COMMON, "device start success!! " - "version:0x%X\n", ver); - } - return 0; -} - -s32 tcbd_enable_irq(struct tcbd_device *_device, u8 _en_bit) -{ - s32 ret = 0; - - if (!_device->is_pal_irq_en) { - tcpal_irq_enable(); - _device->is_pal_irq_en = 1; - } - ret |= tcbd_reg_write(_device, TCBD_IRQ_STAT_CLR, TCBD_IRQ_STATCLR_ALL); - ret |= tcbd_reg_write(_device, TCBD_IRQ_EN, _en_bit); - _device->enabled_irq = _en_bit; - return ret; -} - -s32 tcbd_disable_irq(struct tcbd_device *_device, u8 _mask) -{ - s32 ret = 0; - - if (_device->is_pal_irq_en) { - tcpal_irq_disable(); - _device->is_pal_irq_en = 0; - } - ret |= tcbd_reg_write(_device, TCBD_IRQ_STAT_CLR, TCBD_IRQ_STATCLR_ALL); - ret |= tcbd_reg_write(_device, TCBD_IRQ_EN, _mask); - return ret; -} - -s32 tcbd_read_irq_status( - struct tcbd_device *_device, - u8 *_irq_status, - u8 *_err_status) -{ - s32 ret = 0; - short status; - - ret = tcbd_reg_write(_device, TCBD_IRQ_LATCH, 0x5E); - ret |= tcbd_reg_read_burst_cont( - _device, TCBD_IRQ_STAT_CLR, (u8 *)&status, 2); - *_irq_status = status & 0xFF; - *_err_status = (status >> 8) & 0xFF; - return ret; -} - -s32 tcbd_clear_irq(struct tcbd_device *_device, u8 _status) -{ - return tcbd_reg_write(_device, TCBD_IRQ_STAT_CLR, _status); -} - -s32 tcbd_change_irq_mode( - struct tcbd_device *_device, enum tcbd_intr_mode _mode) -{ - u8 mode = TCBD_IRQ_MODE_PAD_ENABLE; - switch (_mode) { - case INTR_MODE_LEVEL_HIGH: - mode |= TCBD_IRQ_MODE_LEVEL | TCBD_IRQ_MODE_RISING; - break; - case INTR_MODE_LEVEL_LOW: - mode |= TCBD_IRQ_MODE_LEVEL | TCBD_IRQ_MODE_FALLING; - break; - case INTR_MODE_EDGE_RISING: - mode |= TCBD_IRQ_MODE_TRIGER | TCBD_IRQ_MODE_RISING; - break; - case INTR_MODE_EDGE_FALLING: - mode |= TCBD_IRQ_MODE_TRIGER | TCBD_IRQ_MODE_FALLING; - break; - default: - mode |= TCBD_IRQ_MODE_LEVEL | TCBD_IRQ_MODE_FALLING; - break; - } - return tcbd_reg_write(_device, TCBD_IRQ_MODE, mode); -} - -s32 tcbd_init_stream_data_config( - struct tcbd_device *_device, - u8 _use_cmd_fifo, - u8 _buffer_mask, - u32 _threshold) -{ - s32 ret = 0; - u16 threshold = SWAP16((_threshold>>2)); - - /* Disable internal buffer */ - ret |= tcbd_reg_write(_device, TCBD_STREAM_CFG0, 0); - /* Change interrupt threshold */ - ret |= tcbd_reg_write_burst_cont( - _device, TCBD_STREAM_CFG1, (u8 *)&threshold, 2); - - if (_use_cmd_fifo == ENABLE_CMD_FIFO) - ret |= tcbd_reg_write(_device, TCBD_STREAM_CFG3, 0x12); - else - ret |= tcbd_reg_write(_device, TCBD_STREAM_CFG3, 0x10); - - tcbd_reset_ip(_device, TCBD_SYS_COMP_ALL, TCBD_SYS_COMP_EP); - - /* Enable internal buffer */ - ret |= tcbd_reg_write(_device, TCBD_STREAM_CFG0, _buffer_mask); - - _device->intr_threshold = _threshold; - _device->selected_buff = _buffer_mask; - _device->en_cmd_fifo = _use_cmd_fifo; - -#if defined(__READ_VARIABLE_LENGTH__) - _device->size_more_read = 0; -#endif /*__READ_VARIABLE_LENGTH__*/ - return ret; -} - -#if defined(__CSPI_ONLY__) -#if defined(__READ_FIXED_LENGTH__) -s32 tcbd_read_stream(struct tcbd_device *_device, u8 *_buff, s32 *_size) -{ - u32 bytes_read = _device->intr_threshold; - - if (bytes_read <= 0 || _buff == NULL) - return -TCERR_INVALID_ARG; -/* - tcbd_reg_write(_device, TCBD_STREAM_CFG3, 0x22); - tcbd_reg_read_burst_cont( - _device, TCBD_STREAM_CFG1, (u8 *)&bytes_remain, 2); - bytes_remain = SWAP16(bytes_remain) << 2; - - tcbd_debug(DEBUG_STREAM_READ, "%d bytes read, %d bytes remain\n", - bytes_read, bytes_remain); -*/ - *_size = bytes_read; - - return tcbd_reg_read_burst_fix( - _device, TCBD_STREAM_CFG4, _buff, bytes_read); -} -#elif defined(__READ_VARIABLE_LENGTH__) -s32 tcbd_read_stream(struct tcbd_device *_device, u8 *_buff, s32 *_size) -{ - u32 bytes_remain = 0; - u32 bytes_read = _device->intr_threshold; - - if (bytes_read <= 0 || _buff == NULL) - return -TCERR_INVALID_ARG; - - tcbd_reg_write(_device, TCBD_STREAM_CFG3, 0x22); - tcbd_reg_read_burst_cont( - _device, TCBD_STREAM_CFG1, (u8 *)&bytes_remain, 2); - - /* bytes_remain is word count. x4 needed */ - bytes_remain = SWAP16(bytes_remain) << 2; - bytes_read = bytes_read + bytes_remain - _device->size_more_read; - tcbd_debug(DEBUG_STREAM_READ, "%d bytes remain, real data size:%d\n", - bytes_remain, bytes_read); - - if ((_device->intr_threshold << 1) < bytes_read) { - tcbd_debug(DEBUG_ERROR, "Could not read data over " - "TCBD_MAX_THRESHOLD(%d)\n", - bytes_read); - return -TCERR_FATAL_ERROR; - } - _device->size_more_read = bytes_remain; - *_size = bytes_read; - return tcbd_reg_read_burst_fix( - _device, TCBD_STREAM_CFG4, _buff, bytes_read); -} -#else -#error "you must define __READ_VARIABLE_LENGTH__ or __READ_FIXED_LENGTH__" -#endif /*!__READ_FIXED_LENGTH__ && !__READ_VARIABLE_LENGTH__*/ -#endif /*__CSPI_ONLY__*/ - -s32 tcbd_tune_frequency( - struct tcbd_device *_device, u32 _freq_khz, s32 _bw_khz) -{ - s32 ret = 0; - u64 tick; - - tcbd_debug(DEBUG_API_COMMON, "freq:%d, bw:%d\n", _freq_khz, _bw_khz); - - memset(&_device->mult_service, 0, sizeof(_device->mult_service)); - tick = tcpal_get_time(); - if (_freq_khz < 1000000) - _device->curr_band = BAND_TYPE_BAND3; - else - _device->curr_band = BAND_TYPE_LBAND; - ret |= tcbd_reset_ip(_device, TCBD_SYS_COMP_ALL, TCBD_SYS_COMP_ALL); - - ret |= tcbd_rf_tune_frequency(_device, _freq_khz, _bw_khz); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to tune frequency to RF!! " - "ret:%d\n", ret); - return ret; - } - - switch (_device->peri_type) { - case PERI_TYPE_SPI_ONLY: - ret |= tcbd_init_stream_data_config(_device, ENABLE_CMD_FIFO, - STREAM_DATA_ENABLE | STREAM_HEADER_ON | - STREAM_MASK_BUFFERA, TCBD_THRESHOLD_FIC); - break; - case PERI_TYPE_STS: - ret |= tcbd_init_stream_data_config(_device, DISABLE_CMD_FIFO, - 0, 0); - break; - default: - tcbd_debug(DEBUG_ERROR, "%d not implemented!!\n", - _device->peri_type); - return -TCERR_FATAL_ERROR; - } - tcbd_init_status_manager(); - - ret |= tcbd_demod_tune_frequency(_device, _freq_khz, _bw_khz); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to tune frequency " - "to demodulator!! ret:%d\n", ret); - return ret; - } - _device->prev_band = _device->curr_band; - _device->frequency = _freq_khz; - -#if defined(__READ_VARIABLE_LENGTH__) - _device->size_more_read = 0; -#endif /*__READ_VARIABLE_LENGTH__*/ - tcbd_debug(DEBUG_API_COMMON, " # Frequency set time :%lld\n", - tcpal_diff_time(tick)); - - return ret; -} - -s32 tcbd_wait_tune(struct tcbd_device *_device, u8 *_status) -{ - s32 ret = 0; - u8 cto, cfo, ofdm; - u64 time_tick, time_tune_wait; - - time_tune_wait = TDMB_OFDMDETECT_LOCK * TDMB_OFDMDETECT_RETRY; - time_tick = tcpal_get_time(); - do { - ret = tcbd_reg_read(_device, TCBD_PROGRAMID, _status); - if (ret < 0) - goto exit_wait_tune; - - cto = ((*_status) >> 1) & 0x01; - cfo = ((*_status) >> 2) & 0x01; - if (cto && cfo) - goto exit_wait_tune; - - ofdm = ((*_status) >> 5) & 0x01; - if (ofdm) - break; - } while (tcpal_diff_time(time_tick) < time_tune_wait); - - if (ofdm == 0) { - ret = -TCERR_TUNE_FAILED; - goto exit_wait_tune; - } - - time_tune_wait = (TDMB_CTO_LOCK * TDMB_CTO_RETRY) + - (TDMB_CTO_LOCK + TDMB_CFO_LOCK) * - TDMB_CFO_RETRY; - time_tick = tcpal_get_time(); - do { - ret = tcbd_reg_read(_device, TCBD_PROGRAMID, _status); - if (ret < 0) - goto exit_wait_tune; - - cto = ((*_status) >> 1) & 0x01; - cfo = ((*_status) >> 2) & 0x01; - if (cto && cfo) - break; - } while (tcpal_diff_time(time_tick) < time_tune_wait); - - if (cto && cfo) - tcbd_debug(DEBUG_API_COMMON, "lock status : 0x%02X\n", - *_status); - else - ret = -TCERR_TUNE_FAILED; - -exit_wait_tune: - return ret; -} - -static inline s32 tcbd_calc_threshold(struct tcbd_service *_service) -{ - s32 threshold = 0; - s32 uep_bitrate[] = { - 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384}; - - switch (_service->ptype) { - case PROTECTION_TYPE_UEP: - threshold = (uep_bitrate[_service->bitrate] * 6) << 2; - break; - case PROTECTION_TYPE_EEP: - threshold = (_service->bitrate * 6) << 5; - break; - } - - if (TCBD_MAX_THRESHOLD < threshold) - threshold = TCBD_MAX_THRESHOLD; - - tcbd_debug(DEBUG_API_COMMON, "ptype:%s, bitrate :%d, interrupt " - "threshold:%d\n", (_service->ptype) ? "EEP" : "UEP", - _service->bitrate, threshold); - - return threshold>>1; -} - -static inline s32 tcbd_find_empty_slot( - struct tcbd_multi_service *_multi_svc) -{ - s32 i; - - for (i = 0; i < TCBD_MAX_NUM_SERVICE; i++) { - if (_multi_svc->on_air[i] == 0) - return i; - } - return -1; -} - -static inline s32 tcbd_find_used_slot( - struct tcbd_multi_service *_multi_svc, u8 _subch_id) -{ - s32 i; - u32 *service_info = _multi_svc->service_info; - - if (_multi_svc->service_count == 0) - return -1; - - for (i = 0; i < TCBD_MAX_NUM_SERVICE; i++) { - if (((service_info[i * 2] >> 20) & 0x3F) == _subch_id) - return i; - } - return -1; -} - -#define FLAG_SHORT_PARAM 0 -#define FLAG_LONG_PARAM 1 -static inline s32 tcbd_set_service(struct tcbd_device *_device, - struct tcbd_service *_service, s32 _flag) -{ - s32 ret = 0; - u32 threshold = 0, sel_buff = 0, sel_stream = 0; - u8 en_cmd_fifo = 0; - - sel_buff = STREAM_DATA_ENABLE | STREAM_HEADER_ON | - STREAM_MASK_BUFFERA; - switch (_device->peri_type) { - case PERI_TYPE_SPI_ONLY: - if (_flag == FLAG_LONG_PARAM) { - threshold = tcbd_calc_threshold(_service); - sel_stream = STREAM_SET_GARBAGE(threshold) | - STREAM_TYPE_ALL; - } else { - threshold = TCBD_MAX_THRESHOLD; - sel_stream = STREAM_SET_GARBAGE(TCBD_MAX_THRESHOLD) | - STREAM_TYPE_ALL; - } - tcbd_debug(DEBUG_API_COMMON, "threshold : %d\n", threshold); - en_cmd_fifo = ENABLE_CMD_FIFO; - break; - case PERI_TYPE_STS: - en_cmd_fifo = DISABLE_CMD_FIFO; - sel_stream = STREAM_TYPE_ALL; -#if !defined(__ALWAYS_FIC_ON__) - sel_buff &= ~(STREAM_HEADER_ON); -#endif /*__ALWAYS_FIC_ON__*/ - break; - default: - tcbd_debug(DEBUG_ERROR, "not implemented!\n"); - return -1; - } - -#if !defined(__ALWAYS_FIC_ON__) - sel_stream &= ~(STREAM_TYPE_FIC); -#endif /*__ALWAYS_FIC_ON__*/ - -#if defined(__STATUS_IN_REGISTER__) - sel_stream &= ~(STREAM_TYPE_STATUS); -#endif /* __STATUS_IN_REGISTER__ */ - -#if defined(__READ_VARIABLE_LENGTH__) - _device->size_more_read = 0; -#endif /*__READ_VARIABLE_LENGTH__*/ - ret |= tcbd_disable_irq(_device, 0); - - ret |= tcbd_change_stream_type(_device, sel_stream); - ret |= tcbd_init_stream_data_config( - _device, en_cmd_fifo, sel_buff, threshold); - - ret |= tcbd_send_service_info(_device); - if (_device->peri_type == PERI_TYPE_SPI_ONLY) - ret |= tcbd_enable_irq(_device, _device->enabled_irq); - return ret; -} - -s32 tcbd_register_service(struct tcbd_device *_device, u8 _subch_id, - u8 _data_mode) -{ - s32 empty_slot, empty_slot2x; - struct tcbd_service service = {0, }; - struct tcbd_multi_service *mult_service = &_device->mult_service; - u32 *service_info = mult_service->service_info; - - if (tcbd_find_used_slot(mult_service, _subch_id) >= 0) { - tcbd_debug(DEBUG_ERROR, "aready registerd service! " - "subch_id:%d\n", _subch_id); - return -TCERR_AREADY_REGISTERED; - } - - empty_slot = tcbd_find_empty_slot(mult_service); - if (empty_slot < 0) { - tcbd_debug(DEBUG_ERROR, "Exceed maxinum number of service!!\n"); - return -TCERR_MAX_NUM_SERVICE; - } - service.subch_id = _subch_id; - empty_slot2x = empty_slot << 1; - mult_service->on_air[empty_slot] = 1; - mult_service->service_count++; - - tcbd_debug(DEBUG_API_COMMON, "sub channel:%d, data mode:%d\n", - _subch_id, _data_mode); - service_info[empty_slot2x] = - (_subch_id << 20) | - (2 << 26); - service_info[empty_slot2x + 1] = - (empty_slot << 20) | - (_data_mode << 16); - - return tcbd_set_service(_device, &service, FLAG_SHORT_PARAM); -} - -s32 tcbd_register_service_long(struct tcbd_device *_device, - struct tcbd_service *_service) -{ - s32 empty_slot, empty_slot2x; - u32 data_mode = 0; - struct tcbd_multi_service *mult_service = &_device->mult_service; - u32 *service_info = mult_service->service_info; - - if (tcbd_find_used_slot(mult_service, _service->subch_id) >= 0) { - tcbd_debug(DEBUG_ERROR, "aready registerd service! " - "subch_id:%d\n", _service->subch_id); - return -TCERR_AREADY_REGISTERED; - } - - empty_slot = tcbd_find_empty_slot(mult_service); - if (empty_slot < 0) { - tcbd_debug(DEBUG_ERROR, "Exceed maxinum number of service!!\n"); - return -TCERR_MAX_NUM_SERVICE; - } - - switch (_service->type) { - case SERVICE_TYPE_DAB: - case SERVICE_TYPE_DABPLUS: - case SERVICE_TYPE_DATA: - data_mode = 0; break; - case SERVICE_TYPE_DMB: - data_mode = 1; break; - default: - data_mode = 2; break; - } - - empty_slot2x = empty_slot << 1; - mult_service->on_air[empty_slot] = 1; - mult_service->service_count++; - - service_info[empty_slot2x] = - (_service->reconfig << 26) | - (_service->subch_id << 20) | - (_service->size_cu << 10) | - _service->start_cu; - service_info[empty_slot2x + 1] = - (empty_slot << 20) | - /*(0 << 18) |*/ - (data_mode << 16) | - (_service->ptype << 11) | - (_service->plevel << 8) | - _service->bitrate; - - return tcbd_set_service(_device, _service, FLAG_LONG_PARAM); -} - -s32 tcbd_unregister_service(struct tcbd_device *_device, u8 _subch_id) -{ - s32 ret = 0; - s32 service_idx; - struct tcbd_multi_service *mult_service = &_device->mult_service; - u32 *service_info = mult_service->service_info; - - tcbd_disable_irq(_device, 0); - service_idx = tcbd_find_used_slot(mult_service, _subch_id); - if (service_idx < 0) { - tcbd_debug(DEBUG_ERROR, "not registered service!\n"); - return -TCERR_SERVICE_NOT_FOUND; - } - /*tcbd_disable_peri(_device);*/ - - service_info[service_idx * 2] = 0x00; - service_info[service_idx * 2 + 1] = 0x00; - mult_service->on_air[service_idx] = 0; - mult_service->service_count--; - - ret |= tcbd_send_service_info(_device); - return ret; -} - -s32 tcbd_read_fic_data(struct tcbd_device *_device, u8 *_buff, s32 _size) -{ - s32 ret = 0; - u32 addr_fic_buff; - u8 status, err_status; - - tcbd_read_irq_status(_device, &status, &err_status); - if (_size != TCBD_FIC_SIZE) { - tcbd_debug(DEBUG_ERROR, "wrong fic size! %d\n", _size); - ret = -TCERR_INVALID_ARG; - goto exit_read_fic; - } - if (status & TCBD_IRQ_STAT_FIFOAINIT) { - addr_fic_buff = PHY_MEM_ADDR_A_START; - tcbd_debug(DEBUG_INTRRUPT, "status:0x%02X, err:0x%02X\n", - status, err_status); - - ret = tcbd_mem_read(_device, addr_fic_buff, _buff, _size); - } else - ret = -TCERR_NO_FIC_DATA; -exit_read_fic: - tcbd_clear_irq(_device, status); - return ret; - } - -static s32 tcbd_disp_dsp_debug(struct tcbd_device *_device) -{ - s32 pos_buf = 0, ret, i; - u32 len = 0, *data = NULL; - u16 cmd; - s8 debug_buff[256]; - - tcbd_debug_mbox_rx(&cmd, &len, &data); - if (data == NULL) - return 0; - - ret = tcbd_read_mail_box(_device, cmd, len, data); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to read mail box, " - "err:%d\n", ret); - return ret; -} - - for (i = 0; i < 6; i++) - pos_buf += sprintf(debug_buff + pos_buf, "[%d:%08X]", - i, data[i]); - tcbd_debug(DEBUG_INFO, "%s\n", debug_buff); - - return 0; -} - -s32 tcbd_read_signal_info( - struct tcbd_device *_device, - struct tcbd_status_data *_status_data) -{ - s32 ret = 0; -#if defined(__STATUS_IN_REGISTER__) - u8 status[32] = {0, }; -#endif /*__STATUS_IN_REGISTER__*/ - - if (!_status_data) - return -TCERR_INVALID_ARG; - - if (tcbd_debug_spur_dbg() == 1) - tcbd_disp_dsp_debug(_device); - -#if defined(__STATUS_IN_REGISTER__) - ret = tcbd_reg_write(_device, TCBD_OP_STATUS0, 0x1); - ret |= tcbd_reg_read_burst_fix(_device, - TCBD_OP_STATUS1, status, TCBD_STATUS_SIZE); - tcbd_update_status(status, TCBD_STATUS_SIZE, _status_data); -#elif defined(__STATUS_IN_STREAM__) - - tcbd_update_status(NULL, 0, _status_data); -#endif /*__STATUS_IN_STREAM__*/ - return ret; -} diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_diagnosis/Makefile b/drivers/media/tdmb/tcc3170/src/tcbd_diagnosis/Makefile deleted file mode 100644 index a901855..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_diagnosis/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -obj-y += tcbd_diagnosis.o - -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcpal -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcbd_diagnosis diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_diagnosis/tcbd_diagnosis.c b/drivers/media/tdmb/tcc3170/src/tcbd_diagnosis/tcbd_diagnosis.c deleted file mode 100644 index e425df8..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_diagnosis/tcbd_diagnosis.c +++ /dev/null @@ -1,386 +0,0 @@ -/* - * tcbd_diagnosis.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_diagnosis.h" -#include "tcbd_error.h" - -#define OFFSET_RF_LOOP_GAIN 4 -#define OFFSET_BB_LOOP_GAIN 5 -#define OFFSET_PRS_SNR 8 -#define OFFSET_PCBER 12 -#define OFFSET_RS_PKT_CNT 16 -#define OFFSET_RS_OVER_CNT 20 -#define OFFSET_RS_ERR_CNT_LO 24 -#define OFFSET_RS_ERR_CNT_HI 28 - -#define MAX_MAVG_ARRAY_SIZE 10 - -#define MIN_SNR 0 -#define MAX_SNR 25 - -#define MIN_PCBER 0 -#define MAX_PCBER 1 - -#define MIN_VITERBIBER 0 -#define MAX_VITERBIBER 1 - -#define MIN_TSPER 0 -#define MAX_TSPER 1 - -#define MIN_RSSI (-105) -#define MAX_RSSI 3 - -#define SCALE_FACTOR 10000 -#define ERROR_LIMIT 2000 - -struct tcbd_moving_avg { - u32 array[MAX_MAVG_ARRAY_SIZE+1]; - u32 pre_sum; - u64 total_sum; - s32 index; - s32 moving_cnt; - s32 total_cnt; -}; - -struct tcbd_raw_status { - u8 lock_status; - u8 rf_loop_gain; - u8 bb_loop_gain; - - s32 pcber; - u32 prs_snr; - - u32 rs_over_cnt; - u32 rs_pkt_cnt; - u64 rs_err_cnt; -}; - -struct tcbd_raw_status_manager { - u32 resynced; - struct tcbd_raw_status old_status; - struct tcbd_raw_status curr_status; - - struct tcbd_status_data status_data; -}; - -static struct tcbd_moving_avg moving_average[4]; -static struct tcbd_raw_status_manager status_manager; - -static inline u32 tcbd_log10(u32 _val) -{ - u32 i, snr = 0; - u32 snr_table[28] = { - 1024, 1289, 1622, 2043, 2572, 3238, 4076, 5132, - 6461, 8133, 10240, 12891, 6229, 20431, 25721, 32381, - 40766, 51321, 64610, 81339, 102400, 128913, 162293, 204314, - 257217, 323817, 407661, 513215 }; - - if (_val < snr_table[0]) - return 0; - - if (_val >= snr_table[27]) - return 27; - - for (i = 0; i < 27; i++) { - if (_val >= snr_table[i] && - _val < snr_table[i + 1]) { - snr = i; - break; - } - } - - return snr; -} - -static s32 tcbd_get_moving_avg( - struct tcbd_moving_avg *_slot, u32 _value, s32 _windowSize) -{ - s32 moving_sum; - u32 result; - - if (MAX_MAVG_ARRAY_SIZE < _windowSize) { - tcbd_debug(0, - "max window size is %d\n", MAX_MAVG_ARRAY_SIZE); - return -TCERR_INVALID_ARG; - } - - if (_slot->moving_cnt >= _windowSize) - _slot->pre_sum += _slot->array[_slot->index]; - else - _slot->moving_cnt++; - - _slot->array[_slot->index] = _value; - _slot->index++; - - _slot->index %= _windowSize; - _slot->total_cnt++; - _slot->total_sum += _value; - - moving_sum = _slot->total_sum - _slot->pre_sum; - result = moving_sum / _slot->moving_cnt; - - if (_slot->index == 0) { - _slot->total_sum = moving_sum; - _slot->pre_sum = 0; - } - - return result; -} - - -static inline void tcbd_calc_rssi(struct tcbd_status_data *_status_data) -{ - struct tcbd_raw_status *curr_status = &status_manager.curr_status; - - if (curr_status->rf_loop_gain <= 120) - _status_data->rssi = 1500 - - ((int)curr_status->bb_loop_gain) * 37 - - 27 * ((int)curr_status->rf_loop_gain); - else if (curr_status->rf_loop_gain <= 216) - _status_data->rssi = 1500 - - ((int)curr_status->bb_loop_gain) * 35 - - 24 * ((int)curr_status->rf_loop_gain); - else - _status_data->rssi = 1500 - - ((int)curr_status->bb_loop_gain) * 33 - - 22 * ((int)curr_status->rf_loop_gain); - - _status_data->rssi /= 100; - if (_status_data->rssi < MIN_RSSI) - _status_data->rssi = MIN_RSSI; - else if (_status_data->rssi > MAX_RSSI) - _status_data->rssi = MAX_RSSI; -} - -static inline void tcbd_calc_pcber(struct tcbd_status_data *_status_data) -{ - long long over; - struct tcbd_raw_status *curr_status = &status_manager.curr_status; - - over = (u64)curr_status->pcber * SCALE_FACTOR; - _status_data->pcber = (u32)(over >> 16); - - if (_status_data->pcber < MIN_PCBER) - _status_data->pcber = MIN_PCBER; - else if (_status_data->pcber > MAX_PCBER * ERROR_LIMIT) - _status_data->pcber = MAX_PCBER * ERROR_LIMIT; - - if (_status_data->pcber <= 20) - _status_data->pcber = 0; - - _status_data->pcber_moving_avg = - tcbd_get_moving_avg( - &moving_average[0], - _status_data->pcber, - MAX_MAVG_ARRAY_SIZE); -} - -static inline void tcbd_calc_snr(struct tcbd_status_data *_status_data) -{ - struct tcbd_raw_status *curr_status = &status_manager.curr_status; - - if ((int)curr_status->prs_snr < 0) - _status_data->snr = MAX_SNR; - else if (curr_status->prs_snr == 0) - _status_data->snr = MIN_SNR; - else - _status_data->snr = tcbd_log10(curr_status->prs_snr); - - if (_status_data->snr < MIN_SNR) - _status_data->snr = MIN_SNR; - else if (_status_data->snr > MAX_SNR) - _status_data->snr = MAX_SNR; - - _status_data->snr_moving_avg = - tcbd_get_moving_avg( - &moving_average[1], - _status_data->snr, - MAX_MAVG_ARRAY_SIZE); -} - -static inline void tcbd_calc_viterbi_ber(struct tcbd_status_data *_status_data) -{ - s32 rs_err, rs_over, rs_under; - struct tcbd_raw_status *old_status, *curr_status; - - old_status = &status_manager.old_status; - curr_status = &status_manager.curr_status; - - if (status_manager.resynced) { - _status_data->vber = MAX_VITERBIBER * ERROR_LIMIT; - goto exit_calc_viterbi_ber; - } - - if (status_manager.resynced && curr_status->rs_pkt_cnt == 0) { - _status_data->vber = MIN_VITERBIBER; - goto exit_calc_viterbi_ber; - } - - rs_err = ((u32)(curr_status->rs_over_cnt - - old_status->rs_over_cnt)) * SCALE_FACTOR; - - rs_over = (rs_err * (8 * 8) + - ((u32)(curr_status->rs_err_cnt - - old_status->rs_err_cnt)) * SCALE_FACTOR); - rs_under = - (curr_status->rs_pkt_cnt - - old_status->rs_pkt_cnt) * 204 * 8; - if (!rs_under) - return; - - _status_data->vber = rs_over / rs_under; - - if (_status_data->vber < MIN_VITERBIBER) - _status_data->vber = MIN_VITERBIBER; - else if (_status_data->vber > MAX_VITERBIBER * ERROR_LIMIT) - _status_data->vber = MAX_VITERBIBER * ERROR_LIMIT; - -exit_calc_viterbi_ber: - _status_data->vber_moving_avg = - tcbd_get_moving_avg( - &moving_average[3], - _status_data->vber, - MAX_MAVG_ARRAY_SIZE); -} - -static inline void tcbd_calc_tsper(struct tcbd_status_data *_status_data) -{ - s32 rs_over, rs_under; - struct tcbd_raw_status *old_status, *curr_status; - - old_status = &status_manager.old_status; - curr_status = &status_manager.curr_status; - - if (status_manager.resynced) { - _status_data->tsper = MAX_TSPER * ERROR_LIMIT; - goto exit_calc_tsper; - } - - if (status_manager.resynced && curr_status->rs_pkt_cnt == 0) { - _status_data->tsper = MIN_TSPER; - goto exit_calc_tsper; - } - - rs_over = (curr_status->rs_over_cnt - - old_status->rs_over_cnt) * SCALE_FACTOR; - rs_under = curr_status->rs_pkt_cnt - old_status->rs_pkt_cnt; - if (!rs_under) - return; - - _status_data->ts_error_count = rs_over; - _status_data->tsper = rs_over / rs_under; - if (_status_data->tsper < MIN_TSPER) - _status_data->tsper = MIN_TSPER; - else if (_status_data->tsper > MAX_TSPER * ERROR_LIMIT) - _status_data->tsper = MAX_TSPER * ERROR_LIMIT; - -exit_calc_tsper: - _status_data->tsper_moving_avg = tcbd_get_moving_avg( - &moving_average[2], - _status_data->tsper, - MAX_MAVG_ARRAY_SIZE); -} - -void tcbd_update_status_per_frame( - u8 *_raw_data, struct tcbd_status_data *_status_data) -{ - struct tcbd_raw_status *old_status, *curr_status; - struct tcbd_status_data *status_data; - - if (!_raw_data && !_status_data) - return; - - if (_raw_data == NULL) { - memcpy(_status_data, &status_manager.status_data, - sizeof(struct tcbd_status_data)); - return; - } - - status_data = (_status_data) ? - _status_data : &status_manager.status_data; - old_status = &status_manager.old_status; - curr_status = &status_manager.curr_status; - memcpy(old_status, curr_status, sizeof(struct tcbd_raw_status)); - - curr_status->rf_loop_gain = _raw_data[OFFSET_RF_LOOP_GAIN]; - curr_status->bb_loop_gain = _raw_data[OFFSET_BB_LOOP_GAIN]; - - curr_status->prs_snr = - *((u32 *)(_raw_data + OFFSET_PRS_SNR)); - curr_status->pcber = - *((u32 *)(_raw_data + OFFSET_PCBER)); - - curr_status->rs_pkt_cnt = - *((u32 *)(_raw_data + OFFSET_RS_PKT_CNT)); - curr_status->rs_over_cnt = - *((u32 *)(_raw_data + OFFSET_RS_OVER_CNT)); - curr_status->rs_err_cnt = - *((u64 *)(_raw_data + OFFSET_RS_ERR_CNT_LO)); - curr_status->rs_err_cnt |= - (*((u64 *)(_raw_data + OFFSET_RS_ERR_CNT_HI))) << 32; - - if (curr_status->rs_pkt_cnt != old_status->rs_pkt_cnt) { - status_manager.resynced = 0; - if (curr_status->rs_pkt_cnt == 0 && old_status->rs_pkt_cnt) - status_manager.resynced = 1; - else if (curr_status->rs_pkt_cnt < old_status->rs_pkt_cnt) { - if (old_status->rs_pkt_cnt < 0x80000000) - status_manager.resynced = 1; - } - } - - tcbd_calc_snr(status_data); - tcbd_calc_pcber(status_data); - tcbd_calc_viterbi_ber(status_data); - tcbd_calc_tsper(status_data); - tcbd_calc_rssi(status_data); - - status_data->lock = *((u8 *)_raw_data); - if (status_manager.resynced) { - memset(moving_average, 0, sizeof(moving_average)); - memset(&status_manager.old_status, 0, - sizeof(struct tcbd_raw_status)); - } -} - -void tcbd_update_status( - u8 *_raw_data, u32 _size, struct tcbd_status_data *_status_data) -{ - s32 i; - - if (!_raw_data) - tcbd_update_status_per_frame(NULL, _status_data); - - for (i = 0; i < _size / TCBD_STATUS_SIZE; i++) - tcbd_update_status_per_frame(_raw_data + i * TCBD_STATUS_SIZE, - _status_data); -} - -void tcbd_init_status_manager(void) -{ - memset(&status_manager, 0, sizeof(status_manager)); - memset(moving_average, 0, sizeof(moving_average)); -} diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_drv_dual.c b/drivers/media/tdmb/tcc3170/src/tcbd_drv_dual.c deleted file mode 100644 index 0897012..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_drv_dual.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * tcbd_drv_dual.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_api_common.h" -#include "tcbd_drv_io.h" - -s32 tcbd_change_chip_addr(struct tcbd_device *_device, u8 addr) -{ - _device->chip_addr = addr; - return tcbd_reg_write(_device, TCBD_CHIPADDR, addr); -} - -s32 tcbd_enable_slave_command_ack(struct tcbd_device *_device) -{ - s32 ret = 0; - u16 outData = SWAP16((0x1 << 15)); - u16 outEnable = SWAP16((0x1 << 15)); - - ret |= tcbd_reg_write_burst_cont( - _device, TCBD_GPIO_LR, (u8 *)&outData, 2); - ret |= tcbd_reg_write_burst_cont( - _device, TCBD_GPIO_DR, (u8 *)&outEnable, 2); - - return ret; -} - -s32 tcbd_init_div_io( - struct tcbd_device *_device, enum tcbd_div_io_type _divIo) -{ - return tcbd_reg_write(_device, TCBD_DIVIO, (u8)_divIo); -} diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_drv_io.c b/drivers/media/tdmb/tcc3170/src/tcbd_drv_io.c deleted file mode 100644 index e2bcbea..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_drv_io.c +++ /dev/null @@ -1,516 +0,0 @@ -/* - * tcbd_drv_io.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_api_common.h" -#include "tcbd_drv_ip.h" -#include "tcbd_drv_io.h" - -static struct tcbd_io_data tcbd_io_funcs; - -struct tcbd_io_data *tcbd_get_io_struct(void) -{ - return &tcbd_io_funcs; -} - -s32 tcbd_io_open(struct tcbd_device *_device) -{ - s32 ret = 0; - - if (tcbd_io_funcs.open == NULL) - return -TCERR_IO_NOT_INITIALIZED; - - tcpal_create_lock(&tcbd_io_funcs.sem, "tcbd_io_lock", 0); - - ret = tcbd_io_funcs.open(); - if (ret < 0) - return ret; - - _device->chip_addr = DEFAULT_CHIP_ADDRESS; - - /*Initialize internal processor */ - tcbd_reset_ip(_device, TCBD_SYS_COMP_EP, TCBD_SYS_COMP_ALL); - - return ret; -} - -s32 tcbd_io_close(struct tcbd_device *_device) -{ - s32 ret = 0; - - if (tcbd_io_funcs.close == NULL) - return -TCERR_IO_NOT_INITIALIZED; - - tcpal_destroy_lock(&tcbd_io_funcs.sem); - - ret = tcbd_io_funcs.close(); - memset(_device, 0, sizeof(struct tcbd_device)); - - return ret; -} - -s32 tcbd_reg_read( - struct tcbd_device *_device, u8 _addr, u8 *_data) -{ - s32 ret; - - if (tcbd_io_funcs.reg_read == NULL) - return -TCERR_IO_NOT_INITIALIZED; - - if (_device == NULL || _data == NULL) - return -TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - ret = tcbd_io_funcs.reg_read(_addr, _data); - tcpal_unlock(&tcbd_io_funcs.sem); - return ret; -} - -s32 tcbd_reg_write( - struct tcbd_device *_device, u8 _addr, u8 _data) -{ - s32 ret; - - if (tcbd_io_funcs.reg_write == NULL) - return -TCERR_IO_NOT_INITIALIZED; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - ret = tcbd_io_funcs.reg_write(_addr, _data); - tcpal_unlock(&tcbd_io_funcs.sem); - - return ret; -} - -s32 tcbd_reg_read_burst_cont( - struct tcbd_device *_device, u8 _addr, u8 *_data, s32 _size) -{ - s32 ret; - - if (tcbd_io_funcs.reg_read_burst_cont == NULL) - return -TCERR_IO_NOT_INITIALIZED; - - if (_device == NULL || _data == NULL) - return TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - ret = tcbd_io_funcs.reg_read_burst_cont(_addr, _data, _size); - tcpal_unlock(&tcbd_io_funcs.sem); - - return ret; -} - -s32 tcbd_reg_write_burst_cont( - struct tcbd_device *_device, u8 _addr, u8 *_data, s32 _size) -{ - s32 ret; - - if (tcbd_io_funcs.reg_write_burst_cont == NULL) - return -TCERR_IO_NOT_INITIALIZED; - - if (_device == NULL || _data == NULL || _size <= 0) - return TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - ret = tcbd_io_funcs.reg_write_burst_cont(_addr, _data, _size); - tcpal_unlock(&tcbd_io_funcs.sem); - - return ret; -} - -s32 tcbd_reg_read_burst_fix( - struct tcbd_device *_device, u8 _addr, u8 *_data, s32 _size) -{ - s32 ret; - - if (tcbd_io_funcs.reg_read_burst_fix == NULL) - return -TCERR_IO_NOT_INITIALIZED; - - if (_device == NULL || _data == NULL || _size <= 0) - return TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - ret = tcbd_io_funcs.reg_read_burst_fix(_addr, _data, _size); - tcpal_unlock(&tcbd_io_funcs.sem); - - return ret; -} - -s32 tcbd_reg_write_burst_fix( - struct tcbd_device *_device, u8 _addr, u8 *_data, s32 _size) -{ - s32 ret; - - if (tcbd_io_funcs.reg_write_burst_fix == NULL) - return -TCERR_IO_NOT_INITIALIZED; - - if (_device == NULL || _data == NULL || _size <= 0) - return TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - ret = tcbd_io_funcs.reg_write_burst_fix(_addr, _data, _size); - tcpal_unlock(&tcbd_io_funcs.sem); - - return ret; -} - -s32 tcbd_mem_write( - struct tcbd_device *_device, u32 _addr, u8 *_data, u32 _size) -{ - s32 ret = 0; - u32 addr = SWAP32(_addr); - u16 size = SWAP16((u16)(_size>>2)); - u8 ctrl_data; - - if (_size <= 0 || _data == NULL || _device == NULL) - return -TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - - ctrl_data = - TCBD_CMDDMA_DMAEN | - TCBD_CMDDMA_WRITEMODE | - TCBD_CMDDMA_CRC32EN; - ret |= tcbd_io_funcs.reg_write(TCBD_CMDDMA_CTRL, ctrl_data); - ret |= tcbd_io_funcs.reg_write_burst_cont( - TCBD_CMDDMA_SADDR, (u8 *)&addr, sizeof(u32)); - ret |= tcbd_io_funcs.reg_write_burst_cont( - TCBD_CMDDMA_SIZE, (u8 *)&size, sizeof(u16)); - ctrl_data = - TCBD_CMDDMA_START_AUTOCLR | - TCBD_CMDDMA_INIT_AUTOCLR | - TCBD_CMDDMA_CRC32INIT_AUTOCLR | - TCBD_CMDDMA_CRC32INIT_AUTOCLR; - ret |= tcbd_io_funcs.reg_write(TCBD_CMDDMA_STARTCTRL, ctrl_data); - ret |= tcbd_io_funcs.reg_write_burst_fix( - TCBD_CMDDMA_DATA_WIND, _data, _size); - - tcpal_unlock(&tcbd_io_funcs.sem); - return ret; -} - -s32 tcbd_mem_read( - struct tcbd_device *_device, u32 _addr, u8 *_data, u32 _size) -{ - s32 ret = 0; - u8 ctrl_data; - u32 addr = SWAP32(_addr); - u16 size = SWAP16((u16)(_size >> 2)); - - if (_size <= 0 || _data == NULL || _device == NULL) - return -TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - - ctrl_data = TCBD_CMDDMA_DMAEN | TCBD_CMDDMA_READMODE; - ret |= tcbd_io_funcs.reg_write(TCBD_CMDDMA_CTRL, ctrl_data); - ret |= tcbd_io_funcs.reg_write_burst_cont( - TCBD_CMDDMA_SADDR, (u8 *)&addr, sizeof(u32)); - ret |= tcbd_io_funcs.reg_write_burst_cont( - TCBD_CMDDMA_SIZE, (u8 *)&size, sizeof(u16)); - ctrl_data = - TCBD_CMDDMA_START_AUTOCLR | - TCBD_CMDDMA_INIT_AUTOCLR | - TCBD_CMDDMA_CRC32INIT_AUTOCLR; - ret |= tcbd_io_funcs.reg_write(TCBD_CMDDMA_STARTCTRL, ctrl_data); - ret |= tcbd_io_funcs.reg_read_burst_fix( - TCBD_CMDDMA_DATA_WIND, _data, _size); - - tcpal_unlock(&tcbd_io_funcs.sem); - return ret; -} - -s32 tcbd_rf_reg_write( - struct tcbd_device *_device, u8 _addr, u32 _data) -{ - s32 ret = 0; - u32 data = SWAP32(_data); - - if (_device == NULL) - return TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - - ret |= tcbd_io_funcs.reg_write( - TCBD_RF_CFG0, - TCBD_RF_MANAGE_ENABLE|TCBD_RF_WRITE); - ret |= tcbd_io_funcs.reg_write(TCBD_RF_CFG2, _addr); - ret |= tcbd_io_funcs.reg_write_burst_cont( - TCBD_RF_CFG3, (u8 *)&data, sizeof(u32)); - ret |= tcbd_io_funcs.reg_write(TCBD_RF_CFG1, TCBD_RF_ACTION); - ret |= tcbd_io_funcs.reg_write(TCBD_RF_CFG0, TCBD_RF_MANAGE_DISABLE); - - tcpal_unlock(&tcbd_io_funcs.sem); - return ret; -} - -s32 tcbd_rf_reg_read( - struct tcbd_device *_device, u32 _addr, u32 *_data) -{ - s32 ret = 0; - u32 data = 0; - - if (_device == NULL) - return TCERR_INVALID_ARG; - - tcpal_lock(&tcbd_io_funcs.sem); - tcbd_io_funcs.chip_addr = _device->chip_addr; - - ret |= tcbd_io_funcs.reg_write( - TCBD_RF_CFG0, TCBD_RF_MANAGE_ENABLE|TCBD_RF_READ); - ret |= tcbd_io_funcs.reg_write(TCBD_RF_CFG2, _addr); - ret |= tcbd_io_funcs.reg_write(TCBD_RF_CFG1, TCBD_RF_ACTION); - ret |= tcbd_io_funcs.reg_read_burst_cont( - TCBD_RF_CFG3, (u8 *)&data, sizeof(u32)); - ret |= tcbd_io_funcs.reg_write(TCBD_RF_CFG0, TCBD_RF_MANAGE_DISABLE); - - *_data = SWAP32(data); - - tcpal_unlock(&tcbd_io_funcs.sem); - return ret; -} - -s32 tcbd_send_mail( - struct tcbd_device *_device, struct tcbd_mail_data *_mail) -{ - s32 ret = 0, count; - u8 mail_data[32]; - u8 reg_data = 0; - u64 time_tick, elapsed; - - tcpal_lock(&tcbd_io_funcs.sem); - - ret = tcbd_io_funcs.reg_write(TCBD_MAIL_CTRL, TCBD_MAIL_INIT); - - *((u32 *)mail_data) = - (MB_HOSTMAIL << 24) | (_mail->count << 20) | - (_mail->flag << 19) | (MB_ERR_OK << 16) | _mail->cmd; - - count = MIN(_mail->count, MAX_MAIL_COUNT); - if (count > 0) - memcpy(mail_data + sizeof(u32) , - _mail->data, count * sizeof(u32)); - - ret |= tcbd_io_funcs.reg_write_burst_fix( - TCBD_MAIL_FIFO_WIND, mail_data, - sizeof(u32) + count * sizeof(u32)); - ret |= tcbd_io_funcs.reg_write(TCBD_MAIL_CTRL, TCBD_MAIL_HOSTMAILPOST); - if (ret < 0) - goto exit_send_mail; - - time_tick = tcpal_get_time(); - do { - elapsed = tcpal_diff_time(time_tick); - if (elapsed > (u64)MAX_TIME_TO_WAIT_MAIL) { - ret = -TCERR_WAIT_MAIL_TIMEOUT; - goto exit_send_mail; - } - /* latch mail status to register */ - ret = tcbd_io_funcs.reg_write(TCBD_MAIL_FIFO_W, 0x5E); - /* read ratched status from register */ - ret |= tcbd_io_funcs.reg_read(TCBD_MAIL_FIFO_W, ®_data); - if (ret < 0) - break; - } while (!(reg_data & 0x1)); /* check fifo status */ - - tcbd_debug(DEBUG_DRV_IO, "cmd:0x%X, count:%d, elapsed time:%llu\n", - _mail->cmd, count, elapsed); - -exit_send_mail: - tcpal_unlock(&tcbd_io_funcs.sem); - return ret; -} - -s32 tcbd_recv_mail( - struct tcbd_device *_device, struct tcbd_mail_data *_mail) -{ - s32 ret = 0; - s32 mail_hdr; - u8 mail_data[32] = {0, }; - u8 reg_data = 0; - u8 bytes_read; - u64 time_tick, elapsed; - - tcpal_lock(&tcbd_io_funcs.sem); - - time_tick = tcpal_get_time(); - do { - /* latch mail status to register */ - ret = tcbd_io_funcs.reg_write(TCBD_MAIL_FIFO_R, 0x5E); - /* read ratched status from register */ - ret |= tcbd_io_funcs.reg_read(TCBD_MAIL_FIFO_R, ®_data); - - elapsed = tcpal_diff_time(time_tick); - if (elapsed > (u64)MAX_TIME_TO_WAIT_MAIL) - ret = -TCERR_WAIT_MAIL_TIMEOUT; - - if (ret < 0) - goto exit_recv_mail; - } while ((reg_data & 0xFC) < 3); /* check fifo status */ - bytes_read = (reg_data >> 2) & 0x3F; - tcbd_debug(DEBUG_DRV_IO, "cmd:0x%X, bytes_read:%d, elapsed time:%llu\n", - _mail->cmd, bytes_read, elapsed); - - ret = tcbd_io_funcs.reg_read_burst_fix( - TCBD_MAIL_FIFO_WIND, mail_data, bytes_read); - /*only warm boot cmd */ - if (bytes_read == 4) { - memcpy(_mail->data, mail_data, bytes_read); - goto exit_recv_mail; - } - - mail_hdr = *((u32 *)mail_data); - if ((mail_hdr >> 24) != MB_SLAVEMAIL) { - tcbd_debug(DEBUG_ERROR, "Error : cmd=0x%X bytes_read=%d\n", - _mail->cmd, bytes_read); - tcbd_debug(DEBUG_ERROR, " [0x%02X][0x%02X][0x%02X][0x%02X]" - "[0x%02X][0x%02X][0x%02X][0x%02X]\n", - mail_data[0], mail_data[1], mail_data[2], - mail_data[3], mail_data[4], mail_data[5], - mail_data[6], mail_data[7]); - - ret = -TCERR_BROKEN_MAIL_HEADER; - goto exit_recv_mail; - } - _mail->cmd = mail_hdr & 0xFFFF; - _mail->status = (mail_hdr >> 16) & 0x7; - if (_mail->status) { - tcbd_debug(DEBUG_ERROR, "Mail Error : status=0x%X, cmd=0x%X\n", - _mail->status, _mail->cmd); - ret = -TCERR_UNKNOWN_MAIL_STATUS; - goto exit_recv_mail; - } - _mail->count = (bytes_read >> 2) - 1; - memcpy(_mail->data, mail_data + 4, bytes_read - 4); - -exit_recv_mail: - tcpal_unlock(&tcbd_io_funcs.sem); - return ret; -} - -s32 tcbd_read_mail_box(struct tcbd_device *_device, u16 _cmd, s32 _cnt, - u32 *_data) -{ - s32 ret = 0; - struct tcbd_mail_data mail = {0, }; - - mail.flag = MB_CMD_READ; - mail.cmd = _cmd; - mail.count = _cnt; - ret = tcbd_send_mail(_device, &mail); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to send mail! %d\n", ret); - goto exit_read_mail_box; - } - - ret = tcbd_recv_mail(_device, &mail); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to recv mail! %d\n", ret); - goto exit_read_mail_box; - } - - memcpy((void *)_data, (void *)mail.data, _cnt * sizeof(u32)); - -exit_read_mail_box: - return ret; -} - -s32 tcbd_write_mail_box(struct tcbd_device *_device, u16 _cmd, s32 _cnt, - u32 *_data) -{ - u32 *data = NULL; - struct tcbd_mail_data mail = {0, }; - - if (_cnt > MAX_MAIL_COUNT || _data == NULL) { - tcbd_debug(DEBUG_ERROR, "invalid param, cnt:%d\n", _cnt); - return -TCERR_INVALID_ARG; - } - - mail.flag = MB_CMD_WRITE; - mail.cmd = _cmd; - mail.count = _cnt; - memcpy((void *)mail.data, (void *)_data, _cnt * sizeof(u32)); -#if defined(__DEBUG_DSP_ROM__) - tcbd_debug_mbox_tx(&_cmd, &_cnt, &data); - if (data != NULL) { - int i, sz = 0; - char print_buff[80]; - mail.cmd = _cmd; - mail.count = _cnt; - memcpy((void *)mail.data, (void *)data, _cnt * sizeof(u32)); - for (i = 0; i < _cnt; i++) - sz += sprintf(print_buff + sz, "[%08X]", data[i]); - - tcbd_debug(DEBUG_ERROR, "cmd 0x%X, cnt:%d, %s\n", - _cmd, _cnt, print_buff); - } -#endif /*__DEBUG_DSP_ROM__*/ - return tcbd_send_mail(_device, &mail); -} - -#if defined(__DEBUG_DSP_ROM__) -s32 tcbd_read_file(struct tcbd_device *_device, char *_path, u8 *_buff, - s32 _size) -{ - int ret; - struct file *flip = NULL; - mm_segment_t old_fs; - - if (_path == NULL) { - tcbd_debug(DEBUG_ERROR, "invalid filename! %s\n", _path); - return -1; - } - - if (_buff == NULL) { - tcbd_debug(DEBUG_ERROR, "Invaild pointer! 0x%X\n", (u32)_buff); - return -1; - } - - flip = filp_open(_path, O_RDWR, 0); - if (IS_ERR(flip)) { - tcbd_debug(DEBUG_ERROR, "%s open failed\n", _path); - return -1; - } - - old_fs = get_fs(); - set_fs(KERNEL_DS); - - flip->f_pos = 0; - ret = vfs_read(flip, _buff, _size, &flip->f_pos); - - filp_close(flip, NULL); - set_fs(old_fs); - - return ret; -} -#endif /*__DEBUG_DSP_ROM__*/ diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_drv_ip.c b/drivers/media/tdmb/tcc3170/src/tcbd_drv_ip.c deleted file mode 100644 index a5f81eb..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_drv_ip.c +++ /dev/null @@ -1,808 +0,0 @@ -/* - * tcbd_drv_ip.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "tcpal_os.h" -#include "tcbd_feature.h" -#include "tcpal_debug.h" - -#include "tcbd_api_common.h" -#include "tcbd_drv_ip.h" -#include "tcbd_drv_io.h" -#include "tcbd_drv_rf.h" - -struct tcbd_spur_data { - s32 freq_khz; - s32 num_data; - s32 data[7]; -}; - -struct tcbd_agc_data { - s32 cmd; - s32 num_data; - u32 data[7]; -}; - -#define MAX_BOOT_TABLE 5 -struct tcbd_boot_bin { - u32 size; - u32 crc; - u32 addr; - u8 *data; -}; - -static u32 clock_config_table[3][5] = { - { 0x60, 0x00, 0x0F, 0x03, 19200}, - { 0x60, 0x01, 0x18, 0x03, 24576}, - { 0x60, 0x01, 0x0F, 0x03, 38400} -}; - -static struct tcbd_spur_data spur_data_table_default[] = { - { 181936, 2, {(0x035C<<16)|(0x0342), (0x0359<<16)|(0x033e)} }, - { 183008, 2, {(0x00CA<<16)|(0x036B), (0x00CE<<16)|(0x0368)} }, - { 192352, 2, {(0x0081<<16)|(0x0328), (0x0084<<16)|(0x0324)} }, - { 201008, 2, {(0x033A<<16)|(0x0366), (0x0336<<16)|(0x0363)} }, - { 201072, 2, {(0x034B<<16)|(0x0352), (0x0347<<16)|(0x034F)} }, - { 211280, 2, {(0x001E<<16)|(0x0307), (0x001F<<16)|(0x0302)} }, - { 211648, 2, {(0x009F<<16)|(0x033E), (0x00A2<<16)|(0x033A)} }, - { 220352, 2, {(0x0361<<16)|(0x033E), (0x035E<<16)|(0x033A)} }, - { 230784, 2, {(0x008B<<16)|(0x032F), (0x008E<<16)|(0x032B)} }, - {1459808, 2, {(0x00CA<<16)|(0x036B), (0x00CE<<16)|(0x0368)} }, - {1468368, 2, {(0x0366<<16)|(0x033A), (0x0363<<16)|(0x0336)} }, - {1478640, 2, {(0x005A<<16)|(0x0316), (0x005C<<16)|(0x0311)} } -}; - -static struct tcbd_spur_data spur_data_table_24576[] = { - { 180064, 2, {(0x03C3<<16)|(0x030D), (0x03C2<<16)|(0x0308)} }, - { 184736, 2, {(0x0092<<16)|(0x033A), (0x0098<<16)|(0x0332)} }, - { 188928, 2, {(0x00B1<<16)|(0x034F), (0x00B5<<16)|(0x034B)} }, - { 189008, 2, {(0x00C6<<16)|(0x0366), (0x00CA<<16)|(0x0363)} }, - { 195936, 2, {(0x0328<<16)|(0x037F), (0x0324<<16)|(0x037C)} }, - { 196736, 2, {(0x0030<<16)|(0x030F), (0x0032<<16)|(0x0305)} }, - { 199280, 2, {(0x000B<<16)|(0x030A), (0x000B<<16)|(0x0300)} }, - { 204640, 2, {(0x03C3<<16)|(0x030D), (0x03C2<<16)|(0x0308)} }, - { 205280, 2, {(0x039F<<16)|(0x031E), (0x039B<<16)|(0x0315)} }, - { 208736, 2, {(0x03C4<<16)|(0x0312), (0x03C2<<16)|(0x0308)} }, - { 213008, 2, {(0x0006<<16)|(0x0305), (0x0006<<16)|(0x0300)} }, - { 213360, 2, {(0x0086<<16)|(0x032C), (0x0089<<16)|(0x0328)} }, - { 229072, 2, {(0x038F<<16)|(0x031F), (0x038D<<16)|(0x031B)} }, - { 237488, 2, {(0x03E2<<16)|(0x0307), (0x03E1<<16)|(0x0302)} }, - { 1458096, 2, {(0x03E2<<16)|(0x0307), (0x03E1<<16)|(0x0302)} }, - { 1466656, 2, {(0x006B<<16)|(0x031E), (0x006D<<16)|(0x0319)} }, - { 1475216, 2, {(0x00D4<<16)|(0x037A), (0x00D8<<16)|(0x0377)} }, - { 1482064, 2, {(0x0325<<16)|(0x0384), (0x0321<<16)|(0x0382)} }, - { 1490624, 2, {(0x0389<<16)|(0x0322), (0x0387<<16)|(0x031E)} }, -}; - -#if defined(__AGC_TABLE_IN_DSP__) -static struct tcbd_agc_data agc_data_table_lband[] = { - {MBCMD_AGC_DAB_JAM, 3, - {0x0, (195 << 16) + (23 << 8) + 24, 0x001C0012} }, -}; - -static struct tcbd_agc_data agc_table_data_vhf[] = { - {MBCMD_AGC_DAB_JAM, 3, - {0x0, (195 << 16) + (16 << 8) + 17, 0x005a0043} }, -}; -#else /*__AGC_TABLE_IN_DSP__*/ -static struct tcbd_agc_data agc_data_table_lband[] = { - { MBCMD_AGC_DAB_CFG, 3, {0xC0ACFF44, 0x031EFF53, 0x011EFF07} }, - { MBCMD_AGC_DAB_JAM, 3, - {0x00091223, (195 << 16) + (23 << 8) + 24, 0x001C0012} }, - { MBCMD_AGC_DAB_3, 7, - {0x52120223, 0x58120823, 0x5c121223, - 0x60121c23, 0x62122023, 0x68122423, 0x6a122a23} }, - { MBCMD_AGC_DAB_4, 7, - {0x70123223, 0x30093a23, 0x32094023, 0x3a094823, - 0x3c095223, 0x40095823, 0x42095c23} }, - { MBCMD_AGC_DAB_5, 7, - {0x48096023, 0x4a096223, 0x52096423, - 0x4e096823, 0x58096a23, 0x5a097023, 0x5e090812} }, - { MBCMD_AGC_DAB_6, 7, - {0x62091212, 0x68090e12, 0x70091c12, - 0x72092012, 0x78092412, 0x7a093012, 0x7c093812} }, - { MBCMD_AGC_DAB_7, 4, - {0x7e093a12, 0x6f094012, 0x73094212, 0x7f094a12} }, - { MBCMD_AGC_DAB_8, 5, - {0x30093a23, 0x32094023, 0x3a094823, 0x3c095223, 0x40095823} }, - { MBCMD_AGC_DAB_9, 5, - {0x72123a23, 0x78124023, 0x7a124823, 0x7e125223, 0x73125823} }, - { MBCMD_AGC_DAB_A, 5, - {0x5e090812, 0x62091212, 0x68090e12, 0x70091c12, 0x72092012} }, - { MBCMD_AGC_DAB_B, 5, - {0x5e097223, 0x62097823, 0x68097a23, 0x70097e23, 0x72097323} }, - { MBCMD_AGC_DAB_C, 5, {0x0, 0x0, 0x0, 0x0, 0x0} }, - { MBCMD_AGC_DAB_D, 5, {0x0, 0x0, 0x0, 0x0, 0x0} }, - { MBCMD_AGC_DAB_E, 5, {0x0, 0x0, 0x0, 0x0, 0x0} }, - { MBCMD_AGC_DAB_F, 5, {0x0, 0x0, 0x0, 0x0, 0x0} }, -}; - -static struct tcbd_agc_data agc_table_data_vhf[] = { - { MBCMD_AGC_DAB_CFG, 3, - {0xC0ACFF44, 0x031EFF53, 0x011EFF07} }, - { MBCMD_AGC_DAB_JAM, 3, - {0x16112243, (195 << 16) + (16 << 8) + 17, 0x005a0043} }, - { MBCMD_AGC_DAB_3, 7, - {0x5a220243, 0x5e220843, 0x60221043, - 0x62221443, 0x64221c43, 0x68222043, 0x6c222243} }, - { MBCMD_AGC_DAB_4, 7, - {0x70222843, 0x2a112c43, 0x30113443, 0x34113a43, - 0x38113e43, 0x3c114243, 0x3e114643} }, - { MBCMD_AGC_DAB_5, 7, - {0x40114c43, 0x44115443, 0x48115a43, 0x4a115e43, - 0x50116043, 0x54116443, 0x5a112422} }, - { MBCMD_AGC_DAB_6, 7, - {0x5e112822, 0x60113222, 0x62113622, 0x66113a22, - 0x6a113e22, 0x6e114222, 0x72114622} }, - { MBCMD_AGC_DAB_7, 4, - {0x76114822, 0x7a115022, 0x7e115422, 0x7f115622} }, - { MBCMD_AGC_DAB_8, 5, - {0x2a112c43, 0x30113443, 0x34113a43, 0x38113e43, 0x3c114243} }, - { MBCMD_AGC_DAB_9, 5, - {0x74222c43, 0x78223443, 0x7a223a43, 0x7e223e43, 0x7f224243} }, - { MBCMD_AGC_DAB_A, 5, - {0x5a112422, 0x5e112822, 0x60113222, 0x62113622, 0x66113a22} }, - { MBCMD_AGC_DAB_B, 5, - {0x5a116843, 0x5e116c43, 0x60117243, 0x62117643, 0x66117a43} }, - { MBCMD_AGC_DAB_C, 5, {0x0, 0x0, 0x0, 0x0, 0x0} }, - { MBCMD_AGC_DAB_D, 5, {0x0, 0x0, 0x0, 0x0, 0x0} }, - { MBCMD_AGC_DAB_E, 5, {0x0, 0x0, 0x0, 0x0, 0x0} }, - { MBCMD_AGC_DAB_F, 5, {0x0, 0x0, 0x0, 0x0, 0x0} }, -}; -#endif /*!__AGC_TABLE_IN_DSP__*/ - -s32 tcbd_send_spur_data(struct tcbd_device *_device, s32 _freq_khz) -{ - s32 ret = 0, i; - s32 size_table; - struct tcbd_spur_data *spur_table; - - switch (_device->clock_type) { - case CLOCK_24576KHZ: - spur_table = spur_data_table_24576; - size_table = ARRAY_SIZE(spur_data_table_24576); - break; - case CLOCK_38400KHZ: - case CLOCK_19200KHZ: - default: - spur_table = spur_data_table_default; - size_table = ARRAY_SIZE(spur_data_table_default); - break; - } - for (i = 0; i < size_table; i++) { - if (spur_table[i].freq_khz != _freq_khz) - continue; - - tcbd_debug(DEBUG_DRV_COMP, "freq:%d, num mail data:%d\n", - _freq_khz, spur_table[i].num_data); - ret = tcbd_write_mail_box(_device, MBCMD_FP_DAB_IIR, - spur_table[i].num_data, - spur_table[i].data); - break; - } - - return ret; -} - -s32 tcbd_send_agc_data(struct tcbd_device *_device, - enum tcbd_band_type _band_type) -{ - s32 ret = 0, i; - s32 size_table; - struct tcbd_agc_data *agc_table; - - switch (_band_type) { - case BAND_TYPE_LBAND: - size_table = ARRAY_SIZE(agc_data_table_lband); - agc_table = agc_data_table_lband; - break; - case BAND_TYPE_BAND3: - size_table = ARRAY_SIZE(agc_table_data_vhf); - agc_table = agc_table_data_vhf; - break; - default: - tcbd_debug(DEBUG_ERROR, "Unknown band type:%d\n", _band_type); - return -1; - } - tcbd_debug(DEBUG_DRV_COMP, "agc table size:%d, band:%s\n", size_table, - (_band_type == BAND_TYPE_LBAND) ? "Lband" : "Band3"); - - for (i = 0; i < size_table; i++) { - ret |= tcbd_write_mail_box(_device, agc_table[i].cmd, - agc_table[i].num_data, - agc_table[i].data); - } - - return ret; -} - -s32 tcbd_send_frequency(struct tcbd_device *_device, s32 _freq_khz) -{ - s32 data, ret = 0; - - tcbd_debug(DEBUG_DRV_COMP, "freq:%d\n", _freq_khz); - - data = 1; - ret |= tcbd_write_mail_box(_device, MBPARA_SYS_NUM_FREQ, 1, &data); - ret |= tcbd_write_mail_box(_device, MBPARA_SYS_FREQ_0_6, 1, &_freq_khz); - - return ret; -} - -static inline void tcbd_sort_start_cu(struct tcbd_multi_service *_multi_svc, - u32 *_svc_info) -{ - s32 i, j; - s32 start_cu[TCBD_MAX_NUM_SERVICE]; - u32 tmp_cu, tmp_info[2]; - - memcpy(_svc_info, _multi_svc->service_info, - sizeof(u32) * TCBD_MAX_NUM_SERVICE << 1); - for (i = 0; i < TCBD_MAX_NUM_SERVICE; i++) { - if (_svc_info[i << 1] != 0) - start_cu[i] = _svc_info[i << 1] & 0x3FF; - else - start_cu[i] = 0x3FF; - } - - for (i = 0; i < TCBD_MAX_NUM_SERVICE; i++) { - for (j = i + 1; j < TCBD_MAX_NUM_SERVICE; j++) { - if (start_cu[i] > start_cu[j]) { - tmp_cu = start_cu[i]; - tmp_info[0] = _svc_info[i * 2]; - tmp_info[1] = _svc_info[i * 2 + 1]; - - start_cu[i] = start_cu[j]; - _svc_info[i * 2] = _svc_info[j * 2]; - _svc_info[i * 2 + 1] = _svc_info[j * 2 + 1]; - - start_cu[j] = tmp_cu; - _svc_info[j * 2] = tmp_info[0]; - _svc_info[j * 2 + 1] = tmp_info[1]; - } - } - } - for (i = 0; i < TCBD_MAX_NUM_SERVICE * 2; i++) - tcbd_debug(DEBUG_DRV_COMP, "%02d: 0x%08X\n", i, _svc_info[i]); -} - -s32 tcbd_send_service_info(struct tcbd_device *_device) -{ - s32 ret = 0; - struct tcbd_multi_service *mult_service = &_device->mult_service; - u32 sorted_svc_info[TCBD_MAX_NUM_SERVICE * 2]; - u8 num_svc = TCBD_MAX_NUM_SERVICE; - - tcbd_sort_start_cu(mult_service, sorted_svc_info); - - ret = tcbd_write_mail_box(_device, MBPARA_SEL_CH_INFO_PRAM, - num_svc, sorted_svc_info); - ret |= tcbd_write_mail_box(_device, MBPARA_SEL_CH_INFO_PRAM + 1, - num_svc, sorted_svc_info + num_svc); - ret |= tcbd_write_mail_box(_device, MBPARA_SYS_DAB_MCI_UPDATE, 1, - &mult_service->service_count); - tcbd_debug(DEBUG_DRV_COMP, "service count:%d\n", - mult_service->service_count); - return ret; -} - -s32 tcbd_disable_buffer(struct tcbd_device *_device) -{ - s32 ret = 0; - ret |= tcbd_reg_write(_device, TCBD_OBUFF_CONFIG, 0); - return ret; -} - -s32 tcbd_enable_buffer(struct tcbd_device *_device) -{ - s32 i, ret = 0; - u8 buff_en = 0, buff_init = 0; - - u32 list_size_buf[] = { - TCBD_BUFFER_A_SIZE, TCBD_BUFFER_B_SIZE, - TCBD_BUFFER_C_SIZE, TCBD_BUFFER_D_SIZE }; - u8 list_buff_init[] = { - TCBD_OBUFF_BUFF_A_INIT, TCBD_OBUFF_BUFF_B_INIT, - TCBD_OBUFF_BUFF_C_INIT, TCBD_OBUFF_BUFF_D_INIT }; - u32 list_buff_en[] = { - TCBD_OBUFF_CONFIG_BUFF_A_EN | TCBD_OBUFF_CONFIG_BUFF_A_CIRCULAR, - TCBD_OBUFF_CONFIG_BUFF_B_EN | TCBD_OBUFF_CONFIG_BUFF_B_CIRCULAR, - TCBD_OBUFF_CONFIG_BUFF_C_EN | TCBD_OBUFF_CONFIG_BUFF_C_CIRCULAR, - TCBD_OBUFF_CONFIG_BUFF_D_EN | TCBD_OBUFF_CONFIG_BUFF_D_CIRCULAR, - }; - - for (i = 0; i < ARRAY_SIZE(list_size_buf); i++) { - if (list_size_buf[i]) { - buff_init |= list_buff_init[i]; - buff_en |= list_buff_en[i]; - } - } - tcbd_debug(DEBUG_DRV_COMP, "buffer init : 0x%02X, buffer en:0x%02X\n", - buff_init, buff_en); - ret |= tcbd_reg_write(_device, TCBD_OBUFF_INIT, buff_init); - ret |= tcbd_reg_write(_device, TCBD_OBUFF_CONFIG, buff_en); - return ret; -} -/*__DEBUG_TCBD__*/ -s32 tcbd_init_buffer_region(struct tcbd_device *_device) -{ - s32 i, ret = 0; - u32 addr_start, addr_end; -#if defined(__DEBUG_TCBD__) - u16 reg_val[2]; -#endif /*__DEBUG_TCBD__*/ - u32 list_size_buf[] = { - TCBD_BUFFER_A_SIZE, TCBD_BUFFER_B_SIZE, - TCBD_BUFFER_C_SIZE, TCBD_BUFFER_D_SIZE }; - u8 reg_addr_buff[] = { - TCBD_OBUFF_A_SADDR, TCBD_OBUFF_B_SADDR, - TCBD_OBUFF_C_SADDR, TCBD_OBUFF_D_SADDR }; - u32 addr_set_buff[] = { - (PHY_MEM_ADDR_A_START>>2), (PHY_MEM_ADDR_A_END>>2), - (PHY_MEM_ADDR_B_START>>2), (PHY_MEM_ADDR_B_END>>2), - (PHY_MEM_ADDR_C_START>>2), (PHY_MEM_ADDR_C_END>>2), - (PHY_MEM_ADDR_D_START>>2), (PHY_MEM_ADDR_D_END>>2), - }; - - for (i = 0; i < ARRAY_SIZE(list_size_buf); i++) { - if (!list_size_buf[i]) - continue; - - addr_start = SWAP16(addr_set_buff[i * 2 + 0]); - addr_end = SWAP16(addr_set_buff[i * 2 + 1]); - tcbd_debug(DEBUG_DRV_COMP, "reg:%02x, %c buffer size: %d\n", - reg_addr_buff[i], 'A' + i, - (addr_set_buff[i * 2 + 1] << 2) - - (addr_set_buff[i * 2 + 0] << 2) + 4); - ret = tcbd_reg_write_burst_cont( - _device, reg_addr_buff[i], (u8 *)&addr_start, 2); - ret |= tcbd_reg_write_burst_cont( - _device, reg_addr_buff[i] + 2, (u8 *)&addr_end, 2); - - if (ret < 0) - return ret; - } -#if defined(__DEBUG_TCBD__) - for (i = 0; i < 4 && list_size_buf[i]; i++) { - tcbd_reg_read_burst_cont( - _device, reg_addr_buff[i], (u8 *)®_val[0], 2); - tcbd_reg_read_burst_cont( - _device, reg_addr_buff[i] + 2, (u8 *)®_val[1], 2); - tcbd_debug(DEBUG_DRV_COMP, "%c buffer start:%X, end:%X\n", - 'A' + i, - SWAP16(reg_val[0]) << 2, - SWAP16(reg_val[1]) << 2); - } -#endif /*__DEBUG_TCBD__*/ - /*tcbd_enable_buffer(_device);*/ - return ret; -} - -s32 tcbd_change_memory_view(struct tcbd_device *_device, - enum tcbd_remap_type _remap) -{ - return tcbd_reg_write(_device, TCBD_INIT_REMAP, (u8)_remap); -} - -s32 tcbd_init_bias_key(struct tcbd_device *_device) -{ - s32 ret = 0; - - ret |= tcbd_reg_write(_device, TCBD_OP_XTAL_BIAS, 0x05); - ret = tcbd_reg_write(_device, TCBD_OP_XTAL_BIAS_KEY, 0x5E); - - return ret; -} - -u32 tcbd_get_osc_clock(struct tcbd_device *_device) -{ - return clock_config_table[(int)_device->clock_type][4]; -} - -s32 tcbd_init_pll(struct tcbd_device *_device, enum tcbd_clock_type _ctype) -{ - /* - * _pll_data[0] = PLL_WAIT_TIME - * _pll_data[1] = PLL_P - * _pll_data[2] = PLL_M - * _pll_data[3] = PLL_S - * _pll_data[4] = OSC_LOCK - * */ - s32 ret = 0; - u32 out, vco; - u8 pll_data[2]; - u8 pll_r, pll_f, pll_od, pll_m; - u32 *clock_config = NULL; - - if (!_device || _ctype >= CLOCK_MAX) - return -TCERR_INVALID_ARG; - - _device->clock_type = _ctype; - - if (!tcbd_debug_spur_dbg()) - clock_config = clock_config_table[(s32)_ctype]; - else - clock_config = tcbd_debug_spur_clk_cfg(); - - tcbd_debug(DEBUG_DRV_COMP, "osc clock:%d, P:%X, M:%X, S:%d\n", - clock_config[1], clock_config[2], - clock_config[3], clock_config[4]); - pll_r = clock_config[1] + 1; - pll_f = clock_config[2] + 1; - pll_od = clock_config[3] & 0x3; - pll_m = (clock_config[3] & 0x4) >> 2; - - vco = clock_config[4] * (pll_f / pll_r); - - if (pll_od) - out = vco >> pll_od; - else - out = vco; - - if (pll_m) - out = out>>pll_m; - - _device->main_clock = out; - pll_data[0] = clock_config[2] | (pll_m << 6) | 0x80; - pll_data[1] = (clock_config[1] << 3) | (pll_od << 1); - - ret = tcbd_reg_write(_device, TCBD_PLL_7, pll_data[1]); - ret = tcbd_reg_write(_device, TCBD_PLL_6, pll_data[0]); - tcpal_msleep(1); - tcbd_debug(DEBUG_DRV_COMP, "clock out:%d, pll[0]=%02X, pll[1]=%02X\n", - out, pll_data[0], pll_data[1]); - - ret |= tcbd_init_bias_key(_device); - - return ret; -} - - -static s32 tcbd_check_dsp(struct tcbd_device *_device) -{ - s32 ret = 0; - u32 status; - - ret = tcbd_reg_read_burst_fix( - _device, TCBD_MAIL_FIFO_WIND, (u8 *)&status, 4); - - if (status != 0x1ACCE551) { - tcbd_debug(DEBUG_ERROR, " # Error access mail [0x%X]\n", - status); - return -TCERR_CANNOT_ACCESS_MAIL; - } - - return ret; -} - -s32 tcbd_reset_ip(struct tcbd_device *_device, u8 _comp_en, u8 _comp_rst) -{ - s32 ret = 0; - _device->processor = _comp_en; - - ret |= tcbd_reg_write(_device, TCBD_SYS_EN, _comp_en); - ret |= tcbd_reg_write(_device, TCBD_SYS_RESET, _comp_rst); - - return ret; -} - -s32 tcbd_change_stream_type(struct tcbd_device *_device, u32 _format) -{ - _device->selected_stream = _format; - return tcbd_write_mail_box(_device, MBPARA_SYS_DAB_STREAM_SET, - 1, &_format); -} - -s32 tcbd_demod_tune_frequency(struct tcbd_device *_device, u32 _freq_khz, - s32 _bw_khz) -{ - s32 ret = 0; - u32 sel_stream = 0; - - switch (_device->peri_type) { - case PERI_TYPE_SPI_ONLY: - case PERI_TYPE_STS: - sel_stream = STREAM_TYPE_ALL; - break; - default: - tcbd_debug(DEBUG_ERROR, "not implemented!\n"); - return -1; - } -#if defined(__STATUS_IN_REGISTER__) - sel_stream &= ~(STREAM_TYPE_STATUS); -#endif /* __STATUS_IN_REGISTER__ */ - - ret = tcbd_change_stream_type(_device, sel_stream); - ret |= tcbd_send_spur_data(_device, _freq_khz); - ret |= tcbd_send_frequency(_device, _freq_khz); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, - "Failed to send spur and freq to op, err:%d\n", ret); - return ret; - } - - if (_device->curr_band != _device->prev_band) - tcbd_send_agc_data(_device, _device->curr_band); - - ret |= tcbd_set_pid_filter(_device, FILTER_ENABLE | FILTER_SYNCERR); - ret |= tcbd_dsp_warm_start(_device); - return ret; -} - - -s32 tcbd_dsp_cold_start(struct tcbd_device *_device) -{ - s32 ret = 0; - u16 new_pc = SWAP16(START_PC_OFFSET); - - ret = tcbd_change_memory_view(_device, OP_RAM0_EP_RAM1_PC2); - ret |= tcbd_reg_write_burst_cont( - _device, TCBD_INIT_PC, (u8 *)&new_pc, 2); - ret |= tcbd_reg_write(_device, TCBD_SYS_RESET, TCBD_SYS_COMP_DSP); - ret |= tcbd_reg_write( - _device, TCBD_SYS_EN, TCBD_SYS_COMP_DSP | TCBD_SYS_COMP_EP); - - if (ret < 0) - return ret; - - return tcbd_check_dsp(_device); -} - -static inline s32 tcbd_start_demod(struct tcbd_device *_device) -{ - s32 ret = 0; - struct tcbd_mail_data mail = {0, }; - - mail.flag = MB_CMD_READ; - mail.cmd = MBPARA_SYS_START; - mail.count = 1; - mail.data[0] = 0x19; - switch (_device->clock_type) { - case CLOCK_24576KHZ: - mail.data[0] |= 0x1 << 28; - break; - case CLOCK_38400KHZ: - mail.data[0] |= 0x2 << 28; - break; - case CLOCK_19200KHZ: - mail.data[0] |= 0x0 << 28; - break; - default: - break; - } - ret |= tcbd_send_mail(_device, &mail); - ret |= tcbd_recv_mail(_device, &mail); - - return ret; -} - -s32 tcbd_dsp_warm_start(struct tcbd_device *_device) -{ - s32 ret = 0; - struct tcbd_mail_data mail = {0, }; - - mail.flag = MB_CMD_WRITE; - mail.cmd = MBPARA_SYS_WARMBOOT; - mail.count = 0; - - ret |= tcbd_send_mail(_device, &mail); - ret |= tcbd_recv_mail(_device, &mail); - - if (ret < 0 || mail.data[0] != 0x1ACCE551) { - tcbd_debug(DEBUG_ERROR, " # Could not warm boot! [%08X]\n", - mail.data[0]); - return -TCERR_WARMBOOT_FAIL; - } - ret = tcbd_start_demod(_device); - - if (ret >= 0) - tcbd_debug(DEBUG_DRV_COMP, "Warm boot succeed! [0x%X] ret:%d\n", - mail.data[0], ret); - return ret; -} - -static s32 tcbd_parse_dsp_rom( - u8 *_data, u32 _size, struct tcbd_boot_bin *_boot_bin) -{ - - u32 idx = 0; - u32 length; - s32 table_idx = 0; - - memset(_boot_bin, 0, sizeof(struct tcbd_boot_bin) * MAX_BOOT_TABLE); - - /* cold boot */ - if (_data[idx + 3] != 0x01) { - tcbd_debug(DEBUG_ERROR, "# Coldboot_preset_Error\n"); - return 0; - } - idx += 4; - length = (_data[idx] << 24) + (_data[idx + 1] << 16) + - (_data[idx + 2] << 8) + (_data[idx + 3]); - idx += 4; - _boot_bin[table_idx].addr = CODE_MEM_BASE; - _boot_bin[table_idx].data = _data + idx; - _boot_bin[table_idx].crc = *((u32 *)(_data + idx + length - 4)); - _boot_bin[table_idx++].size = length - 4; - idx += length; - _size -= (length + 8); - - /* dagu */ - if (_data[idx + 3] != 0x02) { - tcbd_debug(DEBUG_ERROR, "# Coldboot_preset_Error\n"); - return 0; - } - idx += 4; - length = (_data[idx] << 24) + (_data[idx + 1] << 16) + - (_data[idx + 2] << 8) + (_data[idx + 3]); - idx += 4; - _boot_bin[table_idx].addr = CODE_TABLEBASE_DAGU; - _boot_bin[table_idx].data = _data + idx; - _boot_bin[table_idx++].size = length; - idx += length; - _size -= (length + 8); - - /* dint */ - if (_data[idx + 3] != 0x03) { - tcbd_debug(DEBUG_ERROR, "# Coldboot_preset_Error\n"); - return 0; - } - idx += 4; - length = (_data[idx] << 24) + (_data[idx + 1] << 16) + - (_data[idx + 2] << 8) + (_data[idx + 3]); - idx += 4; - _boot_bin[table_idx].addr = CODE_TABLEBASE_DINT; - _boot_bin[table_idx].data = _data + idx; - _boot_bin[table_idx++].size = length; - idx += length; - _size -= (length + 8); - - /* rand */ - if (_data[idx + 3] != 0x04) { - tcbd_debug(DEBUG_ERROR, "# Coldboot_preset_Error\n"); - return 0; - } - - idx += 4; - length = (_data[idx] << 24) + (_data[idx + 1] << 16) + - (_data[idx + 2] << 8) + (_data[idx + 3]); - idx += 4; - _boot_bin[table_idx].addr = CODE_TABLEBASE_RAND; - _boot_bin[table_idx].data = _data + idx; - _boot_bin[table_idx++].size = length; - idx += length; - _size -= (length + 8); - - if (_size >= 8) { - /* col_order */ - if (_data[idx + 3] != 0x05) { - tcbd_debug(DEBUG_ERROR, "# Coldboot_preset_Error\n"); - return 0; - } - idx += 4; - length = (_data[idx] << 24) + (_data[idx + 1] << 16) + - (_data[idx + 2] << 8) + (_data[idx + 3]); - idx += 4; - - _boot_bin[table_idx].addr = CODE_TABLEBASE_COL_ORDER; - _boot_bin[table_idx].data = _data + idx; - _boot_bin[table_idx++].size = length; - idx += length; - _size -= (length + 8); - } - - /* tcbd_debug(DEBUG_DRV_COMP, " # remain size :%d\n", _size); */ - return table_idx; -} - -s32 tcbd_init_dsp(struct tcbd_device *_device, u8 *_boot_code, s32 _size) -{ - s32 i, ret = 0; - s32 num_table_entry = 0; - u32 dma_crc = 0; - u64 tick; - struct tcbd_boot_bin boot_bin[MAX_BOOT_TABLE]; - - tick = tcpal_get_time(); - num_table_entry = tcbd_parse_dsp_rom(_boot_code, _size, boot_bin); - - ret |= tcbd_change_memory_view(_device, EP_RAM0_RAM1); - - for (i = 0; i < num_table_entry && boot_bin[i].size; i++) { - tcbd_debug(DEBUG_API_COMMON, "# download boot to 0x%X, " - "size %d\n", boot_bin[i].addr, - boot_bin[i].size); - ret |= tcbd_mem_write(_device, boot_bin[i].addr, - boot_bin[i].data, boot_bin[i].size); - ret |= tcbd_reg_read_burst_cont(_device, TCBD_CMDDMA_CRC32, - (u8 *)&dma_crc, 4); - if (boot_bin[i].crc && (SWAP32(dma_crc) != boot_bin[i].crc)) { - tcbd_debug(DEBUG_ERROR, "# CRC Error DMA[0x%08X] !=" - " BIN[0x%08X]\n", dma_crc, - boot_bin[i].crc); - return -TCERR_CRC_FAIL; - } - } - - ret = tcbd_dsp_cold_start(_device); - if (ret < 0) - tcbd_debug(DEBUG_ERROR, "Failed to cold boot! ret:%d\n", ret); - else - tcbd_debug(DEBUG_API_COMMON, "# %llums elapsed to download!\n", - tcpal_diff_time(tick)); - return ret; -} - -s32 tcbd_get_rom_version(struct tcbd_device *_device, u32 *_boot_version) -{ - s32 ret = 0; - struct tcbd_mail_data mail = {0, }; - - mail.flag = MB_CMD_READ; - mail.cmd = MBPARA_SYS_VERSION; - mail.count = 0; - ret = tcbd_send_mail(_device, &mail); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to send mail! %d\n", ret); - return ret; - } - - ret = tcbd_recv_mail(_device, &mail); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to recv mail! %d\n", ret); - return ret; - } - - memcpy(_boot_version, &mail.data[0], sizeof(u32)); - - return ret; -} - -s32 tcbd_check_dsp_status(struct tcbd_device *_device) -{ - s32 i, j, len; - s8 *item_name[] = {" CTO", " CFO", " SFE", "RESYNC" }; - s8 dbg_buff[255]; - static struct tcbd_mail_data check_item[] = { - {MB_CMD_READ, 2, MBCMD_CTO_DAB_RESULT, }, - {MB_CMD_READ, 3, MBCMD_CFO_DAB_RESULT, }, - {MB_CMD_READ, 3, MBCMD_SFE_DAB_RESULT, }, - {MB_CMD_READ, 7, MBPARA_SYS_DAB_RESYNC_RESULT, } - }; - - for (i = 0; i < ARRAY_SIZE(check_item); i++) { - tcbd_read_mail_box(_device, - check_item[i].cmd, - check_item[i].count, - check_item[i].data); - len = sprintf(dbg_buff, " %s ", item_name[i]); - for (j = 0; j < check_item[i].count; j++) { - len += sprintf(dbg_buff + len, "[%d] = 0x%08X, ", - j, check_item[i].data[j]); - } - tcbd_debug(DEBUG_INFO, "%s\n", dbg_buff); - } - return 0; -} - -s32 tcbd_set_pid_filter(struct tcbd_device *_device, u32 _filter) -{ - return tcbd_write_mail_box(_device, MBPARA_SYS_DAB_DP_FLT, 1, &_filter); -} diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_drv_peri.c b/drivers/media/tdmb/tcc3170/src/tcbd_drv_peri.c deleted file mode 100644 index 8a162f7..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_drv_peri.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - * tcbd_drv_peri.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_api_common.h" -#include "tcbd_drv_io.h" - -#define TCBD_PERI_SPI_READY_TIME 0x00 -#define TCBD_PERI_SPI_WAIT_TIME 0x00 - -static inline void tcbd_peri_spi_slave( - u8 *_peri_mode, u8 _interface_speed) -{ - _peri_mode[0] = TCBD_PERI_SPI_MOTOROLA_SSP | - TCBD_PERI_SPI_SLAVE | - TCBD_PERI_SPI_SIZE32BIT | - _interface_speed; - _peri_mode[1] = TCBD_PERI_SPI_CLKINIT_LOW | - TCBD_PERI_SPI_CLKPOL_POS | - TCBD_PERI_SPI_BITMSB1 | - (TCBD_PERI_SPI_READY_TIME << 2) | - TCBD_PERI_SPI_WAIT_TIME; -} - -static inline void tcbd_peri_spi_master( - u8 *_peri_mode, u8 _interface_speed) -{ - _peri_mode[0] = TCBD_PERI_SPI_MOTOROLA_SSP | - TCBD_PERI_SPI_MASTER | - TCBD_PERI_SPI_SIZE32BIT | - _interface_speed; - _peri_mode[1] = TCBD_PERI_SPI_CLKINIT_LOW | - TCBD_PERI_SPI_CLKPOL_POS | - TCBD_PERI_SPI_BITMSB1 | - (TCBD_PERI_SPI_READY_TIME << 2) | - TCBD_PERI_SPI_WAIT_TIME; -} - -#define TCBD_PERI_TS_STREAM_WAIT_TIME 0x02 -#define TCBD_PERI_TS_MSM_SYNC_HIGH_TIME 0x00 -#define TCBD_PERI_TS_MSM_SYNC_LOW_TIME 0x00 -static inline void tcbd_peri_sts( - u8 *_peri_mode, u8 _interface_speed) -{ - _peri_mode[0] = TCBD_PERI_TS_NORMAL_SLAVE | - TCBD_PERI_TS_STS | - TCBD_PERI_TS_FASTON | - _interface_speed; - - _peri_mode[1] = TCBD_PERI_TS_CLKPHASE_NEG | - TCBD_PERI_TS_SYNC_ACTIVEHIGH | - TCBD_PERI_TS_ENPOL_ACTIVEHIGH | - TCBD_PERI_TS_STREAM_WAIT_ON | - TCBD_PERI_TS_STREAM_WAIT_TIME; - _peri_mode[2] = TCBD_PERI_TS_BITMSB | - (TCBD_PERI_TS_MSM_SYNC_HIGH_TIME << 3) | - TCBD_PERI_TS_MSM_SYNC_LOW_TIME; - _peri_mode[3] = TCBD_PERI_TS_ERR_SIG_OFF; -} - -static inline void tcbd_peri_pts( - u8 *_peri_mode, u8 _interface_speed) -{ - _peri_mode[0] = TCBD_PERI_TS_NORMAL_SLAVE | - TCBD_PERI_TS_PTS | - TCBD_PERI_TS_FASTON | - TCBD_PERI_TS_TSCLKMASKON | - _interface_speed; - _peri_mode[1] = TCBD_PERI_TS_CLKPHASE_POS | - TCBD_PERI_TS_SYNC_ACTIVEHIGH | - TCBD_PERI_TS_ENPOL_ACTIVEHIGH | - TCBD_PERI_TS_STREAM_WAIT_ON | - TCBD_PERI_TS_STREAM_WAIT_TIME; - _peri_mode[2] = (TCBD_PERI_TS_MSM_SYNC_HIGH_TIME << 3) | - TCBD_PERI_TS_MSM_SYNC_LOW_TIME; - _peri_mode[3] = TCBD_PERI_TS_ERR_SIG_OFF; -} - -static inline void tcbd_peri_hpi(u8 *_peri_mode) -{ - _peri_mode[0] = TCBD_PERI_HPI_INTEL; -} - -static inline u8 tcbd_calc_clock( - struct tcbd_device *_device, s32 _min_khz, s32 _max_khz) -{ - u32 min_dlr = 0, max_dlr = 0, minv = -1, maxv = -1; - - min_dlr = (_device->main_clock / (2 * _min_khz)) - 1; - max_dlr = (_device->main_clock / (2 * _max_khz)) - 1; - - if (min_dlr >= 0 && min_dlr < 8) - minv = min_dlr; - else if (min_dlr >= 8) - minv = 7; - - if (max_dlr >= 0 && max_dlr < 8) - maxv = max_dlr; - else if (max_dlr >= 8) - maxv = 7; - - if (minv == -1 && maxv == -1) { - tcbd_debug(DEBUG_DRV_PERI, - " # Can't find DLR value, DLR will set to zero\n"); - return 0; - } - - if (maxv == -1) - maxv = minv; - else if (minv == -1) - minv = maxv; - - return minv; -} - -s32 tcbd_init_peri_gpio( - struct tcbd_device *_device, enum tcbd_peri_type _peri_type) -{ - u8 cfg_value[10] = {0, }; - /*u8 drv_strength[] = {0xFF, 0xFF};*/ - - tcbd_debug(DEBUG_DRV_PERI, "peri type:%d\n", (s32)(_peri_type)); - memset(cfg_value, 0, sizeof(cfg_value)); - - switch (_peri_type) { - case PERI_TYPE_SPI_SLAVE: - case PERI_TYPE_PTS: - case PERI_TYPE_HPI: - case PERI_TYPE_SPI_ONLY: - return 0; - - case PERI_TYPE_SPI_MASTER: - cfg_value[0] = 0x0E; - cfg_value[1] = 0x34; - break; - case PERI_TYPE_STS: - cfg_value[0] = 0x0E; - cfg_value[1] = 0x3C; - break; - default: - break; - } - - tcbd_reg_write_burst_cont(_device, TCBD_GPIO_ALT, cfg_value, 2); - /*tcbd_reg_write_burst_cont(_device, TCBD_GPIO_DRV, drv_strength, 2);*/ - return 0; -} - -s32 tcbd_select_peri( - struct tcbd_device *_device, enum tcbd_peri_type _peri_type) -{ - s32 ret = 0; - u8 peri_mode[4] = {0, }; - u8 interface_speed = 4; /*tcbd_calc_clock(_device, 3000, 10000);*/ - - tcbd_debug(DEBUG_DRV_PERI, "peri type:%d, clock div:%d\n", - (s32)(_peri_type), interface_speed); - switch (_peri_type) { - case PERI_TYPE_SPI_SLAVE: - tcbd_peri_spi_slave(peri_mode, interface_speed); - ret |= tcbd_reg_write_burst_cont( - _device, TCBD_PERI_MODE0, peri_mode, 2); - ret |= tcbd_reg_write(_device, TCBD_PERI_CTRL, 0x90); - ret |= tcbd_init_peri_gpio(_device, PERI_TYPE_SPI_SLAVE); - break; - case PERI_TYPE_SPI_MASTER: - tcbd_peri_spi_master(peri_mode, interface_speed); - ret |= tcbd_reg_write_burst_cont( - _device, TCBD_PERI_MODE0, peri_mode, 2); - ret |= tcbd_reg_write(_device, TCBD_PERI_CTRL, 0x90); - ret |= tcbd_init_peri_gpio(_device, PERI_TYPE_SPI_MASTER); - break; - case PERI_TYPE_PTS: - tcbd_peri_pts(peri_mode, interface_speed); - ret |= tcbd_reg_write_burst_cont( - _device, TCBD_PERI_MODE0, peri_mode, 4); - ret |= tcbd_init_peri_gpio(_device, PERI_TYPE_PTS); - break; - case PERI_TYPE_STS: - tcbd_peri_sts(peri_mode, interface_speed); - ret |= tcbd_reg_write_burst_cont( - _device, TCBD_PERI_MODE0, peri_mode, 4); - ret |= tcbd_init_peri_gpio(_device, PERI_TYPE_STS); - break; - case PERI_TYPE_HPI: - tcbd_peri_hpi(peri_mode); - ret |= tcbd_reg_write(_device, TCBD_PERI_MODE0, peri_mode[0]); - break; - case PERI_TYPE_SPI_ONLY: - ret |= tcbd_reg_write(_device, TCBD_PERI_CTRL, 0x80); - ret |= tcbd_init_peri_gpio(_device, PERI_TYPE_SPI_ONLY); - default: - break; - } - _device->peri_type = _peri_type; - return ret; -} - -s32 tcbd_init_gpio_for_slave(struct tcbd_device *_device) -{ - u8 cfg_value[10] = {0, }; - - cfg_value[0] = 0x01; - cfg_value[1] = 0xC0; - return tcbd_reg_write_burst_cont( - _device, TCBD_GPIO_ALT, cfg_value, 10); -} - -s32 tcbd_enable_peri(struct tcbd_device *_device) -{ - u8 data = TCBD_PERI_EN | TCBD_PERI_INIT_AUTOCLR; - - switch (_device->peri_type) { - case PERI_TYPE_SPI_ONLY: - data = 0x80; - break; - case PERI_TYPE_SPI_SLAVE: - case PERI_TYPE_SPI_MASTER: - data |= TCBD_PERI_SEL_SPI | TCBD_PERI_HEADER_ON; - break; - case PERI_TYPE_PTS: - case PERI_TYPE_STS: - data |= TCBD_PERI_SEL_TS | TCBD_PERI_HEADER_ON; - break; - case PERI_TYPE_HPI: - data |= TCBD_PERI_SEL_HPI | TCBD_PERI_HEADER_ON; - break; - default: - break; - } - - return tcbd_reg_write(_device, TCBD_PERI_CTRL, data); -} - -s32 tcbd_disable_peri(struct tcbd_device *_device) -{ - s32 ret = 0; - u8 data; - - ret |= tcbd_reg_read(_device, TCBD_PERI_CTRL, &data); - data &= ~TCBD_PERI_EN; - ret |= tcbd_reg_write(_device, TCBD_PERI_CTRL, data); - - return ret; -} diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_drv_rf.c b/drivers/media/tdmb/tcc3170/src/tcbd_drv_rf.c deleted file mode 100644 index a988077..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_drv_rf.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * tcbd_drv_rf.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "tcpal_os.h" -#include "tcbd_feature.h" -#include "tcpal_debug.h" - -#include "tcbd_api_common.h" -#include "tcbd_drv_ip.h" -#include "tcbd_drv_io.h" -#include "tcbd_drv_rf.h" - -struct tcbd_rf_data { - u8 addr; - u32 data; -}; - -static struct tcbd_rf_data tcc3170_rf_table_band3[] = { - {0x02, 0x00030000}, - {0x04, 0x00002002}, - {0x05, 0x5500640B}, - {0x06, 0x1AADA754}, - {0x07, 0x00002000}, - {0x08, 0x42222249}, - {0x09, 0x000D2299}, - {0x0A, 0xD87060DD}, - {0x0B, 0x00000E72}, - {0x0C, 0x02AE7077}, - {0x0D, 0x00240376}, - {0x0E, 0X7F7F0711} -}; - -static struct tcbd_rf_data tcc3170_rf_table_lband[] = { - {0x02, 0x00030000}, - {0x04, 0x00004001}, - {0x06, 0x0AADA754}, - {0x07, 0x00002000}, - {0x08, 0x42222249}, - {0x09, 0x000D2299}, - {0x0A, 0xD87060DD}, - {0x0B, 0x00000E72}, - {0x0C, 0x02AE7077}, - {0x0D, 0x00240376}, - {0x0E, 0X7F7F0907} -}; - -static u64 tcbd_div64(u64 x, u64 y) -{ - u64 a, b, q, counter; - - q = 0; - if (y != 0) { - while (x >= y) { - a = x >> 1; - b = y; - counter = 1; - while (a >= b) { - b <<= 1; - counter <<= 1; - } - x -= b; - q += counter; - } - } - return q; -} - - -s32 tcbd_rf_init(struct tcbd_device *_device, enum tcbd_band_type _band) -{ - s32 i = 0; - s32 size; - s32 ret = 0; - struct tcbd_rf_data *rf_data; - - switch (_band) { - case BAND_TYPE_BAND3: - size = ARRAY_SIZE(tcc3170_rf_table_band3); - rf_data = tcc3170_rf_table_band3; - break; - case BAND_TYPE_LBAND: - size = ARRAY_SIZE(tcc3170_rf_table_lband); - rf_data = tcc3170_rf_table_lband; - break; - default: - return -TCERR_UNKNOWN_BAND; - break; - } - - for (i = 0; i < size; i++) - ret |= tcbd_rf_reg_write( - _device, rf_data[i].addr, rf_data[i].data); - return ret; -} - -#define SCALE_FACTOR 22 -#define DIV(A, B) (tcbd_div64((A< 1000000) - band = 1; - - if (band == 0) { - /* band III */ - ret |= tcbd_rf_reg_write(_device, 0x04, 0x00002002); - ret |= tcbd_rf_reg_write(_device, 0x0e, 0x7F7F0711); - } else { - /* LBAND */ - ret |= tcbd_rf_reg_write(_device, 0x04, 0x00004001); - ret |= tcbd_rf_reg_write(_device, 0x0e, 0x7F7F0907); - } - - ret |= tcbd_rf_reg_read(_device, 0x06, (u32 *)&rf_cfg2); - if (((rf_cfg2 >> 28) & 0x01) == 0) - FR = 0; - else - FR = 1; - - if (((rf_cfg2 >> 31) & 0x01) == 0) - PLL_MODE = 2; - else - PLL_MODE = 4; - - osc_clock = tcbd_get_osc_clock(_device); - f_freq_khz = _freq_khz; - - /* Calculate PLL */ - if (f_freq_khz < 250000) { - /* VHF */ - DIV_MODE = 0x00; - fpfd = osc_clock >> FR; - VCO_DIV = 16; - - Flo = f_freq_khz - FOffset; - Fvco = Flo * VCO_DIV; - - Temp1 = Fvco << FR; - Temp2 = PLL_MODE * osc_clock; - N = DIV(Temp1, Temp2); - N_int = (N >> SCALE_FACTOR) << SCALE_FACTOR; - F = ((N - N_int) * (2 << 21)) >> SCALE_FACTOR; - - if (N_int < (19 << SCALE_FACTOR)) { - FR = 1; - fpfd = osc_clock >> FR; - VCO_DIV = 16; - Flo = f_freq_khz - FOffset; - Fvco = Flo * VCO_DIV; - - Temp1 = Fvco * FR; - Temp2 = PLL_MODE * osc_clock; - N = DIV(Temp1, Temp2); - N_int = (N >> SCALE_FACTOR) << SCALE_FACTOR; - F = ((N - N_int) * (2 << 21)) >> SCALE_FACTOR; - } - intF = F; - intVCO_DIV = VCO_DIV; - } else { - /* LBAND */ - DIV_MODE = 0x01; - fpfd = osc_clock >> FR; - VCO_DIV = 2; - - Flo = f_freq_khz - FOffset; - Fvco = Flo * VCO_DIV; - - Temp1 = Fvco << FR; - Temp2 = PLL_MODE * osc_clock; - N = DIV(Temp1, Temp2); - N_int = (N >> SCALE_FACTOR) << SCALE_FACTOR; - F = ((N - N_int) * (2 << 21)) >> SCALE_FACTOR; - - if (N_int < (19 << SCALE_FACTOR)) { - FR = 1; - - VCO_DIV = 2; - Flo = f_freq_khz - FOffset; - Fvco = Flo * VCO_DIV; - - Temp1 = Fvco << FR; - Temp2 = PLL_MODE * osc_clock; - N = DIV(Temp1, Temp2); - N_int = (N >> SCALE_FACTOR) << SCALE_FACTOR; - F = ((N - N_int) * (2<<21)) >> SCALE_FACTOR; - } - intF = F; - intVCO_DIV = VCO_DIV; - } - - rf_cfg4 = (u32)((N_int >> SCALE_FACTOR) & 0xFF) ; - rf_cfg4 |= ((intF & 0x3FFFFF) << 8); - rf_cfg4 |= ((RST_PLL & 0x01) << 30); - rf_cfg4 |= ((DIV_MODE & 0x01) << 31); - ret |= tcbd_rf_reg_write(_device, 0x08, rf_cfg4); - - ret |= tcbd_rf_reg_read(_device, 0x06, (u32 *)&rf_cfg2); - if (FR == 0) - BITCLR(rf_cfg2, Bit28); - else - BITSET(rf_cfg2, Bit28); - - ret |= tcbd_rf_reg_write(_device, 0x06, rf_cfg2); - - return ret; -} - -s32 tcbd_rf_tune_frequency( - struct tcbd_device *_device, u32 _freq_khz, s32 _bw_khz) -{ - s32 ret = 0; - - if (_device->curr_band != _device->prev_band) - ret |= tcbd_rf_init(_device, _device->curr_band); - - ret |= tcbd_rf_set_frequency(_device, _freq_khz, _bw_khz); - - if (ret < 0) - tcbd_debug(DEBUG_ERROR, - "Failed to set frequency to RF, err:%d\n", ret); - - return ret; -} diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_hal.c b/drivers/media/tdmb/tcc3170/src/tcbd_hal.c deleted file mode 100644 index fba77e7..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcbd_hal.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * tcbd_hal.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include - -#include - -#include "tcpal_os.h" -#include "tcpal_debug.h" -#include "tcbd_hal.h" -#include "tcbd_feature.h" - -#define __USE_DXB0_IRQ__ -/*#define __USE_DXB1_IRQ__*/ - -#ifdef __USE_TC_CPU__ -static PGPIO RGPIO; -static PPIC RPIC; -#endif - -void tchal_init(void) -{ -#ifdef __USE_TC_CPU__ - tcbd_debug(DEBUG_TCHAL, "\n"); - RGPIO = (PGPIO)tcc_p2v(HwGPIO_BASE); - RPIC = (PPIC)tcc_p2v(HwPIC_BASE); -#endif - tchal_power_down_device(); -} - -void tchal_reset_device(void) -{ -#ifdef __USE_TC_CPU__ - tcbd_debug(DEBUG_TCHAL, "\n"); -#if defined(__CSPI_ONLY__) - /* select peripheral mode as SPI */ -#if defined(__USE_DXB1_IRQ__) - BITCLR(RGPIO->GPAFN1, Hw16 - Hw12); /* DXB1_IRQ Set GPIO mode*/ - BITSET(RGPIO->GPAEN, Hw11); /* DXB1_IRQ output mode*/ - BITCLR(RGPIO->GPADAT, Hw11); /* DXB1_IRQ clear*/ -#elif defined(__USE_DXB0_IRQ__) - BITCLR(RGPIO->GPDFN1, Hw8 - Hw4); /* DXB0_IRQ Set GPIO mode*/ - BITSET(RGPIO->GPDEN, Hw9); /* DXB0_IRQ output mode*/ - BITCLR(RGPIO->GPDDAT, Hw9); /* DXB0_IRQ clear*/ -#endif /*__USE_DXB1_IRQ__*/ -#endif /*__CSPI_ONLY__*/ - - /* reset */ -#if defined(__CSPI_ONLY__) - BITCLR(RGPIO->GPEFN1, Hw16 - Hw12); /* DXB1_RST# Set GPIO mode */ - BITSET(RGPIO->GPEEN, Hw11);/* DXB1_RST# Set GPIO Output mode*/ - BITCLR(RGPIO->GPEDAT, Hw11);/* DXB1_RST# Clear */ - tcpal_msleep(10); - BITSET(RGPIO->GPEDAT, Hw11);/* DXB1_RST# Set*/ -#elif defined(__I2C_STS__) - BITCLR(RGPIO->GPDFN1, Hw4 - Hw0); /* DXB0_RST# Set GPIO mode */ - BITSET(RGPIO->GPDEN, Hw8); /* DXB0_RST# Set GPIO Output mode*/ - BITCLR(RGPIO->GPDDAT, Hw8); /* DXB0_RST# Clear */ - tcpal_msleep(10); - BITSET(RGPIO->GPDDAT, Hw8); /* DXB0_RST# Set*/ -#else /*__CSPI_ONLY__ || __I2C_STS__*/ -#error "you must define __CSPI_ONLY__ or __I2C_STS__" -#endif /*!__CSPI_ONLY__ && !__I2C_STS__*/ -#endif -} - -void tchal_power_on_device(void) -{ -#ifdef __USE_TC_CPU__ - tcbd_debug(DEBUG_TCHAL, "\n"); - BITCLR(RGPIO->GPEFN0, Hw16 - Hw12);/* DXB1_PD Set GPIO mode*/ - - BITSET(RGPIO->GPEEN, Hw3);/* DXB1_PD Set GPIO Output mode*/ - BITCLR(RGPIO->GPEDAT, Hw3);/* DXB1_PD Clear*/ - tcpal_msleep(10); - BITSET(RGPIO->GPEDAT, Hw3);/* DXB1_PD Set*/ - tcpal_msleep(10); - - tchal_reset_device(); - tchal_irq_setup(); -#endif -} - - -void tchal_power_down_device(void) -{ -#ifdef __USE_TC_CPU__ - tcbd_debug(DEBUG_TCHAL, "\n"); - BITCLR(RGPIO->GPEFN0, Hw16 - Hw12); - BITSET(RGPIO->GPEEN, Hw3);/* DXB1_PD Set GPIO Output mode*/ - BITCLR(RGPIO->GPEDAT, Hw3);/* DXB1_PD Clear*/ -#if defined(__CSPI_ONLY__) - BITCLR(RGPIO->GPEDAT, Hw11);/* DXB1_RST# Clear*/ -#elif defined(__I2C_STS__) - BITCLR(RGPIO->GPDDAT, Hw8);/* DXB0_RST# Clear */ -#else -#error "you must define __CSPI_ONLY__ or __I2C_STS__" -#endif -#endif -} - -void tchal_irq_setup(void) -{ -#ifdef __USE_TC_CPU__ -#if defined(__USE_DXB1_IRQ__) - BITCLR(RGPIO->GPAFN1, Hw16 - Hw12);/* DXB1_IRQ Set GPIO mode*/ - BITCLR(RGPIO->GPAEN, Hw11);/* DXB1_IRQ input mode*/ - - BITCSET(RGPIO->EINTSEL0, Hw32 - Hw24, 11<<24); /*GPIO_A11*/ -#elif defined(__USE_DXB0_IRQ__) - BITCLR(RGPIO->GPDFN1, Hw8 - Hw4); /* DXB0_IRQ Set GPIO mode*/ - BITCLR(RGPIO->GPDEN, Hw9); /* DXB0_IRQ input mode*/ - - BITCSET(RGPIO->EINTSEL0, Hw32 - Hw24, 20<<24); /*GPIO_D9*/ -#endif /*__USE_DXB1_IRQ__*/ - BITSET(RPIC->POL0, 1< - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_stream_parser.h" - -#define SIZE_MSC_CACHE_BUFF (188*20) -#define SIZE_FIC_CACHE_BUFF (388*2) -#define SIZE_STATUS_CACHE_BUFF (32*2) - -#if defined(__MERGE_EACH_TYPEOF_STREAM__) -#define SIZE_MSC_STACK_BUFF (1024*16) -#define SIZE_FIC_STACK_BUFF (388*10) -#define SIZE_STATUS_STACK_BUFF (32*10) -#endif /*!__MERGE_EACH_TYPEOF_STREAM__*/ - -#define MAX_SUBCH_ID (0x1<<6) -enum tcbd_split_stream_state { - STATE_NO_SYNC = 0, - STATE_OTHER, - STATE_STATUS, - STATE_MSC, - STATE_FIC, - STATE_GARBAGE, - STATE_ERROR -}; - -#define HEADER_SIZE 4 -#define SYNC_BYTE 0x5C -struct op_header { - u8 sync; /**< sync byte. must be 0x5C */ - u8 subch; /**< sub channel id */ - u16 data_size; - u8 parity; - enum DATA_TYPE type; -}; - -#if defined(__MERGE_EACH_TYPEOF_STREAM__) -struct merged_stream_info { - s32 curr_pos; /**< Current position of buffer of merged stream */ - u8 *buffer; /**< Buffer for stacking stream chunk */ - u8 subch_id; -}; -#endif /* __MERGE_EACH_TYPEOF_STREAM__ */ - -struct tcbd_split_stream_data { - s32 dev_idx; - s32 header_err[2]; - enum tcbd_split_stream_state state; - s32 header_cnt; - s32 remain; - s32 next_read; - u8 *buffer; - struct op_header header; -#if defined(__MERGE_EACH_TYPEOF_STREAM__) - struct merged_stream_info merged_msc[TCBD_MAX_NUM_SERVICE]; - struct merged_stream_info merged_fic; - struct merged_stream_info merged_status; - u8 quick_msc_idx[MAX_SUBCH_ID]; - u8 num_subch; -#endif /*__MERGE_EACH_TYPEOF_STREAM__ */ - tcbd_stream_callback stream_callback; -}; - -static struct tcbd_split_stream_data tcbd_stream_spliter[2]; - -static inline u8 tcbd_parity_check(u8 *parity) -{ - u32 i, k; - u8 p = 0; - - for (i = 0; i < 4; i++) { - for (k = 0; k < 8; k++) - p = (p + ((parity[i] >> k) & 1)) & 1; - } - - return p; -} - -#define FIC_ID 0x00 -#define STATUS_ID 0x3F -#define GARBAGE_ID 0x04 -#define OTHER_CHIP_ID 0x3D - -static inline void tcbd_change_parser_state(struct op_header *header, - struct tcbd_split_stream_data *_parser) -{ - s32 size_limit[] = { -1, 4096, 32, 4096, 388, 4096}; - s8 *type[] = {NULL, "other", "status", "msc", "fic", "garbage"}; - - switch ((enum DATA_TYPE)header->type) { - case DATA_TYPE_MSC: - if (header->data_size == 388) { - _parser->state = STATE_FIC; - header->type = DATA_TYPE_FIC; - } else - _parser->state = STATE_MSC; - break; - case DATA_TYPE_FIC: - if (header->subch == GARBAGE_ID) - _parser->state = STATE_GARBAGE; - else if (header->subch == FIC_ID) - _parser->state = STATE_FIC; - else - _parser->state = STATE_ERROR; - break; - case DATA_TYPE_STATUS: - if (header->subch == STATUS_ID) - _parser->state = STATE_STATUS; - else - _parser->state = STATE_ERROR; - break; - case DATA_TYPE_OTHER: - if (header->subch == OTHER_CHIP_ID) - _parser->state = STATE_OTHER; - else - _parser->state = STATE_ERROR; - break; - default: - tcbd_debug(DEBUG_ERROR, "unknown data type!!"); - _parser->state = STATE_ERROR; - break; - } - switch (_parser->state) { - case STATE_ERROR: - _parser->header_err[1]++; - _parser->state = STATE_NO_SYNC; - break; - default: - if (size_limit[_parser->state] < header->data_size) { - tcbd_debug(DEBUG_ERROR, "wrong data size %s:%d!\n", - type[_parser->state], header->data_size); - _parser->header_err[1]++; - _parser->state = STATE_NO_SYNC; - - } else - _parser->header_cnt++; - break; - } -} - -static s32 tcbd_parse_header(struct tcbd_split_stream_data *_parser) -{ - u8 *stream = _parser->buffer; - struct op_header *header = &_parser->header; - - _parser->state = STATE_NO_SYNC; - if ((stream[3] != SYNC_BYTE) || (tcbd_parity_check(stream) != 1)) { - _parser->header_err[0]++; - return HEADER_SIZE; - } - - header->sync = stream[3]; - header->type = (stream[2] & 0xC0) >> 6; - header->data_size = ((stream[1]<<7) | (stream[0]>>1)) << 2; - header->subch = stream[2] & 0x3F; - - tcbd_debug(DEBUG_PARSE_HEADER, "sync:0x%02X, type:%d, size:%d\n", - header->sync, header->type, - header->data_size); - tcbd_change_parser_state(header, _parser); - - return HEADER_SIZE; -} - -#if defined(__MERGE_EACH_TYPEOF_STREAM__) -static void tcbd_merge_each_stream(struct tcbd_split_stream_data *_parser, - u8 *chunk_buff) -{ - static u8 msc_buff[TCBD_MAX_NUM_SERVICE][SIZE_MSC_STACK_BUFF]; - static u8 fic_buff[SIZE_FIC_STACK_BUFF]; - static u8 status_buff[SIZE_STATUS_STACK_BUFF]; - - struct merged_stream_info *merged; - struct op_header *header = &_parser->header; - - s32 sz_stack_buff[] = { - SIZE_MSC_STACK_BUFF, - SIZE_FIC_STACK_BUFF, - SIZE_STATUS_STACK_BUFF}; - s32 quick_msc_idx = 0; - - switch (header->type) { - case DATA_TYPE_MSC: - if (_parser->num_subch >= TCBD_MAX_NUM_SERVICE) { - tcbd_debug(DEBUG_ERROR, "exceeded max num service!\n"); - return; - } - if (_parser->quick_msc_idx[header->subch] == 0xFF) - _parser->quick_msc_idx[header->subch] = - _parser->num_subch++; - - quick_msc_idx = _parser->quick_msc_idx[header->subch]; - if (quick_msc_idx >= TCBD_MAX_NUM_SERVICE) - tcbd_debug(DEBUG_ERROR, "quick_msc_idx:%d, header->" - "subch:%d\n", quick_msc_idx, header->subch); - - merged = &_parser->merged_msc[quick_msc_idx]; - merged->buffer = msc_buff[quick_msc_idx]; - merged->subch_id = header->subch; - break; - case DATA_TYPE_FIC: - merged = &_parser->merged_fic; - merged->buffer = fic_buff; - break; - case DATA_TYPE_STATUS: - merged = &_parser->merged_status; - merged->buffer = status_buff; - break; - default: - tcbd_debug(DEBUG_ERROR, "unknown stream type!\n"); - return; - } - - if (merged->curr_pos+header->data_size > sz_stack_buff[header->type]) { - tcbd_debug(DEBUG_ERROR, "overflow stack buffer!!\n"); - return; - } - - tcbd_debug(DEBUG_STREAM_STACK, "type:%d, subchid:%u, buffer:%p " - "currpos:%d, size:%d\n", header->type, header->subch, - merged->buffer, merged->curr_pos, header->data_size); - memcpy(merged->buffer + merged->curr_pos, chunk_buff, - header->data_size); - merged->curr_pos += header->data_size; -} - -static s32 tcbd_push_merged_stream(struct tcbd_split_stream_data *_parser) -{ - register s32 i; - struct merged_stream_info *merged = NULL; - struct merged_stream_info *list_stream[] = { - NULL, &_parser->merged_fic, &_parser->merged_status, NULL - }; - - tcbd_debug(DEBUG_STREAM_STACK, "header num:%d, num subch :%d\n", - _parser->header_cnt, _parser->num_subch); - for (i = 0; i < _parser->num_subch; i++) { - merged = &_parser->merged_msc[i]; - if (!merged->buffer || !merged->curr_pos) - continue; - - /* send merged data to user space */ - if (_parser->stream_callback) { - _parser->stream_callback(_parser->dev_idx, - merged->buffer, merged->curr_pos, - merged->subch_id, DATA_TYPE_MSC); - merged->buffer = NULL; - merged->curr_pos = 0; - } - } - - for (i = 1; i < (s32)DATA_TYPE_MAX; i++) { - merged = list_stream[i]; - if (!merged || !merged->buffer || !merged->curr_pos) - continue; - - /* send merged data to user space */ - if (_parser->stream_callback) { - _parser->stream_callback(_parser->dev_idx, - merged->buffer, merged->curr_pos, - merged->subch_id, i); - merged->buffer = NULL; - merged->curr_pos = 0; - } - } - return 0; -} -#endif /*__MERGE_EACH_TYPEOF_STREAM__ */ - -static void tcbd_stack_chunk(struct tcbd_split_stream_data *_parser, - u8 *_buffer) -{ - u8 *chunk_buff = (_buffer) ? _buffer : _parser->buffer; -#if defined(__MERGE_EACH_TYPEOF_STREAM__) - tcbd_merge_each_stream(_parser, chunk_buff); -#else /* __MERGE_EACH_TYPEOF_STREAM__ */ - struct op_header *header = &_parser->header; - if (_parser->stream_callback) { - _parser->stream_callback(_parser->dev_idx, chunk_buff, - header->data_size, header->subch, header->type); - } -#endif /* !__MERGE_EACH_TYPEOF_STREAM__ */ -} - -static inline s32 tcbd_push_concat(struct tcbd_split_stream_data *_parser, - u8 *_cache_buff) -{ - s32 pre_copied, ret; - u8 *buffer = _parser->buffer; - struct op_header *header = &_parser->header; - - s8 *type[] = {"msc", "fic", "status", "other"}; - s32 size_cache_buff[] = { - SIZE_MSC_CACHE_BUFF, - SIZE_FIC_CACHE_BUFF, - SIZE_STATUS_CACHE_BUFF}; - - if (header->data_size > size_cache_buff[header->type]) { - tcbd_debug(DEBUG_ERROR, "overflow %s cache buffer!! size:%d\n", - type[header->type], header->data_size); - _parser->state = STATE_ERROR; - ret = HEADER_SIZE; - goto exit_func; - } - - pre_copied = header->data_size - _parser->next_read; - if (_parser->next_read > _parser->remain) { - memcpy(_cache_buff + pre_copied, buffer, _parser->remain); - _parser->next_read -= _parser->remain; - ret = _parser->remain; - tcbd_debug(DEBUG_PARSING_PROC, "keep %s data %d bytes, pre:%d," - "next:%d, buffer:%p\n", type[header->type], - _parser->remain, pre_copied, _parser->next_read, - _cache_buff); - } else { - memcpy(_cache_buff + pre_copied, buffer, _parser->next_read); - tcbd_stack_chunk(_parser, _cache_buff); - ret = _parser->next_read; - tcbd_debug(DEBUG_PARSING_PROC, "send %s data %d bytes, pre:%d," - "curr:%d, buffer:%p\n", type[header->type], - header->data_size, pre_copied, - _parser->next_read, _cache_buff); - _parser->state = STATE_NO_SYNC; - } - -exit_func: - return ret; -} - -static inline void tcbd_push_medium(struct tcbd_split_stream_data *_parser) -{ - struct op_header *header = &_parser->header; - s8 *type[] = {"msc", "fic", "status", "other"}; - - tcbd_debug(DEBUG_PARSING_PROC, "send %s data %d bytes\n", - type[header->type], header->data_size); - tcbd_stack_chunk(_parser, NULL); -} - -static inline s32 tcbd_cache_ramnant(struct tcbd_split_stream_data *_parser, - u8 *_cache_buff) -{ - struct op_header *header = &_parser->header; - u8 *buffer = _parser->buffer; - s8 *type[] = {"msc", "fic", "status", "other"}; - s32 size_cache_buff[] = { - SIZE_MSC_CACHE_BUFF, - SIZE_FIC_CACHE_BUFF, - SIZE_STATUS_CACHE_BUFF}; - - tcbd_debug(DEBUG_PARSING_PROC, "keep %s data %d bytes buff:%p\n", - type[header->type], _parser->remain, _cache_buff); - - if (header->data_size > size_cache_buff[header->type]) { - tcbd_debug(DEBUG_ERROR, "overflow %s cache buffer!! size:%d\n", - type[header->type], header->data_size); - _parser->state = STATE_ERROR; - return HEADER_SIZE; - } else { - memcpy(_cache_buff, buffer, _parser->remain); - return _parser->remain; - } -} - -static s32 tcbd_push_chunk(struct tcbd_split_stream_data *_parser, - u8 *_cached_buff) -{ - s32 move; - struct op_header *header = &_parser->header; - - if (_parser->next_read) { - if (_parser->state != STATE_GARBAGE) - move = tcbd_push_concat(_parser, _cached_buff); - else { - if (_parser->next_read > _parser->remain) { - _parser->next_read -= _parser->remain; - move = _parser->remain; - } else { - move = _parser->next_read; - _parser->state = STATE_NO_SYNC; - } - } - } else if (_parser->remain >= header->data_size) { - if (_parser->state != STATE_GARBAGE) - tcbd_push_medium(_parser); - - _parser->state = STATE_NO_SYNC; - move = header->data_size; - } else { - if (_parser->state != STATE_GARBAGE) - move = tcbd_cache_ramnant(_parser, _cached_buff); - else - move = _parser->remain; - - _parser->next_read = header->data_size - _parser->remain; - } - - switch (_parser->state) { - case STATE_NO_SYNC: -#if defined(__USING_TS_IF__) - if (_parser->next_read == 0) - move += 188 - ((move + SIZE_BUFF_HEADER) % 188); - else - move += 188 - (move % 188); -#endif /*__USING_TS_IF__*/ - case STATE_ERROR: - _parser->state = STATE_NO_SYNC; - _parser->next_read = 0; - default: - break; - } - - return move; -} - -s32 tcbd_split_stream(s32 _dev_idx, u8 *_stream, s32 _size) -{ - s32 ret = 0; - register s32 point, move; - /* buffer for un-handled spare data of each interrupt */ - static u8 cache_buff_msc[SIZE_MSC_CACHE_BUFF]; - static u8 cache_buff_fic[SIZE_FIC_CACHE_BUFF]; - static u8 buff_cache_status[SIZE_STATUS_CACHE_BUFF]; - - struct tcbd_split_stream_data *spliter = &tcbd_stream_spliter[_dev_idx]; - - u64 time = 0; - point = move = 0; - spliter->remain = _size; - spliter->header_cnt = 0; - memset(spliter->header_err, 0, sizeof(spliter->header_err)); - - time = tcpal_get_time(); - while (spliter->remain > 0) { - spliter->buffer = _stream + point; - switch (spliter->state) { - case STATE_NO_SYNC: - move = tcbd_parse_header(spliter); - break; - case STATE_OTHER: - move = tcbd_parse_header(spliter); - tcbd_debug(DEBUG_ERROR, "State Other!! size:%d\n", - spliter->header.data_size); - break; - case STATE_MSC: - move = tcbd_push_chunk(spliter, cache_buff_msc); - break; - case STATE_FIC: - move = tcbd_push_chunk(spliter, cache_buff_fic); - break; - case STATE_STATUS: - move = tcbd_push_chunk(spliter, buff_cache_status); - break; - - case STATE_GARBAGE: - move = tcbd_push_chunk(spliter, NULL); - tcbd_debug(DEBUG_STREAM_PARSER, "State Garbage!:%d\n", - spliter->header.data_size); - break; - default: - move = 0; point = 0; - spliter->state = STATE_NO_SYNC; - spliter->next_read = 0; - tcbd_debug(DEBUG_ERROR, "something wrong!\n"); - goto exit_func; - } - spliter->remain -= move; - point += move; - tcbd_debug(0, "remain:%d, point:%d, move:%d\n", - spliter->remain, point, move); - } -exit_func: -#if defined(__MERGE_EACH_TYPEOF_STREAM__) - ret = tcbd_push_merged_stream(spliter); -#endif /*__MERGE_EACH_TYPEOF_STREAM__*/ - tcbd_debug(DEBUG_PARSING_TIME, "%lldms elapsed to parse!\n", - tcpal_diff_time(time)); - - if (spliter->header_err[0] || spliter->header_err[1]) - tcbd_debug(DEBUG_ERROR, "header err, parity:%d, state:%d\n", - spliter->header_err[0], spliter->header_err[1]); - return ret; -} - -void tcbd_init_parser(s32 _dev_idx, tcbd_stream_callback _stream_callback) -{ - tcbd_stream_callback bak = NULL; - struct tcbd_split_stream_data *spliter = &tcbd_stream_spliter[_dev_idx]; - - if (spliter->stream_callback) - bak = spliter->stream_callback; - - memset(spliter, 0, sizeof(struct tcbd_split_stream_data)); - spliter->dev_idx = _dev_idx; -#if defined(__MERGE_EACH_TYPEOF_STREAM__) - memset(spliter->quick_msc_idx, 0xFF, sizeof(spliter->quick_msc_idx)); -#endif /*__MERGE_EACH_TYPEOF_STREAM__*/ - if (_stream_callback) - spliter->stream_callback = _stream_callback; - else if (bak) - spliter->stream_callback = bak; -} diff --git a/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/Makefile b/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/Makefile deleted file mode 100644 index 9dcc13e..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -obj-y += tcc_fic_decoder.o -obj-y += tcc_fic_fig0.o -obj-y += tcc_fic_fig1.o - -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcpal -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcc_fic_decoder diff --git a/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_decoder.c b/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_decoder.c deleted file mode 100644 index 8997c44..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_decoder.c +++ /dev/null @@ -1,540 +0,0 @@ -/* - * tcc_fic_decoder.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcc_fic_decoder.h" - -/****************************************************************************** -* UEP Table -* +---------------+-----------+-----------------------------------+ -* |Bit rate(4bits)|Protect Lv | SubCh Size(9bits) | -* |---------------|---+---+---|---+---+---+---+---+---+---+---+---| -* | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | -* +---------------+-----------+-----------------------------------+ -* -*******************************************************************************/ -static const unsigned short uep_table[64] = { - 0x0810, 0x0615, 0x0418, 0x021d, 0x0023, 0x1818, 0x161d, 0x1423, - 0x122a, 0x1034, 0x281d, 0x2623, 0x242a, 0x2234, 0x3820, 0x362a, - 0x3430, 0x323a, 0x3046, 0x4828, 0x4634, 0x443a, 0x4246, 0x4054, - 0x5830, 0x563a, 0x5446, 0x5254, 0x5068, 0x683a, 0x6646, 0x6454, - 0x6268, 0x7840, 0x7654, 0x7460, 0x7274, 0x708c, 0x8850, 0x8668, - 0x8474, 0x828c, 0x80a8, 0x9860, 0x9674, 0x948c, 0x92a8, 0x90d0, - 0xa874, 0xa68c, 0xa4a8, 0xa2d0, 0xa0e8, 0xb880, 0xb6a8, 0xb4c0, - 0xb2e8, 0xb118, 0xc8a0, 0xc6d0, 0xc318, 0xd8c0, 0xd518, 0xd1a0 }; - -static struct fic_parser_matadata parser_metadata; -static struct tcc_ensemble_info user_ensbl_info; - -static s32 parsing_fig0(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 length) -{ - s32 ret = FICERR_SUCCESS; - u8 extension; - - fic_info->fig_cn = (*fig_buff & 0x80) >> 7; - fic_info->fig_oe0 = (*fig_buff & 0x40) >> 6; - fic_info->fig_pd = (*fig_buff & 0x20) >> 5; - extension = (*fig_buff++ & 0x1f); - - length--; - /* service link FIG */ - if ((extension != 6) && (extension != 21) && (extension != 24)) { - if (fic_info->fig_cn) { - if (fic_info->reconf_stage) { - if (extension > 0) - return FICERR_FIG0_NEXT_FIG; - } else { - return FICERR_FIG0_NEXT_FIG1; - } - } - } - - switch (extension) { - case EXT_00: - ret = fig0_ext00(fic_info, fig_buff, length); - break; - case EXT_01: - ret = fig0_ext01(fic_info, fig_buff, length); - break; - case EXT_02: - ret = fig0_ext02(fic_info, fig_buff, length); - break; - case EXT_03: - ret = fig0_ext03(fic_info, fig_buff, length); - break; - case EXT_04: - ret = fig0_ext04(fic_info, fig_buff, length); - break; - case EXT_05: - ret = fig0_ext05(fic_info, fig_buff, length); - break; - case EXT_08: - ret = fig0_ext08(fic_info, fig_buff, length); - break; - case EXT_13: - ret = fig0_ext13(fic_info, fig_buff, length); - break; - case EXT_17: - ret = fig0_ext17(fic_info, fig_buff, length); - break; - default: - break; - } - return ret; -} - - -static s32 parsing_fig1( - struct fic_parser_matadata *fic_info, - u8 *fig_buff, - s32 length) -{ - s32 ret; - u8 extension, charset; - - fic_info->fig_oe1 = (*fig_buff & 0x08) >> 3; - - if (fic_info->fig_oe1 != 0) - return FICERR_FIG_NODATA; - - charset = (*fig_buff & 0xf0) >> 4; - extension = (*fig_buff++ & 0x07); - length--; - switch (extension) { - case EXT_00: - ret = fig1_ext00(fic_info, fig_buff, length, charset); - break; - case EXT_01: - ret = fig1_ext01(fic_info, fig_buff, length, charset); - break; - case EXT_04: - ret = fig1_ext04(fic_info, fig_buff, length, charset); - break; - case EXT_05: - ret = fig1_ext05(fic_info, fig_buff, length, charset); - break; - case EXT_06: - ret = fig1_ext06(fic_info, fig_buff, length, charset); - default: - break; - } - - return FICERR_SUCCESS; -} - -static u32 fic_channel_updated(void) -{ - u32 i, j; - u32 num_svc, num_svc_comp, num_subch; - - struct fic_parser_matadata *metadata = &parser_metadata; - struct tcc_ensemble *esmbl = &metadata->esmbl_start; - struct tcc_service *svc = metadata->svc_start; - struct tcc_service_comp *svc_comp = metadata->svc_comp_start; - struct tcc_user_app_types *user_app = metadata->user_app_start; - - num_svc = esmbl->num_svc; - num_svc_comp = esmbl->num_svc_comp; - num_subch = esmbl->num_svc_comp; - - if (!num_svc_comp) - return CH_UPDATE_NO_DATA; - - if (!num_subch) - return CH_UPDATE_NO_DATA; - - if (esmbl->label[0] == 0x00) - return CH_UPDATE_NO_DATA; - - if (num_svc) { - for (i = 0; i < num_svc; i++) { - if ((svc + i)->svc_label[0] == 0) - return CH_UPDATE_NO_DATA; - } - } else { - return CH_UPDATE_NO_DATA; - } - - for (i = 0; i < num_svc_comp; i++) { - if ((svc_comp + i)->fidc_id == 0xff) - return CH_UPDATE_NO_DATA; - } - - for (i = 0; i < num_svc_comp; i++) { - if (svc_comp[i].tmid == 3 || svc_comp[i].ascty_dscty == 5) { - if (svc_comp[i].ascty_dscty == 0) - return CH_UPDATE_ESSENTIAL_DATA; - - for (j = 0; j < num_svc_comp; j++) { - if (svc_comp[i].sid == user_app[j].sid && - svc_comp[i].scids == user_app[j].scids) - break; - } - if (j == num_svc_comp) - return CH_UPDATE_ESSENTIAL_DATA; - - if (svc_comp[i].scids == 0x0f) - return CH_UPDATE_ESSENTIAL_DATA; - } - - if (svc_comp[i].order) { - if ((svc_comp + i)->label[0] == 0) - return CH_UPDATE_ESSENTIAL_DATA; - } - } - - return CH_UPDATE_FULL_DATA; -} - -void tcc_fic_parser_init(void) -{ - s32 i; - struct fic_parser_matadata *metadata; - - metadata = &parser_metadata; - memset(metadata, 0, sizeof(parser_metadata)); - - metadata->reconf_stage = 0; - metadata->fig_cn = 0; - metadata->fig_oe0 = 0; - metadata->fig_pd = 0; - metadata->fig_oe1 = 0; - metadata->fib_cnt = 0; - - for (i = 0; i < NUM_SVC_COMP; i++) - metadata->svc_comp_start[i].scids = 0x0f; - - for (i = 0; i < NUM_USER_APP; i++) - metadata->user_app_start[i].scids = 0x0f; -} - -static s32 fib_decode(u8 *fig_buff) -{ - s32 ret = FICERR_SUCCESS; - struct fic_parser_matadata *fic_info; - - s32 fig_len; - u32 fig_type; - u32 buff_point = 0; - s32 buff_len = 30; - - fic_info = &parser_metadata; - - if (ret != FICERR_SUCCESS) - return ret; - - /* the size of FIG is bigger than 2bytes */ - while (buff_len > 0) { - /* find a FIG header */ - if (*(fig_buff + buff_point) == 0xff || - *(fig_buff + buff_point) == 0x00) { - ret = FICERR_FIBD_ENDMARKER; - break; - } - - fig_type = (*(fig_buff + buff_point) & 0xe0) >> 5; - fig_len = (*(fig_buff + buff_point) & 0x1f); - if (fig_len > 29 || fig_len == 0) - return FICERR_FIBD_INVALID_LENGTH; - - buff_point++; - if (fig_len <= 0x01) { - ret = FICERR_FIG_NODATA; - return ret; - } - - switch (fig_type) { - case FIG0: - ret = parsing_fig0(fic_info, - fig_buff + buff_point, fig_len); - break; - case FIG1: - ret = parsing_fig1(fic_info, - fig_buff+buff_point, fig_len); - break; - default: - ret = FICERR_FIBD_UNKNOWN_FIGTYPE; - return ret; - } - - buff_point += fig_len; - buff_len -= (fig_len + 1); - } - - if (buff_len < 0) - ret = FICERR_FIBD_INVALID_LENGTH; - return ret; -} - -static u16 fib_crc16(u8 *buf) -{ - u32 b, len; - u8 crcl, crcm; - - crcl = 0xff; - crcm = 0xff; - - - for (len = 0; len < 30; len++) { - b = *(buf + len) ^ crcm; - b = b ^ (b >> 4); - crcm = crcl ^ (b >> 3) ^ (b << 4); - crcl = b ^ (b << 5); - } - - crcl = crcl ^ 0xff; - crcm = crcm ^ 0xff; - return (u16)crcl | ((u16)crcm << 8); -} - - -static void fic_copy_sub_ch(struct fic_parser_matadata *fic_info, - struct tcc_service_comp_info *svc_comp_info) -{ - s32 i; - struct tcc_ensemble *esbl = &fic_info->esmbl_start; - struct tcc_sub_channel *subch_start = fic_info->subch_start; - - for (i = 0; i < esbl->num_svc_comp; i++) { - if (svc_comp_info->svc_comp.fidc_id != subch_start[i].subch_id) - continue; - memcpy(&svc_comp_info->sub_ch, &subch_start[i], - sizeof(struct tcc_sub_channel)); - break; - } -} - -static void fic_copy_svc_comp(struct fic_parser_matadata *fic_info, - struct tcc_service_info *svc_info) -{ - s32 i, j = 0; - struct tcc_ensemble *esbl = &fic_info->esmbl_start; - struct tcc_service_comp *src_svc_comp = fic_info->svc_comp_start; - struct tcc_service_comp_info *svc_comp_info; - - for (i = 0; i < esbl->num_svc_comp; i++) { - if (svc_info->svc.sid != src_svc_comp[i].sid) - continue; - svc_comp_info = &svc_info->svc_comp_info[j]; - memcpy(&svc_comp_info->svc_comp, &src_svc_comp[i], - sizeof(struct tcc_service_comp)); - fic_copy_sub_ch(fic_info, svc_comp_info); - j++; - } -} - -struct tcc_service_comp_info *tcc_fic_get_svc_comp_info(s32 _subch_id) -{ - s32 i; - struct tcc_service_comp_info *svc_comp_info; - struct tcc_ensemble *ensbl = &user_ensbl_info.ensbl; - struct tcc_service_info *svc_info = user_ensbl_info.svc_info; - - for (i = 0; i < ensbl->num_svc_comp; i++) { - svc_comp_info = &svc_info[i].svc_comp_info[0]; - if (svc_comp_info->svc_comp.fidc_id == _subch_id) - return svc_comp_info; - } - return NULL; -} - -u8 tcc_fic_get_ptype(struct tcc_service_comp_info *svc_comp_info) -{ - struct tcc_sub_channel *sub_ch = &svc_comp_info->sub_ch; - if (sub_ch->form_flag & 0x08) - return 1; - else - return 0; -} - -u8 tcc_fic_get_plevel(struct tcc_service_comp_info *svc_comp_info) -{ - u8 eep8[4] = {0, 1, 2, 3}; - u8 eep32[4] = {4, 5, 6, 7}; - u8 opt, protect; - struct tcc_sub_channel *sub_ch = &svc_comp_info->sub_ch; - - if (sub_ch->form_flag & 0x08) { - opt = (sub_ch->form_flag & 0x04) ? 1 : 0; - protect = sub_ch->form_flag & 0x03; - if (opt) - return eep32[protect]; - else - return eep8[protect]; - } else { - return (uep_table[sub_ch->tbl_index] & 0x0E00) >> 9; - } -} - -u16 tcc_fic_get_cu_size(struct tcc_service_comp_info *svc_comp_info) -{ - struct tcc_sub_channel *sub_ch = &svc_comp_info->sub_ch; - - if (sub_ch->form_flag & 0x08) - return sub_ch->size_cu; - else - return uep_table[sub_ch->tbl_index] & 0x1FF; -} - -u16 tcc_fic_get_cu_start(struct tcc_service_comp_info *svc_comp_info) -{ - struct tcc_sub_channel *sub_ch = &svc_comp_info->sub_ch; - - return sub_ch->size_cu; -} - -u8 tcc_fic_get_subch_id(struct tcc_service_comp_info *svc_comp_info) -{ - struct tcc_sub_channel *sub_ch = &svc_comp_info->sub_ch; - - return sub_ch->subch_id; -} - - -u8 tcc_fic_get_bitrate(struct tcc_service_comp_info *svc_comp_info) -{ - u8 opt, protect; - struct tcc_sub_channel *sub_ch = &svc_comp_info->sub_ch; - - if ((sub_ch->form_flag & 0x08) == 0) - return (uep_table[sub_ch->tbl_index] & 0xf000) >> 12; - - opt = (sub_ch->form_flag & 0x04) ? 1 : 0; - protect = sub_ch->form_flag & 0x03; - if (opt) { - switch (protect) { - case 0: - return sub_ch->size_cu / 27; - case 1: - return sub_ch->size_cu / 21; - case 2: - return sub_ch->size_cu / 18; - case 3: - return sub_ch->size_cu / 15; - default: - return 0; - } - /*human readable bitrate is x32*/ - } else { - switch (protect) { - case 0: - return sub_ch->size_cu / 12; - case 1: - return sub_ch->size_cu / 8; - case 2: - return sub_ch->size_cu / 6; - case 3: - return sub_ch->size_cu / 4; - default: - return 0; - } - /*human readable bitrate is x8*/ - } -} - -u8 tcc_fic_get_rs(struct tcc_service_comp_info *svc_comp_info) -{ - struct tcc_service_comp *svc_comp = &svc_comp_info->svc_comp; - if (svc_comp->ascty_dscty == 0x18) - return 1; - else - return 0; -} - -/** -* @param buff buffer for fic -* @param size fic buffer size. it must be 384 bytes. -* @return -1 : invalid argument, 0 : in progress, > 0 : parsing done -*/ -s32 tcc_fic_run_decoder(u8 *buff, s32 size) -{ - s32 cnt = 0, ret = 0; - s32 num_broken_fib = 0; - u16 fib_crc; - - if ((size%TCC_FIB_SIZE) != 0) { - tcbd_debug(DEBUG_ERROR, "invalid fic size:%d!\n", size); - return -1; - } - while (size > cnt * TCC_FIB_SIZE) { - fib_crc = (u16)(buff[(cnt * TCC_FIB_SIZE) + 30] << 8) | - (u16)buff[(cnt * TCC_FIB_SIZE) + 31]; - if (fib_crc != fib_crc16(buff + (cnt * TCC_FIB_SIZE))) { - num_broken_fib++; - tcbd_debug(DEBUG_ERROR, "broken fib cnt:%d\n", cnt); - goto cont_loop; - } - fib_decode(buff + (cnt * TCC_FIB_SIZE)); - ret = fic_channel_updated(); - if (ret == CH_UPDATE_ESSENTIAL_DATA || - ret == CH_UPDATE_FULL_DATA) { - break; - } -cont_loop: - cnt++; - } - return ret; -} - -void tcc_fic_disp_ensbl_info(struct tcc_ensemble_info *ensbl_info) -{ - s32 i, j; - struct tcc_ensemble *esbl = &ensbl_info->ensbl; - struct tcc_service_info *svc_info; - struct tcc_service_comp_info *svc_comp_info; - - tcbd_debug(DEBUG_INFO, "[ %s ] %d services available!\n", - esbl->label, esbl->num_svc); - for (i = 0; i < esbl->num_svc; i++) { - svc_info = &ensbl_info->svc_info[i]; - tcbd_debug(DEBUG_INFO, " => [ %s ] %d service component\n", - svc_info->svc.svc_label, - svc_info->svc.num_svc_comp); - for (j = 0; j < svc_info->svc.num_svc_comp; j++) { - svc_comp_info = &svc_info->svc_comp_info[j]; - tcbd_debug(DEBUG_INFO, " -> sub channel id [%d]\n", - svc_comp_info[j].svc_comp.fidc_id); - } - } -} - -struct tcc_ensemble_info *tcc_fic_get_ensbl_info(s32 _disp) -{ - s32 i; - struct fic_parser_matadata *fic_info = &parser_metadata; - struct tcc_ensemble *esbl = &fic_info->esmbl_start; - struct tcc_service *svc = fic_info->svc_start; - struct tcc_service_info *svc_info; - - memcpy(&user_ensbl_info.ensbl, esbl, sizeof(struct tcc_ensemble)); - for (i = 0; i < esbl->num_svc; i++) { - svc_info = &user_ensbl_info.svc_info[i]; - memcpy(&svc_info->svc, &svc[i], sizeof(struct tcc_service)); - fic_copy_svc_comp(fic_info, svc_info); - } - - if (_disp) - tcc_fic_disp_ensbl_info(&user_ensbl_info); - - return &user_ensbl_info; -} - diff --git a/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_fig0.c b/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_fig0.c deleted file mode 100644 index a7e2a1f..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_fig0.c +++ /dev/null @@ -1,911 +0,0 @@ -/* - * tcc_fic_fig0.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcc_fic_decoder.h" - -void fig0_ext00_update_reconf_mode(struct fic_parser_matadata *parser) -{ -/* - if (parser->cif_count == 0xff00) - gpFicParserInfo->reconf_mode = 2; - - if (cif_cnt >= parser->cif_count && - (cif_cnt - parser->cif_count) > 0x100) - gpFicParserInfo->reconf_mode = 3; - else if (cif_cnt + 0x1400 - parser->cif_count > 0x100) - gpFicParserInfo->reconf_mode = 3; - - parser->cif_count = cif_cnt; - if (fig_len == 5 && change_flag) { - parser->occur_change = *fig_buff; - - if (parser->reconf_stage == 0) - parser->reconf_stage = 1; - - if (parser->cif_count_hi == 0xff) { - parser->cif_count_hi = - (parser->cif_count & 0x1f00) >> 8; - parser->cif_count_lo = - (parser->cif_count & 0xff); - } - } else if (parser->reconf_stage == 1 && - parser->cif_count_hi != ((parser->cif_count & 0x1f00) >> 8) && - parser->occur_change <= ((parser->cif_count & 0xff) + 4)) { - parser->reconf_stage = 2; - parser->cif_count_hi = 0xff; - gpFicParserInfo->reconf_mode = 1; - } - } -*/ -} - -/******************************************************************** -* Function: Parsing FIG 0/0 -* Ensemble Information Field ETSI EN 300401 V010401p Figure 29 -*********************************************************************/ -s32 fig0_ext00(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - s32 ret = FICERR_SUCCESS; - u8 change_flag; - u16 cif_cnt; - struct tcc_ensemble *esb_start; - - esb_start = &parser->esmbl_start; - if (esb_start == NULL) - ret = FICERR_FIG0_0_NO_ENSEMBLEARRAY; - else { - esb_start->eid = (u16)(*fig_buff++) << 8; - /* eid = Country Id(b15-b12), Ensemble reference(b11-b0) */ - esb_start->eid |= *fig_buff++; - - /*b15-b14: Change flag about service Organization */ - change_flag = (*fig_buff & 0xc0) >> 6; - /*b13: Alarm flag, 1: alarm message accessible */ - esb_start->al_flag = (*fig_buff & 0x20) >> 5; - cif_cnt = (u16)(*fig_buff++ & 0x1f) << 8; - /*b12-b0: CIF Count, b12-b8->modulo 20, b7-b0->modulo250 */ - cif_cnt |= *fig_buff++; - - /*fig0_ext00_update_reconf_mode(parser);*/ - } - return ret; -} - -/******************************************************************** -* Function: Parsing FIG 0/1 -* Sub-channel Organization Field ETSI EN 300401 V010401p Figure 22 -*********************************************************************/ -s32 fig0_ext01(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - s32 ret = FICERR_SUCCESS; - u8 subchid, i, flag = 0; - u8 tbl_switch = 0xff; - - struct tcc_ensemble *esmbl; - struct tcc_sub_channel *subch_start, *subch_prev; - - esmbl = &parser->esmbl_start; - subch_start = subch_prev = parser->subch_start; - - if (subch_start == 0) - return FICERR_FIG0_1_NO_SUBCHARRAY; - while (fig_len > 0) { - if (esmbl->num_subch == NUM_SUB_CH) { - ret = FICERR_FIG0_1_FULL_SUBCHARRAY; - return ret; - } - - subchid = (*fig_buff & 0xfc) >> 2; /*b15-b10: subch_id */ - - for (i = 0; i < esmbl->num_subch; i++) { - subch_start = subch_prev + i; - if (subchid == subch_start->subch_id) { - flag = 1; - break; - } - } - - subch_start = subch_prev + i; - subch_start->subch_id = subchid; - subch_start->start_cu = (u16)(*fig_buff++ & 0x03) << 8; - /*b9-b0: Start Address */ - subch_start->start_cu |= *fig_buff++; - /*b7(b15): Short or Long form flag, 0:Short form 1:Long form*/ - subch_start->form_flag = ((*fig_buff & 0x80) ? 1 : 0) << 3; - fig_len -= 2; - - - /* In Long form case */ - if (subch_start->form_flag & 0x08) { - /*b14-b12: Option 000: 1,2,3,4-A 001: 1,2,3,4-B*/ - subch_start->form_flag |= - ((*fig_buff & 0x10) ? 1 : 0) << 2; - /*b11-b10: Protection level */ - subch_start->form_flag |= (*fig_buff & 0x0c) >> 2; - subch_start->size_cu = (u16)(*fig_buff++ & 0x03) << 8; - /*b9-b0: Sub-channel size */ - subch_start->size_cu |= *fig_buff++; - fig_len -= 2; - } else { - /* In Short form case */ - /* b6: Table switch */ - tbl_switch = (*fig_buff & 0x40)>>6; - if (!tbl_switch) - /*b5-b0: Table index */ - subch_start->tbl_index = *fig_buff++ & 0x3f; - else - /* Invalid Table index */ - subch_start->tbl_index = *fig_buff++ | 0xff; - - fig_len -= 1; - } - - if (!flag) - esmbl->num_subch++; - flag = 0; - } - if (fig_len < 0) - ret = FICERR_FIG0_1_INVALID_LENGTH; - - return ret; -} - -u8 *fig0_ext02_sid(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 *fig_len, u32 *sid) -{ - /* PD from FIG0 Header PD=1: 32bit sid */ - if (parser->fig_pd == 1) { - /*b31-b0: sid(ECC,Country Id,Service reference) */ - *sid = (u32)(*fig_buff++ << 24); - *sid |= (u32)(*fig_buff++ << 16); - *sid |= (u32)(*fig_buff++ << 8); - *sid |= (u32)(*fig_buff++); - *fig_len -= 4; - } else { - /* PD from FIG0 Header PD=0: 16bit sid */ - /*b15-b0: sid(Country Id,Service reference */ - *sid = (u32)(*fig_buff++ << 8); - *sid |= (u32)(*fig_buff++); - *fig_len -= 2; - } - return fig_buff; -} - -u8 *fig0_ext02_check_num_comp(struct fic_parser_matadata *parser, - u8 *fig_buff, u8 *num_comp) -{ - /* b3-b0: Number of Service Componentsin current FIG0_2, - * max 12 or 11 */ - *num_comp = (*fig_buff & 0x0f); - if (parser->fig_pd == 1) { - if (*num_comp > 11) - return NULL; - } else { - if (*num_comp > 12) - return NULL; - } - return fig_buff; -} - -u8 *fig0_ext02_update_svc(struct fic_parser_matadata *parser, - u8 *fig_buff, u32 sid, struct tcc_service **svc_start) -{ - u8 i, al; - struct tcc_ensemble *esmbl; - /*struct tcc_service *svc_start;*/ - - esmbl = &parser->esmbl_start; - al = 0; - for (i = 0; i < esmbl->num_svc; i++) { - *svc_start = parser->svc_start + i; - if (sid == (*svc_start)->sid) { - al = 1; - break; - } - } - - if (al == 0) { - *svc_start = parser->svc_start + i; - (*svc_start)->sid = sid; - /*b6-b4: Conditional Access Identifier */ - (*svc_start)->ca_id = (*fig_buff++ & 0x70) >> 4; - esmbl->num_svc++; - } else { - fig_buff++; - } - return fig_buff; -} - -s32 fig0_ext02_check_new_svc_comp(struct fic_parser_matadata *parser, - u32 sid, u16 scid, u8 tmid, u8 fidc_id) -{ - s32 j; - struct tcc_service_comp *svc_comp_start; - - for (j = 0; j < parser->esmbl_start.num_svc_comp; j++) { - svc_comp_start = parser->svc_comp_start + j; - if ((tmid == 0) || (tmid == 1) || (tmid == 2)) { - if ((fidc_id == svc_comp_start->fidc_id) && - (tmid == svc_comp_start->tmid) && - (sid == svc_comp_start->sid)) - return 1; - } else if (tmid == 3) { - if ((scid == svc_comp_start->scid) && - (sid == svc_comp_start->sid)) - return 1; - } - } - return 0; -} - -u8 *fig0_ext02_update_svc_comp(struct fic_parser_matadata *parser, - u8 *fig_buff, u32 sid, u8 *p_flag, struct tcc_service *svc_start) -{ - u8 is_updated, tmid, ascty_dscty = 0xff, fidc_id = 0xff; - u16 scid = 0xffff; - - struct tcc_ensemble *esmbl; - /*struct tcc_service *svc_start;*/ - struct tcc_service_comp *svc_comp_start; - - esmbl = &parser->esmbl_start; - svc_comp_start = parser->svc_comp_start; - - /*b15-b14: Transport Mechanism Identifier */ - tmid = (*fig_buff & 0xc0) >> 6; - switch (tmid) { - case 0: /* MSC-Stream mode - audio */ - case 1: /* MSC-Stream mode - data */ - case 2: - /*b13-b8: Data Service Component type */ - ascty_dscty = (*fig_buff++ & 0x3f); - /*b7-b2: FIDCId */ - fidc_id = (*fig_buff & 0xfc) >> 2; - /* Invalid scid */ - scid = 0xffff; - break; - case 3: /* MSC-Packet mode - data */ - scid = (*fig_buff++ & 0x3f) << 6; - /*b13-b2: Service Component Identifier */ - scid |= (*fig_buff & 0xfc) >> 2; - /* Invalid subch_id */ - fidc_id = 0xff; - ascty_dscty = 0xff; - break; - default: - tcbd_debug(DEBUG_ERROR, "unknown tmid!\n"); - break; - } - - is_updated = fig0_ext02_check_new_svc_comp(parser, - sid, scid, tmid, fidc_id); - if (is_updated == 0) { - /*b1: PS flag, 1: Primary service component 0: Secondary */ - if ((*fig_buff & 0x02) && *p_flag == 0) { - svc_comp_start = parser->svc_comp_start + - esmbl->num_svc_comp; - svc_comp_start->order = 0; - *p_flag = 1; - } else { - if (*p_flag) { - svc_comp_start = parser->svc_comp_start + - esmbl->num_svc_comp; - svc_comp_start->order = - svc_start->num_svc_comp; - } else { - svc_comp_start = parser->svc_comp_start + - esmbl->num_svc_comp + 1; - svc_comp_start->order = - svc_start->num_svc_comp + 1; - } - } - svc_comp_start->sid = sid; - svc_comp_start->tmid = tmid; - svc_comp_start->ascty_dscty = ascty_dscty; - svc_comp_start->fidc_id = fidc_id; - svc_comp_start->scid = scid; - svc_comp_start->ca_flag = (*fig_buff++ & 0x01); - svc_comp_start->ca_org = 0xffff; - svc_comp_start->scids = INITVAL_SCIDS; - - esmbl->num_svc_comp++; - svc_start->num_svc_comp++; - } else { - fig_buff++; /* pointer update */ - } - return fig_buff; -} - - -/******************************************************************** -* Function: Parsing FIG 0/2 -* Service Organization Field EN 300401 v010401p Figure 24 -*********************************************************************/ -s32 fig0_ext02(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - s32 ret = FICERR_SUCCESS; - u8 k, num_comp, p_flag; - u32 sid; - struct tcc_ensemble *esmbl; - struct tcc_service *svc; - - esmbl = &parser->esmbl_start; - while (fig_len > 0) { - if (esmbl->num_svc == NUM_SVC) - return FICERR_FIG0_2_FULL_SERVICEARRAY; - - if (!fig_buff) - return FICERR_FIG0_2_INVALID_LENGTH; - - fig_buff = fig0_ext02_sid(parser, fig_buff, &fig_len, &sid); - fig_buff = fig0_ext02_check_num_comp( - parser, fig_buff, &num_comp); - if (fig_buff == NULL) - return FICERR_FIG0_2_INVALID_LENGTH; - - fig_buff = fig0_ext02_update_svc(parser, fig_buff, sid, &svc); - - if (num_comp == 0) - goto cont_while; - - p_flag = 0; - for (k = 0; k < num_comp; k++) { - if (esmbl->num_svc_comp == NUM_SVC_COMP) - return FICERR_FIG0_2_FULL_SRVCOMPARRAY; - - fig_buff = fig0_ext02_update_svc_comp( - parser, fig_buff, sid, &p_flag, svc); - fig_len -= 2; - } -cont_while: - fig_len -= 1; - } - - if (fig_len < 0) - return FICERR_FIG0_2_INVALID_LENGTH; - - return ret; -} - -/******************************************************************** -* Function: Parsing FIG 0/3 -* Service Component Field in Packet Mode -* ETSI EN 300401 V010401p Figure 26 -*********************************************************************/ -s32 fig0_ext03(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - u8 i; - u16 scid = 0xffff; - struct tcc_ensemble *esmbl; - struct tcc_service_comp *svc_comp_start; - - u8 ca_org_flag = 0xff, dg_mf_flag = 0xff; - u8 ascty_dscty = 0xff, fidc_id = 0xff; - u16 pack_add = 0xffff, ca_org = 0xffff; - - esmbl = &parser->esmbl_start; - svc_comp_start = parser->svc_comp_start; - - if (svc_comp_start == 0) - return FICERR_FIG0_3_NO_SRVCOMPARRAY; - - if (esmbl->num_svc_comp == 0) - return FICERR_FIG0_3_NOTREADY_SRVCOMP1; - - while (fig_len > 0) { - scid = (u16)(*fig_buff++) << 4; - /* Service Component Identifier (b15~b4) */ - scid |= (*fig_buff & 0xf0) >> 4; - /* b0, 0: ca_org field absent, 1: ca_org field present */ - ca_org_flag = (*fig_buff++ & 0x01); - /* b7, 1: data groups are not used to transport - * the service component */ - dg_mf_flag = (*fig_buff & 0x80) >> 7; - /* b5-b0, Data Service Component Type */ - ascty_dscty = (*fig_buff++ & 0x3f); - /* b15-b10, Sub-channel Identifier */ - fidc_id = (*fig_buff & 0xfc) >> 2; - pack_add = (u16)(*fig_buff++ & 0x03) << 8; - /* b9-b0, Packet address */ - pack_add |= (*fig_buff++); - fig_len -= 5; - if (ca_org_flag) { - /* b15-b0, Conditional Access Organization */ - ca_org = (u16)(*fig_buff++) << 8; - ca_org |= (u16)(*fig_buff++); - fig_len -= 2; - } - for (i = 0; i < esmbl->num_svc_comp; i++) { - svc_comp_start = parser->svc_comp_start + i; - if (scid == svc_comp_start->scid) { - svc_comp_start->ca_org_flag = ca_org_flag; - svc_comp_start->dg_mf_flag = dg_mf_flag; - svc_comp_start->ascty_dscty = ascty_dscty; - svc_comp_start->fidc_id = fidc_id; - svc_comp_start->pack_add = pack_add; - if (ca_org_flag) - svc_comp_start->ca_org = ca_org; - } - } - } - if (fig_len < 0) - return FICERR_FIG0_3_INVALID_LENGTH; - return FICERR_SUCCESS; -} - -/******************************************************************** -* Function: Parsing FIG 0/4 -* Service Component Field in Stream Mode or -* FIC ETSI EN 300401 v010401p Figure 27 -*********************************************************************/ -s32 fig0_ext04(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - u8 i = 0; - u8 flag, id; - struct tcc_ensemble *esmbl; - struct tcc_service_comp *svc_comp_start; - - esmbl = &parser->esmbl_start; - svc_comp_start = parser->svc_comp_start; - - if (svc_comp_start == 0) - return FICERR_FIG0_4_NO_SRVCOMPARRAY; - - while (fig_len > 0) { - /* b6, 0: MSC and subch_id, 1: FIC and FIDCId */ - flag = (*fig_buff & 0x40) ? 1 : 0; - /* b5-b0, subch_id or FIDCId */ - id = (*fig_buff++ & 0x3f); - - for (i = 0; i < esmbl->num_svc_comp; i++) { - svc_comp_start = parser->svc_comp_start + i; - if (id == svc_comp_start->fidc_id) { - if (svc_comp_start->ca_org != 0xffff) - return FICERR_FIG0_4_ALREADY_CA_FIELD; - else - break; - } - } - - if (i >= esmbl->num_svc_comp) - return FICERR_FIG0_4_NOTREADY_SRVCOMP; - - svc_comp_start = parser->svc_comp_start + i; - svc_comp_start->dg_mf_flag = flag; - svc_comp_start->fidc_id = id; - svc_comp_start->ca_org = (u16)(*fig_buff++) << 8; - /* b15-b0: Conditional Access Organization */ - svc_comp_start->ca_org |= (u16)(*fig_buff++); - fig_len -= 3; - } - - if (fig_len < 0) - return FICERR_FIG0_4_INVALID_LENGTH; - - return FICERR_SUCCESS; -} - -/******************************************************************** -* Function: Parsing FIG 0/5 -* Service Component Language Field ETSI EN 300401 v010401p Figure 45 -* Short form(LS=0) b7: LS flag, b6: MSC_FIC flag, b5-b0: subch_id_FIDCId, -* b7-b0: Language -* Long form(LS=1) b15: LS flag, b14-b12: Rfa, b11-b0: scid, b7-b0: Language -*********************************************************************/ -s32 fig0_ext05(struct fic_parser_matadata *parser, u8 *fig_buff, s32 fig_len) -{ - u16 id; - u8 i; - struct tcc_ensemble *esmbl; - struct tcc_service_comp *svc_comp_start; - - esmbl = &parser->esmbl_start; - svc_comp_start = parser->svc_comp_start; - - if (svc_comp_start == 0) - return FICERR_FIG0_5_NO_SRVCOMPARRAY; - - if (esmbl->num_svc == 0) - return FICERR_FIG0_5_NOTREADY_SERVICE; - - while (fig_len > 0) { - if (*fig_buff & 0x80) { - /* b7(LS) = 1: Long form Case */ - id = (*fig_buff++ & 0x0f) << 8; - /* b11-b0: scid Service Component Id */ - id |= (*fig_buff++); - fig_len -= 2; - for (i = 0; i < esmbl->num_svc_comp; i++) { - svc_comp_start = parser->svc_comp_start + i; - if (id == svc_comp_start->scid) - break; - } - } else { - /* b7(LS) = 0: Short form Case */ - /* b5-b0: subch_id/FIDCId is mixed*/ - id = (*fig_buff++ & 0x3f); - fig_len -= 1; - for (i = 0; i < esmbl->num_svc_comp; i++) { - svc_comp_start = parser->svc_comp_start + i; - if (id == svc_comp_start->fidc_id) - break; - } - } - - if (i == esmbl->num_svc_comp) - return FICERR_FIG0_5_NOTREADY_SRVCOMP; - - svc_comp_start = parser->svc_comp_start + i; - /* b7-b0: Language of the audio or data service component, - * TS 101 756 Tables 9 and 10 */ - svc_comp_start->lang = *fig_buff++; - fig_len -= 1; - } - if (fig_len < 0) - return FICERR_FIG0_5_INVALID_LENGTH; - - return FICERR_SUCCESS; -} - -/**************************************************************************** -* Function: Parsing FIG 0/7 -* Data Service Component Type extension -* There is not FIG 0/7 in ETSI EN 300401 not yet. -*****************************************************************************/ -s32 fig0_ext07(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - u8 tmid, num, i, k; - u16 id, extdscty; - struct tcc_ensemble *esmbl; - struct tcc_service_comp *svc_comp_start; - - esmbl = &parser->esmbl_start; - svc_comp_start = parser->svc_comp_start; - - tmid = (*fig_buff & 0x30) >> 4; - num = (*fig_buff++ & 0x0f); - for (k = 0; k < num; k++) { - switch (tmid) { - case 0: - return FICERR_FIG0_7_RETURN; - case 1: - case 2: - /* MSC stream/FIDC */ - id = (*fig_buff & 0xfc) >> 2; - extdscty = (u16)(*fig_buff & 0x03) << 8; - extdscty |= (*fig_buff++); - fig_len -= 2; - for (i = 0; i < esmbl->num_svc_comp; i++) { - svc_comp_start = parser->svc_comp_start + i; - if (tmid == svc_comp_start->tmid && - id == svc_comp_start->fidc_id) - break; - } - break; - - case 3: - id = (u16)(*fig_buff & 0x3f) << 6; - id |= (*fig_buff++ & 0xfc) >> 2; - extdscty = (u16)(*fig_buff & 0x03) << 8; - extdscty |= (*fig_buff++); - fig_len -= 3; - for (i = 0; i < esmbl->num_svc_comp; i++) { - svc_comp_start = parser->svc_comp_start + i; - if (tmid == svc_comp_start->tmid && - id == svc_comp_start->scid) - break; - } - break; - default: - break; - } - } - return FICERR_SUCCESS; -} - -/******************************************************************** -* Function: Parsing FIG 0/8 -* Service Component Global Definition Field EN 300401 V010401p Figure 28 -*********************************************************************/ -s32 fig0_ext08(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - s32 ret = FICERR_SUCCESS; - u8 i; - u8 ls_flag = 0xff, ext_flag = 0xff; - u8 scids = 0xff, subch_id = 0xff; - u32 sid = 0xffffffff; - u16 scid = 0xffff; - s32 is_fic_db = 0; - s32 is_fic = 0; - struct tcc_ensemble *esmbl; - struct tcc_service_comp *svc_comp_start; - - esmbl = &parser->esmbl_start; - svc_comp_start = parser->svc_comp_start; - - if (svc_comp_start == 0) - return FICERR_FIG0_8_NO_SRVCOMPARRAY; - - while (fig_len > 0) { - /* PD from FIG0 Header PD=1: 32bit sid */ - if (parser->fig_pd == 1) { - /* b32-b0: sid(Service Identifier) */ - sid = (u32)(*fig_buff++ << 24); - sid |= (u32)(*fig_buff++ << 16); - sid |= (u32)(*fig_buff++ << 8); - sid |= (u32)(*fig_buff++); - fig_len -= 4; - } else { - /* PD from FIG0 Header PD=0: 16bit sid */ - sid = (u32)(*fig_buff++ << 8); - /* b15-b0: sid(Service Identifier) */ - sid |= (u32)(*fig_buff++); - fig_len -= 2; - } - - /* b7: Ext.flag(extension Flag) - * 0: Rfa field absent, 1: Rfa field present */ - ext_flag = (*fig_buff & 0x80); - /* b3-b0: - * scids(Service Component Identifier within the Service) */ - scids = (*fig_buff++ & 0x0f); - /* b7: LS flag(Long form or Short form), - * 1: Long form 0: Short form */ - ls_flag = (*fig_buff & 0x80); - - if (ls_flag) { - /* Long form case */ - scid = (*fig_buff++ & 0x0f) << 8; - /* b11-b0: scid(Service Component Identifier) */ - scid |= (*fig_buff++); - fig_len -= 3; - } else { - /* Short form case */ - /* b6: MSC_FIC flag 0: MSC_subch_id 1: FIC_FIDCId */ - is_fic = ((*fig_buff) >> 6) & 1; - /* b5-b0: subch_id or FIDCId */ - subch_id = (*fig_buff++ & 0x3f); - fig_len -= 2; - } - - - if (ext_flag) { - fig_buff++; - fig_len -= 1; - } - - for (i = 0; i < esmbl->num_svc_comp; i++) { - svc_comp_start = parser->svc_comp_start + i; - if (sid != svc_comp_start->sid) - continue; - - if (ls_flag && scid == svc_comp_start->scid) { - svc_comp_start->scids = scids; - break; - } else { - is_fic_db = (svc_comp_start->tmid == 2) ? 1 : 0; - if ((is_fic_db == is_fic) && - (subch_id == svc_comp_start->fidc_id)) { - svc_comp_start->scids = scids; - break; - } - } - } - } - if (fig_len < 0) - ret = FICERR_FIG0_8_INVALID_LENGTH; - return ret; -} - -/******************************************************************** -* Function: Parsing FIG 0/13 -* User Application Field EN 300401 v010401p Figure68 -*********************************************************************/ -s32 fig0_ext13(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - u32 i, k; - u32 sid; - u8 scids; - struct tcc_ensemble *esmbl; - struct tcc_user_app_types *usrapp_start; - - esmbl = &parser->esmbl_start; - usrapp_start = parser->user_app_start; - - if (usrapp_start == 0) - return FICERR_FIG0_13_NO_USERAPPLARRAY; - - while (fig_len > 0) { - if (esmbl->num_user_app == NUM_USER_APP) - return FICERR_FIG0_13_FULL_USERAPPLARRAY; - - /* PD from FIG0 Header PD=1: 32bit sid */ - if (parser->fig_pd == 1) { - sid = (u32)(*fig_buff++ << 24); - sid |= (u32)(*fig_buff++ << 16); - sid |= (u32)(*fig_buff++ << 8); - sid |= (u32)(*fig_buff++); - fig_len -= 4; - } else { - /* PD from FIG0 Header PD=0: 16bit sid */ - sid = (u32)(*fig_buff++ << 8); - /*b15-b0: sid(16bit) */ - sid |= (u32)(*fig_buff++); - fig_len -= 2; - } - - /* b7-b4: - * scids(Service Component Identifier within the Service) */ - scids = (*fig_buff & 0xf0) >> 4; - - for (i = 0; i < esmbl->num_user_app; i++) { - usrapp_start = parser->user_app_start + i; - if (sid == usrapp_start->sid && - scids == usrapp_start->scids) { - return FICERR_FIG0_13_ALREADY_USERAPPL; - } - } - usrapp_start = parser->user_app_start + i; - - /* b3-b0: No. of User Applications */ - usrapp_start->num_app = (*fig_buff++ & 0x0f); - if (usrapp_start->num_app > 6) { - usrapp_start->num_app = 0; - return FICERR_FIG0_13_INVALID_LENGTH; - } - fig_len -= 1; - - for (i = 0; i < usrapp_start->num_app; i++) { - struct tcc_user_app_type *ua = - &usrapp_start->app_type[i]; - ua->type = (*fig_buff++) << 3; - /*b15-b5: User Application Type */ - ua->type += ((*fig_buff & 0xe0) >> 5); - /*b4-b0: User Application data length in bytes */ - ua->len = (*fig_buff++ & 0x1f); - if (ua->len > 23) { - ua->len = 0; - return FICERR_FIG0_13_INVALID_LENGTH; - } - - for (k = 0; k < ua->len; k++) - ua->data[k] = *fig_buff++; - fig_len -= (2 + ua->len); - } - - usrapp_start->sid = sid; - usrapp_start->scids = scids; - - esmbl->num_user_app++; - } - - if (fig_len < 0) - return FICERR_FIG0_13_INVALID_LENGTH; - - return FICERR_SUCCESS; -} - -/******************************************************************** -* Function: Parsing FIG 0/17 -* Programme Type Field EN 300401 V010401p Figure49 -* Input : ucOffset is the point of buffer being processed and length -* Return : return the start point of next FIG -*********************************************************************/ -s32 fig0_ext17(struct fic_parser_matadata *parser, - u8 *fig_buff, s32 fig_len) -{ - s32 ret = FICERR_SUCCESS; - u8 i, k; - u8 lang_flag, cc_flag, end_flag; - u16 sid; - u8 sd, ps; - struct tcc_ensemble *esmbl; - struct tcc_program_type *prg_start; - - esmbl = &parser->esmbl_start; - prg_start = parser->prg_start; - - if (prg_start == 0x00) { - ret = FICERR_FIG0_17_NO_PROGTYPEARRAY; - return ret; - } - - if (parser->fig_oe0) { - ret = FICERR_FIG0_17_OTHER_ENSEMBLE; - return ret; - } - - while (fig_len > 0) { - if (esmbl->num_prg_type == NUM_PRG_TYPE) { - ret = FICERR_FIG0_17_FULL_PROGTYPEARRAY; - return ret; - } - sid = (*fig_buff++) << 8; - /*b15-b0: sid */ - sid |= *fig_buff++; - /*b7:SD(Static or Dynamic) 1: - * represent the current programme contents */ - sd = (*fig_buff & 0x80) ? 1 : 0; - /*b6: PS(Primary or Secondary) 0: - * Primary Service Component 1: Secondary */ - ps = (*fig_buff & 0x40) ? 1 : 0; - /* for making End condition */ - end_flag = 0; - for (k = 0; k < esmbl->num_prg_type; k++) { - prg_start = parser->prg_start + k; - if (sid == prg_start->sid && - sd == prg_start->sd && - ps == prg_start->ps) { - end_flag = 1; - break; - } - } - fig_len -= 2; - if (end_flag) - prg_start = parser->prg_start + k; - else - prg_start = parser->prg_start + - esmbl->num_prg_type; - - prg_start->sid = sid; - prg_start->sd = sd; - prg_start->ps = ps; - /*b5: Language flag, 0: language field absent */ - lang_flag = (*fig_buff & 0x20) ? 1 : 0; - /*b4: Complementary Code flag, 1: - * CC, preceding Rfa and Rfu fields present */ - cc_flag = (*fig_buff & 0x10) ? 1 : 0; - /* This field is strange things */ - prg_start->nfc = (*fig_buff++ & 0x0f); - fig_len -= 1; - if (lang_flag) { - fig_len -= 1; - prg_start->lang = *fig_buff++; - } - - /*b4-b0: International Code */ - prg_start->i18n_code = (*fig_buff++ & 0x1f); - fig_len -= 1; - if (cc_flag) { - prg_start->coarse_code = (*fig_buff++); - fig_len -= 1; - } - - for (i = 0; i < prg_start->nfc; i++) { - prg_start->fine_code = *fig_buff++; - fig_len -= 1; - } - if (!end_flag) - esmbl->num_prg_type++; - } - if (fig_len < 0) - ret = FICERR_FIG0_17_INVALID_LENGTH; - return ret; -} diff --git a/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_fig1.c b/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_fig1.c deleted file mode 100644 index d2653fa..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcc_fic_decoder/tcc_fic_fig1.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * tcc_fic_fig1.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcc_fic_decoder.h" - -static u8 *fig_put_in_label(u8 *label, u8 *fig_buff) -{ - u8 m; - - for (m = 0; m < 16; m++) - *label++ = *fig_buff++; - label--; - for (; *label == 0x20 || *label == 0; label--) - *label = 0; - - return fig_buff; -} - -s32 fig1_ext00(struct fic_parser_matadata *fic_info, - u8 *fig_buff, - s32 length, - u8 charset) -{ - s32 ret = FICERR_SUCCESS; - u16 tmp; - struct tcc_ensemble *ensmbl; - - ensmbl = &fic_info->esmbl_start; - - tmp = (*fig_buff++) << 8; - tmp |= (*fig_buff++); - - ensmbl->charset = charset; - fig_buff = fig_put_in_label(ensmbl->label, fig_buff); - ensmbl->char_flag = (*fig_buff++)<<8; - ensmbl->char_flag |= *fig_buff; - - return ret; -} - -/* - * Program sService label - */ -s32 fig1_ext01(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 length, u8 charset) -{ - s32 ret = FICERR_SUCCESS; - u16 sid; - u8 i; - struct tcc_ensemble *ensmbl; - struct tcc_service *svc_start; - - ensmbl = &fic_info->esmbl_start; - svc_start = fic_info->svc_start; - - if (svc_start == 0) - return FICERR_FIG1_1_NO_SERVICEARRAY; - - sid = (*fig_buff++) << 8; - sid |= (*fig_buff++); - for (i = 0; i < ensmbl->num_svc; i++) { - svc_start = fic_info->svc_start + i; - if (sid == svc_start->sid) - break; - } - - if (i == ensmbl->num_svc) { - ret = FICERR_FIG1_1_NOTREADY_SERVICE; - return ret; - } - - svc_start->charset = charset; - fig_buff = fig_put_in_label(svc_start->svc_label, fig_buff); - svc_start->char_flag = (*fig_buff++)<<8; - svc_start->char_flag |= *fig_buff; - - return ret; -} - -/* - * sService Component label - */ -s32 fig1_ext04(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 length, u8 charset) -{ - s32 ret = FICERR_SUCCESS; - u32 sid; - u8 i, scids, pd; - struct tcc_service_comp *svc_comp_start; - struct tcc_ensemble *ensmbl; - - ensmbl = &fic_info->esmbl_start; - svc_comp_start = fic_info->svc_comp_start; - - if (svc_comp_start == 0) - return FICERR_FIG1_4_NO_SRVCOMPARRAY; - - /* If no service informaion, return */ - if (ensmbl->num_svc_comp == 0) { - ret = FICERR_FIG1_4_NOTREADY_SRVCOMP; - return ret; - } - - pd = (*fig_buff & 0x80) ? 1 : 0; - scids = *fig_buff++ & 0x0f; - if (pd) { - sid = (u32)(*fig_buff++ << 24); - sid |= (u32)(*fig_buff++ << 16); - sid |= (u32)(*fig_buff++ << 8); - sid |= (u32)(*fig_buff++); - } else { - sid = (u32)(*fig_buff++ << 8); - sid |= (u32)(*fig_buff++); - } - - for (i = 0; i < ensmbl->num_svc_comp; i++) { - svc_comp_start = fic_info->svc_comp_start + i; - if (scids == svc_comp_start->scids && - sid == svc_comp_start->sid) - break; - } - if (i == ensmbl->num_svc_comp) { - ret = FICERR_FIG1_4_NOTREADY_SRVCOMP1; - return ret; - } - - svc_comp_start->charset = charset; - fig_buff = fig_put_in_label(svc_comp_start->label, fig_buff); - - svc_comp_start->char_flag = (*fig_buff++) << 8; - svc_comp_start->char_flag |= *fig_buff; - - return ret; -} - -/* - * Data sService label - */ -s32 fig1_ext05(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 length, u8 charset) -{ - s32 ret = FICERR_SUCCESS; - u32 sid; - u32 j; - struct tcc_ensemble *ensmbl; - struct tcc_service *svc_start; - - ensmbl = &fic_info->esmbl_start; - svc_start = fic_info->svc_start; - - if (svc_start == 0) - return FICERR_FIG1_5_NO_SERVICEARRAY; - - sid = (*fig_buff++) << 24; - sid |= (*fig_buff++) << 16; - sid |= (*fig_buff++) << 8; - sid |= (*fig_buff++); - for (j = 0; j < ensmbl->num_svc; j++) { - svc_start = fic_info->svc_start + j; - if (sid == svc_start->sid) - break; - } - - if (j == ensmbl->num_svc) { - ret = FICERR_FIG1_5_NOTREADY_SERVICE; - return ret; - } - - svc_start->charset = charset; - fig_buff = fig_put_in_label(svc_start->svc_label, fig_buff); - svc_start->char_flag = (*fig_buff++) << 8; - svc_start->char_flag |= *fig_buff; - - return ret; -} - -s32 fig1_ext06(struct fic_parser_matadata *fic_info, - u8 *fig_buff, s32 length, u8 charset) -{ - s32 ret = FICERR_SUCCESS; - s32 p_d; - u32 sid; - u8 scids; - u8 xpad_appl_type; - s32 i, empty_idx; - - struct tcc_ensemble *ensmbl; - struct tcc_xpad_user_app *user_app_start; - - ensmbl = &fic_info->esmbl_start; - user_app_start = fic_info->fig1_6_start; - - if (user_app_start == 0) - return FICERR_FIG1_6_NO_XPADLABELARRAY; - - p_d = fig_buff[0] >> 7; - scids = fig_buff[0] & 0x0f; - fig_buff++; - if (p_d) { - sid = (fig_buff[0] << 24) | (fig_buff[1] << 16) | - (fig_buff[2] << 8) | fig_buff[3]; - fig_buff += 4; - } else { - sid = (fig_buff[0] << 8) | fig_buff[1]; - fig_buff += 2; - } - xpad_appl_type = fig_buff[0] & 0x1f; - fig_buff++; - - empty_idx = -1; - - for (i = 0; i < NUM_USER_APP; i++) { - if (user_app_start[i].sid == sid && - user_app_start[i].scids == scids && - user_app_start[i].type == xpad_appl_type) { - empty_idx = i; - break; - } - if (empty_idx == -1 && user_app_start[i].sid == 0) - empty_idx = i; - } - - if (empty_idx != -1) { - user_app_start[empty_idx].sid = sid; - user_app_start[empty_idx].scids = scids; - user_app_start[empty_idx].charset = charset; - user_app_start[empty_idx].type = xpad_appl_type; - fig_buff = fig_put_in_label( - user_app_start[empty_idx].label, fig_buff); - user_app_start[empty_idx].char_flag = (*fig_buff++) << 8; - user_app_start[empty_idx].char_flag |= *fig_buff; - } - - return ret; -} diff --git a/drivers/media/tdmb/tcc3170/src/tcpal_linux/Makefile b/drivers/media/tdmb/tcc3170/src/tcpal_linux/Makefile deleted file mode 100644 index 70efca8..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcpal_linux/Makefile +++ /dev/null @@ -1,15 +0,0 @@ - -obj-y += tcpal_irq_handler.o -obj-y += tcpal_debug.o -obj-y += tcpal_queue.o -obj-y += tcpal_linux.o -obj-y += tcpal_io_cspi.o -obj-y += tcpal_io_i2c.o - -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcpal -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcbd_diagnosis -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcbd_stream_parser -ccflags-y += -Idrivers/media/tdmb/tcc3170/inc/tcc_fic_decoder - -ccflags-y += -Idrivers/media/tdmb/ diff --git a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_debug.c b/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_debug.c deleted file mode 100644 index abe8ca7..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_debug.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * tcpal_debug.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -static s32 tcbd_spur_dbg; - -static s32 tcbd_spur_clock_config[5] = {0x60, 0x00, 0x0F, 0x02, 76800}; -static s32 clock_config_count = 5; - -static s32 tcbd_rom_from_fs; -static char *tcbd_rom_path = "/tmp/tcc3170.rom"; - -static u32 tcbd_mbox_rx[9] = {0, }; -static u32 tcbd_mbox_tx[9*10] = {0, }; - -static s32 mbox_rx_data_len = 9; -static s32 mbox_tx_data_len = 9*10; - -module_param(tcbd_rom_from_fs, int, 0664); -module_param(tcbd_rom_path, charp, 0664); -module_param(tcbd_spur_dbg, int, 0664); -module_param_array(tcbd_spur_clock_config, int, &clock_config_count, 0664); -module_param_array(tcbd_mbox_rx, int, &mbox_rx_data_len, 0664); -module_param_array(tcbd_mbox_tx, int, &mbox_tx_data_len, 0664); - -void tcbd_debug_mbox_rx(u16 *_cmd, s32 *_cnt, u32 **_data) -{ - *_cmd = tcbd_mbox_rx[0]; - *_cnt = tcbd_mbox_rx[1]; - *_data = &tcbd_mbox_rx[2]; -} - -void tcbd_debug_mbox_tx(u16 *_cmd, s32 *_cnt, u32 **_data) -{ - s32 i; - - for (i = 0; i < 10; i++) { - if (tcbd_mbox_tx[i * 9] != *_cmd) - continue; - *_cmd = tcbd_mbox_tx[i * 9 + 0]; - *_cnt = tcbd_mbox_tx[i * 9 + 1]; - *_data = &tcbd_mbox_tx[i * 9 + 2]; - break; - } -} - -s32 tcbd_debug_spur_dbg(void) -{ - return tcbd_spur_dbg; -} - -s32 tcbd_debug_rom_from_fs(void) -{ - return tcbd_rom_from_fs; -} - -s32 *tcbd_debug_spur_clk_cfg(void) -{ - return tcbd_spur_clock_config; -} - -char *tcbd_debug_rom_path(void) -{ - return tcbd_rom_path; -} - -u32 tcbd_debug_class = - DEBUG_API_COMMON | - /*DEBUG_DRV_PERI | */ - /*DEBUG_DRV_IO | */ - /*DEBUG_DRV_COMP | */ - /*DEBUG_DRV_RF | */ - /*DEBUG_TCPAL_OS | */ - /*DEBUG_TCPAL_CSPI | */ - /*DEBUG_TCPAL_I2C | */ - /*DEBUG_TCHAL | */ - /*DEBUG_STREAM_READ | */ - /*DEBUG_STREAM_PARSER |*/ - /*DEBUG_PARSING_PROC | */ - /*DEBUG_INTRRUPT | */ - DEBUG_INFO | - DEBUG_ERROR; - -module_param(tcbd_debug_class, int, 0664); - diff --git a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_io_cspi.c b/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_io_cspi.c deleted file mode 100644 index b9ec89d..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_io_cspi.c +++ /dev/null @@ -1,492 +0,0 @@ -/* - * tcpal_io_cspi.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_api_common.h" -#include "tcbd_drv_io.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "tcbd_hal.h" - -#define SPICMD_VALID_BITS 36 -#define SPICMD_BUFF_LEN 8 -#define SPICMD_ACK 0x47 - -#define SPI_SPEED_HZ 10000000 -#define SPI_BITS_PER_WORD 8 - -#define DMA_MAX_SIZE (2048) - -#define CSPI_READ 0 -#define CSPI_WRITE 1 - -#define CONTINUOUS_MODE 0 -#define FIXED_MODE 1 - -#if defined(__CSPI_ONLY__) - -struct tcpal_cspi_data { - spinlock_t spin_lock; - u8 buff_dummy[DMA_MAX_SIZE+(SPICMD_BUFF_LEN*2)+1]; - u8 buff_rw[DMA_MAX_SIZE+(SPICMD_BUFF_LEN*2)+1]; - u8 buff_init_cmd[SPICMD_BUFF_LEN]; /*Set all bit to 1*/ - struct spi_device *spi_dev; -}; - -static struct tcbd_io_data *tcbd_cspi_io_funcs; -static struct tcpal_cspi_data tcpal_cspi_io_data; - -static u8 tcpal_calc_crc8(u8 *data, s32 len) -{ - u16 masking, carry; - u16 crc; - u32 i, loop, remain; - - crc = 0x0000; - loop = len / 8; - remain = len - loop * 8; - - for (i = 0; i < loop; i++) { - masking = 1 << 8; - while ((masking >>= 1)) { - carry = crc & 0x40; - crc <<= 1; - if ((!carry) ^ (!(*data & masking))) - crc ^= 0x9; - crc &= 0x7f; - } - data++; - } - - masking = 1 << 8; - while (remain) { - carry = crc & 0x40; - crc <<= 1; - masking >>= 1; - if ((!carry) ^ (!(*data & masking))) - crc ^= 0x9; - crc &= 0x7f; - remain--; - } - - return (u8) crc; -} - - -#if defined(__USE_TC_CPU__) -static struct spi_device *tcpal_find_cspi_device(void) -{ - struct spi_master *spi_master; - struct spi_device *spi_device; - struct device *pdev; - s8 buff[64]; - - spi_master = spi_busnum_to_master(0); - if (!spi_master) { - tcbd_debug(DEBUG_ERROR, - "spi_busnum_to_master(%d) returned NULL\n", 0); - return NULL; - } - - spi_device = spi_alloc_device(spi_master); - if (!spi_device) { - put_device(&spi_master->dev); - tcbd_debug(DEBUG_TCPAL_CSPI, - "spi_alloc_device() failed\n"); - return NULL; - } - - /* specify a chip select line */ - spi_device->chip_select = 0; - - snprintf(buff, sizeof(buff), "%s.%u", - dev_name(&spi_device->master->dev), - spi_device->chip_select); - - pdev = bus_find_device_by_name(spi_device->dev.bus, NULL, buff); - if (pdev) - tcbd_debug(DEBUG_TCPAL_CSPI, "spi_device :0x%X\n", - (u32)spi_device); - put_device(&spi_master->dev); - return spi_device; -} -#endif /*__USE_TC_CPU__*/ - -static s32 tcpal_cspi_close(void) -{ -#ifdef __USE_TC_CPU__ - struct tcpal_cspi_data *spi_data = &tcpal_cspi_io_data; - spi_tcc_close(spi_data->spi_dev); - spi_dev_put(spi_data->spi_dev); - spi_data->spi_dev = NULL; -#endif - - tcbd_debug(DEBUG_TCPAL_CSPI, "\n"); - return 0; -} - -static s32 tcpal_cspi_open(void) -{ - s32 ret = 0; - struct tcpal_cspi_data *spi_data = &tcpal_cspi_io_data; - - memset(&tcpal_cspi_io_data, 0, sizeof(tcpal_cspi_io_data)); - memset(spi_data->buff_init_cmd, 0xFF, SPICMD_BUFF_LEN); - -#ifdef __USE_TC_CPU__ - spi_data->spi_dev = tcpal_find_cspi_device(); - - if (spi_data->spi_dev) { - ret = spi_tcc_open(spi_data->spi_dev); - if (ret < 0) - goto cspi_init_fail; - spi_data->spi_dev->mode = SPI_MODE_0; - spi_data->spi_dev->bits_per_word = SPI_BITS_PER_WORD; - spi_data->spi_dev->max_speed_hz = SPI_SPEED_HZ; - ret = spi_setup(spi_data->spi_dev); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, - "spi_setup failed :%d\n", ret); - goto cspi_init_fail; - } - } -#else - spi_data->spi_dev = spi_dmb; -#endif /*__USE_TC_CPU__*/ - - tcbd_debug(DEBUG_TCPAL_CSPI, "\n"); - return 0; - -cspi_init_fail: - return -1; -} - -static inline s32 tcpal_cspi_write_and_read( - u8 *_buffin, - u8 *_buffout, - u32 _length) -{ - struct spi_transfer xfer = {0, }; - struct spi_message msg; - s32 ret = 0; - struct tcpal_cspi_data *spi_data = &tcpal_cspi_io_data; - - if (!spi_data->spi_dev || !_length) - return -EFAULT; - if (!_buffin && !_buffout) - return -EFAULT; - - xfer.tx_buf = _buffin; - xfer.rx_buf = _buffout; - xfer.len = _length; -/* xfer.speed_hz = SPI_SPEED_HZ; */ -/* xfer.bits_per_word = SPI_BITS_PER_WORD; */ - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - - ret = spi_sync(spi_data->spi_dev, &msg); - - if (ret < 0) - return -TCERR_OS_DRIVER_FAIL; - - return 0; -} - -static inline s32 tcpal_cspi_single_io( - u8 _write_flag, - u16 _reg_addr, - u8 *_data) -{ - s32 ret = 0; - u8 buffer[SPICMD_BUFF_LEN+1]; - u8 buffout[SPICMD_BUFF_LEN+1]; - u8 crc; - - /* start bit(1) + chip_id(7) */ - buffer[0] = tcbd_cspi_io_funcs->chip_addr; - /* mode(1) + rw(1) + fix(1) + addr(5) */ - buffer[1] = (0 << 7) | (_write_flag << 6) | (1 << 5) | - ((_reg_addr & 0x7c0) >> 6); - /* addr(6bit) + NULL(2bit) */ - buffer[2] = (_reg_addr & 0x03f) << 2 | 0x0; - - if (_write_flag) - buffer[3] = _data[0]; /* write */ - else - buffer[3] = 0x0; /* null(8) */ - - buffer[4] = 0x00; - - crc = tcpal_calc_crc8(buffer, 36); - buffer[4] = 0x00 | ((crc & 0x7f) >> 3); /* null(4) + crc(4) */ - buffer[5] = ((crc & 0x07) << 5) | 0x0f; /* crc(3) + end bit(5) */ - buffer[6] = 0xff; - buffer[7] = 0xff; - - ret = tcpal_cspi_write_and_read(buffer, buffout, SPICMD_BUFF_LEN); - if (ret < 0) - return ret; - - if (buffout[7] != SPICMD_ACK) { /* ack */ - tcbd_debug(DEBUG_ERROR, - "# Single %s ACK error chip_addr:0x%X, regAddr:0x%X\n", - _write_flag ? "Write" : "Read", - tcbd_cspi_io_funcs->chip_addr, _reg_addr); - tcbd_debug(DEBUG_ERROR, - "# [%02x][%02x][%02x][%02x][%02x]" - "[%02x][%02x][%02x]//[%02x][%02x][%02x]\n", - buffer[0], buffer[1], buffer[2], - buffer[3], buffer[4], buffer[5], - buffer[6], buffer[7], - buffout[6], buffout[7], buffout[8]); - return -TCERR_ACK_FAIL; - } - - if (_write_flag == 0) - *_data = buffout[6]; - - return 0; -} - -static inline s32 tcpal_cspi_burst_io( - u8 _write_flag, - u16 _reg_addr, - u8 *_data, - s32 _size, - u8 _fixedMode) -{ - s32 ret = 0; - struct tcpal_cspi_data *spi_data = &tcpal_cspi_io_data; - u8 crc; - u8 *buffer; - u8 *buffout; - - if (_write_flag == 0) { - buffer = spi_data->buff_dummy; - buffout = spi_data->buff_rw; - } else { - memcpy(spi_data->buff_rw+SPICMD_BUFF_LEN, _data, _size); - buffer = spi_data->buff_rw; - buffout = spi_data->buff_dummy; - } - memset(buffer+SPICMD_BUFF_LEN+_size, 0xFF, SPICMD_BUFF_LEN); - - if (_size > DMA_MAX_SIZE) - return -TCERR_INVALID_ARG; - - /* MAX 16KB (Output buffer max size 7KB) (LENGTH + 1 Byte) */ - _size--; - - /* start bit(1) + chip_id(7) */ - buffer[0] = tcbd_cspi_io_funcs->chip_addr; - /* mode(1) + rw(1) + fix(1) + addr(5) */ - buffer[1] = 1 << 7 | _write_flag << 6 | _fixedMode << 5 | - ((_reg_addr & 0x7c0) >> 6); - /* addr(6bit) + length(2bit) */ - buffer[2] = (_reg_addr & 0x03f) << 2 | ((_size & 0x3000) >> 12); - /* length(8bit) */ - buffer[3] = (_size & 0xff0) >> 4; - - buffer[4] = (_size & 0xf) << 4; - crc = tcpal_calc_crc8(buffer, 36); - /* length(4) + crc(4) */ - buffer[4] = ((_size & 0xf) << 4) | ((crc & 0x7f) >> 3); - /* crc(3) + end bit(5) */ - buffer[5] = ((crc & 0x07) << 5) | 0x0f; - buffer[6] = 0xff; - buffer[7] = 0xff; - - _size++; - - ret = tcpal_cspi_write_and_read( - buffer, buffout, _size+SPICMD_BUFF_LEN*2); - if (ret < 0) - return ret; - - if (buffout[7] != SPICMD_ACK) {/* ack */ - tcbd_debug(DEBUG_ERROR, - "# Burst %s ACK error, chip_addr:0x%X, " - "reg_addr:0x%X, size:%d, mode:%d\n", - _write_flag ? "Write" : "Read", - tcbd_cspi_io_funcs->chip_addr, - _reg_addr, _size, _fixedMode); - tcbd_debug(DEBUG_ERROR, - "# [%02x][%02x][%02x][%02x][%02x]" - "[02%x][02%x][%02x]//[%02x][%02x][%02x]\n", - buffer[0], buffer[1], buffer[2], - buffer[3], buffer[4], buffer[5], - buffer[6], buffer[7], - buffout[6], buffout[7], buffout[8]); - return -TCERR_ACK_FAIL; - } - - if (_write_flag == 0) - memcpy(_data, buffout + SPICMD_BUFF_LEN, _size); - - return 0; -} - -static inline s32 tcpal_cspi_reg_read_burst( - u8 _reg_addr, - u8 *_data, - s32 _size, - u8 mode) -{ - u32 i; - u32 cmax, cremain; - s32 ret; - - cmax = _size / DMA_MAX_SIZE; - cremain = _size % DMA_MAX_SIZE; - - for (i = 0; i < cmax; i++) { - ret = tcpal_cspi_burst_io( - CSPI_READ, - _reg_addr, - &_data[i * DMA_MAX_SIZE], - DMA_MAX_SIZE, - mode); - if (ret < 0) - return ret; - } - - if (cremain != 0) { - ret = tcpal_cspi_burst_io( - CSPI_READ, - _reg_addr, - &_data[i * DMA_MAX_SIZE], - cremain, - mode); - if (ret < 0) - return ret; - } - return 0; -} - -static inline s32 tcpal_cspi_reg_write_burst( - u8 _reg_addr, - u8 *_data, - s32 _size, - u8 mode) -{ - u32 i; - u32 cmax, cremain; - s32 ret; - - cmax = _size / DMA_MAX_SIZE; - cremain = _size % DMA_MAX_SIZE; - - for (i = 0; i < cmax; i++) { - ret = tcpal_cspi_burst_io( - CSPI_WRITE, - _reg_addr, - &_data[i * DMA_MAX_SIZE], - DMA_MAX_SIZE, - mode); - if (ret < 0) - return ret; - } - - if (cremain) { - ret = tcpal_cspi_burst_io( - CSPI_WRITE, - _reg_addr, - &_data[i * DMA_MAX_SIZE], - cremain, - mode); - if (ret < 0) - return ret; - } - - return 0; -} - -static s32 tcpal_cspi_reg_read(u8 _reg_addr, u8 *_data) -{ - return tcpal_cspi_single_io(CSPI_READ, _reg_addr, _data); -} - -static s32 tcpal_cspi_reg_write(u8 _reg_addr, u8 _data) -{ - return tcpal_cspi_single_io(CSPI_WRITE, _reg_addr, &_data); -} - -static s32 tcpal_cspi_reg_read_burst_cont( - u8 _reg_addr, u8 *_data, s32 _size) -{ - return tcpal_cspi_reg_read_burst( - _reg_addr, _data, _size, CONTINUOUS_MODE); -} - -static s32 tcpal_cspi_reg_write_burst_cont( - u8 _reg_addr, u8 *_data, s32 _size) -{ - return tcpal_cspi_reg_write_burst( - _reg_addr, _data, _size, CONTINUOUS_MODE); -} - -static s32 tcpal_cspi_reg_read_burst_fix( - u8 _reg_addr, u8 *_data, s32 _size) -{ - return tcpal_cspi_reg_read_burst( - _reg_addr, _data, _size, FIXED_MODE); -} - -static s32 tcpal_cspi_reg_write_burst_fix( - u8 _reg_addr, u8 *_data, s32 _size) -{ - return tcpal_cspi_reg_write_burst( - _reg_addr, _data, _size, FIXED_MODE); -} - -void tcpal_set_cspi_io_function(void) -{ - tcbd_cspi_io_funcs = tcbd_get_io_struct(); - - tcbd_cspi_io_funcs->open = tcpal_cspi_open; - tcbd_cspi_io_funcs->close = tcpal_cspi_close; - tcbd_cspi_io_funcs->reg_write = tcpal_cspi_reg_write; - tcbd_cspi_io_funcs->reg_read = tcpal_cspi_reg_read; - tcbd_cspi_io_funcs->reg_write_burst_cont = - tcpal_cspi_reg_write_burst_cont; - tcbd_cspi_io_funcs->reg_read_burst_cont = - tcpal_cspi_reg_read_burst_cont; - tcbd_cspi_io_funcs->reg_write_burst_fix = - tcpal_cspi_reg_write_burst_fix; - tcbd_cspi_io_funcs->reg_read_burst_fix = - tcpal_cspi_reg_read_burst_fix; -} -#endif /*__CSPI_ONLY__*/ diff --git a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_io_i2c.c b/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_io_i2c.c deleted file mode 100644 index 679c157..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_io_i2c.c +++ /dev/null @@ -1,309 +0,0 @@ -/* - * tcpal_io_i2c.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_api_common.h" -#include "tcbd_drv_io.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#define MAX_I2C_BURST 512 -#define Bit7 0x00000080 - -#define I2C_BUS 1 -#define I2C_ADDR (0xA0>>1) - -#if defined(__I2C_STS__) - -static u8 static_buffer_i2c[MAX_I2C_BURST+4]; -static struct i2c_client *tcpal_i2c_client; - -static const struct i2c_device_id tcpal_i2c_id[] = { - {"tc317x", 0}, -}; - -static s32 tcpal_i2c_probe( - struct i2c_client *i2c, const struct i2c_device_id *id) -{ - s32 ret = 0; - tcpal_i2c_client = i2c; - tcbd_debug(DEBUG_TCPAL_I2C, "tcpal_i2c_client : %p\n", i2c); - return ret; -} - -static s32 tcpal_i2c_remove(struct i2c_client *client) -{ - tcbd_debug(DEBUG_TCPAL_I2C, "tcpal_i2c_client : %p\n", client); - return 0; -} - -MODULE_DEVICE_TABLE(i2c, tcpal_i2c_id); - -static struct i2c_driver tcpal_i2c_driver = { - .driver = { - .name = "tc317x", - .owner = THIS_MODULE, - }, - .probe = tcpal_i2c_probe, - .remove = tcpal_i2c_remove, - .id_table = tcpal_i2c_id, -}; - -static s32 tcpal_i2c_add_device(void) -{ - s32 ret; - struct i2c_board_info info; - struct i2c_adapter *adapter; - struct i2c_client *client; - - ret = i2c_add_driver(&tcpal_i2c_driver); - if (ret < 0) { - tcbd_debug(DEBUG_TCPAL_I2C, "can't add i2c driver\n"); - return ret; - } - - memset(&info, 0, sizeof(struct i2c_board_info)); - info.addr = I2C_ADDR; - strlcpy(info.type, "tc317x", I2C_NAME_SIZE); - - adapter = i2c_get_adapter(I2C_BUS); - if (!adapter) { - tcbd_debug(DEBUG_TCPAL_I2C, - "can't get i2c adapter :%d\n", I2C_BUS); - goto err_driver; - } - - client = i2c_new_device(adapter, &info); - i2c_put_adapter(adapter); - if (!client) { - tcbd_debug(DEBUG_TCPAL_I2C, - "can't add i2c device at 0x%X\n", info.addr); - goto err_driver; - } - - return 0; - -err_driver: - i2c_del_driver(&tcpal_i2c_driver); - return -ENODEV; -} - -static s32 tcpal_i2c_close(void) -{ - i2c_unregister_device(tcpal_i2c_client); - i2c_del_driver(&tcpal_i2c_driver); - return 0; -} - -static s32 tcpal_i2c_open(void) -{ - return tcpal_i2c_add_device(); -} - -static s32 tcpal_i2c_reg_read( - u8 _reg_addr, u8 *_data) -{ - s32 ret = 0; - - if (!tcpal_i2c_client) - return -TCERR_OS_DRIVER_FAIL; - - ret = i2c_master_send(tcpal_i2c_client, &_reg_addr, 1); - ret |= i2c_master_recv(tcpal_i2c_client, _data, 1); - if (ret < 0) { - tcbd_debug(DEBUG_TCPAL_I2C, - "I2C read error %d\n", ret); - return -TCERR_OS_DRIVER_FAIL; - } - return 0; -} - -static s32 tcpal_i2c_reg_write(u8 _reg_addr, u8 _data) -{ - s32 ret = 0; - u8 buf[2]; - - if (!tcpal_i2c_client) - return -TCERR_OS_DRIVER_FAIL; - - buf[0] = _reg_addr; - buf[1] = _data; - - ret = i2c_master_send(tcpal_i2c_client, buf, 2); - - if (ret < 0) - return -TCERR_OS_DRIVER_FAIL; - - return 0; -} - -static inline s32 tcpal_i2c_reg_read_burst( - u8 _reg_addr, u8 *_data, s32 _size) -{ - s32 i, ret = 0; - s32 num_chunk, remain, sent, recvd; - - num_chunk = _size / MAX_I2C_BURST; - remain = _size % MAX_I2C_BURST; - - if (!tcpal_i2c_client) - return -TCERR_OS_DRIVER_FAIL; - - for (i = 0; i < num_chunk; i++) { - sent = i2c_master_send(tcpal_i2c_client, &_reg_addr, 1); - if (sent < 1) { - tcbd_debug(DEBUG_TCPAL_I2C, - "I2C Multi read 8 Addr Error!! %d\n", sent); - return -TCERR_OS_DRIVER_FAIL; - } - - recvd = i2c_master_recv( - tcpal_i2c_client, - &_data[i*MAX_I2C_BURST], - MAX_I2C_BURST); - if (recvd < 0) { - tcbd_debug(DEBUG_TCPAL_I2C, - "I2C Multi read 8 data Error!! %d\n", recvd); - return -TCERR_OS_DRIVER_FAIL; - } - } - - if (remain) { - sent = i2c_master_send(tcpal_i2c_client, &_reg_addr, 1); - if (sent < 1) { - tcbd_debug(DEBUG_TCPAL_I2C, - "I2C Multi read 8 Addr Error!!, %d\n", sent); - return -TCERR_OS_DRIVER_FAIL; - } - ret = i2c_master_recv( - tcpal_i2c_client, - &_data[num_chunk * MAX_I2C_BURST], - remain); - if (ret < 0) { - tcbd_debug(DEBUG_TCPAL_I2C, - "I2C Multi read 8 data Error!!\n"); - return -TCERR_OS_DRIVER_FAIL; - } - } - - return 0; -} - -static inline s32 tcpal_i2c_reg_write_burst( - u8 _reg_addr, u8 *_data, s32 _size) -{ - s32 ret = 0; - s32 num_chunk, remain, sent; - s32 i; - - if (!tcpal_i2c_client) - return -TCERR_OS_DRIVER_FAIL; - - num_chunk = _size/MAX_I2C_BURST; - remain = _size%MAX_I2C_BURST; - - static_buffer_i2c[0] = _reg_addr; - for (i = 0; i < num_chunk; i++) { - memcpy(&static_buffer_i2c[1], &_data[i*MAX_I2C_BURST], - MAX_I2C_BURST); - sent = i2c_master_send( - tcpal_i2c_client, - static_buffer_i2c, - MAX_I2C_BURST+1); - if (ret < 0 || sent < 1) { - tcbd_debug(DEBUG_TCPAL_I2C, - "I2C write error %d\n", ret); - return -TCERR_OS_DRIVER_FAIL; - } - } - - if (remain) { - memcpy(&static_buffer_i2c[1], - &_data[num_chunk * MAX_I2C_BURST], - remain); - ret = i2c_master_send( - tcpal_i2c_client, - static_buffer_i2c, - remain+1); - if (ret < 1) { - tcbd_debug(DEBUG_TCPAL_I2C, "I2C write error!\n"); - return -TCERR_OS_DRIVER_FAIL; - } - } - - return 0; -} - -static s32 tcpal_i2c_reg_read_burst_fix( - u8 _reg_addr, u8 *_data, s32 _size) -{ - return tcpal_i2c_reg_read_burst(_reg_addr|Bit7, _data, _size); -} - -static s32 tcpal_i2c_reg_write_burst_fix( - u8 _reg_addr, u8 *_data, s32 _size) -{ - return tcpal_i2c_reg_write_burst(_reg_addr|Bit7, _data, _size); -} - -static s32 tcpal_i2c_reg_read_burst_cont( - u8 _reg_addr, u8 *_data, s32 _size) -{ - return tcpal_i2c_reg_read_burst(_reg_addr, _data, _size); -} - -static s32 tcpal_i2c_reg_write_burst_cont( - u8 _reg_addr, u8 *_data, s32 _size) -{ - return tcpal_i2c_reg_write_burst(_reg_addr, _data, _size); -} - -void tcpal_set_i2c_io_function(void) -{ - struct tcbd_io_data *tcbd_i2c_io_funcs = tcbd_get_io_struct(); - - tcbd_i2c_io_funcs->open = tcpal_i2c_open; - tcbd_i2c_io_funcs->close = tcpal_i2c_close; - tcbd_i2c_io_funcs->reg_write = tcpal_i2c_reg_write; - tcbd_i2c_io_funcs->reg_read = tcpal_i2c_reg_read; - tcbd_i2c_io_funcs->reg_write_burst_cont = - tcpal_i2c_reg_write_burst_cont; - tcbd_i2c_io_funcs->reg_read_burst_cont = - tcpal_i2c_reg_read_burst_cont; - tcbd_i2c_io_funcs->reg_write_burst_fix = - tcpal_i2c_reg_write_burst_fix; - tcbd_i2c_io_funcs->reg_read_burst_fix = - tcpal_i2c_reg_read_burst_fix; -} - -#endif /*__I2C_STS__ */ diff --git a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_irq_handler.c b/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_irq_handler.c deleted file mode 100644 index b6cadaa..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_irq_handler.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * tcpal_irq_handler.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include -#include - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcbd_api_common.h" -#include "tcbd_drv_ip.h" - -#include "tcbd_stream_parser.h" -#include "tcbd_diagnosis.h" -#include "tcc_fic_decoder.h" -#include "tcbd_hal.h" - -struct tcbd_irq_data { - struct work_struct work; - struct workqueue_struct *work_queue; - struct tcbd_device *device; - u64 start_tick; - s32 tcbd_irq; - s32 is_irq_en; -}; - -static struct tcbd_irq_data tcbd_irq_handler_data; - -#if defined(__CSPI_ONLY__) -static inline void tcpal_split_stream(struct tcbd_irq_data *irq_data) -{ - s32 size, ret = 0; - s8 irq_status; - s8 irq_error; - static u8 buff_read[TCBD_MAX_THRESHOLD*2]; - struct tcbd_device *device = irq_data->device; - - ret = tcbd_read_irq_status(device, &irq_status, &irq_error); - ret |= tcbd_clear_irq(device, irq_status); - - ret |= tcbd_read_stream(device, buff_read, &size); - if (ret == 0 && !irq_error) - tcbd_split_stream(0, buff_read, size); - else { - tcbd_debug(DEBUG_ERROR, "### buffer is full, skip the data " - "(ret:%d, status=0x%02X, error=0x%02X, %d) ###\n", - ret, irq_status, irq_error, - (s32)tcpal_diff_time(irq_data->start_tick)); - - tcbd_init_stream_data_config(device, - ENABLE_CMD_FIFO, - device->selected_buff, - device->intr_threshold); - /*tcbd_reset_ip(device, TCBD_SYS_COMP_ALL, TCBD_SYS_COMP_EP);*/ - tcbd_init_parser(0, NULL); - } -} - -static void tcpal_work_parse_stream(struct work_struct *_param) -{ - u64 diff = tcpal_diff_time(tcbd_irq_handler_data.start_tick); - struct tcbd_irq_data *irq_data = - container_of(_param, struct tcbd_irq_data, work); - - /* for checking delay of workqueue */ - if (diff > 10) - tcbd_debug(DEBUG_INTRRUPT, "diff work start and process :%d\n", - (s32)diff); - tcpal_split_stream(irq_data); - enable_irq(irq_data->tcbd_irq); -} - - -s32 start_tune; -static s32 tcpal_irq_stream_callback( - s32 _dev_idx, - u8 *_stream, - s32 _size, - u8 _subch_id, - u8 _type) -{ - /*static u64 time = 0;*/ - /*struct tcbd_status_data status;*/ - s32 ret, i = 0; - - switch (_type) { - case 0: /*MSC*/ - /* write your own code!!*/ - case 1: /*FIC*/ - /* write your own code!!*/ - if (!start_tune) /* set by tune_frequency*/ - goto skip_fic_parse; - - for (i = 0; i < _size / TCBD_FIC_SIZE; i++) { - ret = tcc_fic_run_decoder(_stream + (i * TCBD_FIC_SIZE), - MAX_FIC_SIZE); - if (ret > 0) { - tcc_fic_get_ensbl_info(1); - start_tune = 0; - tcc_fic_parser_init(); - } - } - /*tcbd_read_signal_info(tcbd_irq_handler_data.device, &status); - tcbd_debug(DEBUG_ERROR, - "PCBER:%d, SNR:%d, RSSI:%d, VBER:%d, TSPER:%d\n", - status.pcber, status.snr, status.rssi, - status.vber, status.tsper);*/ - /*if (tcpal_diff_time(time) > 1000) { - tcbd_check_dsp_status(tcbd_irq_handler_data.device); - time = tcpal_get_time(); - }*/ -skip_fic_parse: - /*tcbd_enqueue_data(_stream, _size, _subch_id, _type);*/ - break; - case 2: /*STATUS*/ - tcbd_debug(DEBUG_STATUS, "status size:%d\n", _size); - tcbd_update_status(_stream, _size, NULL); - break; - default: - break; - } - return 0; -} -#endif /*__CSPI_ONLY__*/ - -#if defined(__I2C_STS__) -static void tcpal_work_read_fic(struct work_struct *_param) -{ - s32 size = TCBD_FIC_SIZE, ret; - u8 buff[TCBD_FIC_SIZE]; - u64 diff; - struct tcbd_irq_data *irq_data = container_of(_param, - struct tcbd_irq_data, work); - struct tcbd_device *device = irq_data->device; - - diff = tcpal_diff_time(irq_data->start_tick); - tcbd_debug(DEBUG_INTRRUPT, "work delay :%d\n", (u32)diff); - - ret = tcbd_read_fic_data(device, buff, size); - if (ret < 0) { - tcbd_debug(DEBUG_ERROR, "failed to read fic! %d\n", ret); - goto exit_work; - } - - tcbd_enqueue_data(buff, size, 0, 1); - if (!start_tune) /* set by tune_frequency*/ - goto exit_work; - - ret = tcc_fic_run_decoder(buff, MAX_FIC_SIZE); - if (ret > 0) { - tcc_fic_get_ensbl_info(1); - start_tune = 0; - tcc_fic_parser_init(); - } -exit_work: - enable_irq(irq_data->tcbd_irq); -} -#endif /*__I2C_STS__*/ - -static irqreturn_t tcpal_irq_handler(s32 _irq, void *_param) -{ - struct tcbd_irq_data *irq_data = (struct tcbd_irq_data *)_param; - struct tcbd_device *device = irq_data->device; - - disable_irq_nosync(irq_data->tcbd_irq); - if (device->is_pal_irq_en) { - irq_data->start_tick = tcpal_get_time(); - queue_work(irq_data->work_queue, &irq_data->work); - tcbd_debug(DEBUG_INTRRUPT, "\n"); - } - return IRQ_HANDLED; -} - -s32 tcpal_irq_register_handler(void *_device) -{ - s32 ret; - - tcbd_irq_handler_data.work_queue = - create_singlethread_workqueue("tdmb_work"); - tcbd_irq_handler_data.device = (struct tcbd_device *)_device; -#if defined(__USE_TC_CPU__) - tcbd_irq_handler_data.tcbd_irq = IRQ_TC317X; -#endif /*__USE_TC_CPU__*/ - -#if defined(__I2C_STS__) - INIT_WORK(&tcbd_irq_handler_data.work, tcpal_work_read_fic); -#elif defined(__CSPI_ONLY__) - INIT_WORK(&tcbd_irq_handler_data.work, tcpal_work_parse_stream); - tcbd_init_parser(0, tcpal_irq_stream_callback); -#endif /*__CSPI_ONLY__*/ - - ret = request_irq(tcbd_irq_handler_data.tcbd_irq, tcpal_irq_handler, - IRQF_TRIGGER_FALLING | IRQF_DISABLED, - "tdmb_irq", &tcbd_irq_handler_data); - tcbd_debug(DEBUG_INTRRUPT, "request_irq : %d\n", (int)ret); - return ret; -} - -s32 tcpal_irq_unregister_handler(void) -{ - disable_irq(tcbd_irq_handler_data.tcbd_irq); - free_irq(tcbd_irq_handler_data.tcbd_irq, NULL); - flush_workqueue(tcbd_irq_handler_data.work_queue); - destroy_workqueue(tcbd_irq_handler_data.work_queue); - return 0; -} - -s32 tcpal_irq_enable(void) -{ -#if defined(__CSPI_ONLY__) - tcbd_init_parser(0, NULL); -#endif /*__CSPI_ONLY__*/ - tcbd_debug(DEBUG_INTRRUPT, "\n"); - /* enable_irq(tcbd_irq_handler_data.tcbd_irq); */ - return 0; -} - -s32 tcpal_irq_disable(void) -{ - tcbd_debug(DEBUG_INTRRUPT, "\n"); - /* disable_irq(tcbd_irq_handler_data.tcbd_irq); */ - return 0; -} diff --git a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_linux.c b/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_linux.c deleted file mode 100644 index 2647484..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_linux.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * tcpal_linux.c - * - * Author: - * Description: Telechips broadcast driver - * - * Copyright (c) Telechips, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include -#include -#include -#include -#include - -#include -#include - -u64 tcpal_get_time(void) -{ - u64 tick; - struct timeval tv; - - do_gettimeofday(&tv); - tick = (u64)tv.tv_sec*1000 + tv.tv_usec/1000; - - return tick; -} - -u64 tcpal_diff_time(u64 _start_time) -{ - u64 interval; - u64 curr_time = tcpal_get_time(); - - if (curr_time > _start_time) - interval = curr_time - _start_time; - else - interval = (TCPAL_MAX_TIMECNT - _start_time) + curr_time + 1; - - return interval; -} - -void tcpal_msleep(s32 _ms) -{ - msleep(_ms); -} - -void tcpal_usleep(s32 _us) -{ - struct timeval pre_tv, tv; - s32 diff; - - do_gettimeofday(&pre_tv); - do { - do_gettimeofday(&tv); - if (tv.tv_usec > pre_tv.tv_usec) - diff = tv.tv_usec - pre_tv.tv_usec; - else - diff = (LONG_MAX - pre_tv.tv_usec) + tv.tv_usec; - } while (diff < _us); -} - -void *tcpal_malloc(u32 _size) -{ - return kmalloc(_size, GFP_KERNEL); -} - -void tcpal_free(void *_ptr) -{ - kfree(_ptr); -} - -s32 tcpal_create_lock( - u32 *_semaphore, - char *_name, - u32 _initialCount) -{ - struct mutex *lock = - (struct mutex *)tcpal_malloc(sizeof(struct mutex)); - tcbd_debug(DEBUG_TCPAL_OS, "\n"); - mutex_init(lock); - - *_semaphore = (u32)lock; - return 0; -} - -s32 tcpal_destroy_lock(u32 *_semaphore) -{ - struct mutex *lock = (struct mutex *)*_semaphore; - - if (lock == NULL) - return -1; - - tcpal_free(lock); - *_semaphore = 0; - tcbd_debug(DEBUG_TCPAL_OS, "\n"); - return 0; -} - -s32 tcpal_lock(u32 *_semaphore) -{ - struct mutex *lock = (struct mutex *)*_semaphore; - - if (lock == NULL) { - tcbd_debug(DEBUG_ERROR, "\n"); - return -1; - } - mutex_lock(lock); - return 0; -} - -s32 tcpal_unlock(u32 *_semaphore) -{ - struct mutex *lock = (struct mutex *)*_semaphore; - - if (lock == NULL) { - tcbd_debug(DEBUG_ERROR, "\n"); - return -1; - } - mutex_unlock(lock); - return 0; -} diff --git a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_queue.c b/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_queue.c deleted file mode 100644 index 3677a58..0000000 --- a/drivers/media/tdmb/tcc3170/src/tcpal_linux/tcpal_queue.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -* -* File name : tcpal_queue.c -* -* Description : tdmb driver -* -* Copyright (C) (2012, Telechips. ) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - - -#include "tcpal_os.h" -#include "tcpal_debug.h" - -#include "tcbd_feature.h" -#include "tcpal_queue.h" - -s32 tcbd_queue_is_full(struct tcbd_queue *_queue) -{ - if (_queue->front == ((_queue->rear+1)%_queue->qsize)) - return 1; - return 0; -} - -s32 tcbd_queue_is_empty(struct tcbd_queue *_queue) -{ - if (_queue->front == _queue->rear) - return 1; - return 0; -} - -void tcbd_init_queue( - struct tcbd_queue *_queue, u8* _buffer, s32 _buff_size) -{ - memset((void *)_queue->q, 0, - sizeof(struct tcbd_queue_item) * TCBD_QUEUE_SIZE); - _queue->front = 0; - _queue->rear = 0; - _queue->qsize = TCBD_QUEUE_SIZE; - _queue->buff_size = _buff_size; - _queue->global_buffer = _buffer; - _queue->pointer = 0; - - tcpal_create_lock(&_queue->sem, "TcbdQueue", 0); -} - -void tcbd_deinit_queue(struct tcbd_queue *_queue) -{ - _queue->front = 0; - _queue->rear = 0; - _queue->qsize = 0; - _queue->buff_size = 0; - tcpal_destroy_lock(&_queue->sem); -} - -void tcbd_reset_queue(struct tcbd_queue *_queue) -{ - _queue->front = 0; - _queue->rear = 0; - _queue->pointer = 0; - memset(_queue->q, 0, - sizeof(struct tcbd_queue_item)*_queue->qsize); -} - -s32 tcbd_enqueue( - struct tcbd_queue *_queue, u8 *_chunk, s32 _size, - u8 _subch_id, s32 _type) -{ - if (_chunk == NULL || _size <= 0) { - tcbd_debug(DEBUG_ERROR, "Invalid argument!!\n"); - return -1; - } - - tcpal_lock(&_queue->sem); - - if (tcbd_queue_is_full(_queue)) { - tcbd_debug(DEBUG_ERROR, "Queue Full!!\n"); - _queue->pointer = 0; - } - - if (_queue->q[_queue->rear].buffer < - _queue->q[_queue->front].buffer) { - u32 next_pos_rear = - (u32)_queue->q[_queue->rear].buffer + _size; - u32 curr_pos_front = - (u32)_queue->q[_queue->front].buffer; - - if (next_pos_rear > curr_pos_front) { - tcbd_debug(DEBUG_ERROR, "Buffer overflow!!\n"); - tcbd_reset_queue(_queue); - tcpal_unlock(&_queue->sem); - return -1; - } - } - - _queue->q[_queue->rear].buffer = - _queue->global_buffer + _queue->pointer; - - if (_queue->pointer + _size >= _queue->buff_size) - _queue->pointer = 0; - else - _queue->pointer += _size; - memcpy(_queue->q[_queue->rear].buffer, _chunk, _size); - _queue->q[_queue->rear].size = _size; - _queue->q[_queue->rear].type = _type; - _queue->q[_queue->rear].subch_id = _subch_id; - - _queue->rear = (_queue->rear + 1) % _queue->qsize; - tcpal_unlock(&_queue->sem); - return 0; -} - -s32 tcbd_dequeue( - struct tcbd_queue *_queue, u8 *_chunk, s32 *_size, - u8 *_subch_id, s32 *_type) -{ - tcpal_lock(&_queue->sem); - if (tcbd_queue_is_empty(_queue)) { - tcbd_debug(0, "Queue Empty!!\n"); - tcpal_unlock(&_queue->sem); - return -1; - } - - if (_queue->q[_queue->front].size > *_size) { - tcbd_debug(DEBUG_ERROR, - "insufficient buffer!! size:%d, qsize:%d\n", - *_size, _queue->q[_queue->front].size); - - tcpal_unlock(&_queue->sem); - return -1; - } - - memcpy(_chunk, _queue->q[_queue->front].buffer, - _queue->q[_queue->front].size); - - *_size = _queue->q[_queue->front].size; - if (_type) - *_type = _queue->q[_queue->front].type; - if (_subch_id) - *_subch_id = _queue->q[_queue->front].subch_id; - - _queue->front = (_queue->front + 1) % _queue->qsize; - tcbd_debug(0, "pos:%d, size:%d\n", _queue->pointer, *_size); - tcpal_unlock(&_queue->sem); - return 0; -} - -s32 tcbd_dequeue_ptr( - struct tcbd_queue *_queue, u8 **_chunk, s32 *_size, s32 *_type) -{ - tcpal_lock(&_queue->sem); - if (tcbd_queue_is_empty(_queue)) { - tcbd_debug(0, "Queue Empty!!\n"); - tcpal_unlock(&_queue->sem); - return -1; - } - - if (_queue->q[_queue->front].size > *_size) { - tcbd_debug(DEBUG_ERROR, - "insufficient buffer!! size:%d, qsize:%d\n", - *_size, _queue->q[_queue->front].size); - tcpal_unlock(&_queue->sem); - return -1; - } - - *_chunk = _queue->q[_queue->front].buffer; - *_size = _queue->q[_queue->front].size; - if (_type) - *_type = _queue->q[_queue->front].type; - _queue->front = (_queue->front + 1) % _queue->qsize; - tcbd_debug(0, "pos:%d, size:%d\n", _queue->pointer, *_size); - tcpal_unlock(&_queue->sem); - return 0; -} - -s32 tcbd_get_first_queue_ptr( - struct tcbd_queue *_queue, u8 **_chunk, s32 *_size, s32 *_type) -{ - tcpal_lock(&_queue->sem); - if (tcbd_queue_is_empty(_queue)) { - tcbd_debug(0, "Queue Empty!!\n"); - tcpal_unlock(&_queue->sem); - return -1; - } - *_size = _queue->q[_queue->front].size; - *_chunk = _queue->q[_queue->front].buffer; - if (_type) - *_type = _queue->q[_queue->front].type; - tcbd_debug(0, "pos:%d, size:%d\n", _queue->pointer, *_size); - tcpal_unlock(&_queue->sem); - return 0; -} diff --git a/drivers/media/tdmb/tdmb.c b/drivers/media/tdmb/tdmb.c deleted file mode 100644 index b8f215a..0000000 --- a/drivers/media/tdmb/tdmb.c +++ /dev/null @@ -1,867 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb.c -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -/* for delay(sleep) */ -#include - -/* for mutex */ -#include - -/*using copy to user */ -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#if defined(CONFIG_TDMB_ANT_DET) -#include -#endif - -#ifdef CONFIG_MACH_C1 -#include -static struct wake_lock tdmb_wlock; -#endif -#include "tdmb.h" -#define TDMB_PRE_MALLOC 1 - -static struct class *tdmb_class; - -/* ring buffer */ -char *ts_ring; -unsigned int *tdmb_ts_head; -unsigned int *tdmb_ts_tail; -char *tdmb_ts_buffer; -unsigned int tdmb_ts_size; - -unsigned int *cmd_head; -unsigned int *cmd_tail; -static char *cmd_buffer; -static unsigned int cmd_size; - -static unsigned long tdmb_last_ch; - -static struct tdmb_platform_data gpio_cfg; -static struct tdmb_drv_func *tdmbdrv_func; - -static bool tdmb_pwr_on; -static bool tdmb_power_on(void) -{ - if (tdmb_create_databuffer(tdmbdrv_func->get_int_size()) == false) { - DPRINTK("tdmb_create_databuffer fail\n"); - goto create_databuffer_fail; - } - if (tdmb_create_workqueue() == false) { - DPRINTK("tdmb_create_workqueue fail\n"); - goto create_workqueue_fail; - } - if (tdmbdrv_func->power_on() == false) { - DPRINTK("power_on fail\n"); - goto power_on_fail; - } - - DPRINTK("power_on success\n"); -#ifdef CONFIG_MACH_C1 - wake_lock(&tdmb_wlock); -#endif - tdmb_pwr_on = true; - return true; - -power_on_fail: - tdmb_destroy_workqueue(); -create_workqueue_fail: - tdmb_destroy_databuffer(); -create_databuffer_fail: - tdmb_pwr_on = false; - - return false; -} -static bool tdmb_power_off(void) -{ - DPRINTK("%s : tdmb_pwr_on(%d)\n", __func__, tdmb_pwr_on); - - if (tdmb_pwr_on) { - tdmbdrv_func->power_off(); - tdmb_destroy_workqueue(); - tdmb_destroy_databuffer(); -#ifdef CONFIG_MACH_C1 - wake_unlock(&tdmb_wlock); -#endif - tdmb_pwr_on = false; - } - tdmb_last_ch = 0; - return true; -} - -static int tdmb_open(struct inode *inode, struct file *filp) -{ - DPRINTK("tdmb_open!\n"); - return 0; -} - -static ssize_t -tdmb_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) -{ - DPRINTK("tdmb_read\n"); - - return 0; -} - -static int tdmb_release(struct inode *inode, struct file *filp) -{ - DPRINTK("tdmb_release\n"); - - tdmb_power_off(); - -#if TDMB_PRE_MALLOC - tdmb_ts_size = 0; - cmd_size = 0; -#else - if (ts_ring != 0) { - kfree(ts_ring); - ts_ring = 0; - tdmb_ts_size = 0; - cmd_size = 0; - } -#endif - - return 0; -} - -#if TDMB_PRE_MALLOC -static void tdmb_make_ring_buffer(void) -{ - size_t size = TDMB_RING_BUFFER_MAPPING_SIZE; - - /* size should aligned in PAGE_SIZE */ - if (size % PAGE_SIZE) /* klaatu hard coding */ - size = size + size % PAGE_SIZE; - - ts_ring = kmalloc(size, GFP_KERNEL); - DPRINTK("RING Buff Create OK\n"); -} - -#endif - -static int tdmb_mmap(struct file *filp, struct vm_area_struct *vma) -{ - size_t size; - unsigned long pfn; - - DPRINTK("%s\n", __func__); - - vma->vm_flags |= VM_RESERVED; - size = vma->vm_end - vma->vm_start; - DPRINTK("size given : %x\n", size); - -#if TDMB_PRE_MALLOC - size = TDMB_RING_BUFFER_MAPPING_SIZE; - if (!ts_ring) { - DPRINTK("RING Buff ReAlloc(%d)!!\n", size); -#endif - /* size should aligned in PAGE_SIZE */ - if (size % PAGE_SIZE) /* klaatu hard coding */ - size = size + size % PAGE_SIZE; - - ts_ring = kmalloc(size, GFP_KERNEL); -#if TDMB_PRE_MALLOC - } -#endif - - pfn = virt_to_phys(ts_ring) >> PAGE_SHIFT; - - DPRINTK("vm_start:%lx,ts_ring:%p,size:%x,prot:%lx,pfn:%lx\n", - vma->vm_start, ts_ring, size, vma->vm_page_prot, pfn); - - if (remap_pfn_range(vma, vma->vm_start, pfn, size, vma->vm_page_prot)) - return -EAGAIN; - - DPRINTK("succeeded\n"); - - tdmb_ts_head = (unsigned int *)ts_ring; - tdmb_ts_tail = (unsigned int *)(ts_ring + 4); - tdmb_ts_buffer = ts_ring + 8; - - *tdmb_ts_head = 0; - *tdmb_ts_tail = 0; - - tdmb_ts_size = size-8; /* klaatu hard coding */ - tdmb_ts_size - = ((tdmb_ts_size / DMB_TS_SIZE) * DMB_TS_SIZE) - (30 * DMB_TS_SIZE); - - DPRINTK("head : %x, tail : %x, buffer : %x, size : %x\n", - (unsigned int)tdmb_ts_head, (unsigned int)tdmb_ts_tail, - (unsigned int)tdmb_ts_buffer, tdmb_ts_size); - - cmd_buffer = tdmb_ts_buffer + tdmb_ts_size + 8; - cmd_head = (unsigned int *)(cmd_buffer - 8); - cmd_tail = (unsigned int *)(cmd_buffer - 4); - - *cmd_head = 0; - *cmd_tail = 0; - - cmd_size = 30 * DMB_TS_SIZE - 8; /* klaatu hard coding */ - - DPRINTK("cmd head : %x, tail : %x, buffer : %x, size : %x\n", - (unsigned int)cmd_head, (unsigned int)cmd_tail, - (unsigned int)cmd_buffer, cmd_size); - - return 0; -} - - -static int _tdmb_cmd_update( - unsigned char *cmd_header, - unsigned char cmd_header_size, - unsigned char *data, - unsigned short data_size) -{ - unsigned int size; - unsigned int head; - unsigned int tail; - unsigned int dist; - unsigned int temp_size; - unsigned int data_size_tmp; - - if (data_size > cmd_size) { - DPRINTK(" Error - cmd size too large\n"); - return false; - } - - head = *cmd_head; - tail = *cmd_tail; - size = cmd_size; - data_size_tmp = data_size + cmd_header_size; - - if (head >= tail) - dist = head-tail; - else - dist = size + head-tail; - - if (size - dist <= data_size_tmp) { - DPRINTK("too small space is left in Cmd Ring Buffer!!\n"); - return false; - } - - DPRINTK("%x head %d tail %d\n", (unsigned int)cmd_buffer, head, tail); - - if (head+data_size_tmp <= size) { - memcpy((cmd_buffer + head), - (char *)cmd_header, cmd_header_size); - memcpy((cmd_buffer + head + cmd_header_size), - (char *)data, data_size); - head += data_size_tmp; - if (head == size) - head = 0; - } else { - temp_size = size - head; - if (temp_size < cmd_header_size) { - memcpy((cmd_buffer+head), - (char *)cmd_header, temp_size); - memcpy((cmd_buffer), - (char *)cmd_header+temp_size, - (cmd_header_size - temp_size)); - head = cmd_header_size - temp_size; - } else { - memcpy((cmd_buffer+head), - (char *)cmd_header, cmd_header_size); - head += cmd_header_size; - if (head == size) - head = 0; - } - - temp_size = size - head; - if (temp_size < data_size) { - memcpy((cmd_buffer+head), - (char *)data, temp_size); - memcpy((cmd_buffer), - (char *)data+temp_size, - (data_size - temp_size)); - head = data_size - temp_size; - } else { - memcpy((cmd_buffer+head), - (char *)data, data_size); - head += data_size; - if (head == size) - head = 0; - } - } - - *cmd_head = head; - - return true; -} - -unsigned char tdmb_make_result( - unsigned char cmd, - unsigned short data_len, - unsigned char *data) -{ - unsigned char cmd_header[4] = {0,}; - - cmd_header[0] = TDMB_CMD_START_FLAG; - cmd_header[1] = cmd; - cmd_header[2] = (data_len>>8)&0xff; - cmd_header[3] = data_len&0xff; - - _tdmb_cmd_update(cmd_header, 4 , data, data_len); - - return true; -} - -unsigned long tdmb_get_chinfo(void) -{ - return tdmb_last_ch; -} - -void tdmb_pull_data(struct work_struct *work) -{ - tdmbdrv_func->pull_data(); -} - -bool tdmb_control_irq(bool set) -{ - bool ret = true; - int irq_ret; - if (set) { - irq_set_irq_type(gpio_cfg.irq, IRQ_TYPE_EDGE_FALLING); - irq_ret = request_irq(gpio_cfg.irq - , tdmb_irq_handler - , IRQF_DISABLED - , TDMB_DEV_NAME - , NULL); - if (irq_ret < 0) { - DPRINTK("request_irq failed !! \r\n"); - ret = false; - } - } else { - free_irq(gpio_cfg.irq, NULL); - } - - return ret; -} - -void tdmb_control_gpio(bool poweron) -{ - if (poweron) - gpio_cfg.gpio_on(); - else - gpio_cfg.gpio_off(); -} - -static long tdmb_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - int ret = 0; - unsigned long fig_freq = 0; - struct ensemble_info_type *ensemble_info; - struct tdmb_dm dm_buff; - - DPRINTK("call tdmb_ioctl : 0x%x\n", cmd); - - if (_IOC_TYPE(cmd) != IOCTL_MAGIC) { - DPRINTK("tdmb_ioctl : _IOC_TYPE error\n"); - return -EINVAL; - } - if (_IOC_NR(cmd) >= IOCTL_MAXNR) { - DPRINTK("tdmb_ioctl : _IOC_NR(cmd) 0x%x\n", _IOC_NR(cmd)); - return -EINVAL; - } - - switch (cmd) { - case IOCTL_TDMB_GET_DATA_BUFFSIZE: - DPRINTK("IOCTL_TDMB_GET_DATA_BUFFSIZE %d\n", tdmb_ts_size); - ret = copy_to_user((unsigned int *)arg, - &tdmb_ts_size, sizeof(unsigned int)); - break; - - case IOCTL_TDMB_GET_CMD_BUFFSIZE: - DPRINTK("IOCTL_TDMB_GET_CMD_BUFFSIZE %d\n", cmd_size); - ret = copy_to_user((unsigned int *)arg, - &cmd_size, sizeof(unsigned int)); - break; - - case IOCTL_TDMB_POWER_ON: - DPRINTK("IOCTL_TDMB_POWER_ON\n"); - ret = tdmb_power_on(); - break; - - case IOCTL_TDMB_POWER_OFF: - DPRINTK("IOCTL_TDMB_POWER_OFF\n"); - ret = tdmb_power_off(); - break; - - case IOCTL_TDMB_SCAN_FREQ_ASYNC: - DPRINTK("IOCTL_TDMB_SCAN_FREQ_ASYNC\n"); - - fig_freq = arg; - - ensemble_info = vmalloc(sizeof(struct ensemble_info_type)); - memset((char *)ensemble_info, 0x00\ - , sizeof(struct ensemble_info_type)); - - ret = tdmbdrv_func->scan_ch(ensemble_info, fig_freq); - if (ret == true) - tdmb_make_result(DMB_FIC_RESULT_DONE, - sizeof(struct ensemble_info_type), - (unsigned char *)ensemble_info); - else - tdmb_make_result(DMB_FIC_RESULT_FAIL, - sizeof(unsigned long), - (unsigned char *)&fig_freq); - - vfree(ensemble_info); - tdmb_last_ch = 0; - break; - - case IOCTL_TDMB_SCAN_FREQ_SYNC: - fig_freq = ((struct ensemble_info_type *)arg)->ensem_freq; - DPRINTK("IOCTL_TDMB_SCAN_FREQ_SYNC %ld\n", fig_freq); - - ensemble_info = vmalloc(sizeof(struct ensemble_info_type)); - memset((char *)ensemble_info, 0x00\ - , sizeof(struct ensemble_info_type)); - - ret = tdmbdrv_func->scan_ch(ensemble_info, fig_freq); - if (ret == true) { - if (copy_to_user((struct ensemble_info_type *)arg, - ensemble_info, - sizeof(struct ensemble_info_type)) - ) - DPRINTK("cmd(%x) : copy_to_user failed\n", cmd); - } - - vfree(ensemble_info); - tdmb_last_ch = 0; - break; - - case IOCTL_TDMB_SCANSTOP: - DPRINTK("IOCTL_TDMB_SCANSTOP\n"); - ret = false; - break; - - case IOCTL_TDMB_ASSIGN_CH: - DPRINTK("IOCTL_TDMB_ASSIGN_CH %ld\n", arg); - tdmb_init_data(); - ret = tdmbdrv_func->set_ch(arg, (arg % 1000), false); - if (ret == true) - tdmb_last_ch = arg; - else - tdmb_last_ch = 0; - break; - - case IOCTL_TDMB_ASSIGN_CH_TEST: - DPRINTK("IOCTL_TDMB_ASSIGN_CH_TEST %ld\n", arg); - tdmb_init_data(); - ret = tdmbdrv_func->set_ch(arg, (arg % 1000), true); - if (ret == true) - tdmb_last_ch = arg; - else - tdmb_last_ch = 0; - break; - - case IOCTL_TDMB_GET_DM: - tdmbdrv_func->get_dm(&dm_buff); - if (copy_to_user((struct tdmb_dm *)arg\ - , &dm_buff, sizeof(struct tdmb_dm))) - DPRINTK("IOCTL_TDMB_GET_DM : copy_to_user failed\n"); - ret = true; - DPRINTK("rssi %d, ber %d, ANT %d\n", - dm_buff.rssi, dm_buff.ber, dm_buff.antenna); - break; - } - - return ret; -} - -static const struct file_operations tdmb_ctl_fops = { - .owner = THIS_MODULE, - .open = tdmb_open, - .read = tdmb_read, - .unlocked_ioctl = tdmb_ioctl, - .mmap = tdmb_mmap, - .release = tdmb_release, - .llseek = no_llseek, -}; - -static struct tdmb_drv_func *tdmb_get_drv_func(void) -{ - struct tdmb_drv_func * (*func)(void); -#if defined(CONFIG_TDMB_T3900) && defined(CONFIG_TDMB_TCC3170) - if (system_rev >= 11) - func = tcc3170_drv_func; - else - func = t3900_drv_func; -#elif defined(CONFIG_TDMB_T3900) || defined(CONFIG_TDMB_T39F0) - func = t3900_drv_func; -#elif defined(CONFIG_TDMB_FC8050) - func = fc8050_drv_func; -#elif defined(CONFIG_TDMB_MTV318) - func = mtv318_drv_func; -#elif defined(CONFIG_TDMB_TCC3170) - func = tcc3170_drv_func; -#else - #error what??? -#endif - - return func(); -} - -#if defined(CONFIG_TDMB_ANT_DET) - -static struct input_dev *tdmb_ant_input; -static int tdmb_check_ant; -static int ant_prev_status; - -#define TDMB_ANT_CHECK_DURATION 500000 -#define TDMB_ANT_CHECK_COUNT 2 -static bool tdmb_ant_det_check_value(void) -{ - int loop = 0; - int cur_val = 0, prev_val = 0; - bool ret = false; - - tdmb_check_ant = 1; - - prev_val = ant_prev_status ? 0 : 1; - for (loop = 0; loop < TDMB_ANT_CHECK_COUNT; loop++) { - usleep_range(TDMB_ANT_CHECK_DURATION, TDMB_ANT_CHECK_DURATION); - cur_val = gpio_get_value_cansleep(gpio_cfg.gpio_ant_det); - if (prev_val != cur_val || ant_prev_status == cur_val) - break; - prev_val = cur_val; - } - - if (loop == TDMB_ANT_CHECK_COUNT) { - if (ant_prev_status == 0 && cur_val == 1) - ret = true; - - ant_prev_status = cur_val; - } - - tdmb_check_ant = 0; - - DPRINTK("%s cnt(%d) cur(%d) ret(%d)\n", __func__, loop, cur_val, ret); - - return ret; -} - -static int tdmb_ant_det_ignore_irq(void) -{ - DPRINTK("%s tdmb_check_ant=%d\n", __func__, tdmb_check_ant); - return tdmb_check_ant; -} - -static void tdmb_ant_det_work_func(struct work_struct *work) -{ - int val = 0; - - if (!tdmb_ant_input) { - DPRINTK("%s: input device is not registered\n", __func__); - return; - } - - if (tdmb_ant_det_check_value()) { - input_report_key(tdmb_ant_input, KEY_DMB_ANT_DET_UP, 1); - input_report_key(tdmb_ant_input, KEY_DMB_ANT_DET_UP, 0); - input_sync(tdmb_ant_input); - DPRINTK("%s: sys_rev:%d\n", __func__, system_rev); - } -} - -static struct workqueue_struct *tdmb_ant_det_wq; -static DECLARE_WORK(tdmb_ant_det_work, tdmb_ant_det_work_func); -static bool tdmb_ant_det_reg_input(struct platform_device *pdev) -{ - struct input_dev *input; - int err; - - DPRINTK("%s\n", __func__); - - input = input_allocate_device(); - if (!input) { - DPRINTK("Can't allocate input device\n"); - err = -ENOMEM; - } - set_bit(EV_KEY, input->evbit); - set_bit(KEY_DMB_ANT_DET_UP & KEY_MAX, input->keybit); - set_bit(KEY_DMB_ANT_DET_DOWN & KEY_MAX, input->keybit); - input->name = "sec_dmb_key"; - input->phys = "sec_dmb_key/input0"; - input->dev.parent = &pdev->dev; - - err = input_register_device(input); - if (err) { - DPRINTK("Can't register dmb_ant_det key: %d\n", err); - goto free_input_dev; - } - tdmb_ant_input = input; - ant_prev_status = gpio_get_value_cansleep(gpio_cfg.gpio_ant_det); - - return true; - -free_input_dev: - input_free_device(input); - return false; -} - -static void tdmb_ant_det_unreg_input(void) -{ - DPRINTK("%s\n", __func__); - if (tdmb_ant_input) { - input_unregister_device(tdmb_ant_input); - tdmb_ant_input = NULL; - } -} -static bool tdmb_ant_det_create_wq(void) -{ - DPRINTK("%s\n", __func__); - tdmb_ant_det_wq = create_singlethread_workqueue("tdmb_ant_det_wq"); - if (tdmb_ant_det_wq) - return true; - else - return false; -} - -static bool tdmb_ant_det_destroy_wq(void) -{ - DPRINTK("%s\n", __func__); - if (tdmb_ant_det_wq) { - flush_workqueue(tdmb_ant_det_wq); - destroy_workqueue(tdmb_ant_det_wq); - tdmb_ant_det_wq = NULL; - } - return true; -} - -static irqreturn_t tdmb_ant_det_irq_handler(int irq, void *dev_id) -{ - int ret = 0; - - if (tdmb_ant_det_ignore_irq()) - return IRQ_HANDLED; - - if (tdmb_ant_det_wq) { - ret = queue_work(tdmb_ant_det_wq, &tdmb_ant_det_work); - if (ret == 0) - DPRINTK("%s queue_work fail\n", __func__); - } - - return IRQ_HANDLED; -} - -static bool tdmb_ant_det_irq_set(bool set) -{ - bool ret = true; - int irq_ret; - DPRINTK("%s\n", __func__); - - if (set) { - if (system_rev >= 6) - irq_set_irq_type(gpio_cfg.irq_ant_det - , IRQ_TYPE_EDGE_BOTH); - else - irq_set_irq_type(gpio_cfg.irq_ant_det - , IRQ_TYPE_EDGE_RISING); - - irq_ret = request_irq(gpio_cfg.irq_ant_det - , tdmb_ant_det_irq_handler - , IRQF_DISABLED - , "tdmb_ant_det" - , NULL); - if (irq_ret < 0) { - DPRINTK("%s %d\r\n", __func__, irq_ret); - ret = false; - } - enable_irq_wake(gpio_cfg.irq_ant_det); - } else { - disable_irq_wake(gpio_cfg.irq_ant_det); - free_irq(gpio_cfg.irq_ant_det, NULL); - } - - return ret; -} -#endif - -static int tdmb_probe(struct platform_device *pdev) -{ - int ret; - struct device *tdmb_dev; - struct tdmb_platform_data *p = pdev->dev.platform_data; - - DPRINTK("call tdmb_probe\n"); - - ret = register_chrdev(TDMB_DEV_MAJOR, TDMB_DEV_NAME, &tdmb_ctl_fops); - if (ret < 0) - DPRINTK("register_chrdev(TDMB_DEV) failed!\n"); - - tdmb_class = class_create(THIS_MODULE, TDMB_DEV_NAME); - if (IS_ERR(tdmb_class)) { - unregister_chrdev(TDMB_DEV_MAJOR, TDMB_DEV_NAME); - class_destroy(tdmb_class); - DPRINTK("class_create failed!\n"); - - return -EFAULT; - } - - tdmb_dev = device_create(tdmb_class, NULL, - MKDEV(TDMB_DEV_MAJOR, TDMB_DEV_MINOR), - NULL, TDMB_DEV_NAME); - if (IS_ERR(tdmb_dev)) { - DPRINTK("device_create failed!\n"); - - unregister_chrdev(TDMB_DEV_MAJOR, TDMB_DEV_NAME); - class_destroy(tdmb_class); - - return -EFAULT; - } - - memcpy(&gpio_cfg, p, sizeof(struct tdmb_platform_data)); - - tdmb_init_bus(); - tdmbdrv_func = tdmb_get_drv_func(); - if (tdmbdrv_func->init) - tdmbdrv_func->init(); - -#if TDMB_PRE_MALLOC - tdmb_make_ring_buffer(); -#endif -#ifdef CONFIG_MACH_C1 - wake_lock_init(&tdmb_wlock, WAKE_LOCK_SUSPEND, "tdmb_wlock"); -#endif - -#if defined(CONFIG_TDMB_ANT_DET) - if (!tdmb_ant_det_reg_input(pdev)) - goto err_reg_input; - if (!tdmb_ant_det_create_wq()) - goto free_reg_input; - if (!tdmb_ant_det_irq_set(true)) - goto free_ant_det_wq; - - return 0; - -free_ant_det_wq: - tdmb_ant_det_destroy_wq(); -free_reg_input: - tdmb_ant_det_unreg_input(); -err_reg_input: - return -EFAULT; -#else - return 0; -#endif - -} - -static int tdmb_remove(struct platform_device *pdev) -{ - DPRINTK("tdmb_remove!\n"); -#if defined(CONFIG_TDMB_ANT_DET) - tdmb_ant_det_unreg_input(); - tdmb_ant_det_destroy_wq(); - tdmb_ant_det_irq_set(false); -#endif - return 0; -} - -static int tdmb_suspend(struct platform_device *pdev, pm_message_t mesg) -{ - return 0; -} - -static int tdmb_resume(struct platform_device *pdev) -{ - return 0; -} - -static struct platform_driver tdmb_driver = { - .probe = tdmb_probe, - .remove = tdmb_remove, - .suspend = tdmb_suspend, - .resume = tdmb_resume, - .driver = { - .owner = THIS_MODULE, - .name = "tdmb" - }, -}; - -static int __init tdmb_init(void) -{ - int ret; - -#ifdef CONFIG_BATTERY_SEC - if (is_lpcharging_state()) { - pr_info("%s : LPM Charging Mode! return 0\n", __func__); - return 0; - } -#endif - - DPRINTK(" module init\n"); - ret = platform_driver_register(&tdmb_driver); - if (ret) - return ret; - - return 0; -} - -static void __exit tdmb_exit(void) -{ - DPRINTK(" module exit\n"); -#if TDMB_PRE_MALLOC - if (ts_ring != 0) { - kfree(ts_ring); - ts_ring = 0; - } -#endif - unregister_chrdev(TDMB_DEV_MAJOR, "tdmb"); - device_destroy(tdmb_class, MKDEV(TDMB_DEV_MAJOR, TDMB_DEV_MINOR)); - class_destroy(tdmb_class); - - platform_driver_unregister(&tdmb_driver); - - tdmb_exit_bus(); -#ifdef CONFIG_MACH_C1 - wake_lock_destroy(&tdmb_wlock); -#endif -} - -module_init(tdmb_init); -module_exit(tdmb_exit); - -MODULE_AUTHOR("Samsung"); -MODULE_DESCRIPTION("TDMB Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/tdmb/tdmb.h b/drivers/media/tdmb/tdmb.h deleted file mode 100644 index dc893dc..0000000 --- a/drivers/media/tdmb/tdmb.h +++ /dev/null @@ -1,181 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb.h -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#ifndef _TDMB_H_ -#define _TDMB_H_ - -#include -#include -#include -#include -#include - - -#define TDMB_DEBUG - -#ifdef TDMB_DEBUG -#define DPRINTK(x...) printk(KERN_DEBUG "TDMB " x) -#else -#define DPRINTK(x...) /* null */ -#endif - -#define TDMB_DEV_NAME "tdmb" -#define TDMB_DEV_MAJOR 225 -#define TDMB_DEV_MINOR 0 - -#define DMB_TS_SIZE 188 - -#define TDMB_RING_BUFFER_SIZE (188 * 150 + 4 + 4) -#define TDMB_RING_BUFFER_MAPPING_SIZE \ - (((TDMB_RING_BUFFER_SIZE - 1) / PAGE_SIZE + 1) * PAGE_SIZE) - -/* commands */ -#define IOCTL_MAGIC 't' -#define IOCTL_MAXNR 32 - -#define IOCTL_TDMB_GET_DATA_BUFFSIZE _IO(IOCTL_MAGIC, 0) -#define IOCTL_TDMB_GET_CMD_BUFFSIZE _IO(IOCTL_MAGIC, 1) -#define IOCTL_TDMB_POWER_ON _IO(IOCTL_MAGIC, 2) -#define IOCTL_TDMB_POWER_OFF _IO(IOCTL_MAGIC, 3) -#define IOCTL_TDMB_SCAN_FREQ_ASYNC _IO(IOCTL_MAGIC, 4) -#define IOCTL_TDMB_SCAN_FREQ_SYNC _IO(IOCTL_MAGIC, 5) -#define IOCTL_TDMB_SCANSTOP _IO(IOCTL_MAGIC, 6) -#define IOCTL_TDMB_ASSIGN_CH _IO(IOCTL_MAGIC, 7) -#define IOCTL_TDMB_GET_DM _IO(IOCTL_MAGIC, 8) -#define IOCTL_TDMB_ASSIGN_CH_TEST _IO(IOCTL_MAGIC, 9) - -struct tdmb_dm { - unsigned int rssi; - unsigned int ber; - unsigned int per; - unsigned int antenna; -} ; - -#define SUB_CH_NUM_MAX 64 - -#define ENSEMBLE_LABEL_MAX 16 -#define SVC_LABEL_MAX 16 - -enum { - TMID_MSC_STREAM_AUDIO = 0x00, - TMID_MSC_STREAM_DATA = 0x01, - TMID_FIDC = 0x02, - TMID_MSC_PACKET_DATA = 0x03 -}; - -enum { - DSCTy_TDMB = 0x18, - /* Used for All-Zero Test */ - DSCTy_UNSPECIFIED = 0x00 -}; - -struct sub_ch_info_type { - /* Sub Channel Information */ - unsigned char sub_ch_id; /* 6 bits */ - unsigned short start_addr; /* 10 bits */ - - /* FIG 0/2 */ - unsigned char tmid; /* 2 bits */ - unsigned char svc_type; /* 6 bits */ - unsigned long svc_id; /* 16/32 bits */ - unsigned char svc_label[SVC_LABEL_MAX+1]; /* 16*8 bits */ -} ; - -struct ensemble_info_type { - unsigned long ensem_freq; /* 4 bytes */ - unsigned char tot_sub_ch; /* MAX: 64 */ - - unsigned short ensem_id; - unsigned char ensem_label[ENSEMBLE_LABEL_MAX+1]; - struct sub_ch_info_type sub_ch[SUB_CH_NUM_MAX]; -} ; - - -#define TDMB_CMD_START_FLAG 0x7F -#define TDMB_CMD_END_FLAG 0x7E -#define TDMB_CMD_SIZE 30 - -/* Result Value */ -#define DMB_FIC_RESULT_FAIL 0x00 -#define DMB_FIC_RESULT_DONE 0x01 -#define DMB_TS_PACKET_RESYNC 0x02 - -int tdmb_init_bus(void); -void tdmb_exit_bus(void); -irqreturn_t tdmb_irq_handler(int irq, void *dev_id); -unsigned long tdmb_get_chinfo(void); -void tdmb_pull_data(struct work_struct *work); -bool tdmb_control_irq(bool set); -void tdmb_control_gpio(bool poweron); -bool tdmb_create_workqueue(void); -bool tdmb_destroy_workqueue(void); -bool tdmb_create_databuffer(unsigned long int_size); -void tdmb_destroy_databuffer(void); -void tdmb_init_data(void); -unsigned char tdmb_make_result -( - unsigned char cmd, - unsigned short data_len, - unsigned char *data -); -bool tdmb_store_data(unsigned char *data, unsigned long len); - -struct tdmb_drv_func { - bool (*init) (void); - bool (*power_on) (void); - void (*power_off) (void); - bool (*scan_ch) (struct ensemble_info_type *ensembleInfo, - unsigned long freq); - void (*get_dm) (struct tdmb_dm *info); - bool (*set_ch) (unsigned long freq, unsigned char subchid, - bool factory_test); - void (*pull_data) (void); - unsigned long (*get_int_size) (void); -}; - -extern unsigned int get_hw_rev(void); - -extern unsigned int *tdmb_ts_head; -extern unsigned int *tdmb_ts_tail; -extern char *tdmb_ts_buffer; -extern unsigned int tdmb_ts_size; - -#if defined(CONFIG_TDMB_T3900) || defined(CONFIG_TDMB_T39F0) -struct tdmb_drv_func *t3900_drv_func(void); -#endif -#if defined(CONFIG_TDMB_FC8050) -struct tdmb_drv_func *fc8050_drv_func(void); -#endif -#if defined(CONFIG_TDMB_MTV318) -struct tdmb_drv_func *mtv318_drv_func(void); -#endif -#if defined(CONFIG_TDMB_TCC3170) -struct tdmb_drv_func *tcc3170_drv_func(void); -extern struct tcbd_fic_ensbl *tcbd_fic_get_ensbl_info(s32 _disp); -#endif - -#if defined(CONFIG_TDMB_SPI) -struct spi_device *tdmb_get_spi_handle(void); -#endif - -#ifdef CONFIG_BATTERY_SEC -extern unsigned int is_lpcharging_state(void); -#endif - -#endif diff --git a/drivers/media/tdmb/tdmb_data.c b/drivers/media/tdmb/tdmb_data.c deleted file mode 100644 index 6f11ff8..0000000 --- a/drivers/media/tdmb/tdmb_data.c +++ /dev/null @@ -1,463 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb_data.c -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -/* for delay(sleep) */ -#include - -/* for mutex */ -#include - -/*using copy to user */ -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include "tdmb.h" - -#define TS_PACKET_SIZE 188 -#define MSC_BUF_SIZE 1024 - -static unsigned char *msc_buff; -static unsigned char *ts_buff; - -static int ts_buff_size; -static int first_packet = 1; -static int ts_buff_pos; -static int msc_buff_pos; -static int mp2_len; -static const int bitrate_table[2][16] = { - /* MPEG1 for id=1*/ - {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0}, - /* MPEG2 for id=0 */ - {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0} -}; - -static struct workqueue_struct *tdmb_workqueue; -static DECLARE_WORK(tdmb_work, tdmb_pull_data); - -irqreturn_t tdmb_irq_handler(int irq, void *dev_id) -{ - int ret = 0; - - if (tdmb_workqueue) { - ret = queue_work(tdmb_workqueue, &tdmb_work); - if (ret == 0) - DPRINTK("failed in queue_work\n"); - } - - return IRQ_HANDLED; -} - -bool tdmb_create_databuffer(unsigned long int_size) -{ - ts_buff_size = int_size * 2; - - msc_buff = vmalloc(MSC_BUF_SIZE); - ts_buff = vmalloc(ts_buff_size); - - if (msc_buff && ts_buff) { - return true; - } else { - if (msc_buff) - vfree(msc_buff); - if (ts_buff) - vfree(ts_buff); - - return false; - } -} - -void tdmb_destroy_databuffer(void) -{ - vfree(msc_buff); - vfree(ts_buff); -} - -bool tdmb_create_workqueue(void) -{ - tdmb_workqueue = create_singlethread_workqueue("ktdmbd"); - if (tdmb_workqueue) - return true; - else - return false; -} - -bool tdmb_destroy_workqueue(void) -{ - if (tdmb_workqueue) { - flush_workqueue(tdmb_workqueue); - destroy_workqueue(tdmb_workqueue); - tdmb_workqueue = NULL; - } - return true; -} - -void tdmb_init_data(void) -{ - first_packet = 1; - ts_buff_pos = 0; - msc_buff_pos = 0; - mp2_len = 0; -} - -static int __add_to_ringbuffer(unsigned char *data, unsigned long data_size) -{ - int ret = 0; - unsigned int size; - unsigned int head; - unsigned int tail; - unsigned int dist; - unsigned int temp_size; - - if (tdmb_ts_size == 0) - return 0; - - size = data_size; - head = *tdmb_ts_head; - tail = *tdmb_ts_tail; - - if (size > tdmb_ts_size) { - DPRINTK("Error - size too large\n"); - } else { - if (head >= tail) - dist = head-tail; - else - dist = tdmb_ts_size+head-tail; - - /* DPRINTK("dist: %x\n", dist); */ - - if ((tdmb_ts_size-dist) < size) { - DPRINTK("small space is left in ring(len:%d/free:%d)\n", - size, (tdmb_ts_size-dist)); - DPRINTK("ts_head:0x%x, ts_tail:0x%x/head:%d,tail:%d\n", - (unsigned int)tdmb_ts_head, - (unsigned int)tdmb_ts_tail, - (unsigned int)head, tail); - } else { - if (head+size <= tdmb_ts_size) { - memcpy((tdmb_ts_buffer+head), - (char *)data, size); - - head += size; - if (head == tdmb_ts_size) - head = 0; - } else { - temp_size = tdmb_ts_size-head; - temp_size = (temp_size/DMB_TS_SIZE)*DMB_TS_SIZE; - - if (temp_size > 0) - memcpy((tdmb_ts_buffer+head), - (char *)data, temp_size); - - memcpy(tdmb_ts_buffer, - (char *)(data+temp_size), - size-temp_size); - head = size-temp_size; - } - - /* - * DPRINTK("< data > %x, %x, %x, %x\n", - * *(tdmb_ts_buffer+ *tdmb_ts_head), - * *(tdmb_ts_buffer+ *tdmb_ts_head +1), - * *(tdmb_ts_buffer+ *tdmb_ts_head +2), - * *(tdmb_ts_buffer+ *tdmb_ts_head +3) ); - - * DPRINTK("exiting - head : %d\n",head); - */ - - *tdmb_ts_head = head; - } - } - - return ret; -} - - -static int __add_ts_data(unsigned char *data, unsigned long data_size) -{ - int j = 0; - int maxi = 0; - if (first_packet) { - DPRINTK("! first sync Size = %ld !\n", data_size); - - for (j = 0; j < data_size; j++) { - if (data[j] == 0x47) { - DPRINTK("!!!!! first sync j = %d !!!!!\n", j); - maxi = (data_size - j) / TS_PACKET_SIZE; - ts_buff_pos = (data_size - j) % TS_PACKET_SIZE; - __add_to_ringbuffer(&data[j], - maxi * TS_PACKET_SIZE); - if (ts_buff_pos > 0) - memcpy(ts_buff, - &data[j+maxi*TS_PACKET_SIZE], - ts_buff_pos); - first_packet = 0; - return 0; - } - } - } else { - maxi = (data_size) / TS_PACKET_SIZE; - - if (ts_buff_pos > 0) { - if (data[TS_PACKET_SIZE - ts_buff_pos] != 0x47) { - DPRINTK("! error 0x%x,0x%x !\n", - data[TS_PACKET_SIZE - ts_buff_pos], - data[TS_PACKET_SIZE - ts_buff_pos + 1]); - - memset(ts_buff, 0, ts_buff_size); - ts_buff_pos = 0; - first_packet = 1; - return -EPERM; - } - - memcpy(&ts_buff[ts_buff_pos], - data, TS_PACKET_SIZE-ts_buff_pos); - __add_to_ringbuffer(ts_buff, TS_PACKET_SIZE); - __add_to_ringbuffer(&data[TS_PACKET_SIZE - ts_buff_pos], - data_size - TS_PACKET_SIZE); - memcpy(ts_buff, - &data[data_size-ts_buff_pos], - ts_buff_pos); - } else { - if (data[0] != 0x47) { - DPRINTK("!! error 0x%x,0x%x!!\n", - data[0], - data[1]); - - memset(ts_buff, 0, ts_buff_size); - ts_buff_pos = 0; - first_packet = 1; - return -EPERM; - } - - __add_to_ringbuffer(data, data_size); - } - } - return 0; -} - -static int __get_mp2_len(unsigned char *pkt) -{ - int id; - int layer_index; - int bitrate_index; - int fs_index; - int samplerate; - int protection; - int bitrate; - int length; - - id = (pkt[1]>>3)&0x01; /* 1: ISO/IEC 11172-3, 0:ISO/IEC 13818-3 */ - layer_index = (pkt[1]>>1)&0x03; /* 2 */ - protection = pkt[1]&0x1; -/* - if (protection != 0) { - ; - } -*/ - bitrate_index = (pkt[2]>>4); - fs_index = (pkt[2]>>2)&0x3; /* 1 */ - - /* sync word check */ - if (pkt[0] == 0xff && (pkt[1]>>4) == 0xf) { - if ((bitrate_index > 0 && bitrate_index < 15) - && (layer_index == 2) && (fs_index == 1)) { - - if (id == 1 && layer_index == 2) { - /* Fs==48 KHz*/ - bitrate = 1000*bitrate_table[0][bitrate_index]; - samplerate = 48000; - } else if (id == 0 && layer_index == 2) { - /* Fs=24 KHz */ - bitrate = 1000*bitrate_table[1][bitrate_index]; - samplerate = 24000; - } else - return -EPERM; - - } else - return -EPERM; - } else - return -EPERM; - - if ((pkt[2]&0x02) != 0) { /* padding bit */ - return -EPERM; - } - - length = (144*bitrate)/(samplerate); - - return length; -} - -static int -__add_msc_data(unsigned char *data, unsigned long data_size, int sub_ch_id) -{ - int j; - int readpos = 0; - unsigned char pOutAddr[TS_PACKET_SIZE]; - int remainbyte = 0; - static int first = 1; - - if (first_packet) { - for (j = 0; j < data_size-4; j++) { - if (data[j] == 0xFF && ((data[j+1]>>4) == 0xF)) { - mp2_len = __get_mp2_len(&data[j]); - DPRINTK("first sync mp2_len= %d\n", mp2_len); - if (mp2_len <= 0 || mp2_len > MSC_BUF_SIZE) - return -EPERM; - - memcpy(msc_buff, &data[j], data_size-j); - msc_buff_pos = data_size-j; - first_packet = 0; - first = 1; - return 0; - } - } - } else { - if (mp2_len <= 0 || mp2_len > MSC_BUF_SIZE) { - msc_buff_pos = 0; - first_packet = 1; - return -EPERM; - } - - remainbyte = data_size; - if ((mp2_len-msc_buff_pos) >= data_size) { - memcpy(msc_buff+msc_buff_pos, data, data_size); - msc_buff_pos += data_size; - remainbyte = 0; - } else if (mp2_len-msc_buff_pos > 0) { - memcpy(msc_buff+msc_buff_pos, - data, (mp2_len - msc_buff_pos)); - remainbyte = data_size - (mp2_len - msc_buff_pos); - msc_buff_pos = mp2_len; - } - - if (msc_buff_pos == mp2_len) { - while (msc_buff_pos > readpos) { - if (first) { - pOutAddr[0] = 0xDF; - pOutAddr[1] = 0xDF; - pOutAddr[2] = (sub_ch_id<<2); - pOutAddr[2] |= - (((msc_buff_pos>>3)>>8)&0x03); - pOutAddr[3] = (msc_buff_pos>>3)&0xFF; - - if (!(msc_buff[0] == 0xFF - && ((msc_buff[1]>>4) == 0xF))) { - DPRINTK("!!error 0x%x,0x%x!!\n", - msc_buff[0], - msc_buff[1]); - memset(msc_buff, - 0, - MSC_BUF_SIZE); - msc_buff_pos = 0; - first_packet = 1; - return -EPERM; - } - - memcpy(pOutAddr+4, msc_buff, 184); - readpos = 184; - first = 0; - } else { - pOutAddr[0] = 0xDF; - pOutAddr[1] = 0xD0; - if (msc_buff_pos-readpos >= 184) { - memcpy(pOutAddr+4, - msc_buff+readpos, - 184); - readpos += 184; - } else { - memcpy(pOutAddr+4, - msc_buff+readpos, - msc_buff_pos-readpos); - readpos - += (msc_buff_pos-readpos); - } - } - __add_to_ringbuffer(pOutAddr, TS_PACKET_SIZE); - } - - first = 1; - msc_buff_pos = 0; - if (remainbyte > 0) { - memcpy(msc_buff - , data+data_size-remainbyte - , remainbyte); - msc_buff_pos = remainbyte; - } - } else if (msc_buff_pos > mp2_len) { - DPRINTK("! Error msc_buff_pos=%d, mp2_len =%d!\n", - msc_buff_pos, mp2_len); - memset(msc_buff, 0, MSC_BUF_SIZE); - msc_buff_pos = 0; - first_packet = 1; - return -EPERM; - } - } - - return 0; -} - -bool tdmb_store_data(unsigned char *data, unsigned long len) -{ - unsigned long i; - unsigned long maxi; - unsigned long subch_id = tdmb_get_chinfo(); - - if (subch_id == 0) { - return false; - } else { - subch_id = subch_id % 1000; - - if (subch_id >= 64) { - __add_ts_data(data, len); - } else { - maxi = len/TS_PACKET_SIZE; - for (i = 0 ; i < maxi ; i++) { - __add_msc_data(data, TS_PACKET_SIZE, subch_id); - data += TS_PACKET_SIZE; - } - if (len - maxi * TS_PACKET_SIZE) - __add_msc_data(data,\ - len - maxi * TS_PACKET_SIZE, subch_id); - } - return true; - } -} diff --git a/drivers/media/tdmb/tdmb_ebi.c b/drivers/media/tdmb/tdmb_ebi.c deleted file mode 100644 index 36c86f7..0000000 --- a/drivers/media/tdmb/tdmb_ebi.c +++ /dev/null @@ -1,36 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb_ebi.c -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include "tdmb.h" - -#define TDMB_BASE_ADDR_PHYS 0x98000000 -void *addr_tdmb_cs4_v; - -int tdmb_init_bus(void) -{ - addr_tdmb_cs4_v = ioremap(TDMB_BASE_ADDR_PHYS, PAGE_SIZE); - DPRINTK("TDMB EBI2 Init addr_tdmb_cs4_v(0x%x)\n", addr_tdmb_cs4_v); - return 0; -} - -void tdmb_exit_bus(void) -{ - addr_tdmb_cs4_v = NULL; -} diff --git a/drivers/media/tdmb/tdmb_port_fc8050.c b/drivers/media/tdmb/tdmb_port_fc8050.c deleted file mode 100644 index 639a648..0000000 --- a/drivers/media/tdmb/tdmb_port_fc8050.c +++ /dev/null @@ -1,220 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb_port_fc8050.c -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include - -#include "tdmb.h" -#include "dmbdrv_wrap_fc8050.h" - -static bool fc8050_on_air; -static bool fc8050_pwr_on; - -static bool __get_ensemble_info(struct ensemble_info_type *e_info - , unsigned long freq) -{ - int i; - int j; - int sub_i = 0; - int cnt; - const char *ensembleName = NULL; - struct sub_channel_info_type *fci_sub_info; - - DPRINTK("%s : freq(%ld)\n", __func__, freq); - - e_info->tot_sub_ch - = dmb_drv_get_dmb_sub_ch_cnt() + dmb_drv_get_dab_sub_ch_cnt(); - DPRINTK("total subchannel number : %d\n", e_info->tot_sub_ch); - - if (e_info->tot_sub_ch > 0) { - ensembleName = (char *)dmb_drv_get_ensemble_label(); - - if (ensembleName) - strncpy((char *)e_info->ensem_label, - (char *)ensembleName, - ENSEMBLE_LABEL_MAX); - - e_info->ensem_freq = freq; - - for (i = 0; i < 2; i++) { - cnt = (i == 0) - ? dmb_drv_get_dmb_sub_ch_cnt() - : dmb_drv_get_dab_sub_ch_cnt(); - - for (j = 0; j < cnt; j++, sub_i++) { - fci_sub_info = (i == 0) - ? dmb_drv_get_fic_dmb(j) - : dmb_drv_get_fic_dab(j); - - e_info->ensem_id - = fci_sub_info->uiEnsembleID; - e_info->sub_ch[sub_i].sub_ch_id - = fci_sub_info->ucSubchID; - e_info->sub_ch[sub_i].start_addr - = fci_sub_info->uiStartAddress; - e_info->sub_ch[sub_i].tmid - = fci_sub_info->ucTMId; - e_info->sub_ch[sub_i].svc_type - = fci_sub_info->ucServiceType; - e_info->sub_ch[sub_i].svc_id - = fci_sub_info->ulServiceID; - if (i == 0) - memcpy( - e_info->sub_ch[sub_i].svc_label, - dmb_drv_get_sub_ch_dmb_label(j), - SVC_LABEL_MAX); - else - memcpy(e_info->sub_ch[sub_i].svc_label, - dmb_drv_get_sub_ch_dab_label(j), - SVC_LABEL_MAX); - - } - } - return true; - } else { - return false; - } -} - -static void fc8050_power_off(void) -{ - DPRINTK("call TDMB_PowerOff !\n"); - - if (fc8050_pwr_on) { - fc8050_on_air = false; - - dmb_drv_deinit(); - - tdmb_control_irq(false); - tdmb_control_gpio(false); - - fc8050_pwr_on = false; - } -} - -static bool fc8050_power_on(void) -{ - DPRINTK("fc8050_power_on\n"); - - if (fc8050_pwr_on) { - return true; - } else { - tdmb_control_gpio(true); - - if (dmb_drv_init() == TDMB_FAIL) { - tdmb_control_gpio(false); - return false; - } else { - tdmb_control_irq(true); - fc8050_pwr_on = true; - return true; - } - } -} -static void fc8050_get_dm(struct tdmb_dm *info) -{ - if (fc8050_pwr_on == true && fc8050_on_air == true) { - info->rssi = dmb_drv_get_rssi(); - info->ber = dmb_drv_get_ber(); - info->antenna = dmb_drv_get_ant(); - info->per = 0; - } else { - info->rssi = 100; - info->ber = 2000; - info->per = 0; - info->antenna = 0; - } -} - -static bool fc8050_set_ch(unsigned long freq, - unsigned char sub_ch_id, - bool factory_test) -{ - unsigned long freq_temp = freq / 1000; - unsigned char sub_ch_id_temp = sub_ch_id % 1000; - unsigned char svc_type_temp = 0x0; - - if (sub_ch_id_temp >= 64) { - sub_ch_id_temp -= 64; - svc_type_temp = 0x18; - } - - DPRINTK("fc8050_set_ch freq:%ld, sub_ch_id:%d, svc_type:%d\n", - freq_temp, sub_ch_id_temp, svc_type_temp); - - fc8050_on_air = false; - - if (dmb_drv_set_ch(freq_temp, sub_ch_id_temp, svc_type_temp) == 1) { - DPRINTK("dmb_drv_set_ch Success\n"); - fc8050_on_air = true; - return true; - } else { - DPRINTK("dmb_drv_set_ch Fail\n"); - return false; - } -} - -static bool fc8050_scan_ch(struct ensemble_info_type *e_info - , unsigned long freq) -{ - if (fc8050_pwr_on == false || e_info == NULL) - return false; - else if (dmb_drv_scan_ch((freq / 1000)) == TDMB_SUCCESS) - return __get_ensemble_info(e_info, freq); - else - return false; -} - -static unsigned long fc8050_int_size(void) -{ - return 188*40; -} - -static struct tdmb_drv_func fci_fc8050_drv_func = { - .power_on = fc8050_power_on, - .power_off = fc8050_power_off, - .scan_ch = fc8050_scan_ch, - .get_dm = fc8050_get_dm, - .set_ch = fc8050_set_ch, - .pull_data = dmb_drv_isr, - .get_int_size = fc8050_int_size, -}; - -struct tdmb_drv_func *fc8050_drv_func(void) -{ - DPRINTK("tdmb_get_drv_func : fc8050\n"); - return &fci_fc8050_drv_func; -} diff --git a/drivers/media/tdmb/tdmb_port_mtv318.c b/drivers/media/tdmb/tdmb_port_mtv318.c deleted file mode 100644 index aa29a9b..0000000 --- a/drivers/media/tdmb/tdmb_port_mtv318.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb_port_mtv318.c -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include - -#include "raontv.h" -#include "raontv_internal.h" -#include "raontv_ficdec_internal.h" -#include "raontv_ficdec.h" - -#include "tdmb.h" - -#define MTV318_INTERRUPT_SIZE (188*10) -/* #define TDMB_DEBUG_SCAN */ - -static bool mtv318_on_air; -static bool mtv318_pwr_on; -static unsigned char stream_buff[MTV318_INTERRUPT_SIZE + 1]; - -static void __print_ensemble_info(struct ensemble_info_type *e_info) -{ - int i = 0; - - DPRINTK("ensem_freq(%ld)\n", e_info->ensem_freq); - DPRINTK("ensem_label(%s)\n", e_info->ensem_label); - for (i = 0; i < e_info->tot_sub_ch; i++) { - DPRINTK("sub_ch_id(0x%x)\n", e_info->sub_ch[i].sub_ch_id); - DPRINTK("start_addr(0x%x)\n", e_info->sub_ch[i].start_addr); - DPRINTK("tmid(0x%x)\n", e_info->sub_ch[i].tmid); - DPRINTK("svc_type(0x%x)\n", e_info->sub_ch[i].svc_type); - DPRINTK("svc_label(%s)\n", e_info->sub_ch[i].svc_label); - } -} - -static bool __get_ensemble_info(struct ensemble_info_type *e_info - , unsigned long freq) -{ - DPRINTK("%s\n", __func__); - memcpy(e_info, - rtvFICDEC_GetEnsembleInfo(freq), - sizeof(struct ensemble_info_type)); - - if (e_info->tot_sub_ch) { -#ifdef TDMB_DEBUG_SCAN - __print_ensemble_info(e_info); -#endif - return true; - } else { - return false; - } -} - -static void mtv318_power_off(void) -{ - DPRINTK("mtv318_power_off\n"); - - if (mtv318_pwr_on) { - mtv318_on_air = false; - tdmb_control_irq(false); - tdmb_control_gpio(false); - - mtv318_pwr_on = false; - - RTV_GUARD_DEINIT; - } -} - -static bool mtv318_power_on(void) -{ - DPRINTK("mtv318_power_on\n"); - - if (mtv318_pwr_on) { - return true; - } else { - tdmb_control_gpio(true); - - if (rtvTDMB_Initialize(RTV_COUNTRY_BAND_KOREA) != RTV_SUCCESS) { - tdmb_control_gpio(false); - return false; - } else { - tdmb_control_irq(true); - mtv318_pwr_on = true; - return true; - } - } -} - -static void mtv318_get_dm(struct tdmb_dm *info) -{ - if (mtv318_pwr_on == true && mtv318_on_air == true) { - info->rssi = (rtvTDMB_GetRSSI() / RTV_TDMB_RSSI_DIVIDER); - info->per = rtvTDMB_GetPER(); - info->ber = rtvTDMB_GetCER(); - info->antenna = rtvTDMB_GetAntennaLevel(info->ber); - } else { - info->rssi = 100; - info->ber = 2000; - info->per = 0; - info->antenna = 0; - } -} - -static bool mtv318_set_ch(unsigned long freq - , unsigned char subchid - , bool factory_test) -{ - bool ret = false; - enum E_RTV_TDMB_SERVICE_TYPE eServiceType; - - DPRINTK("%s : %ld %d\n", __func__, freq, subchid); - - if (mtv318_pwr_on) { - if (subchid >= 64) { - subchid -= 64; - eServiceType = RTV_TDMB_SERVICE_VIDEO; - } else { - eServiceType = RTV_TDMB_SERVICE_AUDIO; - } - - ret = rtvTDMB_OpenSubChannel((freq/1000), - subchid, - eServiceType, - MTV318_INTERRUPT_SIZE); - if (ret == RTV_SUCCESS || ret == RTV_NO_MORE_SUB_CHANNEL) { - mtv318_on_air = true; - ret = TRUE; - DPRINTK("mtv318_set_ch Success\n"); - } else { - DPRINTK("mtv318_set_ch Fail\n"); - } - } - - return ret; -} - -static bool mtv318_scan_ch(struct ensemble_info_type *e_info - , unsigned long freq) -{ - bool ret = false; - - if (mtv318_pwr_on == true && e_info != NULL) { - if (rtvTDMB_ScanFrequency(freq/1000) == RTV_SUCCESS) { - rtvTDMB_OpenFIC(); - ret = rtvFICDEC_Decode(freq/1000); - rtvTDMB_CloseFIC(); - if (ret == true) - __get_ensemble_info(e_info, (freq)); - } - } - - return ret; -} - -static void mtv318_pull_data(void) -{ - unsigned char int_type_val1; - unsigned char int_type_val2; - - RTV_GUARD_LOCK; - - RTV_REG_MAP_SEL(DD_PAGE); - int_type_val1 = RTV_REG_GET(INT_E_STATL); - int_type_val2 = RTV_REG_GET(INT_E_STATH); - - /*=========================================== - * Processing MSC1 interrupt. - * T-DMB/DAB: 1 VIDEO data or 1 AUDIO data - * 1 seg: 1 VIDEO data - * FM: PCM data - *===========================================*/ - /* MSC1 memory overflow or under run */ - if (int_type_val1&(MSC1_E_INT|MSC1_E_OVER_FLOW|MSC1_E_UNDER_FLOW)) { - if (int_type_val1 & (MSC1_E_OVER_FLOW|MSC1_E_UNDER_FLOW)) { - rtv_ClearAndSetupMemory_MSC1(); - /* MSC1 Interrupt status clear */ - RTV_REG_SET(INT_E_UCLRL, 0x04); - DPRINTK("%s : int_type 0x%x\n", - __func__, int_type_val1); - } else { - /* Get the frame data using CPU or DMA. - RTV_REG_BURST_GET() macro should implemented by user. */ - RTV_REG_MAP_SEL(MSC1_PAGE); - RTV_REG_BURST_GET(0x10, stream_buff, - MTV318_INTERRUPT_SIZE+1); - - RTV_REG_MAP_SEL(DD_PAGE); - /* MSC1 Interrupt status clear */ - RTV_REG_SET(INT_E_UCLRL, 0x04); - - tdmb_store_data(&stream_buff[1], MTV318_INTERRUPT_SIZE); - } - } - - RTV_GUARD_FREE; -} - -static unsigned long mtv318_int_size(void) -{ - return MTV318_INTERRUPT_SIZE; -} - -static bool mtv318_init(void) -{ - RTV_GUARD_INIT; - return true; -} - -static struct tdmb_drv_func raontech_mtv318_drv_func = { - .init = mtv318_init, - .power_on = mtv318_power_on, - .power_off = mtv318_power_off, - .scan_ch = mtv318_scan_ch, - .get_dm = mtv318_get_dm, - .set_ch = mtv318_set_ch, - .pull_data = mtv318_pull_data, - .get_int_size = mtv318_int_size, -}; - -struct tdmb_drv_func *mtv318_drv_func(void) -{ - DPRINTK("tdmb_get_drv_func : mtv318\n"); - return &raontech_mtv318_drv_func; -} diff --git a/drivers/media/tdmb/tdmb_port_t3900.c b/drivers/media/tdmb/tdmb_port_t3900.c deleted file mode 100644 index ac40d73..0000000 --- a/drivers/media/tdmb/tdmb_port_t3900.c +++ /dev/null @@ -1,291 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb_port_t3900.c -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include - -#include "tdmb.h" -#include "INC_INCLUDES.h" - -static struct ST_SUBCH_INFO *st_ch_info; -static bool t3900_on_air; -static bool t3900_pwr_on; -static unsigned char stream_buff[INC_INTERRUPT_SIZE+188]; - -static bool __get_ensemble_info(struct ensemble_info_type *e_info - , unsigned long freq) -{ - int i; - int j; - int sub_i = 0; - int cnt; - const char *e_name = NULL; - struct INC_CHANNEL_INFO *inc_sub_info; - - DPRINTK("t3900_get_ensemble_info - freq(%ld)\n", freq); - - e_info->tot_sub_ch = - INTERFACE_GETDMB_CNT() + INTERFACE_GETDAB_CNT(); - DPRINTK("total subchannel number : %d\n" - , e_info->tot_sub_ch); - - if (e_info->tot_sub_ch > 0) { - e_name = - (char *)INTERFACE_GETENSEMBLE_LABEL(TDMB_I2C_ID80); - - if (e_name) - strncpy((char *)e_info->ensem_label, - (char *)e_name, - ENSEMBLE_LABEL_MAX); - - e_info->ensem_freq = freq; - - for (i = 0; i < 2; i++) { - cnt = (i == 0) ? INTERFACE_GETDMB_CNT() - : INTERFACE_GETDAB_CNT(); - - for (j = 0; j < cnt; j++, sub_i++) { - inc_sub_info = (i == 0) - ? INTERFACE_GETDB_DMB(j) - : INTERFACE_GETDB_DAB(j); - e_info->sub_ch[sub_i].sub_ch_id - = inc_sub_info->ucSubChID; - e_info->sub_ch[sub_i].start_addr - = inc_sub_info->uiStarAddr; - e_info->sub_ch[sub_i].tmid - = inc_sub_info->uiTmID; - e_info->sub_ch[sub_i].svc_type - = inc_sub_info->ucServiceType; - e_info->sub_ch[sub_i].svc_id - = inc_sub_info->ulServiceID; - memcpy(e_info->sub_ch[sub_i].svc_label, - inc_sub_info->aucLabel, - SVC_LABEL_MAX); - - } - } - return true; - } else { - return false; - } -} - -static void t3900_power_off(void) -{ - DPRINTK("t3900_power_off\n"); - - if (t3900_pwr_on) { - t3900_on_air = false; - - INC_STOP(TDMB_I2C_ID80); - - tdmb_control_irq(false); - tdmb_control_gpio(false); - - vfree(st_ch_info); - st_ch_info = NULL; - - t3900_pwr_on = false; - } -} - -static bool t3900_power_on(void) -{ - DPRINTK("t3900_power_on\n"); - - if (t3900_pwr_on) { - return true; - } else { - st_ch_info = vmalloc(sizeof(struct ST_SUBCH_INFO)); - if (st_ch_info == NULL) { - return false; - } else { - tdmb_control_gpio(true); - - if (INTERFACE_INIT(TDMB_I2C_ID80) != INC_SUCCESS) { - tdmb_control_gpio(false); - - vfree(st_ch_info); - st_ch_info = NULL; - - return false; - } else { - tdmb_control_irq(true); - t3900_pwr_on = true; - return true; - } - } - } -} - -static void t3900_get_dm(struct tdmb_dm *info) -{ - if (t3900_pwr_on == true && t3900_on_air == true) { - INC_STATUS_CHECK(TDMB_I2C_ID80); - info->rssi = INC_GET_RSSI(TDMB_I2C_ID80); - info->ber = INC_GET_SAMSUNG_BER(TDMB_I2C_ID80); - info->antenna = INC_GET_SAMSUNG_ANT_LEVEL(TDMB_I2C_ID80); - info->per = 0; - } else { - info->rssi = 100; - info->ber = 2000; - info->per = 0; - info->antenna = 0; - } -} - -static bool t3900_set_ch(unsigned long freq - , unsigned char subchid - , bool factory_test) -{ - unsigned char ret_err; - bool ret = false; - - if (t3900_pwr_on) { - st_ch_info->nSetCnt = 1; - st_ch_info->astSubChInfo[0].ulRFFreq = freq / 1000; - st_ch_info->astSubChInfo[0].ucSubChID = subchid; - st_ch_info->astSubChInfo[0].ucServiceType = 0x0; - if (st_ch_info->astSubChInfo[0].ucSubChID >= 64) { - st_ch_info->astSubChInfo[0].ucSubChID -= 64; - st_ch_info->astSubChInfo[0].ucServiceType = 0x18; - } - - t3900_on_air = false; - - if (factory_test == false) - ret_err = INTERFACE_START( - TDMB_I2C_ID80, st_ch_info); - else - ret_err = INTERFACE_START_TEST( - TDMB_I2C_ID80, st_ch_info); - - if (ret_err == INC_SUCCESS) { - /* TODO Ensemble good code .... */ - t3900_on_air = true; - ret = true; - } else if (ret_err == INC_RETRY) { - DPRINTK("IOCTL_TDMB_ASSIGN_CH retry\n"); - - t3900_power_off(); - t3900_power_on(); - - if (factory_test == false) - ret_err = INTERFACE_START( - TDMB_I2C_ID80, st_ch_info); - else - ret_err = INTERFACE_START_TEST( - TDMB_I2C_ID80, st_ch_info); - - if (ret_err == INC_SUCCESS) { - /* TODO Ensemble good code .... */ - t3900_on_air = true; - ret = true; - } - } - } - - return ret; -} - -static bool t3900_scan_ch(struct ensemble_info_type *e_info - , unsigned long freq) -{ - if (t3900_pwr_on == false || e_info == NULL) - return false; - else if (INTERFACE_SCAN(TDMB_I2C_ID80, (freq / 1000)) == INC_SUCCESS) - return __get_ensemble_info(e_info, freq); - else - return false; -} - -static void t3900_pull_data(void) -{ - unsigned short remain_len = INC_INTERRUPT_SIZE; -#if !(INC_INTERRUPT_SIZE <= 0xFFF) - unsigned short idx = 0; - unsigned short spi_size = 0xFFF; -#endif - - memset(stream_buff, 0, sizeof(stream_buff)); - -#if (INC_INTERRUPT_SIZE <= 0xFFF) - INC_CMD_READ_BURST( - TDMB_I2C_ID80, APB_STREAM_BASE - , stream_buff - , remain_len); -#else - while (remain_len) { - if (remain_len >= spi_size) { - INC_CMD_READ_BURST( - TDMB_I2C_ID80, APB_STREAM_BASE - , &stream_buff[idx*spi_size] - , spi_size); - idx++; - remain_len -= spi_size; - } else { - INC_CMD_READ_BURST( - TDMB_I2C_ID80, APB_STREAM_BASE - , &stream_buff[idx*spi_size] - , remain_len); - remain_len = 0; - } - } -#endif - - tdmb_store_data(stream_buff, INC_INTERRUPT_SIZE); -} - -static unsigned long t3900_int_size(void) -{ - return INC_INTERRUPT_SIZE; -} - -static struct tdmb_drv_func inc_t3900_drv_func = { - .power_on = t3900_power_on, - .power_off = t3900_power_off, - .scan_ch = t3900_scan_ch, - .get_dm = t3900_get_dm, - .set_ch = t3900_set_ch, - .pull_data = t3900_pull_data, - .get_int_size = t3900_int_size, -}; - -struct tdmb_drv_func *t3900_drv_func(void) -{ - DPRINTK("tdmb_get_drv_func : t3900\n"); - return &inc_t3900_drv_func; -} diff --git a/drivers/media/tdmb/tdmb_port_tcc3170.c b/drivers/media/tdmb/tdmb_port_tcc3170.c deleted file mode 100644 index b6e6abe..0000000 --- a/drivers/media/tdmb/tdmb_port_tcc3170.c +++ /dev/null @@ -1,478 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb_port_tcc3170.c -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include "tdmb.h" - -#include "tcpal_os.h" -#include "tcpal_queue.h" - -#include "tcbd_feature.h" -#include "tcbd_api_common.h" -#include "tcbd_drv_io.h" -#include "tcbd_stream_parser.h" -#include "tcc_fic_decoder.h" -#include "tcbd_drv_ip.h" -#include "tcc_fic_decoder.h" - -#include "tcbd_hal.h" - -/* #define TDMB_DEBUG_SCAN */ - -static DEFINE_MUTEX(tcc3170_mutex); - -static DECLARE_WAIT_QUEUE_HEAD(wq); -static bool scan_done; - -static bool tcc3170_on_air; -static bool tcc3170_pwr_on; -static struct tcbd_device tcc3170_device; -static unsigned char prev_subch = 0xFF; - -#ifdef TDMB_DEBUG_SCAN -static void __print_ensemble_info(struct ensemble_info_type *e_info) -{ - int i = 0; - - DPRINTK("ensem_freq(%ld)\n", e_info->ensem_freq); - DPRINTK("ensem_label(%s)\n", e_info->ensem_label); - for (i = 0; i < e_info->tot_sub_ch; i++) { - DPRINTK("[%d]\n", i); - DPRINTK("svc_label(%s)\n", e_info->sub_ch[i].svc_label); - DPRINTK("sub_ch_id(0x%x)\n", e_info->sub_ch[i].sub_ch_id); - DPRINTK("start_addr(0x%x)\n", e_info->sub_ch[i].start_addr); - DPRINTK("tmid(0x%x)\n", e_info->sub_ch[i].tmid); - DPRINTK("svc_type(0x%x)\n", e_info->sub_ch[i].svc_type); - } -} -#endif - -static bool __get_ensemble_info(struct ensemble_info_type *e_info - , unsigned long freq) -{ - struct tcc_ensemble_info *ensbl_info; - struct tcc_ensemble *esbl = &ensbl_info->ensbl; - struct tcc_service_info *svc_info; - struct tcc_service_comp_info *svc_comp_info; - - unsigned char i; - unsigned char cnt = 0; - - ensbl_info = tcc_fic_get_ensbl_info(1); - esbl = &ensbl_info->ensbl; - - memset(e_info, 0, sizeof(e_info)); - - e_info->ensem_freq = freq; - e_info->ensem_id = esbl->eid; - strncpy(e_info->ensem_label, esbl->label, \ - ENSEMBLE_LABEL_MAX); - - for (i = 0; i < esbl->num_svc; i++) { - svc_info = &ensbl_info->svc_info[i]; - svc_comp_info = &svc_info->svc_comp_info[0]; - if ((svc_comp_info->svc_comp.tmid == 0x00 && - svc_comp_info->svc_comp.ascty_dscty == 0x00) || - (svc_comp_info->svc_comp.tmid == 0x01 && - svc_comp_info->svc_comp.ascty_dscty == 0x18)) { - e_info->sub_ch[cnt].sub_ch_id = \ - svc_comp_info->sub_ch.subch_id; - e_info->sub_ch[cnt].start_addr = \ - svc_comp_info->sub_ch.start_cu; - e_info->sub_ch[cnt].tmid = \ - svc_comp_info->svc_comp.tmid; - e_info->sub_ch[cnt].svc_type = \ - svc_comp_info->svc_comp.ascty_dscty; - e_info->sub_ch[cnt].svc_id = \ - svc_comp_info->svc_comp.scid; - strncpy(e_info->sub_ch[cnt].svc_label, \ - svc_info->svc.svc_label, SVC_LABEL_MAX); - cnt++; - } - } - e_info->tot_sub_ch = cnt; - -#ifdef TDMB_DEBUG_SCAN - __print_ensemble_info(e_info); -#endif - - return (e_info->tot_sub_ch > 0) ? true : false; -} - -static void tcc3170_power_off(void) -{ - DPRINTK("call TDMB_PowerOff !\n"); - - mutex_lock(&tcc3170_mutex); - - if (tcc3170_pwr_on) { - tcc3170_on_air = false; - - if (prev_subch != 0xFF) { - tcbd_unregister_service(&tcc3170_device, prev_subch); - prev_subch = 0xFF; - } - - tcbd_io_close(&tcc3170_device); - - tdmb_control_irq(false); - tdmb_control_gpio(false); - - tcc3170_pwr_on = false; - } - - mutex_unlock(&tcc3170_mutex); - -} - -static bool tcc3170_power_on(void) -{ - unsigned char chip_id = 0; - s32 ret; - - DPRINTK("tcc3170_power_on\n"); - - if (tcc3170_pwr_on) { - return true; - } else { - tdmb_control_gpio(true); - - /* command io open */ - ret = tcbd_io_open(&tcc3170_device); - if (ret < 0) { - DPRINTK("failed io open %d\n", (int)ret); - tdmb_control_gpio(false); - return false; - } - - /* check chip id */ - tcbd_reg_read(&tcc3170_device, TCBD_CHIPID, &chip_id); - DPRINTK("chip id : 0X%X\n", chip_id); - if (chip_id != TCBD_CHIPID_VALUE) { - DPRINTK("invalid chip id !!! exit!\n"); - tcbd_io_close(&tcc3170_device); - tdmb_control_gpio(false); - return false; - } else { -#ifdef CONFIG_TDMB_SPI - tcbd_select_peri(&tcc3170_device, PERI_TYPE_SPI_ONLY); - tcbd_change_irq_mode \ - (&tcc3170_device, INTR_MODE_LEVEL_LOW); -#else -#error -#endif /* CONFIG_TDMB_SPI */ - if (tcbd_device_start \ - (&tcc3170_device, CLOCK_19200KHZ) < 0) { - DPRINTK("could not start device!!\n"); - tcbd_io_close(&tcc3170_device); - tdmb_control_gpio(false); - return false; - } else { - tdmb_control_irq(true); - tcc3170_pwr_on = true; - return true; - } - } - } -} - - -static s32 tcbd_get_ant_level(u32 pcber, s32 rssi) -{ - s32 ant_level = 0; - - s32 ant75[] = {300, 450, 600, 800, 950, 1150, }; - s32 ant80[] = {-1, 450, 600, 800, 950, 1150, }; - s32 ant85[] = {-1, -1, 600, 800, 900, 1150, }; - s32 ant90[] = {-1, -1, -1, 800, 950, 1150, }; - s32 ant100[] = {-1, -1, -1, -1, 950, 1150, }; - s32 *ant = ant75; - - if (rssi > -75) - ant = ant75; - else if (rssi > -80) - ant = ant80; - else if (rssi > -85) - ant = ant85; - else if (rssi > -90) - ant = ant90; - else if (rssi > -100) - ant = ant100; - - if ((s32)pcber <= ant[0]) - ant_level = 6; - else if ((s32)pcber <= ant[1]) - ant_level = 5; - else if ((s32)pcber <= ant[2]) - ant_level = 4; - else if ((s32)pcber <= ant[3]) - ant_level = 3; - else if ((s32)pcber <= ant[4]) - ant_level = 2; - else if ((s32)pcber <= ant[5]) - ant_level = 1; - else if ((s32)pcber > ant[5]) - ant_level = 0; - - return ant_level; -} - -static void tcc3170_get_dm(struct tdmb_dm *info) -{ - struct tcbd_status_data status; - - if (tcc3170_pwr_on == true && tcc3170_on_air == true) { - tcbd_read_signal_info(&tcc3170_device, &status); - - info->ber = status.pcber_moving_avg; - info->rssi = status.rssi; - info->antenna = tcbd_get_ant_level(status.pcber, status.rssi); - info->per = status.tsper; - } else { - info->rssi = 100; - info->ber = 3000; - info->per = 100; - info->antenna = 0; - } -} - -static s32 __set_frequency(unsigned long freqKHz, bool scan_mode) -{ - s32 ret = 0; - u8 status; - - tcbd_disable_irq(&tcc3170_device, 0); - tcc_fic_parser_init(); - ret = tcbd_tune_frequency(&tcc3170_device, freqKHz, 1500); - if (ret < 0) { - DPRINTK("tcbd_tune_frequency fail %d\n", ret); - return -EFAULT; - } - - if (scan_mode) { - ret = tcbd_wait_tune(&tcc3170_device, &status); - if (ret < 0) { - DPRINTK("wait_tune fail status:0x%02X, ret:0x%x\n", \ - status, ret); - ret = -EFAULT; - } - } - DPRINTK("%s : status:0x%02X, ret:0x%x\n", __func__, status, ret); - - if (ret == TCERR_SUCCESS) { -#if defined(__CSPI_ONLY__) - tcbd_enable_irq(&tcc3170_device, TCBD_IRQ_EN_DATAINT); -#else -#error -#endif - } - return ret; -} - -static bool tcc3170_set_ch(unsigned long freq, - unsigned char sub_ch_id, - bool factory_test) -{ - unsigned long freq_temp = freq / 1000; - unsigned char sub_ch_id_temp = sub_ch_id % 1000; - s32 ret; - - DPRINTK("tcc3170_set_ch freq:%ld, sub_ch_id:%d\n", - freq_temp, sub_ch_id_temp); - - tcc3170_on_air = false; - - if (prev_subch != 0xFF) { - tcbd_unregister_service(&tcc3170_device, prev_subch); - prev_subch = 0xFF; - } - - if (__set_frequency((freq/1000), true) == TCERR_SUCCESS) { - if (sub_ch_id_temp >= 64) { - sub_ch_id_temp -= 64; - ret = tcbd_register_service( - &tcc3170_device, sub_ch_id_temp, 1); - } else { - ret = tcbd_register_service( - &tcc3170_device, sub_ch_id_temp, 0); - } - if (ret == TCERR_SUCCESS) { - DPRINTK("dmb_drv_set_ch Success\n"); - prev_subch = sub_ch_id_temp - 64; - tcc3170_on_air = true; - } - } - - if (tcc3170_on_air == false) - DPRINTK("dmb_drv_set_ch Fail\n"); - - return tcc3170_on_air; -} - -static bool tcc3170_scan_ch(struct ensemble_info_type *e_info - , unsigned long freq) -{ - bool ret = false; - - if (tcc3170_pwr_on == true && e_info != NULL) { - if (prev_subch != 0xFF) { - tcbd_unregister_service(&tcc3170_device, prev_subch); - prev_subch = 0xFF; - } - - tcc_fic_parser_init(); - scan_done = false; - if (__set_frequency((freq/1000), true) == TCERR_SUCCESS) { - msleep(1200); /* optimize this point */ - - if (scan_done == true) - ret = __get_ensemble_info(e_info, freq); - } - } - - return ret; -} - -static unsigned long tcc3170_int_size(void) -{ - return TCBD_MAX_THRESHOLD * 2; -} - -static void tcc3170_pull_data(void) -{ - s32 size, ret = 0; - s8 irq_status; - s8 irq_error; - static u8 buff_read[TCBD_MAX_THRESHOLD*2]; - - if (!tcc3170_pwr_on) - return; - - mutex_lock(&tcc3170_mutex); - - ret = tcbd_read_irq_status(&tcc3170_device, &irq_status, &irq_error); - ret |= tcbd_clear_irq(&tcc3170_device, irq_status); - ret |= tcbd_read_stream(&tcc3170_device, buff_read, &size); - if (ret == 0 && !irq_error) { - tcbd_split_stream(0, buff_read, size); - } else { - DPRINTK("### buffer is full, skip the data " - "(ret:%d, status=0x%02X, error=0x%02X) ###\n", - ret, irq_status, irq_error); - - tcbd_init_stream_data_config(&tcc3170_device, - ENABLE_CMD_FIFO, - tcc3170_device.selected_buff, - tcc3170_device.intr_threshold); - /*tcbd_reset_ip(device, TCBD_SYS_COMP_ALL, TCBD_SYS_COMP_EP);*/ - tcbd_init_parser(0, NULL); - } - mutex_unlock(&tcc3170_mutex); -} - -static s32 __stream_callback( - s32 _dev_idx, - u8 *_stream, - s32 _size, - u8 _subch_id, - u8 _type) -{ - u8 *stream; - s32 size; - s32 ret, i = 0; - -#ifdef __CALLBACK_BUFFER_HEADER__ - stream = _stream + SIZE_BUFF_HEADER; - size = _size - SIZE_BUFF_HEADER; -#else - stream = _stream; - size = _size; -#endif - - /* DPRINTK("%s : _type %d size %d\n", __func__, _type, size); */ - - switch (_type) { - case DATA_TYPE_FIC: /*FIC*/ - for (i = 0; i < size/TCBD_FIC_SIZE; i++) { - ret = tcc_fic_run_decoder(stream + (i*TCBD_FIC_SIZE), - MAX_FIC_SIZE); - if (ret > 0) - scan_done = true; - } - break; - case DATA_TYPE_MSC: /*MSC*/ - tdmb_store_data(stream, size); - break; - case DATA_TYPE_STATUS: /*STATUS*/ - tcbd_update_status(stream, size, NULL); - default: - break; - } - return 0; -} -static bool tcc3170_init(void) -{ -#if defined(__CSPI_ONLY__) - tcpal_set_cspi_io_function(); -#else -#error -#endif - tcbd_init_parser(0, __stream_callback); - - return true; -} - -static struct tdmb_drv_func telechips_tcc3170_drv_func = { - .init = tcc3170_init, - .power_on = tcc3170_power_on, - .power_off = tcc3170_power_off, - .scan_ch = tcc3170_scan_ch, - .get_dm = tcc3170_get_dm, - .set_ch = tcc3170_set_ch, - .pull_data = tcc3170_pull_data, - .get_int_size = tcc3170_int_size, -}; - -struct tdmb_drv_func *tcc3170_drv_func(void) -{ - DPRINTK("tdmb_get_drv_func : tcc3170\n"); - return &telechips_tcc3170_drv_func; -} diff --git a/drivers/media/tdmb/tdmb_spi.c b/drivers/media/tdmb/tdmb_spi.c deleted file mode 100644 index 014fd00..0000000 --- a/drivers/media/tdmb/tdmb_spi.c +++ /dev/null @@ -1,72 +0,0 @@ -/* -* -* drivers/media/tdmb/tdmb_spi.c -* -* tdmb driver -* -* Copyright (C) (2011, Samsung Electronics) -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation version 2. -* -* This program is distributed "as is" WITHOUT ANY WARRANTY of any -* kind, whether express or implied; without even the implied warranty -* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -*/ - -#include -#include "tdmb.h" - -struct spi_device *spi_dmb; - -static int tdmbspi_probe(struct spi_device *spi) -{ - int ret; - - spi_dmb = spi; - - DPRINTK("tdmbspi_probe() spi_dmb : 0x%x\n", (unsigned int)spi_dmb); - - spi->mode = SPI_MODE_0; - spi->bits_per_word = 8; - ret = spi_setup(spi); - if (ret < 0) { - DPRINTK("spi_setup() fail ret : %d\n", ret); - return ret; - } - - return 0; -} - -static int __devexit tdmbspi_remove(struct spi_device *spi) -{ - return 0; -} - -static struct spi_driver tdmbspi_driver = { - .driver = { - .name = "tdmbspi", - .bus = &spi_bus_type, - .owner = THIS_MODULE, - }, - .probe = tdmbspi_probe, - .remove = __devexit_p(tdmbspi_remove), -}; - -int tdmb_init_bus(void) -{ - return spi_register_driver(&tdmbspi_driver); -} - -void tdmb_exit_bus(void) -{ - spi_unregister_driver(&tdmbspi_driver); -} - -struct spi_device *tdmb_get_spi_handle(void) -{ - return spi_dmb; -} diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 25c56cb..196c492 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -87,7 +87,7 @@ config ATMEL_PWM depends on AVR32 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 help This option enables device driver support for the PWM channels - on certain Atmel processors. Pulse Width Modulation is used for + on certain Atmel processors. Pulse Width Modulation is used for purposes including software controlled power-efficient backlights on LCD displays, motor control, and waveform generation. @@ -385,14 +385,14 @@ config SENSORS_BH1780 will be called bh1780gli. config SENSORS_BH1770 - tristate "BH1770GLC / SFH7770 combined ALS - Proximity sensor" - depends on I2C - ---help--- - Say Y here if you want to build a driver for BH1770GLC (ROHM) or + tristate "BH1770GLC / SFH7770 combined ALS - Proximity sensor" + depends on I2C + ---help--- + Say Y here if you want to build a driver for BH1770GLC (ROHM) or SFH7770 (Osram) combined ambient light and proximity sensor chip. - To compile this driver as a module, choose M here: the - module will be called bh1770glc. If unsure, say N here. + To compile this driver as a module, choose M here: the + module will be called bh1770glc. If unsure, say N here. config SENSORS_APDS990X tristate "APDS990X combined als and proximity sensors" @@ -694,10 +694,6 @@ config STMPE811_ADC ---help--- Say yes here to build support for STMPE811 8 channel ADC driver -config MPU_SENSORS_MPU3050 - tristate "MPU3050" - depends on I2C - config MPU_SENSORS_MPU6050 tristate "MPU6050" depends on I2C @@ -706,22 +702,11 @@ source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig" source "drivers/misc/iwmc3200top/Kconfig" -if MPU_SENSORS_MPU3050 -source "drivers/misc/mpu3050/Kconfig" -endif -if MPU_SENSORS_MPU6050 -source "drivers/misc/inv_mpu/Kconfig" -endif source "drivers/misc/ti-st/Kconfig" source "drivers/misc/lis3lv02d/Kconfig" source "drivers/misc/carma/Kconfig" -source "drivers/misc/c2c/Kconfig" source "drivers/misc/modem_if/Kconfig" -source "drivers/misc/modem_if_na/Kconfig" -if MACH_U1 -source "drivers/misc/modem_if_u1/Kconfig" -endif config SLP_LOWMEM_NOTIFY bool "Driver for SLP Low Memory Notification" diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index ec1c23d..91f74c5 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -41,7 +41,6 @@ obj-$(CONFIG_HMC6352) += hmc6352.o obj-y += eeprom/ obj-y += cb710/ obj-$(CONFIG_MPU_SENSORS_MPU3050) += mpu3050/ -obj-$(CONFIG_MPU_SENSORS_MPU6050) += inv_mpu/ obj-$(CONFIG_SPEAR13XX_PCIE_GADGET) += spear13xx_pcie_gadget.o obj-$(CONFIG_VMWARE_BALLOON) += vmw_balloon.o obj-$(CONFIG_ARM_CHARLCD) += arm-charlcd.o @@ -53,19 +52,12 @@ obj-y += carma/ obj-$(CONFIG_WL127X_RFKILL) += wl127x-rfkill.o obj-$(CONFIG_APANIC) += apanic.o obj-$(CONFIG_SENSORS_AK8975) += akm8975.o -obj-$(CONFIG_SAMSUNG_C2C) += c2c/ obj-$(CONFIG_USBHUB_USB3503) += usb3503.o obj-$(CONFIG_USBHUB_USB3503_OTG_CONN) += usb3503_otg_conn.o obj-$(CONFIG_USBHUB_USB3803) += usb3803.o -ifeq ($(CONFIG_SEC_MODEM_P8LTE),y) -obj-$(CONFIG_SEC_MODEM) += modem_if_na/ -else -ifeq ($(CONFIG_MACH_U1),y) -obj-$(CONFIG_SEC_MODEM) += modem_if_u1/ -else + obj-$(CONFIG_SEC_MODEM) += modem_if/ -endif -endif + obj-$(CONFIG_MFD_MAX77693) += max77693-muic.o obj-$(CONFIG_STMPE811_ADC) += stmpe811-adc.o obj-$(CONFIG_JACK_MON) += jack.o diff --git a/drivers/misc/c2c/Kconfig b/drivers/misc/c2c/Kconfig deleted file mode 100644 index 3b91fa5..0000000 --- a/drivers/misc/c2c/Kconfig +++ /dev/null @@ -1,24 +0,0 @@ -# -# C2C XXX -# - -menuconfig SAMSUNG_C2C - tristate "C2C Support" - depends on CPU_EXYNOS4212 || CPU_EXYNOS5250 - default n - help - It is for supporting C2C driver. - -if SAMSUNG_C2C -config C2C_DEBUG - bool "C2C Debugging - Print C2C debug messages" - default y - help - Print C2C debug messages. - -config C2C_IPC_ENABLE - bool "Enable C2C IPC via the Shared Memory" - default n - help - Enable C2C IPC via the Shared Memory. -endif # SAMSUNG_C2C diff --git a/drivers/misc/c2c/Makefile b/drivers/misc/c2c/Makefile deleted file mode 100644 index ef12d10..0000000 --- a/drivers/misc/c2c/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# -# Makefile for C2C -# - -obj-$(CONFIG_SAMSUNG_C2C) += samsung-c2c.o diff --git a/drivers/misc/c2c/samsung-c2c.c b/drivers/misc/c2c/samsung-c2c.c deleted file mode 100644 index fe58c3d..0000000 --- a/drivers/misc/c2c/samsung-c2c.c +++ /dev/null @@ -1,712 +0,0 @@ -/* - * Samsung C2C driver - * - * Copyright (C) 2011 Samsung Electronics Co.Ltd - * Author: Kisang Lee - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef ENABLE_C2CSTATE_TIMER -#include -#endif -#ifdef CONFIG_C2C_IPC_ENABLE -#include -#include -#include -#endif -#include - -#include -#include -#include -#include -#include -#include - -#include "samsung-c2c.h" - -void (*exynos_c2c_request_pwr_mode)(enum c2c_pwr_mode mode); - -#ifdef ENABLE_C2CSTATE_TIMER -struct timer_list c2c_status_timer; - -static void c2c_timer_func(unsigned long data) -{ - /* Check C2C state */ - struct exynos_c2c_platdata *pdata = (struct exynos_c2c_platdata *)data; - static int old_state = 0xff; - int current_state = 0; - - if (pdata->get_c2c_state() != NULL) { - current_state = pdata->get_c2c_state(); - if (current_state != old_state) { - dev_info(c2c_con.c2c_dev, "C2C state is chaged (0x%x --> 0x%x)\n", - old_state, current_state); - old_state = current_state; - } - } - c2c_status_timer.expires = jiffies + (HZ/5); - add_timer(&c2c_status_timer); -} -#endif - -void c2c_reset_ops(void) -{ - /* This function will be only used for EVT0 or EVT0.1 */ - u32 set_clk = 0; - - if (c2c_con.opp_mode == C2C_OPP100) - set_clk = c2c_con.clk_opp100; - else if (c2c_con.opp_mode == C2C_OPP50) - set_clk = c2c_con.clk_opp50; - else if (c2c_con.opp_mode == C2C_OPP25) - set_clk = c2c_con.clk_opp25; - - dev_info(c2c_con.c2c_dev, "c2c_reset_ops()\n"); - clk_set_rate(c2c_con.c2c_sclk, (set_clk + 1) * MHZ); - c2c_set_func_clk(set_clk); - - /* First phase - C2C block reset */ - c2c_set_reset(C2C_CLEAR); - c2c_set_reset(C2C_SET); - /* Second phase - Clear clock gating */ - c2c_set_clock_gating(C2C_CLEAR); - /* Third phase - Retention reg */ - c2c_writel(c2c_con.retention_reg, EXYNOS_C2C_IRQ_EN_SET1); - c2c_writel(set_clk, EXYNOS_C2C_FCLK_FREQ); - c2c_writel(set_clk, EXYNOS_C2C_RX_MAX_FREQ); - /* Last phase - Set clock gating */ - c2c_set_clock_gating(C2C_SET); -} - -static ssize_t c2c_ctrl_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int ret = 0; - ret = sprintf(buf, "C2C State"); - c2c_set_clock_gating(C2C_CLEAR); - ret += sprintf(&buf[ret], "SysReg : 0x%x\n", - readl(c2c_con.c2c_sysreg)); - ret += sprintf(&buf[ret], "Port Config : 0x%x\n", - c2c_readl(EXYNOS_C2C_PORTCONFIG)); - ret += sprintf(&buf[ret], "FCLK_FREQ : %d\n", - c2c_readl(EXYNOS_C2C_FCLK_FREQ)); - ret += sprintf(&buf[ret], "RX_MAX_FREQ : %d\n", - c2c_readl(EXYNOS_C2C_RX_MAX_FREQ)); - ret += sprintf(&buf[ret], "IRQ_EN_SET1 : 0x%x\n", - c2c_readl(EXYNOS_C2C_IRQ_EN_SET1)); - ret += sprintf(&buf[ret], "Get C2C sclk rate : %ld\n", - clk_get_rate(c2c_con.c2c_sclk)); - ret += sprintf(&buf[ret], "Get C2C aclk rate : %ld\n", - clk_get_rate(c2c_con.c2c_aclk)); - c2c_set_clock_gating(C2C_SET); - - return ret; -} - -static ssize_t c2c_ctrl_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - int ops_num, opp_val, req_clk; - sscanf(buf, "%d", &ops_num); - - switch (ops_num) { - case 1: - c2c_reset_ops(); - break; - case 2: - case 3: - case 4: - opp_val = ops_num - 1; - req_clk = 0; - dev_info(c2c_con.c2c_dev, "Set current OPP mode (%d)\n", opp_val); - - if (opp_val == C2C_OPP100) - req_clk = c2c_con.clk_opp100; - else if (opp_val == C2C_OPP50) - req_clk = c2c_con.clk_opp50; - else if (opp_val == C2C_OPP25) - req_clk = c2c_con.clk_opp25; - - if (opp_val == 0 || req_clk == 1) { - dev_info(c2c_con.c2c_dev, "This mode is not reserved in OPP mode.\n"); - } else { - c2c_set_clock_gating(C2C_CLEAR); - if (c2c_con.opp_mode < opp_val) { /* increase case */ - clk_set_rate(c2c_con.c2c_sclk, (req_clk + 1) * MHZ); - c2c_writel(req_clk, EXYNOS_C2C_FCLK_FREQ); - c2c_set_func_clk(req_clk); - c2c_writel(req_clk, EXYNOS_C2C_RX_MAX_FREQ); - } else if (c2c_con.opp_mode > opp_val) { /* decrease case */ - c2c_writel(req_clk, EXYNOS_C2C_RX_MAX_FREQ); - clk_set_rate(c2c_con.c2c_sclk, (req_clk + 1) * MHZ); - c2c_writel(req_clk, EXYNOS_C2C_FCLK_FREQ); - c2c_set_func_clk(req_clk); - } else{ - dev_info(c2c_con.c2c_dev, "Requested same OPP mode\n"); - } - c2c_con.opp_mode = opp_val; - c2c_set_clock_gating(C2C_SET); - } - - dev_info(c2c_con.c2c_dev, "Get C2C sclk rate : %ld\n", - clk_get_rate(c2c_con.c2c_sclk)); - dev_info(c2c_con.c2c_dev, "Get C2C aclk rate : %ld\n", - clk_get_rate(c2c_con.c2c_aclk)); - break; - default: - dev_info(c2c_con.c2c_dev, "Wrong C2C operation number\n"); - dev_info(c2c_con.c2c_dev, "---C2C Operation Number---\n"); - dev_info(c2c_con.c2c_dev, "1. C2C Reset\n"); - dev_info(c2c_con.c2c_dev, "2. Set OPP25\n"); - dev_info(c2c_con.c2c_dev, "3. Set OPP50\n"); - dev_info(c2c_con.c2c_dev, "4. Set OPP100\n"); - } - - return count; -} - -static DEVICE_ATTR(c2c_ctrl, 0644, c2c_ctrl_show, c2c_ctrl_store); - -int c2c_open(struct inode *inode, struct file *filp) -{ - /* This function is not needed.(Test Function) */ - dev_info(c2c_con.c2c_dev, "C2C chrdrv Opened.\n"); - - return 0; -} - -static long c2c_ioctl(struct file *filp, unsigned int cmd, - unsigned long arg) -{ - c2c_reset_ops(); - - return 0; -} - -static const struct file_operations c2c_fops = { - .owner = THIS_MODULE, - .unlocked_ioctl = c2c_ioctl, - .open = c2c_open, -}; - -static struct miscdevice char_dev = { - .minor = MISC_DYNAMIC_MINOR, - .name = C2C_DEV_NAME, - .fops = &c2c_fops -}; - -static int c2c_set_sharedmem(enum c2c_shrdmem_size size, u32 addr) -{ - dev_info(c2c_con.c2c_dev, "Set BaseAddr(0x%x) and Size(%d)\n", - addr, 1 << (2 + size)); - - /* Set DRAM Base Addr & Size */ - c2c_set_shdmem_size(size); - c2c_set_base_addr((addr >> 22)); - - return 0; -} - -static void c2c_set_interrupt(u32 genio_num, enum c2c_interrupt set_int) -{ - u32 cur_int_reg, cur_lev_reg; - - cur_int_reg = c2c_readl(EXYNOS_C2C_GENO_INT); - cur_lev_reg = c2c_readl(EXYNOS_C2C_GENO_LEVEL); - - switch (set_int) { - case C2C_INT_TOGGLE: - cur_int_reg &= ~(0x1 << genio_num); - c2c_writel(cur_int_reg, EXYNOS_C2C_GENO_INT); - break; - case C2C_INT_HIGH: - cur_int_reg |= (0x1 << genio_num); - cur_lev_reg |= (0x1 << genio_num); - c2c_writel(cur_int_reg, EXYNOS_C2C_GENO_INT); - c2c_writel(cur_lev_reg, EXYNOS_C2C_GENO_LEVEL); - break; - case C2C_INT_LOW: - cur_int_reg |= (0x1 << genio_num); - cur_lev_reg &= ~(0x1 << genio_num); - c2c_writel(cur_int_reg, EXYNOS_C2C_GENO_INT); - c2c_writel(cur_lev_reg, EXYNOS_C2C_GENO_LEVEL); - break; - } -} - -static irqreturn_t c2c_sscm0_irq(int irq, void *data) -{ - /* TODO : This function will be used other type boards */ - return IRQ_HANDLED; -} - -static irqreturn_t c2c_sscm1_irq(int irq, void *data) -{ - /* TODO : It is just temporary code. It will be modified. */ - u32 raw_irq, latency_val, opp_val, req_clk; - raw_irq = c2c_readl(EXYNOS_C2C_IRQ_EN_STAT1); - -#ifdef CONFIG_C2C_IPC_ENABLE - if (raw_irq & 0x1) { - dev_info(c2c_con.c2c_dev, "IPC interrupt occured : GENO[0]\n"); - if (c2c_con.hd.handler) - c2c_con.hd.handler(c2c_con.hd.data); - - /* Interrupt Clear */ - c2c_writel(0x1, EXYNOS_C2C_IRQ_EN_STAT1); - } -#endif - if ((raw_irq >> C2C_GENIO_OPP_INT) & 1) { /* OPP Change */ - /* - OPP mode GENI/O bit definition[29:27] - OPP100 GENI/O[29:28] : 1 1 - OPP50 GENI/O[29:28] : 1 0 - OPP25 GENI/O[29:28] : 0 1 - GENI[27] is only used for making interrupt. - */ - opp_val = (c2c_readl(EXYNOS_C2C_GENO_STATUS) >> 28) & 3; - req_clk = 0; - dev_info(c2c_con.c2c_dev, "OPP interrupt occured (%d)\n", opp_val); - - if (opp_val == C2C_OPP100) - req_clk = c2c_con.clk_opp100; - else if (opp_val == C2C_OPP50) - req_clk = c2c_con.clk_opp50; - else if (opp_val == C2C_OPP25) - req_clk = c2c_con.clk_opp25; - - if (opp_val == 0 || req_clk == 1) { - dev_info(c2c_con.c2c_dev, "This mode is not reserved in OPP mode.\n"); - } else { - if (c2c_con.opp_mode < opp_val) { /* increase case */ - clk_set_rate(c2c_con.c2c_sclk, (req_clk + 1) * MHZ); - c2c_writel(req_clk, EXYNOS_C2C_FCLK_FREQ); - c2c_set_func_clk(req_clk); - c2c_writel(req_clk, EXYNOS_C2C_RX_MAX_FREQ); - } else if (c2c_con.opp_mode > opp_val) { /* decrease case */ - c2c_writel(req_clk, EXYNOS_C2C_RX_MAX_FREQ); - clk_set_rate(c2c_con.c2c_sclk, (req_clk + 1) * MHZ); - c2c_writel(req_clk, EXYNOS_C2C_FCLK_FREQ); - c2c_set_func_clk(req_clk); - } else{ - dev_info(c2c_con.c2c_dev, "Requested same OPP mode\n"); - } - c2c_con.opp_mode = opp_val; - } - - /* Interrupt Clear */ - c2c_writel((0x1 << C2C_GENIO_OPP_INT), EXYNOS_C2C_IRQ_EN_STAT1); - } - - /* Memory I/F latency change */ - if ((raw_irq >> C2C_GENIO_LATENCY_INT) & 1) { - latency_val = (c2c_readl(EXYNOS_C2C_GENO_STATUS) >> 30) & 3; - switch (latency_val) { - case 3: - dev_info(c2c_con.c2c_dev, "Set Min latency\n"); - if (exynos_c2c_request_pwr_mode != NULL) - exynos_c2c_request_pwr_mode(MIN_LATENCY); - break; - case 1: - dev_info(c2c_con.c2c_dev, "Set Short latency\n"); - if (exynos_c2c_request_pwr_mode != NULL) - exynos_c2c_request_pwr_mode(SHORT_LATENCY); - break; - case 0: - dev_info(c2c_con.c2c_dev, "Set Max latency\n"); - if (exynos_c2c_request_pwr_mode != NULL) - exynos_c2c_request_pwr_mode(MAX_LATENCY); - break; - } - /* Interrupt Clear */ - c2c_writel((0x1 << C2C_GENIO_LATENCY_INT), EXYNOS_C2C_IRQ_EN_STAT1); - } - - return IRQ_HANDLED; -} - -static void set_c2c_device(struct platform_device *pdev) -{ - struct exynos_c2c_platdata *pdata = pdev->dev.platform_data; - u32 default_clk; - - c2c_con.c2c_sysreg = pdata->c2c_sysreg; - c2c_con.rx_width = pdata->rx_width; - c2c_con.tx_width = pdata->tx_width; - c2c_con.clk_opp100 = pdata->clk_opp100; - c2c_con.clk_opp50 = pdata->clk_opp50; - c2c_con.clk_opp25 = pdata->clk_opp25; - c2c_con.opp_mode = pdata->default_opp_mode; -#ifdef CONFIG_C2C_IPC_ENABLE - c2c_con.shd_pages = NULL; - c2c_con.hd.data = NULL; - c2c_con.hd.handler = NULL; -#endif - c2c_con.c2c_sclk = clk_get(&pdev->dev, "sclk_c2c"); - c2c_con.c2c_aclk = clk_get(&pdev->dev, "aclk_c2c"); - - if (soc_is_exynos4212()) - exynos_c2c_request_pwr_mode = exynos4_c2c_request_pwr_mode; - else if (soc_is_exynos4412()) { - exynos_c2c_request_pwr_mode = exynos4_c2c_request_pwr_mode; - if (samsung_rev() >= EXYNOS4412_REV_1_0) - writel(C2C_SYSREG_DEFAULT, c2c_con.c2c_sysreg); - } else if (soc_is_exynos5250()) - exynos_c2c_request_pwr_mode = NULL; - - /* Set clock to default mode */ - if (c2c_con.opp_mode == C2C_OPP100) - default_clk = c2c_con.clk_opp100; - else if (c2c_con.opp_mode == C2C_OPP50) - default_clk = c2c_con.clk_opp50; - else if (c2c_con.opp_mode == C2C_OPP25) - default_clk = c2c_con.clk_opp25; - else { - dev_info(c2c_con.c2c_dev, "Default OPP mode is not selected.\n"); - c2c_con.opp_mode = C2C_OPP50; - default_clk = c2c_con.clk_opp50; - } - - clk_set_rate(c2c_con.c2c_sclk, (default_clk + 1) * MHZ); - clk_set_rate(c2c_con.c2c_aclk, ((default_clk / 2) + 1) * MHZ); - - dev_info(c2c_con.c2c_dev, "Get C2C sclk rate : %ld\n", - clk_get_rate(c2c_con.c2c_sclk)); - dev_info(c2c_con.c2c_dev, "Get C2C aclk rate : %ld\n", - clk_get_rate(c2c_con.c2c_aclk)); - if (pdata->setup_gpio) - pdata->setup_gpio(pdata->rx_width, pdata->tx_width); - - c2c_set_sharedmem(pdata->shdmem_size, pdata->shdmem_addr); - - /* Set SYSREG to memdone */ - c2c_set_memdone(C2C_SET); - c2c_set_clock_gating(C2C_CLEAR); - - /* Set C2C clock register to OPP50 */ - c2c_writel(default_clk, EXYNOS_C2C_FCLK_FREQ); - c2c_writel(default_clk, EXYNOS_C2C_RX_MAX_FREQ); - c2c_set_func_clk(default_clk); - - /* Set C2C buswidth */ - c2c_writel(((pdata->rx_width << 4) | (pdata->tx_width)), - EXYNOS_C2C_PORTCONFIG); - c2c_set_tx_buswidth(pdata->tx_width); - c2c_set_rx_buswidth(pdata->rx_width); - - /* Enable all of GENI/O Interrupt */ - c2c_writel((0x1 << C2C_GENIO_OPP_INT), EXYNOS_C2C_IRQ_EN_SET1); - c2c_con.retention_reg = (0x1 << C2C_GENIO_OPP_INT); - - if (exynos_c2c_request_pwr_mode != NULL) - exynos_c2c_request_pwr_mode(MAX_LATENCY); - - c2c_set_interrupt(C2C_GENIO_OPP_INT, C2C_INT_HIGH); - - dev_info(c2c_con.c2c_dev, "Port Config : 0x%x\n", - c2c_readl(EXYNOS_C2C_PORTCONFIG)); - dev_info(c2c_con.c2c_dev, "FCLK_FREQ register : %d\n", - c2c_readl(EXYNOS_C2C_FCLK_FREQ)); - dev_info(c2c_con.c2c_dev, "RX_MAX_FREQ register : %d\n", - c2c_readl(EXYNOS_C2C_RX_MAX_FREQ)); - dev_info(c2c_con.c2c_dev, "IRQ_EN_SET1 register : 0x%x\n", - c2c_readl(EXYNOS_C2C_IRQ_EN_SET1)); - - c2c_set_clock_gating(C2C_SET); -} - -#ifdef CONFIG_C2C_IPC_ENABLE -void __iomem *c2c_request_cp_region(unsigned int cp_addr, - unsigned int size) -{ - dma_addr_t phy_cpmem; - - phy_cpmem = cma_alloc(c2c_con.c2c_dev, "c2c_shdmem", size, 0); - if (IS_ERR_VALUE(phy_cpmem)) { - dev_info(c2c_con.c2c_dev, KERN_ERR "C2C CMA Alloc Error!!!"); - return NULL; - } - - return phys_to_virt(phy_cpmem); -} -EXPORT_SYMBOL(c2c_request_cp_region); - -void c2c_release_cp_region(void *rgn) -{ - dma_addr_t phy_cpmem; - - phy_cpmem = virt_to_phys(rgn); - - cma_free(phy_cpmem); -} -EXPORT_SYMBOL(c2c_release_cp_region); - -void __iomem *c2c_request_sh_region(unsigned int sh_addr, - unsigned int size) -{ - int i; - struct page **pages; - void *pv; - - pages = kmalloc((size >> PAGE_SHIFT) * sizeof(*pages), GFP_KERNEL); - for (i = 0; i < (size >> PAGE_SHIFT); i++) { - pages[i] = phys_to_page(sh_addr); - sh_addr += PAGE_SIZE; - } - - c2c_con.shd_pages = (void *)pages; - - pv = vmap(pages, size >> PAGE_SHIFT, VM_MAP, - pgprot_noncached(PAGE_KERNEL)); - - return (void __iomem *)pv; -} -EXPORT_SYMBOL(c2c_request_sh_region); - -void c2c_release_sh_region(void *rgn) -{ - vunmap(rgn); - kfree(c2c_con.shd_pages); - c2c_con.shd_pages = NULL; -} -EXPORT_SYMBOL(c2c_release_sh_region); - -int c2c_register_handler(void (*handler)(void *), void *data) -{ - if (!handler) - return -EINVAL; - - c2c_con.hd.data = data; - c2c_con.hd.handler = handler; - - c2c_reset_interrupt(); - - return 0; -} -EXPORT_SYMBOL(c2c_register_handler); - -int c2c_unregister_handler(void (*handler)(void *)) -{ - if (!handler || (c2c_con.hd.handler != handler)) - return -EINVAL; - - c2c_con.hd.data = NULL; - c2c_con.hd.handler = NULL; - return 0; -} -EXPORT_SYMBOL(c2c_unregister_handler); - -void c2c_send_interrupt(void) -{ - c2c_writel(c2c_readl(EXYNOS_C2C_GENI_CONTROL) ^ 0x1, - EXYNOS_C2C_GENI_CONTROL); -} -EXPORT_SYMBOL(c2c_send_interrupt); - -void c2c_reset_interrupt(void) -{ - c2c_writel(c2c_readl(EXYNOS_C2C_IRQ_EN_SET1) | 0x1, - EXYNOS_C2C_IRQ_EN_SET1); - c2c_con.retention_reg |= 0x1; -} -EXPORT_SYMBOL(c2c_reset_interrupt); -#endif - -static int __devinit samsung_c2c_probe(struct platform_device *pdev) -{ - struct exynos_c2c_platdata *pdata = pdev->dev.platform_data; - struct resource *res = NULL; - struct resource *res1 = NULL; - int sscm_irq0, sscm_irq1; - int err = 0; - - c2c_con.c2c_dev = &pdev->dev; - - /* resource for AP's SSCM region */ - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "no memory resource defined(AP's SSCM)\n"); - return -ENOENT; - } - res = request_mem_region(res->start, resource_size(res), pdev->name); - if (!res) { - dev_err(&pdev->dev, "failded to request memory resource(AP)\n"); - return -ENOENT; - } - pdata->ap_sscm_addr = ioremap(res->start, resource_size(res)); - if (!pdata->ap_sscm_addr) { - dev_err(&pdev->dev, "failded to request memory resource(AP)\n"); - goto release_ap_sscm; - } - c2c_con.ap_sscm_addr = pdata->ap_sscm_addr; - - /* resource for CP's SSCM region */ - res1 = platform_get_resource(pdev, IORESOURCE_MEM, 1); - if (!res1) { - dev_err(&pdev->dev, "no memory resource defined(AP's SSCM)\n"); - goto unmap_ap_sscm; - } - res1 = request_mem_region(res1->start, resource_size(res1), pdev->name); - if (!res1) { - dev_err(&pdev->dev, "failded to request memory resource(AP)\n"); - goto unmap_ap_sscm; - } - pdata->cp_sscm_addr = ioremap(res1->start, resource_size(res1)); - if (!pdata->cp_sscm_addr) { - dev_err(&pdev->dev, "failded to request memory resource(CP)\n"); - goto release_cp_sscm; - } - c2c_con.cp_sscm_addr = pdata->cp_sscm_addr; - - /* Request IRQ */ - sscm_irq0 = platform_get_irq(pdev, 0); - if (sscm_irq0 < 0) { - dev_err(&pdev->dev, "no irq specified\n"); - goto unmap_cp_sscm; - } - err = request_irq(sscm_irq0, c2c_sscm0_irq, 0, pdev->name, pdev); - if (err) { - dev_err(&pdev->dev, "Can't request SSCM0 IRQ\n"); - goto unmap_cp_sscm; - } - /* SSCM0 irq will be only used for master(CP) device */ - disable_irq(sscm_irq0); - - sscm_irq1 = platform_get_irq(pdev, 1); - if (sscm_irq1 < 0) { - dev_err(&pdev->dev, "no irq specified\n"); - goto release_sscm_irq0; - } - err = request_irq(sscm_irq1, c2c_sscm1_irq, 1, pdev->name, pdev); - if (err) { - dev_err(&pdev->dev, "Can't request SSCM1 IRQ\n"); - goto release_sscm_irq0; - } - - err = misc_register(&char_dev); - if (err) { - dev_err(&pdev->dev, "Can't register chrdev!\n"); - goto release_sscm_irq0; - } - - set_c2c_device(pdev); - -#ifdef ENABLE_C2CSTATE_TIMER - /* Timer for debugging to check C2C state */ - init_timer(&c2c_status_timer); - c2c_status_timer.expires = jiffies + HZ; - c2c_status_timer.data = (unsigned long)pdata; - c2c_status_timer.function = &c2c_timer_func; - add_timer(&c2c_status_timer); -#endif - - /* Create sysfs file for C2C debug */ - err = device_create_file(&pdev->dev, &dev_attr_c2c_ctrl); - if (err) { - dev_err(&pdev->dev, "Failed to create sysfs for C2C\n"); - goto release_sscm_irq1; - } - - return 0; - -release_sscm_irq1: - free_irq(sscm_irq1, pdev); - -release_sscm_irq0: - free_irq(sscm_irq0, pdev); - -unmap_cp_sscm: - iounmap(pdata->cp_sscm_addr); - -release_cp_sscm: - release_mem_region(res1->start, resource_size(res1)); - -unmap_ap_sscm: - iounmap(pdata->ap_sscm_addr); - -release_ap_sscm: - release_mem_region(res->start, resource_size(res)); - - return err; -} - -static int __devexit samsung_c2c_remove(struct platform_device *pdev) -{ - /* TODO */ - return 0; -} - -#ifdef CONFIG_PM -static int samsung_c2c_suspend(struct platform_device *dev, pm_message_t pm) -{ - /* TODO */ - return 0; -} - -static int samsung_c2c_resume(struct platform_device *dev) -{ - struct exynos_c2c_platdata *pdata = dev->dev.platform_data; - - if ((soc_is_exynos4212() || soc_is_exynos4412()) - && samsung_rev() == EXYNOS4412_REV_0) { - /* Set SYSREG */ - c2c_set_sharedmem(pdata->shdmem_size, pdata->shdmem_addr); - c2c_set_memdone(C2C_SET); - } else if (soc_is_exynos5250()) { - /* Set SYSREG */ - c2c_set_sharedmem(pdata->shdmem_size, pdata->shdmem_addr); - c2c_set_memdone(C2C_SET); - } - - return 0; -} -#else -#define samsung_c2c_suspend NULL -#define samsung_c2c_resume NULL -#endif - -static struct platform_driver samsung_c2c_driver = { - .probe = samsung_c2c_probe, - .remove = __devexit_p(samsung_c2c_remove), - .suspend = samsung_c2c_suspend, - .resume = samsung_c2c_resume, - .driver = { - .name = "samsung-c2c", - .owner = THIS_MODULE, - }, -}; - -static int __init samsung_c2c_init(void) -{ - return platform_driver_register(&samsung_c2c_driver); -} -module_init(samsung_c2c_init); - -static void __exit samsung_c2c_exit(void) -{ - platform_driver_unregister(&samsung_c2c_driver); -} -module_exit(samsung_c2c_exit); - -MODULE_DESCRIPTION("Samsung C2C driver"); -MODULE_AUTHOR("Kisang Lee "); -MODULE_LICENSE("GPL"); diff --git a/drivers/misc/c2c/samsung-c2c.h b/drivers/misc/c2c/samsung-c2c.h deleted file mode 100644 index 03ea601..0000000 --- a/drivers/misc/c2c/samsung-c2c.h +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Samsung C2C driver - * - * Copyright (C) 2011 Samsung Electronics Co.Ltd - * Author: Kisang Lee - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ -#ifndef SAMSUNG_C2C_H -#define SAMSUNG_C2C_H - -/* This timer will be only used for debugging -#define ENABLE_C2CSTATE_TIMER -*/ -#define C2C_DEV_NAME "c2c_dev" -#define C2C_SYSREG_DEFAULT 0x832AA803 - -#ifdef CONFIG_C2C_IPC_ENABLE -#define C2C_CP_RGN_ADDR 0x60000000 -#define C2C_CP_RGN_SIZE (56 * SZ_1M) -#define C2C_SH_RGN_ADDR (C2C_CP_RGN_ADDR + C2C_CP_RGN_SIZE) -#define C2C_SH_RGN_SIZE (8 * SZ_1M) - -extern void __iomem *c2c_request_cp_region(unsigned int cp_addr, - unsigned int size); -extern void __iomem *c2c_request_sh_region(unsigned int sh_addr, - unsigned int size); -extern void c2c_release_cp_region(void *rgn); -extern void c2c_release_sh_region(void *rgn); - -extern int c2c_register_handler(void (*handler)(void *), void *data); -extern int c2c_unregister_handler(void (*handler)(void *)); -extern void c2c_send_interrupt(void); -extern void c2c_reset_interrupt(void); - -struct c2c_ipc_handler { - void *data; - void (*handler)(void *); -}; -#endif - -enum c2c_set_clear { - C2C_CLEAR = 0, - C2C_SET = 1, -}; - -enum c2c_interrupt { - C2C_INT_TOGGLE = 0, - C2C_INT_HIGH = 1, - C2C_INT_LOW = 2, -}; - -struct c2c_state_control { - void __iomem *ap_sscm_addr; - void __iomem *cp_sscm_addr; -#ifdef CONFIG_C2C_IPC_ENABLE - void *shd_pages; - struct c2c_ipc_handler hd; -#endif - struct device *c2c_dev; - - u32 rx_width; - u32 tx_width; - - u32 clk_opp100; - u32 clk_opp50; - u32 clk_opp25; - - struct clk *c2c_sclk; - struct clk *c2c_aclk; - - enum c2c_opp_mode opp_mode; - /* Below variables are needed in reset for retention */ - u32 retention_reg; - void __iomem *c2c_sysreg; -}; - -static struct c2c_state_control c2c_con; - -static inline void c2c_writel(u32 val, int reg) -{ - writel(val, c2c_con.ap_sscm_addr + reg); -} - -static inline void c2c_writew(u16 val, int reg) -{ - writew(val, c2c_con.ap_sscm_addr + reg); -} - -static inline void c2c_writeb(u8 val, int reg) -{ - writeb(val, c2c_con.ap_sscm_addr + reg); -} - -static inline u32 c2c_readl(int reg) -{ - return readl(c2c_con.ap_sscm_addr + reg); -} - -static inline u16 c2c_readw(int reg) -{ - return readw(c2c_con.ap_sscm_addr + reg); -} - -static inline u8 c2c_readb(int reg) -{ - return readb(c2c_con.ap_sscm_addr + reg); -} - -static inline void c2c_writel_cp(u32 val, int reg) -{ - writel(val, c2c_con.cp_sscm_addr + reg); -} - -static inline void c2c_writew_cp(u16 val, int reg) -{ - writew(val, c2c_con.cp_sscm_addr + reg); -} - -static inline void c2c_writeb_cp(u8 val, int reg) -{ - writeb(val, c2c_con.cp_sscm_addr + reg); -} - -static inline u32 c2c_readl_cp(int reg) -{ - return readl(c2c_con.cp_sscm_addr + reg); -} - -static inline u16 c2c_readw_cp(int reg) -{ - return readw(c2c_con.cp_sscm_addr + reg); -} - -static inline u8 c2c_readb_cp(int reg) -{ - return readb(c2c_con.cp_sscm_addr + reg); -} - -static inline enum c2c_set_clear c2c_get_clock_gating(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - if (sysreg & (1 << C2C_SYSREG_CG)) - return C2C_SET; - else - return C2C_CLEAR; -} - -static inline void c2c_set_clock_gating(enum c2c_set_clear val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - if (val == C2C_SET) - sysreg |= (1 << C2C_SYSREG_CG); - else - sysreg &= ~(1 << C2C_SYSREG_CG); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline enum c2c_set_clear c2c_get_memdone(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - if (sysreg & (1 << C2C_SYSREG_MD)) - return C2C_SET; - else - return C2C_CLEAR; -} - -static inline void c2c_set_memdone(enum c2c_set_clear val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - if (val == C2C_SET) - sysreg |= (1 << C2C_SYSREG_MD); - else - sysreg &= ~(1 << C2C_SYSREG_MD); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline enum c2c_set_clear c2c_get_master_on(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - if (sysreg & (1 << C2C_SYSREG_MO)) - return C2C_SET; - else - return C2C_CLEAR; -} - -static inline void c2c_set_master_on(enum c2c_set_clear val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - if (val == C2C_SET) - sysreg |= (1 << C2C_SYSREG_MO); - else - sysreg &= ~(1 << C2C_SYSREG_MO); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline u32 c2c_get_func_clk(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= (0x3ff << C2C_SYSREG_FCLK); - - return sysreg >> C2C_SYSREG_FCLK; -} - -static inline void c2c_set_func_clk(u32 val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= ~(0x3ff << C2C_SYSREG_FCLK); - sysreg |= (val << C2C_SYSREG_FCLK); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline u32 c2c_get_tx_buswidth(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= (0x3 << C2C_SYSREG_TXW); - - return sysreg >> C2C_SYSREG_TXW; -} - -static inline void c2c_set_tx_buswidth(u32 val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= ~(0x3 << C2C_SYSREG_TXW); - sysreg |= (val << C2C_SYSREG_TXW); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline u32 c2c_get_rx_buswidth(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= (0x3 << C2C_SYSREG_RXW); - - return sysreg >> C2C_SYSREG_RXW; -} - -static inline void c2c_set_rx_buswidth(u32 val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= ~(0x3 << C2C_SYSREG_RXW); - sysreg |= (val << C2C_SYSREG_RXW); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline enum c2c_set_clear c2c_get_reset(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - if (sysreg & (1 << C2C_SYSREG_RST)) - return C2C_SET; - else - return C2C_CLEAR; -} - -static inline void c2c_set_reset(enum c2c_set_clear val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - if (val == C2C_SET) - sysreg |= (1 << C2C_SYSREG_RST); - else - sysreg &= ~(1 << C2C_SYSREG_RST); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline void c2c_set_rtrst(enum c2c_set_clear val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - if (val == C2C_SET) - sysreg |= (1 << C2C_SYSREG_RTRST); - else - sysreg &= ~(1 << C2C_SYSREG_RTRST); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline u32 c2c_get_base_addr(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= (0x3ff << C2C_SYSREG_BASE_ADDR); - - return sysreg >> C2C_SYSREG_BASE_ADDR; -} - -static inline void c2c_set_base_addr(u32 val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= ~(0x3ff << C2C_SYSREG_BASE_ADDR); - sysreg |= (val << C2C_SYSREG_BASE_ADDR); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -static inline u32 c2c_get_shdmem_size(void) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= (0x7 << C2C_SYSREG_DRAM_SIZE); - - return sysreg >> C2C_SYSREG_DRAM_SIZE; -} - -static inline void c2c_set_shdmem_size(u32 val) -{ - u32 sysreg = readl(c2c_con.c2c_sysreg); - - sysreg &= ~(0x7 << C2C_SYSREG_DRAM_SIZE); - sysreg |= (val << C2C_SYSREG_DRAM_SIZE); - - writel(sysreg, c2c_con.c2c_sysreg); -} - -#endif diff --git a/drivers/misc/inv_mpu/Kconfig b/drivers/misc/inv_mpu/Kconfig deleted file mode 100644 index 060b79f..0000000 --- a/drivers/misc/inv_mpu/Kconfig +++ /dev/null @@ -1,24 +0,0 @@ -config MPU_SENSORS_GYRO - tristate "MPU6050 built in gyroscope" - depends on MPU_SENSORS_MPU6050 - -config MPU_SENSORS_TIMERIRQ - tristate "Timer IRQ" - depends on MPU_SENSORS_MPU6050 - help - If you say yes here you get access to the timerirq device handle which - can be used to select on. This can be used instead of IRQ's, sleeping, - or timer threads. Reading from this device returns the same type of - information as reading from the MPU and slave IRQ's. - -config MPU_SENSORS_DEBUG - bool "MPU6050 MPU debug" - depends on MPU_SENSORS_TIMERIRQ - help - If you say yes here you get extra debug messages from the MPU6050 - and other slave sensors. - -config MPU_SENSORS_CORE - tristate "Sensors core" - - diff --git a/drivers/misc/inv_mpu/Makefile b/drivers/misc/inv_mpu/Makefile deleted file mode 100644 index c129cf2..0000000 --- a/drivers/misc/inv_mpu/Makefile +++ /dev/null @@ -1,22 +0,0 @@ - -# Kernel makefile for motions sensors -# - -# MPU - -obj-$(CONFIG_MPU_SENSORS_MPU6050) += mpu6050.o -mpu6050-objs += mpuirq.o \ - slaveirq.o \ - mpu-dev.o \ - mlsl-kernel.o \ - mldl_cfg.o \ - mldl_print_cfg.o \ - sensors_core.o \ - accel/mpu6050.o \ - compass/ak8975.o - -EXTRA_CFLAGS += -Idrivers/misc/inv_mpu -EXTRA_CFLAGS += -D__C99_DESIGNATED_INITIALIZER -EXTRA_CFLAGS += -DINV_CACHE_DMP=1 - -obj-$(CONFIG_MPU_SENSORS_TIMERIRQ)+= timerirq.o diff --git a/drivers/misc/inv_mpu/README b/drivers/misc/inv_mpu/README deleted file mode 100644 index ce592c8..0000000 --- a/drivers/misc/inv_mpu/README +++ /dev/null @@ -1,104 +0,0 @@ -Kernel driver mpu -===================== - -Supported chips: - * InvenSense IMU3050 - Prefix: 'mpu3050' - Datasheet: - PS-MPU-3000A-00.2.4b.pdf - -Author: InvenSense - -Description ------------ -The mpu is a motion processor unit that controls the mpu3050 gyroscope, a slave -accelerometer, a compass and a pressure sensor. This document describes how to -install the driver into a Linux kernel. - -Sysfs entries -------------- -/dev/mpu -/dev/mpuirq -/dev/accelirq -/dev/compassirq -/dev/pressureirq - -General Remarks MPU3050 ------------------------ -* Valid addresses for the MPU3050 is 0x68. -* Accelerometer must be on the secondary I2C bus for MPU3050, the - magnetometer must be on the primary bus and pressure sensor must - be on the primary bus. - -Programming the chip using /dev/mpu ----------------------------------- -Programming of MPU3050 is done by first opening the /dev/mpu file and -then performing a series of IOCTLS on the handle returned. The IOCTL codes can -be found in mpu.h. Typically this is done by the mllite library in user -space. - -Board and Platform Data ------------------------ - -In order for the driver to work, board and platform data specific to the device -needs to be added to the board file. A mpu_platform_data structure must -be created and populated and set in the i2c_board_info_structure. For details -of each structure member see mpu.h. All values below are simply an example and -should be modified for your platform. - -#include - -static struct mpu_platform_data mpu3050_data = { - .int_config = 0x10, - .orientation = { -1, 0, 0, - 0, 1, 0, - 0, 0, -1 }, -}; - -/* accel */ -static struct ext_slave_platform_data inv_mpu_kxtf9_data = { - .bus = EXT_SLAVE_BUS_SECONDARY, - .orientation = { -1, 0, 0, - 0, 1, 0, - 0, 0, -1 }, -}; -/* compass */ -static struct ext_slave_platform_data inv_mpu_ak8975_data = { - .bus = EXT_SLAVE_BUS_PRIMARY, - .orientation = { 1, 0, 0, - 0, 1, 0, - 0, 0, 1 }, -}; - -static struct i2c_board_info __initdata panda_inv_mpu_i2c4_boardinfo[] = { - { - I2C_BOARD_INFO("mpu3050", 0x68), - .irq = (IH_GPIO_BASE + MPUIRQ_GPIO), - .platform_data = &mpu3050_data, - }, - { - I2C_BOARD_INFO("kxtf9", 0x0F), - .irq = (IH_GPIO_BASE + ACCEL_IRQ_GPIO), - .platform_data = &inv_mpu_kxtf9_data - }, - { - I2C_BOARD_INFO("ak8975", 0x0E), - .irq = (IH_GPIO_BASE + COMPASS_IRQ_GPIO), - .platform_data = &inv_mpu_ak8975_data, - }, -}; - -Typically the IRQ is a GPIO input pin and needs to be configured properly. If -in the above example GPIO 168 corresponds to IRQ 299, the following should be -done as well: - -#define MPU_GPIO_IRQ 168 - - gpio_request(MPU_GPIO_IRQ,"MPUIRQ"); - gpio_direction_input(MPU_GPIO_IRQ) - -Dynamic Debug -============= - -The mpu3050 makes use of dynamic debug. For details on how to use this -refer to Documentation/dynamic-debug-howto.txt diff --git a/drivers/misc/inv_mpu/accel/Kconfig b/drivers/misc/inv_mpu/accel/Kconfig deleted file mode 100644 index 8e24177..0000000 --- a/drivers/misc/inv_mpu/accel/Kconfig +++ /dev/null @@ -1,133 +0,0 @@ -menuconfig MPU_SENSORS_ACCEL - bool "Accelerometer Slave Sensors" - default n - ---help--- - Say Y here to get to see options for device drivers for various - accelerometrs for integration with the MPU3050 or MPU6050 driver. - This option alone does not add any kernel code. - - If you say N, all options in this submenu will be skipped and disabled. - -if MPU_SENSORS_ACCEL - -config MPU_SENSORS_ADXL34X - bool "ADI adxl34x" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the ADI adxl345 or adxl346 accelerometers. - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_BMA222 - bool "Bosch BMA222" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the Bosch BMA222 accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_BMA150 - bool "Bosch BMA150" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the Bosch BMA150 accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_BMA250 - bool "Bosch BMA250" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the Bosch BMA250 accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_KXSD9 - bool "Kionix KXSD9" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the Kionix KXSD9 accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_KXTF9 - bool "Kionix KXTF9" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the Kionix KXFT9 accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_LIS331DLH - bool "ST lis331dlh" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the ST lis331dlh accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_LIS3DH - bool "ST lis3dh" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the ST lis3dh accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_LSM303DLX_A - bool "ST lsm303dlx" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the ST lsm303dlh and lsm303dlm accelerometers - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_MMA8450 - bool "Freescale mma8450" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the Freescale mma8450 accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_MMA845X - bool "Freescale mma8451/8452/8453" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the Freescale mma8451/8452/8453 accelerometer - This support is for integration with the MPU3050 gyroscope device - driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -config MPU_SENSORS_BUILTIN_ACCEL - bool "MPU6050 built in accelerometer" - depends on MPU_SENSORS_MPU6050B1 || MPU_SENSORS_MPU6050A2 - help - This enables support for the MPU6050 built in accelerometer. - This the built in support for integration with the MPU6050 gyroscope - device driver. This is the only accelerometer supported with the - MPU6050. Specifying another accelerometer in the board file will - result in runtime errors. - -endif diff --git a/drivers/misc/inv_mpu/accel/Makefile b/drivers/misc/inv_mpu/accel/Makefile deleted file mode 100644 index 1f0f5be..0000000 --- a/drivers/misc/inv_mpu/accel/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# -# Accel Slaves to MPUxxxx -# -obj-$(CONFIG_MPU_SENSORS_ADXL34X) += inv_mpu_adxl34x.o -inv_mpu_adxl34x-objs += adxl34x.o - -obj-$(CONFIG_MPU_SENSORS_BMA150) += inv_mpu_bma150.o -inv_mpu_bma150-objs += bma150.o - -obj-$(CONFIG_MPU_SENSORS_KXTF9) += inv_mpu_kxtf9.o -inv_mpu_kxtf9-objs += kxtf9.o - -obj-$(CONFIG_MPU_SENSORS_BMA222) += inv_mpu_bma222.o -inv_mpu_bma222-objs += bma222.o - -obj-$(CONFIG_MPU_SENSORS_BMA250) += inv_mpu_bma250.o -inv_mpu_bma250-objs += bma250.o - -obj-$(CONFIG_MPU_SENSORS_KXSD9) += inv_mpu_kxsd9.o -inv_mpu_kxsd9-objs += kxsd9.o - -obj-$(CONFIG_MPU_SENSORS_LIS331DLH) += inv_mpu_lis331.o -inv_mpu_lis331-objs += lis331.o - -obj-$(CONFIG_MPU_SENSORS_LIS3DH) += inv_mpu_lis3dh.o -inv_mpu_lis3dh-objs += lis3dh.o - -obj-$(CONFIG_MPU_SENSORS_LSM303DLX_A) += inv_mpu_lsm303dlx_a.o -inv_mpu_lsm303dlx_a-objs += lsm303dlx_a.o - -obj-$(CONFIG_MPU_SENSORS_MMA8450) += inv_mpu_mma8450.o -inv_mpu_mma8450-objs += mma8450.o - -obj-$(CONFIG_MPU_SENSORS_MMA845X) += inv_mpu_mma845x.o -inv_mpu_mma845x-objs += mma845x.o - -EXTRA_CFLAGS += -Idrivers/misc/inv_mpu -EXTRA_CFLAGS += -D__C99_DESIGNATED_INITIALIZER diff --git a/drivers/misc/inv_mpu/accel/adxl34x.c b/drivers/misc/inv_mpu/accel/adxl34x.c deleted file mode 100644 index f2bff8a..0000000 --- a/drivers/misc/inv_mpu/accel/adxl34x.c +++ /dev/null @@ -1,728 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file adxl34x.c - * @brief Accelerometer setup and handling methods for AD adxl345 and - * adxl346. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include - -#include -#include "mlsl.h" -#include "mldl_cfg.h" - -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* -------------------------------------------------------------------------- */ - -/* registers */ -#define ADXL34X_ODR_REG (0x2C) -#define ADXL34X_PWR_REG (0x2D) -#define ADXL34X_DATAFORMAT_REG (0x31) - -/* masks */ -#define ADXL34X_ODR_MASK (0x0F) -#define ADXL34X_PWR_SLEEP_MASK (0x04) -#define ADXL34X_PWR_MEAS_MASK (0x08) -#define ADXL34X_DATAFORMAT_JUSTIFY_MASK (0x04) -#define ADXL34X_DATAFORMAT_FSR_MASK (0x03) - -/* -------------------------------------------------------------------------- */ - -struct adxl34x_config { - unsigned int odr; /** < output data rate in mHz */ - unsigned int fsr; /** < full scale range mg */ - unsigned int fsr_reg_mask; /** < register setting for fsr */ -}; - -struct adxl34x_private_data { - struct adxl34x_config suspend; /** < suspend configuration */ - struct adxl34x_config resume; /** < resume configuration */ -}; - -/** - * @brief Set the output data rate for the particular configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * Config to modify with new ODR. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param odr - * Output data rate in units of 1/1000Hz (mHz). - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct adxl34x_config *config, - int apply, - long odr) -{ - int result = INV_SUCCESS; - unsigned char new_odr_mask; - - /* ADXL346 (Rev. A) pages 13, 24 */ - if (odr >= 3200000) { - new_odr_mask = 0x0F; - config->odr = 3200000; - } else if (odr >= 1600000) { - new_odr_mask = 0x0E; - config->odr = 1600000; - } else if (odr >= 800000) { - new_odr_mask = 0x0D; - config->odr = 800000; - } else if (odr >= 400000) { - new_odr_mask = 0x0C; - config->odr = 400000; - } else if (odr >= 200000) { - new_odr_mask = 0x0B; - config->odr = 200000; - } else if (odr >= 100000) { - new_odr_mask = 0x0A; - config->odr = 100000; - } else if (odr >= 50000) { - new_odr_mask = 0x09; - config->odr = 50000; - } else if (odr >= 25000) { - new_odr_mask = 0x08; - config->odr = 25000; - } else if (odr >= 12500) { - new_odr_mask = 0x07; - config->odr = 12500; - } else if (odr >= 6250) { - new_odr_mask = 0x06; - config->odr = 6250; - } else if (odr >= 3130) { - new_odr_mask = 0x05; - config->odr = 3130; - } else if (odr >= 1560) { - new_odr_mask = 0x04; - config->odr = 1560; - } else if (odr >= 780) { - new_odr_mask = 0x03; - config->odr = 780; - } else if (odr >= 390) { - new_odr_mask = 0x02; - config->odr = 390; - } else if (odr >= 200) { - new_odr_mask = 0x01; - config->odr = 200; - } else { - new_odr_mask = 0x00; - config->odr = 100; - } - - if (apply) { - unsigned char reg_odr; - result = inv_serial_read(mlsl_handle, pdata->address, - ADXL34X_ODR_REG, 1, ®_odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - reg_odr &= ~ADXL34X_ODR_MASK; - reg_odr |= new_odr_mask; - result = inv_serial_single_write(mlsl_handle, pdata->address, - ADXL34X_ODR_REG, reg_odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGV("ODR: %d mHz\n", config->odr); - } - return result; -} - -/** - * @brief Set the full scale range of the accels - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * pointer to configuration. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param fsr - * requested full scale range in milli gees (mg). - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct adxl34x_config *config, - int apply, - long fsr) -{ - int result = INV_SUCCESS; - - if (fsr <= 2000) { - config->fsr_reg_mask = 0x00; - config->fsr = 2000; - } else if (fsr <= 4000) { - config->fsr_reg_mask = 0x01; - config->fsr = 4000; - } else if (fsr <= 8000) { - config->fsr_reg_mask = 0x02; - config->fsr = 8000; - } else { /* 8001 -> oo */ - config->fsr_reg_mask = 0x03; - config->fsr = 16000; - } - - if (apply) { - unsigned char reg_df; - result = inv_serial_read(mlsl_handle, pdata->address, - ADXL34X_DATAFORMAT_REG, 1, ®_df); - reg_df &= ~ADXL34X_DATAFORMAT_FSR_MASK; - result = inv_serial_single_write(mlsl_handle, pdata->address, - ADXL34X_DATAFORMAT_REG, - reg_df | config->fsr_reg_mask); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGV("FSR: %d mg\n", config->fsr); - } - return result; -} - -/** - * @brief facility to retrieve the device configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to store the returned configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct adxl34x_private_data *private_data = - (struct adxl34x_private_data *)(pdata->private_data); - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - case MPU_SLAVE_CONFIG_IRQ_RESUME: - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -/** - * @brief device configuration facility. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to the configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct adxl34x_private_data *private_data = - (struct adxl34x_private_data *)(pdata->private_data); - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return adxl34x_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return adxl34x_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return adxl34x_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return adxl34x_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - case MPU_SLAVE_CONFIG_IRQ_RESUME: - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - return INV_SUCCESS; -} - -/** - * @brief suspends the device to put it in its lowest power mode. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - - /* - struct adxl34x_config *suspend_config = - &((struct adxl34x_private_data *)pdata->private_data)->suspend; - - result = adxl34x_set_odr(mlsl_handle, pdata, suspend_config, - true, suspend_config->odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; -} - result = adxl34x_set_fsr(mlsl_handle, pdata, suspend_config, - true, suspend_config->fsr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; -} - */ - - /* - Page 25 - When clearing the sleep bit, it is recommended that the part - be placed into standby mode and then set back to measurement mode - with a subsequent write. - This is done to ensure that the device is properly biased if sleep - mode is manually disabled; otherwise, the first few samples of data - after the sleep bit is cleared may have additional noise, - especially if the device was asleep when the bit was cleared. */ - - /* go in standy-by mode (suspends measurements) */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - ADXL34X_PWR_REG, ADXL34X_PWR_MEAS_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* and then in sleep */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - ADXL34X_PWR_REG, - ADXL34X_PWR_MEAS_MASK | ADXL34X_PWR_SLEEP_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -/** - * @brief resume the device in the proper power state given the configuration - * chosen. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - struct adxl34x_config *resume_config = - &((struct adxl34x_private_data *)pdata->private_data)->resume; - unsigned char reg; - - /* - Page 25 - When clearing the sleep bit, it is recommended that the part - be placed into standby mode and then set back to measurement mode - with a subsequent write. - This is done to ensure that the device is properly biased if sleep - mode is manually disabled; otherwise, the first few samples of data - after the sleep bit is cleared may have additional noise, - especially if the device was asleep when the bit was cleared. */ - - /* remove sleep, but leave in stand-by */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - ADXL34X_PWR_REG, ADXL34X_PWR_MEAS_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = adxl34x_set_odr(mlsl_handle, pdata, resume_config, - true, resume_config->odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* - -> FSR - -> Justiy bit for Big endianess - -> resulution to 10 bits - */ - reg = ADXL34X_DATAFORMAT_JUSTIFY_MASK; - reg |= resume_config->fsr_reg_mask; - result = inv_serial_single_write(mlsl_handle, pdata->address, - ADXL34X_DATAFORMAT_REG, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* go in measurement mode */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - ADXL34X_PWR_REG, 0x00); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* DATA_FORMAT: full resolution of +/-2g; data is left justified */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - 0x31, reg); - - return result; -} - -/** - * @brief one-time device driver initialization function. - * If the driver is built as a kernel module, this function will be - * called when the module is loaded in the kernel. - * If the driver is built-in in the kernel, this function will be - * called at boot time. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - long range; - - struct adxl34x_private_data *private_data; - private_data = (struct adxl34x_private_data *) - kzalloc(sizeof(struct adxl34x_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - result = adxl34x_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = adxl34x_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - range = range_fixedpoint_to_long_mg(slave->range); - result = adxl34x_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, range); - result = adxl34x_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, range); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = adxl34x_suspend(mlsl_handle, slave, pdata); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief one-time device driver exit function. - * If the driver is built as a kernel module, this function will be - * called when the module is removed from the kernel. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -/** - * @brief read the sensor data from the device. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a buffer to store the data read. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int adxl34x_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, data); - return result; -} - -static struct ext_slave_descr adxl34x_descr = { - .init = adxl34x_init, - .exit = adxl34x_exit, - .suspend = adxl34x_suspend, - .resume = adxl34x_resume, - .read = adxl34x_read, - .config = adxl34x_config, - .get_config = adxl34x_get_config, - .name = "adxl34x", /* 5 or 6 */ - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_ADXL34X, - .read_reg = 0x32, - .read_len = 6, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {2, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *adxl34x_get_slave_descr(void) -{ - return &adxl34x_descr; -} - -/* -------------------------------------------------------------------------- */ -struct adxl34x_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int adxl34x_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct adxl34x_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - adxl34x_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int adxl34x_mod_remove(struct i2c_client *client) -{ - struct adxl34x_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - adxl34x_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id adxl34x_mod_id[] = { - { "adxl34x", ACCEL_ID_ADXL34X }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, adxl34x_mod_id); - -static struct i2c_driver adxl34x_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = adxl34x_mod_probe, - .remove = adxl34x_mod_remove, - .id_table = adxl34x_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "adxl34x_mod", - }, - .address_list = normal_i2c, -}; - -static int __init adxl34x_mod_init(void) -{ - int res = i2c_add_driver(&adxl34x_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "adxl34x_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit adxl34x_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&adxl34x_mod_driver); -} - -module_init(adxl34x_mod_init); -module_exit(adxl34x_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate ADXL34X sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("adxl34x_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/bma150.c b/drivers/misc/inv_mpu/accel/bma150.c deleted file mode 100644 index c35f43a..0000000 --- a/drivers/misc/inv_mpu/accel/bma150.c +++ /dev/null @@ -1,776 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file bma150.c - * @brief Accelerometer setup and handling methods for Bosch BMA150. - */ - -/* -------------------------------------------------------------------------- */ -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include "mlsl.h" -#include "mldl_cfg.h" - -/* -------------------------------------------------------------------------- */ -/* registers */ -#define BMA150_CTRL_REG (0x14) -#define BMA150_INT_REG (0x15) -#define BMA150_PWR_REG (0x0A) - -/* masks */ -#define BMA150_CTRL_MASK (0x18) -#define BMA150_CTRL_MASK_ODR (0xF8) -#define BMA150_CTRL_MASK_FSR (0xE7) -#define BMA150_INT_MASK_WUP (0xF8) -#define BMA150_INT_MASK_IRQ (0xDF) -#define BMA150_PWR_MASK_SLEEP (0x01) -#define BMA150_PWR_MASK_SOFT_RESET (0x02) - -/* -------------------------------------------------------------------------- */ -struct bma150_config { - unsigned int odr; /** < output data rate mHz */ - unsigned int fsr; /** < full scale range mgees */ - unsigned int irq_type; /** < type of IRQ, see bma150_set_irq */ - unsigned char ctrl_reg; /** < control register value */ - unsigned char int_reg; /** < interrupt control register value */ -}; - -struct bma150_private_data { - struct bma150_config suspend; /** < suspend configuration */ - struct bma150_config resume; /** < resume configuration */ -}; - -/** - * @brief Simply disables the IRQ since it is not usable on BMA150 devices. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * configuration to apply to, suspend or resume - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param irq_type - * the type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - * The only supported IRQ type is MPU_SLAVE_IRQ_TYPE_NONE which - * corresponds to disabling the IRQ completely. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct bma150_config *config, - int apply, - long irq_type) -{ - int result = INV_SUCCESS; - - if (irq_type != MPU_SLAVE_IRQ_TYPE_NONE) - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - - config->irq_type = MPU_SLAVE_IRQ_TYPE_NONE; - config->int_reg = 0x00; - - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_CTRL_REG, config->ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_INT_REG, config->int_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - return result; -} - -/** - * @brief Set the output data rate for the particular configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * Config to modify with new ODR. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param odr - * Output data rate in units of 1/1000Hz (mHz). - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct bma150_config *config, - int apply, - long odr) -{ - unsigned char odr_bits = 0; - unsigned char wup_bits = 0; - int result = INV_SUCCESS; - - if (odr > 100000) { - config->odr = 190000; - odr_bits = 0x03; - } else if (odr > 50000) { - config->odr = 100000; - odr_bits = 0x02; - } else if (odr > 25000) { - config->odr = 50000; - odr_bits = 0x01; - } else if (odr > 0) { - config->odr = 25000; - odr_bits = 0x00; - } else { - config->odr = 0; - wup_bits = 0x00; - } - - config->int_reg &= BMA150_INT_MASK_WUP; - config->ctrl_reg &= BMA150_CTRL_MASK_ODR; - config->ctrl_reg |= odr_bits; - - MPL_LOGV("ODR: %d\n", config->odr); - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_CTRL_REG, config->ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_INT_REG, config->int_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - return result; -} - -/** - * @brief Set the full scale range of the accels - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * pointer to configuration. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param fsr - * requested full scale range. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct bma150_config *config, - int apply, - long fsr) -{ - unsigned char fsr_bits; - int result = INV_SUCCESS; - - if (fsr <= 2048) { - fsr_bits = 0x00; - config->fsr = 2048; - } else if (fsr <= 4096) { - fsr_bits = 0x08; - config->fsr = 4096; - } else { - fsr_bits = 0x10; - config->fsr = 8192; - } - - config->ctrl_reg &= BMA150_CTRL_MASK_FSR; - config->ctrl_reg |= fsr_bits; - - MPL_LOGV("FSR: %d\n", config->fsr); - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_CTRL_REG, config->ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_CTRL_REG, config->ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - return result; -} - -/** - * @brief one-time device driver initialization function. - * If the driver is built as a kernel module, this function will be - * called when the module is loaded in the kernel. - * If the driver is built-in in the kernel, this function will be - * called at boot time. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg; - long range; - - struct bma150_private_data *private_data; - private_data = (struct bma150_private_data *) - kzalloc(sizeof(struct bma150_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_PWR_REG, BMA150_PWR_MASK_SOFT_RESET); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); - - result = inv_serial_read(mlsl_handle, pdata->address, - BMA150_CTRL_REG, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - private_data->resume.ctrl_reg = reg; - private_data->suspend.ctrl_reg = reg; - - result = inv_serial_read(mlsl_handle, pdata->address, - BMA150_INT_REG, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - private_data->resume.int_reg = reg; - private_data->suspend.int_reg = reg; - - result = bma150_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma150_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - range = range_fixedpoint_to_long_mg(slave->range); - result = bma150_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, range); - result = bma150_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, range); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = bma150_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, MPU_SLAVE_IRQ_TYPE_NONE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma150_set_irq(mlsl_handle, pdata, &private_data->resume, - false, MPU_SLAVE_IRQ_TYPE_NONE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_PWR_REG, BMA150_PWR_MASK_SLEEP); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief one-time device driver exit function. - * If the driver is built as a kernel module, this function will be - * called when the module is removed from the kernel. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -/** - * @brief device configuration facility. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to the configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct bma150_private_data *private_data = - (struct bma150_private_data *)(pdata->private_data); - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return bma150_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return bma150_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return bma150_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return bma150_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return bma150_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return bma150_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - return INV_SUCCESS; -} - -/** - * @brief facility to retrieve the device configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to store the returned configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct bma150_private_data *private_data = - (struct bma150_private_data *)(pdata->private_data); - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.irq_type; - break; - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -/** - * @brief suspends the device to put it in its lowest power mode. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char ctrl_reg; - unsigned char int_reg; - - struct bma150_private_data *private_data = - (struct bma150_private_data *)(pdata->private_data); - - ctrl_reg = private_data->suspend.ctrl_reg; - int_reg = private_data->suspend.int_reg; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_PWR_REG, BMA150_PWR_MASK_SOFT_RESET); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_CTRL_REG, ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_INT_REG, int_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_PWR_REG, BMA150_PWR_MASK_SLEEP); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief resume the device in the proper power state given the configuration - * chosen. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char ctrl_reg; - unsigned char int_reg; - - struct bma150_private_data *private_data = - (struct bma150_private_data *)(pdata->private_data); - - ctrl_reg = private_data->resume.ctrl_reg; - int_reg = private_data->resume.int_reg; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_PWR_REG, BMA150_PWR_MASK_SOFT_RESET); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_CTRL_REG, ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_INT_REG, int_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA150_PWR_REG, 0x00); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief read the sensor data from the device. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a buffer to store the data read. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma150_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - return inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, data); -} - -static struct ext_slave_descr bma150_descr = { - .init = bma150_init, - .exit = bma150_exit, - .suspend = bma150_suspend, - .resume = bma150_resume, - .read = bma150_read, - .config = bma150_config, - .get_config = bma150_get_config, - .name = "bma150", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_BMA150, - .read_reg = 0x02, - .read_len = 6, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {2, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *bma150_get_slave_descr(void) -{ - return &bma150_descr; -} - -/* -------------------------------------------------------------------------- */ - -/* Platform data for the MPU */ -struct bma150_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int bma150_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct bma150_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - bma150_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int bma150_mod_remove(struct i2c_client *client) -{ - struct bma150_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - bma150_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id bma150_mod_id[] = { - { "bma150", ACCEL_ID_BMA150 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, bma150_mod_id); - -static struct i2c_driver bma150_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = bma150_mod_probe, - .remove = bma150_mod_remove, - .id_table = bma150_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "bma150_mod", - }, - .address_list = normal_i2c, -}; - -static int __init bma150_mod_init(void) -{ - int res = i2c_add_driver(&bma150_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "bma150_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit bma150_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&bma150_mod_driver); -} - -module_init(bma150_mod_init); -module_exit(bma150_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate BMA150 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("bma150_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/bma222.c b/drivers/misc/inv_mpu/accel/bma222.c deleted file mode 100644 index e9fc99b..0000000 --- a/drivers/misc/inv_mpu/accel/bma222.c +++ /dev/null @@ -1,654 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/* - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file bma222.c - * @brief Accelerometer setup and handling methods for Bosch BMA222. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include "mlsl.h" -#include "mldl_cfg.h" - -/* -------------------------------------------------------------------------- */ - -#define BMA222_STATUS_REG (0x0A) -#define BMA222_FSR_REG (0x0F) -#define ADXL34X_ODR_REG (0x10) -#define BMA222_PWR_REG (0x11) -#define BMA222_SOFTRESET_REG (0x14) - -#define BMA222_STATUS_RDY_MASK (0x80) -#define BMA222_FSR_MASK (0x0F) -#define BMA222_ODR_MASK (0x1F) -#define BMA222_PWR_SLEEP_MASK (0x80) -#define BMA222_PWR_AWAKE_MASK (0x00) -#define BMA222_SOFTRESET_MASK (0xB6) -#define BMA222_SOFTRESET_MASK (0xB6) - -/* -------------------------------------------------------------------------- */ - -struct bma222_config { - unsigned int odr; /** < output data rate in mHz */ - unsigned int fsr; /** < full scale range mg */ -}; - -struct bma222_private_data { - struct bma222_config suspend; /** < suspend configuration */ - struct bma222_config resume; /** < resume configuration */ -}; - - -/* -------------------------------------------------------------------------- */ - -/** - * @brief Set the output data rate for the particular configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * Config to modify with new ODR. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param odr - * Output data rate in units of 1/1000Hz (mHz). - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct bma222_config *config, - int apply, - long odr) -{ - int result = INV_SUCCESS; - unsigned char reg_odr; - - if (odr >= 1000000) { - reg_odr = 0x0F; - config->odr = 1000000; - } else if (odr >= 500000) { - reg_odr = 0x0E; - config->odr = 500000; - } else if (odr >= 250000) { - reg_odr = 0x0D; - config->odr = 250000; - } else if (odr >= 125000) { - reg_odr = 0x0C; - config->odr = 125000; - } else if (odr >= 62500) { - reg_odr = 0x0B; - config->odr = 62500; - } else if (odr >= 32000) { - reg_odr = 0x0A; - config->odr = 32000; - } else if (odr >= 16000) { - reg_odr = 0x09; - config->odr = 16000; - } else { - reg_odr = 0x08; - config->odr = 8000; - } - - if (apply) { - MPL_LOGV("ODR: %d\n", config->odr); - result = inv_serial_single_write(mlsl_handle, pdata->address, - ADXL34X_ODR_REG, reg_odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - return result; -} - -/** - * @brief Set the full scale range of the accels - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * pointer to configuration. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param fsr - * requested full scale range. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct bma222_config *config, - int apply, - long fsr) -{ - int result = INV_SUCCESS; - unsigned char reg_fsr_mask; - - if (fsr <= 2000) { - reg_fsr_mask = 0x03; - config->fsr = 2000; - } else if (fsr <= 4000) { - reg_fsr_mask = 0x05; - config->fsr = 4000; - } else if (fsr <= 8000) { - reg_fsr_mask = 0x08; - config->fsr = 8000; - } else { /* 8001 -> oo */ - reg_fsr_mask = 0x0C; - config->fsr = 16000; - } - - if (apply) { - MPL_LOGV("FSR: %d\n", config->fsr); - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA222_FSR_REG, reg_fsr_mask); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - return result; -} - -/** - * @brief one-time device driver initialization function. - * If the driver is built as a kernel module, this function will be - * called when the module is loaded in the kernel. - * If the driver is built-in in the kernel, this function will be - * called at boot time. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - - struct bma222_private_data *private_data; - private_data = (struct bma222_private_data *) - kzalloc(sizeof(struct bma222_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA222_SOFTRESET_REG, BMA222_SOFTRESET_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); - - result = bma222_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma222_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = bma222_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, 2000); - result = bma222_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, 2000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA222_PWR_REG, BMA222_PWR_SLEEP_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief one-time device driver exit function. - * If the driver is built as a kernel module, this function will be - * called when the module is removed from the kernel. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - - -/** - * @brief facility to retrieve the device configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to store the returned configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct bma222_private_data *private_data = - (struct bma222_private_data *)(pdata->private_data); - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - case MPU_SLAVE_CONFIG_IRQ_RESUME: - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -/** - * @brief device configuration facility. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to the configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct bma222_private_data *private_data = - (struct bma222_private_data *)(pdata->private_data); - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return bma222_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return bma222_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return bma222_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return bma222_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - case MPU_SLAVE_CONFIG_IRQ_RESUME: - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - return INV_SUCCESS; -} - -/** - * @brief suspends the device to put it in its lowest power mode. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - struct bma222_config *suspend_config = - &((struct bma222_private_data *)pdata->private_data)->suspend; - - result = bma222_set_odr(mlsl_handle, pdata, suspend_config, - true, suspend_config->odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma222_set_fsr(mlsl_handle, pdata, suspend_config, - true, suspend_config->fsr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA222_PWR_REG, BMA222_PWR_SLEEP_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - msleep(3); /* 3 ms powerup time maximum */ - return result; -} - -/** - * @brief resume the device in the proper power state given the configuration - * chosen. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - struct bma222_config *resume_config = - &((struct bma222_private_data *)pdata->private_data)->resume; - - /* Soft reset */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA222_SOFTRESET_REG, BMA222_SOFTRESET_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(10); - - result = bma222_set_odr(mlsl_handle, pdata, resume_config, - true, resume_config->odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma222_set_fsr(mlsl_handle, pdata, resume_config, - true, resume_config->fsr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief read the sensor data from the device. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a buffer to store the data read. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma222_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = INV_SUCCESS; - result = inv_serial_read(mlsl_handle, pdata->address, - BMA222_STATUS_REG, 1, data); - if (data[0] & BMA222_STATUS_RDY_MASK) { - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, data); - return result; - } else - return INV_ERROR_ACCEL_DATA_NOT_READY; -} - -static struct ext_slave_descr bma222_descr = { - .init = bma222_init, - .exit = bma222_exit, - .suspend = bma222_suspend, - .resume = bma222_resume, - .read = bma222_read, - .config = bma222_config, - .get_config = bma222_get_config, - .name = "bma222", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_BMA222, - .read_reg = 0x02, - .read_len = 6, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {2, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *bma222_get_slave_descr(void) -{ - return &bma222_descr; -} - -/* -------------------------------------------------------------------------- */ - -struct bma222_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int bma222_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct bma222_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - bma222_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int bma222_mod_remove(struct i2c_client *client) -{ - struct bma222_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - bma222_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id bma222_mod_id[] = { - { "bma222", ACCEL_ID_BMA222 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, bma222_mod_id); - -static struct i2c_driver bma222_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = bma222_mod_probe, - .remove = bma222_mod_remove, - .id_table = bma222_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "bma222_mod", - }, - .address_list = normal_i2c, -}; - -static int __init bma222_mod_init(void) -{ - int res = i2c_add_driver(&bma222_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "bma222_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit bma222_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&bma222_mod_driver); -} - -module_init(bma222_mod_init); -module_exit(bma222_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate BMA222 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("bma222_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/bma250.c b/drivers/misc/inv_mpu/accel/bma250.c deleted file mode 100644 index 6a245f4..0000000 --- a/drivers/misc/inv_mpu/accel/bma250.c +++ /dev/null @@ -1,787 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file bma250.c - * @brief Accelerometer setup and handling methods for Bosch BMA250. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include "mlsl.h" -#include "mldl_cfg.h" - -/* -------------------------------------------------------------------------- */ - -/* registers */ -#define BMA250_STATUS_REG (0x0A) -#define BMA250_FSR_REG (0x0F) -#define BMA250_ODR_REG (0x10) -#define BMA250_PWR_REG (0x11) -#define BMA250_SOFTRESET_REG (0x14) -#define BMA250_INT_TYPE_REG (0x17) -#define BMA250_INT_DST_REG (0x1A) -#define BMA250_INT_SRC_REG (0x1E) - -/* masks */ -#define BMA250_STATUS_RDY_MASK (0x80) -#define BMA250_FSR_MASK (0x0F) -#define BMA250_ODR_MASK (0x1F) -#define BMA250_PWR_SLEEP_MASK (0x80) -#define BMA250_PWR_AWAKE_MASK (0x00) -#define BMA250_SOFTRESET_MASK (0xB6) -#define BMA250_INT_TYPE_MASK (0x10) -#define BMA250_INT_DST_1_MASK (0x01) -#define BMA250_INT_DST_2_MASK (0x80) -#define BMA250_INT_SRC_MASK (0x00) - -/* -------------------------------------------------------------------------- */ - -struct bma250_config { - unsigned int odr; /** < output data rate in mHz */ - unsigned int fsr; /** < full scale range mg */ - unsigned char irq_type; -}; - -struct bma250_private_data { - struct bma250_config suspend; /** < suspend configuration */ - struct bma250_config resume; /** < resume configuration */ -}; - -/* -------------------------------------------------------------------------- */ -/** - * @brief Sets the IRQ to fire when one of the IRQ events occur. - * Threshold and duration will not be used unless the type is MOT or - * NMOT. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * configuration to apply to, suspend or resume - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param irq_type - * the type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct bma250_config *config, - int apply, long irq_type) -{ - int result = INV_SUCCESS; - unsigned char irqtype_reg; - unsigned char irqdst_reg; - unsigned char irqsrc_reg; - - switch (irq_type) { - case MPU_SLAVE_IRQ_TYPE_DATA_READY: - /* data ready int. */ - irqtype_reg = BMA250_INT_TYPE_MASK; - /* routed to interrupt pin 1 */ - irqdst_reg = BMA250_INT_DST_1_MASK; - /* from filtered data */ - irqsrc_reg = BMA250_INT_SRC_MASK; - break; - /* unfinished - case MPU_SLAVE_IRQ_TYPE_MOTION: - reg1 = 0x00; - reg2 = config->mot_int1_cfg; - reg3 = ; - break; - */ - case MPU_SLAVE_IRQ_TYPE_NONE: - irqtype_reg = 0x00; - irqdst_reg = 0x00; - irqsrc_reg = 0x00; - break; - default: - return INV_ERROR_INVALID_PARAMETER; - break; - } - - config->irq_type = (unsigned char)irq_type; - - if (apply) { - /* select the type of interrupt to use */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_INT_TYPE_REG, irqtype_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* select to which interrupt pin to route it to */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_INT_DST_REG, irqdst_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* select whether the interrupt works off filtered or - unfiltered data */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_INT_SRC_REG, irqsrc_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - return result; -} - -/** - * @brief Set the output data rate for the particular configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * Config to modify with new ODR. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param odr - * Output data rate in units of 1/1000Hz (mHz). - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct bma250_config *config, - int apply, - long odr) -{ - int result = INV_SUCCESS; - unsigned char reg_odr; - - /* Table uses bandwidth which is half the sample rate */ - odr = odr >> 1; - if (odr >= 1000000) { - reg_odr = 0x0F; - config->odr = 2000000; - } else if (odr >= 500000) { - reg_odr = 0x0E; - config->odr = 1000000; - } else if (odr >= 250000) { - reg_odr = 0x0D; - config->odr = 500000; - } else if (odr >= 125000) { - reg_odr = 0x0C; - config->odr = 250000; - } else if (odr >= 62500) { - reg_odr = 0x0B; - config->odr = 125000; - } else if (odr >= 31250) { - reg_odr = 0x0A; - config->odr = 62500; - } else if (odr >= 15630) { - reg_odr = 0x09; - config->odr = 31250; - } else { - reg_odr = 0x08; - config->odr = 15630; - } - - if (apply) { - MPL_LOGV("ODR: %d\n", config->odr); - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_ODR_REG, reg_odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - return result; -} - -/** - * @brief Set the full scale range of the accels - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * pointer to configuration. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param fsr - * requested full scale range. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct bma250_config *config, - int apply, - long fsr) -{ - int result = INV_SUCCESS; - unsigned char reg_fsr_mask; - - if (fsr <= 2000) { - reg_fsr_mask = 0x03; - config->fsr = 2000; - } else if (fsr <= 4000) { - reg_fsr_mask = 0x05; - config->fsr = 4000; - } else if (fsr <= 8000) { - reg_fsr_mask = 0x08; - config->fsr = 8000; - } else { /* 8001 -> oo */ - reg_fsr_mask = 0x0C; - config->fsr = 16000; - } - - if (apply) { - MPL_LOGV("FSR: %d\n", config->fsr); - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_FSR_REG, reg_fsr_mask); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - return result; -} - -/** - * @brief one-time device driver initialization function. - * If the driver is built as a kernel module, this function will be - * called when the module is loaded in the kernel. - * If the driver is built-in in the kernel, this function will be - * called at boot time. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - long range; - - struct bma250_private_data *private_data; - private_data = kzalloc(sizeof(struct bma250_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_SOFTRESET_REG, BMA250_SOFTRESET_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); - - result = bma250_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma250_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - range = range_fixedpoint_to_long_mg(slave->range); - result = bma250_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, range); - result = bma250_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, range); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = bma250_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, MPU_SLAVE_IRQ_TYPE_NONE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma250_set_irq(mlsl_handle, pdata, &private_data->resume, - false, MPU_SLAVE_IRQ_TYPE_NONE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_PWR_REG, BMA250_PWR_SLEEP_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief one-time device driver exit function. - * If the driver is built as a kernel module, this function will be - * called when the module is removed from the kernel. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -/** - * @brief device configuration facility. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to the configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct bma250_private_data *private_data = - (struct bma250_private_data *)(pdata->private_data); - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return bma250_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return bma250_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return bma250_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return bma250_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return bma250_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return bma250_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - return INV_SUCCESS; -} - -/** - * @brief facility to retrieve the device configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to store the returned configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct bma250_private_data *private_data = - (struct bma250_private_data *)(pdata->private_data); - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.irq_type; - break; - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -/** - * @brief suspends the device to put it in its lowest power mode. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - struct bma250_config *suspend_config = - &((struct bma250_private_data *)pdata->private_data)->suspend; - - result = bma250_set_odr(mlsl_handle, pdata, suspend_config, - true, suspend_config->odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma250_set_fsr(mlsl_handle, pdata, suspend_config, - true, suspend_config->fsr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma250_set_irq(mlsl_handle, pdata, suspend_config, - true, suspend_config->irq_type); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_PWR_REG, BMA250_PWR_SLEEP_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - msleep(3); /* 3 ms powerup time maximum */ - return result; -} - -/** - * @brief resume the device in the proper power state given the configuration - * chosen. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - struct bma250_config *resume_config = - &((struct bma250_private_data *)pdata->private_data)->resume; - - result = bma250_set_odr(mlsl_handle, pdata, resume_config, - true, resume_config->odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma250_set_fsr(mlsl_handle, pdata, resume_config, - true, resume_config->fsr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = bma250_set_irq(mlsl_handle, pdata, resume_config, - true, resume_config->irq_type); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write(mlsl_handle, pdata->address, - BMA250_PWR_REG, BMA250_PWR_AWAKE_MASK); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief read the sensor data from the device. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a buffer to store the data read. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int bma250_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = INV_SUCCESS; - result = inv_serial_read(mlsl_handle, pdata->address, - BMA250_STATUS_REG, 1, data); - if (1) { /* KLP - workaroud for small data ready window */ - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, data); - return result; - } else - return INV_ERROR_ACCEL_DATA_NOT_READY; -} - -static struct ext_slave_descr bma250_descr = { - .init = bma250_init, - .exit = bma250_exit, - .suspend = bma250_suspend, - .resume = bma250_resume, - .read = bma250_read, - .config = bma250_config, - .get_config = bma250_get_config, - .name = "bma250", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_BMA250, - .read_reg = 0x02, - .read_len = 6, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {2, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *bma250_get_slave_descr(void) -{ - return &bma250_descr; -} - -/* -------------------------------------------------------------------------- */ - -/* Platform data for the MPU */ -struct bma250_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int bma250_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct bma250_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - bma250_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int bma250_mod_remove(struct i2c_client *client) -{ - struct bma250_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - bma250_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id bma250_mod_id[] = { - { "bma250", ACCEL_ID_BMA250 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, bma250_mod_id); - -static struct i2c_driver bma250_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = bma250_mod_probe, - .remove = bma250_mod_remove, - .id_table = bma250_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "bma250_mod", - }, - .address_list = normal_i2c, -}; - -static int __init bma250_mod_init(void) -{ - int res = i2c_add_driver(&bma250_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "bma250_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit bma250_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&bma250_mod_driver); -} - -module_init(bma250_mod_init); -module_exit(bma250_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate BMA250 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("bma250_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/cma3000.c b/drivers/misc/inv_mpu/accel/cma3000.c deleted file mode 100644 index 496d1f2..0000000 --- a/drivers/misc/inv_mpu/accel/cma3000.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/* - * @addtogroup ACCELDL - * @brief Accelerometer setup and handling methods for VTI CMA3000. - * - * @{ - * @file cma3000.c - * @brief Accelerometer setup and handling methods for VTI CMA3000 - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* -------------------------------------------------------------------------- */ - -static int cma3000_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - /* RAM reset */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, 0x1d, 0xcd); - return result; -} - -static int cma3000_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - - return INV_SUCCESS; -} - -static int cma3000_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = inv_serial_read(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -static struct ext_slave_descr cma3000_descr = { - .init = NULL, - .exit = NULL, - .suspend = cma3000_suspend, - .resume = cma3000_resume, - .read = cma3000_read, - .config = NULL, - .get_config = NULL, - .name = "cma3000", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ID_INVALID, - .read_reg = 0x06, - .read_len = 6, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {2, 0}, - .trigger = NULL, - -}; - -static -struct ext_slave_descr *cma3000_get_slave_descr(void) -{ - return &cma3000_descr; -} - -/* -------------------------------------------------------------------------- */ - -struct cma3000_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int cma3000_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct cma3000_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - cma3000_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int cma3000_mod_remove(struct i2c_client *client) -{ - struct cma3000_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - cma3000_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id cma3000_mod_id[] = { - { "cma3000", ACCEL_ID_CMA3000 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, cma3000_mod_id); - -static struct i2c_driver cma3000_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = cma3000_mod_probe, - .remove = cma3000_mod_remove, - .id_table = cma3000_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "cma3000_mod", - }, - .address_list = normal_i2c, -}; - -static int __init cma3000_mod_init(void) -{ - int res = i2c_add_driver(&cma3000_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "cma3000_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit cma3000_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&cma3000_mod_driver); -} - -module_init(cma3000_mod_init); -module_exit(cma3000_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate CMA3000 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("cma3000_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/kxsd9.c b/drivers/misc/inv_mpu/accel/kxsd9.c deleted file mode 100644 index 5cb4eaf..0000000 --- a/drivers/misc/inv_mpu/accel/kxsd9.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Accelerometer setup and handling methods for Kionix KXSD9. - * - * @{ - * @file kxsd9.c - * @brief Accelerometer setup and handling methods for Kionix KXSD9. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* -------------------------------------------------------------------------- */ - -static int kxsd9_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - /* CTRL_REGB: low-power standby mode */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, 0x0d, 0x0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -/* full scale setting - register and mask */ -#define ACCEL_KIONIX_CTRL_REG (0x0C) -#define ACCEL_KIONIX_CTRL_MASK (0x3) - -static int kxsd9_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - unsigned char reg; - - /* Full Scale */ - reg = 0x0; - reg &= ~ACCEL_KIONIX_CTRL_MASK; - reg |= 0x00; - if (slave->range.mantissa == 4) { /* 4g scale = 4.9951 */ - reg |= 0x2; - slave->range.fraction = 9951; - } else if (slave->range.mantissa == 7) { /* 6g scale = 7.5018 */ - reg |= 0x1; - slave->range.fraction = 5018; - } else if (slave->range.mantissa == 9) { /* 8g scale = 9.9902 */ - reg |= 0x0; - slave->range.fraction = 9902; - } else { - slave->range.mantissa = 2; /* 2g scale = 2.5006 */ - slave->range.fraction = 5006; - reg |= 0x3; - } - reg |= 0xC0; /* 100Hz LPF */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_KIONIX_CTRL_REG, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* normal operation */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, 0x0d, 0x40); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return INV_SUCCESS; -} - -static int kxsd9_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, data); - return result; -} - -static struct ext_slave_descr kxsd9_descr = { - .init = NULL, - .exit = NULL, - .suspend = kxsd9_suspend, - .resume = kxsd9_resume, - .read = kxsd9_read, - .config = NULL, - .get_config = NULL, - .name = "kxsd9", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_KXSD9, - .read_reg = 0x00, - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {2, 5006}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *kxsd9_get_slave_descr(void) -{ - return &kxsd9_descr; -} - -/* -------------------------------------------------------------------------- */ -struct kxsd9_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int kxsd9_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct kxsd9_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - kxsd9_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int kxsd9_mod_remove(struct i2c_client *client) -{ - struct kxsd9_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - kxsd9_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id kxsd9_mod_id[] = { - { "kxsd9", ACCEL_ID_KXSD9 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, kxsd9_mod_id); - -static struct i2c_driver kxsd9_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = kxsd9_mod_probe, - .remove = kxsd9_mod_remove, - .id_table = kxsd9_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "kxsd9_mod", - }, - .address_list = normal_i2c, -}; - -static int __init kxsd9_mod_init(void) -{ - int res = i2c_add_driver(&kxsd9_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "kxsd9_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit kxsd9_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&kxsd9_mod_driver); -} - -module_init(kxsd9_mod_init); -module_exit(kxsd9_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate KXSD9 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("kxsd9_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/kxtf9.c b/drivers/misc/inv_mpu/accel/kxtf9.c deleted file mode 100644 index 80776f2..0000000 --- a/drivers/misc/inv_mpu/accel/kxtf9.c +++ /dev/null @@ -1,841 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Accelerometer setup and handling methods for Kionix KXTF9. - * - * @{ - * @file kxtf9.c - * @brief Accelerometer setup and handling methods for Kionix KXTF9. -*/ - -/* -------------------------------------------------------------------------- */ - -#undef MPL_LOG_NDEBUG -#define MPL_LOG_NDEBUG 1 - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -#define KXTF9_XOUT_HPF_L (0x00) /* 0000 0000 */ -#define KXTF9_XOUT_HPF_H (0x01) /* 0000 0001 */ -#define KXTF9_YOUT_HPF_L (0x02) /* 0000 0010 */ -#define KXTF9_YOUT_HPF_H (0x03) /* 0000 0011 */ -#define KXTF9_ZOUT_HPF_L (0x04) /* 0001 0100 */ -#define KXTF9_ZOUT_HPF_H (0x05) /* 0001 0101 */ -#define KXTF9_XOUT_L (0x06) /* 0000 0110 */ -#define KXTF9_XOUT_H (0x07) /* 0000 0111 */ -#define KXTF9_YOUT_L (0x08) /* 0000 1000 */ -#define KXTF9_YOUT_H (0x09) /* 0000 1001 */ -#define KXTF9_ZOUT_L (0x0A) /* 0001 1010 */ -#define KXTF9_ZOUT_H (0x0B) /* 0001 1011 */ -#define KXTF9_ST_RESP (0x0C) /* 0000 1100 */ -#define KXTF9_WHO_AM_I (0x0F) /* 0000 1111 */ -#define KXTF9_TILT_POS_CUR (0x10) /* 0001 0000 */ -#define KXTF9_TILT_POS_PRE (0x11) /* 0001 0001 */ -#define KXTF9_INT_SRC_REG1 (0x15) /* 0001 0101 */ -#define KXTF9_INT_SRC_REG2 (0x16) /* 0001 0110 */ -#define KXTF9_STATUS_REG (0x18) /* 0001 1000 */ -#define KXTF9_INT_REL (0x1A) /* 0001 1010 */ -#define KXTF9_CTRL_REG1 (0x1B) /* 0001 1011 */ -#define KXTF9_CTRL_REG2 (0x1C) /* 0001 1100 */ -#define KXTF9_CTRL_REG3 (0x1D) /* 0001 1101 */ -#define KXTF9_INT_CTRL_REG1 (0x1E) /* 0001 1110 */ -#define KXTF9_INT_CTRL_REG2 (0x1F) /* 0001 1111 */ -#define KXTF9_INT_CTRL_REG3 (0x20) /* 0010 0000 */ -#define KXTF9_DATA_CTRL_REG (0x21) /* 0010 0001 */ -#define KXTF9_TILT_TIMER (0x28) /* 0010 1000 */ -#define KXTF9_WUF_TIMER (0x29) /* 0010 1001 */ -#define KXTF9_TDT_TIMER (0x2B) /* 0010 1011 */ -#define KXTF9_TDT_H_THRESH (0x2C) /* 0010 1100 */ -#define KXTF9_TDT_L_THRESH (0x2D) /* 0010 1101 */ -#define KXTF9_TDT_TAP_TIMER (0x2E) /* 0010 1110 */ -#define KXTF9_TDT_TOTAL_TIMER (0x2F) /* 0010 1111 */ -#define KXTF9_TDT_LATENCY_TIMER (0x30) /* 0011 0000 */ -#define KXTF9_TDT_WINDOW_TIMER (0x31) /* 0011 0001 */ -#define KXTF9_WUF_THRESH (0x5A) /* 0101 1010 */ -#define KXTF9_TILT_ANGLE (0x5C) /* 0101 1100 */ -#define KXTF9_HYST_SET (0x5F) /* 0101 1111 */ - -#define KXTF9_MAX_DUR (0xFF) -#define KXTF9_MAX_THS (0xFF) -#define KXTF9_THS_COUNTS_P_G (32) - -/* -------------------------------------------------------------------------- */ - -struct kxtf9_config { - unsigned long odr; /* Output data rate mHz */ - unsigned int fsr; /* full scale range mg */ - unsigned int ths; /* Motion no-motion thseshold mg */ - unsigned int dur; /* Motion no-motion duration ms */ - unsigned int irq_type; - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char reg_odr; - unsigned char reg_int_cfg1; - unsigned char reg_int_cfg2; - unsigned char ctrl_reg1; -}; - -struct kxtf9_private_data { - struct kxtf9_config suspend; - struct kxtf9_config resume; -}; - -static int kxtf9_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long ths) -{ - int result = INV_SUCCESS; - if ((ths * KXTF9_THS_COUNTS_P_G / 1000) > KXTF9_MAX_THS) - ths = (long)(KXTF9_MAX_THS * 1000) / KXTF9_THS_COUNTS_P_G; - - if (ths < 0) - ths = 0; - - config->ths = ths; - config->reg_ths = (unsigned char) - ((long)(ths * KXTF9_THS_COUNTS_P_G) / 1000); - MPL_LOGV("THS: %d, 0x%02x\n", config->ths, (int)config->reg_ths); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_WUF_THRESH, - config->reg_ths); - return result; -} - -static int kxtf9_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long dur) -{ - int result = INV_SUCCESS; - long reg_dur = (dur * config->odr) / 1000000L; - config->dur = dur; - - if (reg_dur > KXTF9_MAX_DUR) - reg_dur = KXTF9_MAX_DUR; - - config->reg_dur = (unsigned char)reg_dur; - MPL_LOGV("DUR: %d, 0x%02x\n", config->dur, (int)config->reg_dur); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_WUF_TIMER, - (unsigned char)reg_dur); - return result; -} - -/** - * Sets the IRQ to fire when one of the IRQ events occur. Threshold and - * duration will not be used uless the type is MOT or NMOT. - * - * @param config configuration to apply to, suspend or resume - * @param irq_type The type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - */ -static int kxtf9_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long irq_type) -{ - int result = INV_SUCCESS; - struct kxtf9_private_data *private_data = pdata->private_data; - - config->irq_type = (unsigned char)irq_type; - config->ctrl_reg1 &= ~0x22; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - config->ctrl_reg1 |= 0x20; - config->reg_int_cfg1 = 0x38; - config->reg_int_cfg2 = 0x00; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - config->ctrl_reg1 |= 0x02; - if ((unsigned long)config == - (unsigned long)&private_data->suspend) - config->reg_int_cfg1 = 0x34; - else - config->reg_int_cfg1 = 0x24; - config->reg_int_cfg2 = 0xE0; - } else { - config->reg_int_cfg1 = 0x00; - config->reg_int_cfg2 = 0x00; - } - - if (apply) { - /* Must clear bit 7 before writing new configuration */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_INT_CTRL_REG1, - config->reg_int_cfg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_INT_CTRL_REG2, - config->reg_int_cfg2); - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - config->ctrl_reg1); - } - MPL_LOGV("CTRL_REG1: %lx, INT_CFG1: %lx, INT_CFG2: %lx\n", - (unsigned long)config->ctrl_reg1, - (unsigned long)config->reg_int_cfg1, - (unsigned long)config->reg_int_cfg2); - - return result; -} - -/** - * Set the Output data rate for the particular configuration - * - * @param config Config to modify with new ODR - * @param odr Output data rate in units of 1/1000Hz - */ -static int kxtf9_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long odr) -{ - unsigned char bits; - int result = INV_SUCCESS; - - /* Data sheet says there is 12.5 hz, but that seems to produce a single - * correct data value, thus we remove it from the table */ - if (odr > 400000L) { - config->odr = 800000L; - bits = 0x06; - } else if (odr > 200000L) { - config->odr = 400000L; - bits = 0x05; - } else if (odr > 100000L) { - config->odr = 200000L; - bits = 0x04; - } else if (odr > 50000) { - config->odr = 100000L; - bits = 0x03; - } else if (odr > 25000) { - config->odr = 50000; - bits = 0x02; - } else if (odr != 0) { - config->odr = 25000; - bits = 0x01; - } else { - config->odr = 0; - bits = 0; - } - - if (odr != 0) - config->ctrl_reg1 |= 0x80; - else - config->ctrl_reg1 &= ~0x80; - - config->reg_odr = bits; - kxtf9_set_dur(mlsl_handle, pdata, config, apply, config->dur); - MPL_LOGV("ODR: %ld, 0x%02x\n", config->odr, (int)config->ctrl_reg1); - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_DATA_CTRL_REG, - config->reg_odr); - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - config->ctrl_reg1); - } - return result; -} - -/** - * Set the full scale range of the accels - * - * @param config pointer to configuration - * @param fsr requested full scale range - */ -static int kxtf9_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long fsr) -{ - int result = INV_SUCCESS; - - config->ctrl_reg1 = (config->ctrl_reg1 & 0xE7); - if (fsr <= 2000) { - config->fsr = 2000; - config->ctrl_reg1 |= 0x00; - } else if (fsr <= 4000) { - config->fsr = 4000; - config->ctrl_reg1 |= 0x08; - } else { - config->fsr = 8000; - config->ctrl_reg1 |= 0x10; - } - - MPL_LOGV("FSR: %d\n", config->fsr); - if (apply) { - /* Must clear bit 7 before writing new configuration */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - config->ctrl_reg1); - } - return result; -} - -static int kxtf9_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char data; - struct kxtf9_private_data *private_data = pdata->private_data; - - /* Wake up */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* INT_CTRL_REG1: */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_INT_CTRL_REG1, - private_data->suspend.reg_int_cfg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* WUF_THRESH: */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_WUF_THRESH, - private_data->suspend.reg_ths); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* DATA_CTRL_REG */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_DATA_CTRL_REG, - private_data->suspend.reg_odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* WUF_TIMER */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_WUF_TIMER, - private_data->suspend.reg_dur); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Normal operation */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - private_data->suspend.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_read(mlsl_handle, pdata->address, - KXTF9_INT_REL, 1, &data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/* full scale setting - register and mask */ -#define ACCEL_KIONIX_CTRL_REG (0x1b) -#define ACCEL_KIONIX_CTRL_MASK (0x18) - -static int kxtf9_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - unsigned char data; - struct kxtf9_private_data *private_data = pdata->private_data; - - /* Wake up */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* INT_CTRL_REG1: */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_INT_CTRL_REG1, - private_data->resume.reg_int_cfg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* WUF_THRESH: */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_WUF_THRESH, - private_data->resume.reg_ths); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* DATA_CTRL_REG */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_DATA_CTRL_REG, - private_data->resume.reg_odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* WUF_TIMER */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_WUF_TIMER, - private_data->resume.reg_dur); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Normal operation */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - private_data->resume.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_read(mlsl_handle, pdata->address, - KXTF9_INT_REL, 1, &data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return INV_SUCCESS; -} - -static int kxtf9_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - - struct kxtf9_private_data *private_data; - int result = INV_SUCCESS; - - private_data = (struct kxtf9_private_data *) - kzalloc(sizeof(struct kxtf9_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - /* RAM reset */ - /* Fastest Reset */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Fastest Reset */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_DATA_CTRL_REG, 0x36); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Reset */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - KXTF9_CTRL_REG3, 0xcd); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(2); - - pdata->private_data = private_data; - - private_data->resume.ctrl_reg1 = 0xC0; - private_data->suspend.ctrl_reg1 = 0x40; - - result = kxtf9_set_dur(mlsl_handle, pdata, &private_data->suspend, - false, 1000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = kxtf9_set_dur(mlsl_handle, pdata, &private_data->resume, - false, 2540); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = kxtf9_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 50000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = kxtf9_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000L); - - result = kxtf9_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, 2000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = kxtf9_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, 2000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = kxtf9_set_ths(mlsl_handle, pdata, &private_data->suspend, - false, 80); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = kxtf9_set_ths(mlsl_handle, pdata, &private_data->resume, - false, 40); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = kxtf9_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, MPU_SLAVE_IRQ_TYPE_NONE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = kxtf9_set_irq(mlsl_handle, pdata, &private_data->resume, - false, MPU_SLAVE_IRQ_TYPE_NONE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -static int kxtf9_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -static int kxtf9_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct kxtf9_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return kxtf9_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return kxtf9_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return kxtf9_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return kxtf9_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return kxtf9_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return kxtf9_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return kxtf9_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return kxtf9_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return kxtf9_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return kxtf9_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static int kxtf9_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct kxtf9_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.irq_type; - break; - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static int kxtf9_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - unsigned char reg; - result = inv_serial_read(mlsl_handle, pdata->address, - KXTF9_INT_SRC_REG2, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (!(reg & 0x10)) - return INV_ERROR_ACCEL_DATA_NOT_READY; - - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -static struct ext_slave_descr kxtf9_descr = { - .init = kxtf9_init, - .exit = kxtf9_exit, - .suspend = kxtf9_suspend, - .resume = kxtf9_resume, - .read = kxtf9_read, - .config = kxtf9_config, - .get_config = kxtf9_get_config, - .name = "kxtf9", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_KXTF9, - .read_reg = 0x06, - .read_len = 6, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {2, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *kxtf9_get_slave_descr(void) -{ - return &kxtf9_descr; -} - -/* -------------------------------------------------------------------------- */ -struct kxtf9_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int kxtf9_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct kxtf9_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - kxtf9_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int kxtf9_mod_remove(struct i2c_client *client) -{ - struct kxtf9_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - kxtf9_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id kxtf9_mod_id[] = { - { "kxtf9", ACCEL_ID_KXTF9 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, kxtf9_mod_id); - -static struct i2c_driver kxtf9_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = kxtf9_mod_probe, - .remove = kxtf9_mod_remove, - .id_table = kxtf9_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "kxtf9_mod", - }, - .address_list = normal_i2c, -}; - -static int __init kxtf9_mod_init(void) -{ - int res = i2c_add_driver(&kxtf9_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "kxtf9_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit kxtf9_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&kxtf9_mod_driver); -} - -module_init(kxtf9_mod_init); -module_exit(kxtf9_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate KXTF9 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("kxtf9_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/lis331.c b/drivers/misc/inv_mpu/accel/lis331.c deleted file mode 100644 index bcbec25..0000000 --- a/drivers/misc/inv_mpu/accel/lis331.c +++ /dev/null @@ -1,745 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file lis331.c - * @brief Accelerometer setup and handling methods for ST LIS331DLH. - */ - -/* -------------------------------------------------------------------------- */ - -#undef MPL_LOG_NDEBUG -#define MPL_LOG_NDEBUG 1 - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* full scale setting - register & mask */ -#define LIS331DLH_CTRL_REG1 (0x20) -#define LIS331DLH_CTRL_REG2 (0x21) -#define LIS331DLH_CTRL_REG3 (0x22) -#define LIS331DLH_CTRL_REG4 (0x23) -#define LIS331DLH_CTRL_REG5 (0x24) -#define LIS331DLH_HP_FILTER_RESET (0x25) -#define LIS331DLH_REFERENCE (0x26) -#define LIS331DLH_STATUS_REG (0x27) -#define LIS331DLH_OUT_X_L (0x28) -#define LIS331DLH_OUT_X_H (0x29) -#define LIS331DLH_OUT_Y_L (0x2a) -#define LIS331DLH_OUT_Y_H (0x2b) -#define LIS331DLH_OUT_Z_L (0x2b) -#define LIS331DLH_OUT_Z_H (0x2d) - -#define LIS331DLH_INT1_CFG (0x30) -#define LIS331DLH_INT1_SRC (0x31) -#define LIS331DLH_INT1_THS (0x32) -#define LIS331DLH_INT1_DURATION (0x33) - -#define LIS331DLH_INT2_CFG (0x34) -#define LIS331DLH_INT2_SRC (0x35) -#define LIS331DLH_INT2_THS (0x36) -#define LIS331DLH_INT2_DURATION (0x37) - -/* CTRL_REG1 */ -#define LIS331DLH_CTRL_MASK (0x30) -#define LIS331DLH_SLEEP_MASK (0x20) -#define LIS331DLH_PWR_MODE_NORMAL (0x20) - -#define LIS331DLH_MAX_DUR (0x7F) - - -/* -------------------------------------------------------------------------- */ - -struct lis331dlh_config { - unsigned int odr; - unsigned int fsr; /* full scale range mg */ - unsigned int ths; /* Motion no-motion thseshold mg */ - unsigned int dur; /* Motion no-motion duration ms */ - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char ctrl_reg1; - unsigned char irq_type; - unsigned char mot_int1_cfg; -}; - -struct lis331dlh_private_data { - struct lis331dlh_config suspend; - struct lis331dlh_config resume; -}; - -/* -------------------------------------------------------------------------- */ -static int lis331dlh_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, long ths) -{ - int result = INV_SUCCESS; - if ((unsigned int)ths >= config->fsr) - ths = (long)config->fsr - 1; - - if (ths < 0) - ths = 0; - - config->ths = ths; - config->reg_ths = (unsigned char)(long)((ths * 128L) / (config->fsr)); - MPL_LOGV("THS: %d, 0x%02x\n", config->ths, (int)config->reg_ths); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_THS, - config->reg_ths); - return result; -} - -static int lis331dlh_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, long dur) -{ - int result = INV_SUCCESS; - long reg_dur = (dur * config->odr) / 1000000L; - config->dur = dur; - - if (reg_dur > LIS331DLH_MAX_DUR) - reg_dur = LIS331DLH_MAX_DUR; - - config->reg_dur = (unsigned char)reg_dur; - MPL_LOGV("DUR: %d, 0x%02x\n", config->dur, (int)config->reg_dur); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_DURATION, - (unsigned char)reg_dur); - return result; -} - -/** - * Sets the IRQ to fire when one of the IRQ events occur. Threshold and - * duration will not be used uless the type is MOT or NMOT. - * - * @param config configuration to apply to, suspend or resume - * @param irq_type The type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - */ -static int lis331dlh_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, long irq_type) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - - config->irq_type = (unsigned char)irq_type; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = config->mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG3, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_CFG, reg2); - } - - return result; -} - -/** - * Set the Output data rate for the particular configuration - * - * @param config Config to modify with new ODR - * @param odr Output data rate in units of 1/1000Hz - */ -static int lis331dlh_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, long odr) -{ - unsigned char bits; - int result = INV_SUCCESS; - - /* normal power modes */ - if (odr > 400000) { - config->odr = 1000000; - bits = LIS331DLH_PWR_MODE_NORMAL | 0x18; - } else if (odr > 100000) { - config->odr = 400000; - bits = LIS331DLH_PWR_MODE_NORMAL | 0x10; - } else if (odr > 50000) { - config->odr = 100000; - bits = LIS331DLH_PWR_MODE_NORMAL | 0x08; - } else if (odr > 10000) { - config->odr = 50000; - bits = LIS331DLH_PWR_MODE_NORMAL | 0x00; - /* low power modes */ - } else if (odr > 5000) { - config->odr = 10000; - bits = 0xC0; - } else if (odr > 2000) { - config->odr = 5000; - bits = 0xA0; - } else if (odr > 1000) { - config->odr = 2000; - bits = 0x80; - } else if (odr > 500) { - config->odr = 1000; - bits = 0x60; - } else if (odr > 0) { - config->odr = 500; - bits = 0x40; - } else { - config->odr = 0; - bits = 0; - } - - config->ctrl_reg1 = bits | (config->ctrl_reg1 & 0x7); - lis331dlh_set_dur(mlsl_handle, pdata, config, apply, config->dur); - MPL_LOGV("ODR: %d, 0x%02x\n", config->odr, (int)config->ctrl_reg1); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG1, - config->ctrl_reg1); - return result; -} - -/** - * Set the full scale range of the accels - * - * @param config pointer to configuration - * @param fsr requested full scale range - */ -static int lis331dlh_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, long fsr) -{ - unsigned char reg1 = 0x40; - int result = INV_SUCCESS; - - if (fsr <= 2048) { - config->fsr = 2048; - } else if (fsr <= 4096) { - reg1 |= 0x30; - config->fsr = 4096; - } else { - reg1 |= 0x10; - config->fsr = 8192; - } - - lis331dlh_set_ths(mlsl_handle, pdata, config, apply, config->ths); - MPL_LOGV("FSR: %d\n", config->fsr); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG4, reg1); - - return result; -} - -static int lis331dlh_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - struct lis331dlh_private_data *private_data = - (struct lis331dlh_private_data *)(pdata->private_data); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG1, - private_data->suspend.ctrl_reg1); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG2, 0x0f); - reg1 = 0x40; - if (private_data->suspend.fsr == 8192) - reg1 |= 0x30; - else if (private_data->suspend.fsr == 4096) - reg1 |= 0x10; - /* else bits [4..5] are already zero */ - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG4, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_THS, - private_data->suspend.reg_ths); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_DURATION, - private_data->suspend.reg_dur); - - if (private_data->suspend.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (private_data->suspend.irq_type == - MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = private_data->suspend.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG3, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_CFG, reg2); - result = inv_serial_read(mlsl_handle, pdata->address, - LIS331DLH_HP_FILTER_RESET, 1, ®1); - return result; -} - -static int lis331dlh_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - struct lis331dlh_private_data *private_data = - (struct lis331dlh_private_data *)(pdata->private_data); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG1, - private_data->resume.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(6); - - /* Full Scale */ - reg1 = 0x40; - if (private_data->resume.fsr == 8192) - reg1 |= 0x30; - else if (private_data->resume.fsr == 4096) - reg1 |= 0x10; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG4, reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Configure high pass filter */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG2, 0x0F); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (private_data->resume.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (private_data->resume.irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = private_data->resume.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_CTRL_REG3, reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_THS, - private_data->resume.reg_ths); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_DURATION, - private_data->resume.reg_dur); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS331DLH_INT1_CFG, reg2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_read(mlsl_handle, pdata->address, - LIS331DLH_HP_FILTER_RESET, 1, ®1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -static int lis331dlh_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = INV_SUCCESS; - result = inv_serial_read(mlsl_handle, pdata->address, - LIS331DLH_STATUS_REG, 1, data); - if (data[0] & 0x0F) { - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, - data); - return result; - } else - return INV_ERROR_ACCEL_DATA_NOT_READY; -} - -static int lis331dlh_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - struct lis331dlh_private_data *private_data; - long range; - private_data = (struct lis331dlh_private_data *) - kzalloc(sizeof(struct lis331dlh_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - private_data->resume.ctrl_reg1 = 0x37; - private_data->suspend.ctrl_reg1 = 0x47; - private_data->resume.mot_int1_cfg = 0x95; - private_data->suspend.mot_int1_cfg = 0x2a; - - lis331dlh_set_odr(mlsl_handle, pdata, &private_data->suspend, false, 0); - lis331dlh_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - - range = range_fixedpoint_to_long_mg(slave->range); - lis331dlh_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, range); - lis331dlh_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, range); - - lis331dlh_set_ths(mlsl_handle, pdata, &private_data->suspend, - false, 80); - lis331dlh_set_ths(mlsl_handle, pdata, &private_data->resume, false, 40); - - - lis331dlh_set_dur(mlsl_handle, pdata, &private_data->suspend, - false, 1000); - lis331dlh_set_dur(mlsl_handle, pdata, &private_data->resume, - false, 2540); - - lis331dlh_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, MPU_SLAVE_IRQ_TYPE_NONE); - lis331dlh_set_irq(mlsl_handle, pdata, &private_data->resume, - false, MPU_SLAVE_IRQ_TYPE_NONE); - return INV_SUCCESS; -} - -static int lis331dlh_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -static int lis331dlh_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lis331dlh_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return lis331dlh_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return lis331dlh_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return lis331dlh_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return lis331dlh_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return lis331dlh_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return lis331dlh_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return lis331dlh_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return lis331dlh_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return lis331dlh_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return lis331dlh_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static int lis331dlh_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lis331dlh_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.irq_type; - break; - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static struct ext_slave_descr lis331dlh_descr = { - .init = lis331dlh_init, - .exit = lis331dlh_exit, - .suspend = lis331dlh_suspend, - .resume = lis331dlh_resume, - .read = lis331dlh_read, - .config = lis331dlh_config, - .get_config = lis331dlh_get_config, - .name = "lis331dlh", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_LIS331, - .read_reg = (0x28 | 0x80), /* 0x80 for burst reads */ - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {2, 480}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *lis331_get_slave_descr(void) -{ - return &lis331dlh_descr; -} - -/* -------------------------------------------------------------------------- */ -struct lis331_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int lis331_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct lis331_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - lis331_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int lis331_mod_remove(struct i2c_client *client) -{ - struct lis331_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - lis331_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id lis331_mod_id[] = { - { "lis331", ACCEL_ID_LIS331 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, lis331_mod_id); - -static struct i2c_driver lis331_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = lis331_mod_probe, - .remove = lis331_mod_remove, - .id_table = lis331_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "lis331_mod", - }, - .address_list = normal_i2c, -}; - -static int __init lis331_mod_init(void) -{ - int res = i2c_add_driver(&lis331_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "lis331_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit lis331_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&lis331_mod_driver); -} - -module_init(lis331_mod_init); -module_exit(lis331_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate LIS331 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("lis331_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/lis3dh.c b/drivers/misc/inv_mpu/accel/lis3dh.c deleted file mode 100644 index 27206e4..0000000 --- a/drivers/misc/inv_mpu/accel/lis3dh.c +++ /dev/null @@ -1,728 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file lis3dh.c - * @brief Accelerometer setup and handling methods for ST LIS3DH. - */ - -/* -------------------------------------------------------------------------- */ - -#undef MPL_LOG_NDEBUG -#define MPL_LOG_NDEBUG 0 - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* full scale setting - register & mask */ -#define LIS3DH_CTRL_REG1 (0x20) -#define LIS3DH_CTRL_REG2 (0x21) -#define LIS3DH_CTRL_REG3 (0x22) -#define LIS3DH_CTRL_REG4 (0x23) -#define LIS3DH_CTRL_REG5 (0x24) -#define LIS3DH_CTRL_REG6 (0x25) -#define LIS3DH_REFERENCE (0x26) -#define LIS3DH_STATUS_REG (0x27) -#define LIS3DH_OUT_X_L (0x28) -#define LIS3DH_OUT_X_H (0x29) -#define LIS3DH_OUT_Y_L (0x2a) -#define LIS3DH_OUT_Y_H (0x2b) -#define LIS3DH_OUT_Z_L (0x2c) -#define LIS3DH_OUT_Z_H (0x2d) - -#define LIS3DH_INT1_CFG (0x30) -#define LIS3DH_INT1_SRC (0x31) -#define LIS3DH_INT1_THS (0x32) -#define LIS3DH_INT1_DURATION (0x33) - -#define LIS3DH_MAX_DUR (0x7F) - -/* -------------------------------------------------------------------------- */ - -struct lis3dh_config { - unsigned long odr; - unsigned int fsr; /* full scale range mg */ - unsigned int ths; /* Motion no-motion thseshold mg */ - unsigned int dur; /* Motion no-motion duration ms */ - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char ctrl_reg1; - unsigned char irq_type; - unsigned char mot_int1_cfg; -}; - -struct lis3dh_private_data { - struct lis3dh_config suspend; - struct lis3dh_config resume; -}; - -/* -------------------------------------------------------------------------- */ - -static int lis3dh_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, int apply, long ths) -{ - int result = INV_SUCCESS; - if ((unsigned int)ths > 1000 * config->fsr) - ths = (long)1000 * config->fsr; - - if (ths < 0) - ths = 0; - - config->ths = ths; - config->reg_ths = (unsigned char)(long)((ths * 128L) / (config->fsr)); - MPL_LOGV("THS: %d, 0x%02x\n", config->ths, (int)config->reg_ths); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_THS, - config->reg_ths); - return result; -} - -static int lis3dh_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, int apply, long dur) -{ - int result = INV_SUCCESS; - long reg_dur = (dur * config->odr) / 1000000L; - config->dur = dur; - - if (reg_dur > LIS3DH_MAX_DUR) - reg_dur = LIS3DH_MAX_DUR; - - config->reg_dur = (unsigned char)reg_dur; - MPL_LOGV("DUR: %d, 0x%02x\n", config->dur, (int)config->reg_dur); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_DURATION, - (unsigned char)reg_dur); - return result; -} - -/** - * Sets the IRQ to fire when one of the IRQ events occur. Threshold and - * duration will not be used uless the type is MOT or NMOT. - * - * @param config configuration to apply to, suspend or resume - * @param irq_type The type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - */ -static int lis3dh_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, - int apply, long irq_type) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - - config->irq_type = (unsigned char)irq_type; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x10; - reg2 = 0x00; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x40; - reg2 = config->mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG3, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_CFG, reg2); - } - - return result; -} - -/** - * Set the Output data rate for the particular configuration - * - * @param config Config to modify with new ODR - * @param odr Output data rate in units of 1/1000Hz - */ -static int lis3dh_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, int apply, long odr) -{ - unsigned char bits; - int result = INV_SUCCESS; - - if (odr > 400000L) { - config->odr = 1250000L; - bits = 0x90; - } else if (odr > 200000L) { - config->odr = 400000L; - bits = 0x70; - } else if (odr > 100000L) { - config->odr = 200000L; - bits = 0x60; - } else if (odr > 50000) { - config->odr = 100000L; - bits = 0x50; - } else if (odr > 25000) { - config->odr = 50000; - bits = 0x40; - } else if (odr > 10000) { - config->odr = 25000; - bits = 0x30; - } else if (odr > 1000) { - config->odr = 10000; - bits = 0x20; - } else if (odr > 500) { - config->odr = 1000; - bits = 0x10; - } else { - config->odr = 0; - bits = 0; - } - - config->ctrl_reg1 = bits | (config->ctrl_reg1 & 0xf); - lis3dh_set_dur(mlsl_handle, pdata, config, apply, config->dur); - MPL_LOGV("ODR: %ld, 0x%02x\n", config->odr, (int)config->ctrl_reg1); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG1, - config->ctrl_reg1); - return result; -} - -/** - * Set the full scale range of the accels - * - * @param config pointer to configuration - * @param fsr requested full scale range - */ -static int lis3dh_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, int apply, long fsr) -{ - int result = INV_SUCCESS; - unsigned char reg1 = 0x48; - - if (fsr <= 2048) { - config->fsr = 2048; - } else if (fsr <= 4096) { - reg1 |= 0x10; - config->fsr = 4096; - } else if (fsr <= 8192) { - reg1 |= 0x20; - config->fsr = 8192; - } else { - reg1 |= 0x30; - config->fsr = 16348; - } - - lis3dh_set_ths(mlsl_handle, pdata, config, apply, config->ths); - MPL_LOGV("FSR: %d\n", config->fsr); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG4, reg1); - - return result; -} - -static int lis3dh_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - struct lis3dh_private_data *private_data = pdata->private_data; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG1, - private_data->suspend.ctrl_reg1); - - reg1 = 0x48; - if (private_data->suspend.fsr == 16384) - reg1 |= 0x30; - else if (private_data->suspend.fsr == 8192) - reg1 |= 0x20; - else if (private_data->suspend.fsr == 4096) - reg1 |= 0x10; - else if (private_data->suspend.fsr == 2048) - reg1 |= 0x00; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG4, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_THS, - private_data->suspend.reg_ths); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_DURATION, - private_data->suspend.reg_dur); - - if (private_data->suspend.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x10; - reg2 = 0x00; - } else if (private_data->suspend.irq_type == - MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x40; - reg2 = private_data->suspend.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG3, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_CFG, reg2); - result = inv_serial_read(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG6, 1, ®1); - - return result; -} - -static int lis3dh_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg1; - unsigned char reg2; - struct lis3dh_private_data *private_data = pdata->private_data; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG1, - private_data->resume.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(6); - - /* Full Scale */ - reg1 = 0x48; - if (private_data->suspend.fsr == 16384) - reg1 |= 0x30; - else if (private_data->suspend.fsr == 8192) - reg1 |= 0x20; - else if (private_data->suspend.fsr == 4096) - reg1 |= 0x10; - else if (private_data->suspend.fsr == 2048) - reg1 |= 0x00; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG4, reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (private_data->resume.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x10; - reg2 = 0x00; - } else if (private_data->resume.irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x40; - reg2 = private_data->resume.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG3, reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_THS, - private_data->resume.reg_ths); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_DURATION, - private_data->resume.reg_dur); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_INT1_CFG, reg2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_read(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG6, 1, ®1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -static int lis3dh_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = INV_SUCCESS; - result = inv_serial_read(mlsl_handle, pdata->address, - LIS3DH_STATUS_REG, 1, data); - if (data[0] & 0x0F) { - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, - data); - return result; - } else - return INV_ERROR_ACCEL_DATA_NOT_READY; -} - -static int lis3dh_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - long range; - struct lis3dh_private_data *private_data; - private_data = (struct lis3dh_private_data *) - kzalloc(sizeof(struct lis3dh_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - private_data->resume.ctrl_reg1 = 0x67; - private_data->suspend.ctrl_reg1 = 0x18; - private_data->resume.mot_int1_cfg = 0x95; - private_data->suspend.mot_int1_cfg = 0x2a; - - lis3dh_set_odr(mlsl_handle, pdata, &private_data->suspend, false, 0); - lis3dh_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000L); - - range = range_fixedpoint_to_long_mg(slave->range); - lis3dh_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, range); - lis3dh_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, range); - - lis3dh_set_ths(mlsl_handle, pdata, &private_data->suspend, - false, 80); - lis3dh_set_ths(mlsl_handle, pdata, &private_data->resume, - false, 40); - - lis3dh_set_dur(mlsl_handle, pdata, &private_data->suspend, - false, 1000); - lis3dh_set_dur(mlsl_handle, pdata, &private_data->resume, - false, 2540); - - lis3dh_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, MPU_SLAVE_IRQ_TYPE_NONE); - lis3dh_set_irq(mlsl_handle, pdata, &private_data->resume, - false, MPU_SLAVE_IRQ_TYPE_NONE); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG1, 0x07); - msleep(6); - - return INV_SUCCESS; -} - -static int lis3dh_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -static int lis3dh_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lis3dh_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return lis3dh_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return lis3dh_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return lis3dh_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return lis3dh_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return lis3dh_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return lis3dh_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return lis3dh_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return lis3dh_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return lis3dh_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return lis3dh_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - return INV_SUCCESS; -} - -static int lis3dh_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lis3dh_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.irq_type; - break; - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static struct ext_slave_descr lis3dh_descr = { - .init = lis3dh_init, - .exit = lis3dh_exit, - .suspend = lis3dh_suspend, - .resume = lis3dh_resume, - .read = lis3dh_read, - .config = lis3dh_config, - .get_config = lis3dh_get_config, - .name = "lis3dh", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_LIS3DH, - .read_reg = 0x28 | 0x80, /* 0x80 for burst reads */ - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {2, 480}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *lis3dh_get_slave_descr(void) -{ - return &lis3dh_descr; -} - -/* -------------------------------------------------------------------------- */ -struct lis3dh_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int lis3dh_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct lis3dh_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - lis3dh_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int lis3dh_mod_remove(struct i2c_client *client) -{ - struct lis3dh_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - lis3dh_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id lis3dh_mod_id[] = { - { "lis3dh", ACCEL_ID_LIS3DH }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, lis3dh_mod_id); - -static struct i2c_driver lis3dh_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = lis3dh_mod_probe, - .remove = lis3dh_mod_remove, - .id_table = lis3dh_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "lis3dh_mod", - }, - .address_list = normal_i2c, -}; - -static int __init lis3dh_mod_init(void) -{ - int res = i2c_add_driver(&lis3dh_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "lis3dh_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit lis3dh_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&lis3dh_mod_driver); -} - -module_init(lis3dh_mod_init); -module_exit(lis3dh_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate LIS3DH sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("lis3dh_mod"); - -/* - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/lsm303dlx_a.c b/drivers/misc/inv_mpu/accel/lsm303dlx_a.c deleted file mode 100644 index 576282a..0000000 --- a/drivers/misc/inv_mpu/accel/lsm303dlx_a.c +++ /dev/null @@ -1,881 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file lsm303dlx_a.c - * @brief Accelerometer setup and handling methods for ST LSM303DLH - * or LSM303DLM accel. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* -------------------------------------------------------------------------- */ - -/* full scale setting - register & mask */ -#define LSM303DLx_CTRL_REG1 (0x20) -#define LSM303DLx_CTRL_REG2 (0x21) -#define LSM303DLx_CTRL_REG3 (0x22) -#define LSM303DLx_CTRL_REG4 (0x23) -#define LSM303DLx_CTRL_REG5 (0x24) -#define LSM303DLx_HP_FILTER_RESET (0x25) -#define LSM303DLx_REFERENCE (0x26) -#define LSM303DLx_STATUS_REG (0x27) -#define LSM303DLx_OUT_X_L (0x28) -#define LSM303DLx_OUT_X_H (0x29) -#define LSM303DLx_OUT_Y_L (0x2a) -#define LSM303DLx_OUT_Y_H (0x2b) -#define LSM303DLx_OUT_Z_L (0x2b) -#define LSM303DLx_OUT_Z_H (0x2d) - -#define LSM303DLx_INT1_CFG (0x30) -#define LSM303DLx_INT1_SRC (0x31) -#define LSM303DLx_INT1_THS (0x32) -#define LSM303DLx_INT1_DURATION (0x33) - -#define LSM303DLx_INT2_CFG (0x34) -#define LSM303DLx_INT2_SRC (0x35) -#define LSM303DLx_INT2_THS (0x36) -#define LSM303DLx_INT2_DURATION (0x37) - -#define LSM303DLx_CTRL_MASK (0x30) -#define LSM303DLx_SLEEP_MASK (0x20) -#define LSM303DLx_PWR_MODE_NORMAL (0x20) - -#define LSM303DLx_MAX_DUR (0x7F) - -/* -------------------------------------------------------------------------- */ - -struct lsm303dlx_a_config { - unsigned int odr; - unsigned int fsr; /** < full scale range mg */ - unsigned int ths; /** < Motion no-motion thseshold mg */ - unsigned int dur; /** < Motion no-motion duration ms */ - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char ctrl_reg1; - unsigned char irq_type; - unsigned char mot_int1_cfg; -}; - -struct lsm303dlx_a_private_data { - struct lsm303dlx_a_config suspend; - struct lsm303dlx_a_config resume; -}; - -/* -------------------------------------------------------------------------- */ - -static int lsm303dlx_a_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lsm303dlx_a_config *config, - int apply, - long ths) -{ - int result = INV_SUCCESS; - if ((unsigned int) ths >= config->fsr) - ths = (long) config->fsr - 1; - - if (ths < 0) - ths = 0; - - config->ths = ths; - config->reg_ths = (unsigned char)(long)((ths * 128L) / (config->fsr)); - MPL_LOGV("THS: %d, 0x%02x\n", config->ths, (int)config->reg_ths); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_THS, - config->reg_ths); - return result; -} - -static int lsm303dlx_a_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lsm303dlx_a_config *config, - int apply, - long dur) -{ - int result = INV_SUCCESS; - long reg_dur = (dur * config->odr) / 1000000L; - config->dur = dur; - - if (reg_dur > LSM303DLx_MAX_DUR) - reg_dur = LSM303DLx_MAX_DUR; - - config->reg_dur = (unsigned char) reg_dur; - MPL_LOGV("DUR: %d, 0x%02x\n", config->dur, (int)config->reg_dur); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_DURATION, - (unsigned char)reg_dur); - return result; -} - -/** - * Sets the IRQ to fire when one of the IRQ events occur. Threshold and - * duration will not be used uless the type is MOT or NMOT. - * - * @param config configuration to apply to, suspend or resume - * @param irq_type The type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - */ -static int lsm303dlx_a_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lsm303dlx_a_config *config, - int apply, - long irq_type) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - - config->irq_type = (unsigned char)irq_type; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = config->mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG3, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_CFG, reg2); - } - - return result; -} - -/** - * @brief Set the output data rate for the particular configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * Config to modify with new ODR. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param odr - * Output data rate in units of 1/1000Hz (mHz). - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lsm303dlx_a_config *config, - int apply, - long odr) -{ - unsigned char bits; - int result = INV_SUCCESS; - - /* normal power modes */ - if (odr > 400000) { - config->odr = 1000000; - bits = LSM303DLx_PWR_MODE_NORMAL | 0x18; - } else if (odr > 100000) { - config->odr = 400000; - bits = LSM303DLx_PWR_MODE_NORMAL | 0x10; - } else if (odr > 50000) { - config->odr = 100000; - bits = LSM303DLx_PWR_MODE_NORMAL | 0x08; - } else if (odr > 10000) { - config->odr = 50000; - bits = LSM303DLx_PWR_MODE_NORMAL | 0x00; - /* low power modes */ - } else if (odr > 5000) { - config->odr = 10000; - bits = 0xC0; - } else if (odr > 2000) { - config->odr = 5000; - bits = 0xA0; - } else if (odr > 1000) { - config->odr = 2000; - bits = 0x80; - } else if (odr > 500) { - config->odr = 1000; - bits = 0x60; - } else if (odr > 0) { - config->odr = 500; - bits = 0x40; - } else { - config->odr = 0; - bits = 0; - } - - config->ctrl_reg1 = bits | (config->ctrl_reg1 & 0x7); - lsm303dlx_a_set_dur(mlsl_handle, pdata, config, apply, config->dur); - MPL_LOGV("ODR: %d, 0x%02x\n", config->odr, (int)config->ctrl_reg1); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG1, - config->ctrl_reg1); - return result; -} - -/** - * @brief Set the full scale range of the accels - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * pointer to configuration. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param fsr - * requested full scale range. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lsm303dlx_a_config *config, - int apply, - long fsr) -{ - unsigned char reg1 = 0x40; - int result = INV_SUCCESS; - - if (fsr <= 2048) { - config->fsr = 2048; - } else if (fsr <= 4096) { - reg1 |= 0x30; - config->fsr = 4096; - } else { - reg1 |= 0x10; - config->fsr = 8192; - } - - lsm303dlx_a_set_ths(mlsl_handle, pdata, - config, apply, config->ths); - MPL_LOGV("FSR: %d\n", config->fsr); - if (apply) - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG4, reg1); - - return result; -} - -/** - * @brief suspends the device to put it in its lowest power mode. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - struct lsm303dlx_a_private_data *private_data = - (struct lsm303dlx_a_private_data *)(pdata->private_data); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG1, - private_data->suspend.ctrl_reg1); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG2, 0x0f); - reg1 = 0x40; - if (private_data->suspend.fsr == 8192) - reg1 |= 0x30; - else if (private_data->suspend.fsr == 4096) - reg1 |= 0x10; - /* else bits [4..5] are already zero */ - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG4, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_THS, - private_data->suspend.reg_ths); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_DURATION, - private_data->suspend.reg_dur); - - if (private_data->suspend.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (private_data->suspend.irq_type == - MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = private_data->suspend.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG3, reg1); - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_CFG, reg2); - result = inv_serial_read(mlsl_handle, pdata->address, - LSM303DLx_HP_FILTER_RESET, 1, ®1); - return result; -} - -/** - * @brief resume the device in the proper power state given the configuration - * chosen. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - struct lsm303dlx_a_private_data *private_data = - (struct lsm303dlx_a_private_data *)(pdata->private_data); - - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG1, - private_data->resume.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(6); - - /* Full Scale */ - reg1 = 0x40; - if (private_data->resume.fsr == 8192) - reg1 |= 0x30; - else if (private_data->resume.fsr == 4096) - reg1 |= 0x10; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG4, reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Configure high pass filter */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG2, 0x0F); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (private_data->resume.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (private_data->resume.irq_type == - MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = private_data->resume.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_CTRL_REG3, reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_THS, - private_data->resume.reg_ths); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_DURATION, - private_data->resume.reg_dur); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - LSM303DLx_INT1_CFG, reg2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_read(mlsl_handle, pdata->address, - LSM303DLx_HP_FILTER_RESET, 1, ®1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -/** - * @brief read the sensor data from the device. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a buffer to store the data read. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = INV_SUCCESS; - result = inv_serial_read(mlsl_handle, pdata->address, - LSM303DLx_STATUS_REG, 1, data); - if (data[0] & 0x0F) { - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, data); - return result; - } else - return INV_ERROR_ACCEL_DATA_NOT_READY; -} - -/** - * @brief one-time device driver initialization function. - * If the driver is built as a kernel module, this function will be - * called when the module is loaded in the kernel. - * If the driver is built-in in the kernel, this function will be - * called at boot time. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - long range; - struct lsm303dlx_a_private_data *private_data; - private_data = (struct lsm303dlx_a_private_data *) - kzalloc(sizeof(struct lsm303dlx_a_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - private_data->resume.ctrl_reg1 = 0x37; - private_data->suspend.ctrl_reg1 = 0x47; - private_data->resume.mot_int1_cfg = 0x95; - private_data->suspend.mot_int1_cfg = 0x2a; - - lsm303dlx_a_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 0); - lsm303dlx_a_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - - range = range_fixedpoint_to_long_mg(slave->range); - lsm303dlx_a_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, range); - lsm303dlx_a_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, range); - - lsm303dlx_a_set_ths(mlsl_handle, pdata, &private_data->suspend, - false, 80); - lsm303dlx_a_set_ths(mlsl_handle, pdata, &private_data->resume, - false, 40); - - lsm303dlx_a_set_dur(mlsl_handle, pdata, &private_data->suspend, - false, 1000); - lsm303dlx_a_set_dur(mlsl_handle, pdata, &private_data->resume, - false, 2540); - - lsm303dlx_a_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, MPU_SLAVE_IRQ_TYPE_NONE); - lsm303dlx_a_set_irq(mlsl_handle, pdata, &private_data->resume, - false, MPU_SLAVE_IRQ_TYPE_NONE); - return INV_SUCCESS; -} - -/** - * @brief one-time device driver exit function. - * If the driver is built as a kernel module, this function will be - * called when the module is removed from the kernel. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -/** - * @brief device configuration facility. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to the configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lsm303dlx_a_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return lsm303dlx_a_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return lsm303dlx_a_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return lsm303dlx_a_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return lsm303dlx_a_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return lsm303dlx_a_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return lsm303dlx_a_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return lsm303dlx_a_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return lsm303dlx_a_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return lsm303dlx_a_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return lsm303dlx_a_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -/** - * @brief facility to retrieve the device configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to store the returned configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int lsm303dlx_a_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lsm303dlx_a_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.irq_type; - break; - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static struct ext_slave_descr lsm303dlx_a_descr = { - .init = lsm303dlx_a_init, - .exit = lsm303dlx_a_exit, - .suspend = lsm303dlx_a_suspend, - .resume = lsm303dlx_a_resume, - .read = lsm303dlx_a_read, - .config = lsm303dlx_a_config, - .get_config = lsm303dlx_a_get_config, - .name = "lsm303dlx_a", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_LSM303DLX, - .read_reg = (0x28 | 0x80), /* 0x80 for burst reads */ - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {2, 480}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *lsm303dlx_a_get_slave_descr(void) -{ - return &lsm303dlx_a_descr; -} - -/* -------------------------------------------------------------------------- */ -struct lsm303dlx_a_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int lsm303dlx_a_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct lsm303dlx_a_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - lsm303dlx_a_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int lsm303dlx_a_mod_remove(struct i2c_client *client) -{ - struct lsm303dlx_a_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - lsm303dlx_a_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id lsm303dlx_a_mod_id[] = { - { "lsm303dlx", ACCEL_ID_LSM303DLX }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, lsm303dlx_a_mod_id); - -static struct i2c_driver lsm303dlx_a_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = lsm303dlx_a_mod_probe, - .remove = lsm303dlx_a_mod_remove, - .id_table = lsm303dlx_a_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "lsm303dlx_a_mod", - }, - .address_list = normal_i2c, -}; - -static int __init lsm303dlx_a_mod_init(void) -{ - int res = i2c_add_driver(&lsm303dlx_a_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "lsm303dlx_a_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit lsm303dlx_a_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&lsm303dlx_a_mod_driver); -} - -module_init(lsm303dlx_a_mod_init); -module_exit(lsm303dlx_a_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate LSM303DLX_A sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("lsm303dlx_a_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/mma8450.c b/drivers/misc/inv_mpu/accel/mma8450.c deleted file mode 100644 index f698ee9..0000000 --- a/drivers/misc/inv_mpu/accel/mma8450.c +++ /dev/null @@ -1,804 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file mma8450.c - * @brief Accelerometer setup and handling methods for Freescale MMA8450. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* full scale setting - register & mask */ -#define ACCEL_MMA8450_XYZ_DATA_CFG (0x16) - -#define ACCEL_MMA8450_CTRL_REG1 (0x38) -#define ACCEL_MMA8450_CTRL_REG2 (0x39) -#define ACCEL_MMA8450_CTRL_REG4 (0x3B) -#define ACCEL_MMA8450_CTRL_REG5 (0x3C) - -#define ACCEL_MMA8450_CTRL_REG (0x38) -#define ACCEL_MMA8450_CTRL_MASK (0x03) - -#define ACCEL_MMA8450_SLEEP_MASK (0x03) - -/* -------------------------------------------------------------------------- */ - -struct mma8450_config { - unsigned int odr; - unsigned int fsr; /** < full scale range mg */ - unsigned int ths; /** < Motion no-motion thseshold mg */ - unsigned int dur; /** < Motion no-motion duration ms */ - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char ctrl_reg1; - unsigned char irq_type; - unsigned char mot_int1_cfg; -}; - -struct mma8450_private_data { - struct mma8450_config suspend; - struct mma8450_config resume; -}; - - -/* -------------------------------------------------------------------------- */ - -static int mma8450_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma8450_config *config, - int apply, - long ths) -{ - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -static int mma8450_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma8450_config *config, - int apply, - long dur) -{ - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -/** - * @brief Sets the IRQ to fire when one of the IRQ events occur. - * Threshold and duration will not be used unless the type is MOT or - * NMOT. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * configuration to apply to, suspend or resume - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param irq_type - * the type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma8450_config *config, - int apply, - long irq_type) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - unsigned char reg3; - - config->irq_type = (unsigned char)irq_type; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x01; - reg2 = 0x01; - reg3 = 0x07; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_NONE) { - reg1 = 0x00; - reg2 = 0x00; - reg3 = 0x00; - } else { - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - } - - if (apply) { - /* XYZ_DATA_CFG: event flag enabled on Z axis */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_XYZ_DATA_CFG, reg3); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG4, reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG5, reg2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - return result; -} - -/** - * @brief Set the output data rate for the particular configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * Config to modify with new ODR. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param odr - * Output data rate in units of 1/1000Hz (mHz). - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma8450_config *config, - int apply, - long odr) -{ - unsigned char bits; - int result = INV_SUCCESS; - - if (odr > 200000) { - config->odr = 400000; - bits = 0x00; - } else if (odr > 100000) { - config->odr = 200000; - bits = 0x04; - } else if (odr > 50000) { - config->odr = 100000; - bits = 0x08; - } else if (odr > 25000) { - config->odr = 50000; - bits = 0x0C; - } else if (odr > 12500) { - config->odr = 25000; - bits = 0x40; /* Sleep -> Auto wake mode */ - } else if (odr > 1563) { - config->odr = 12500; - bits = 0x10; - } else if (odr > 0) { - config->odr = 1563; - bits = 0x14; - } else { - config->ctrl_reg1 = 0; /* Set FS1.FS2 to Standby */ - config->odr = 0; - bits = 0; - } - - config->ctrl_reg1 = bits | (config->ctrl_reg1 & 0x3); - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG1, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG1, config->ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGV("ODR: %d mHz, 0x%02x\n", - config->odr, (int)config->ctrl_reg1); - } - return result; -} - -/** - * @brief Set the full scale range of the accels - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * pointer to configuration. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param fsr - * requested full scale range. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma8450_config *config, - int apply, - long fsr) -{ - unsigned char bits; - int result = INV_SUCCESS; - - if (fsr <= 2000) { - bits = 0x01; - config->fsr = 2000; - } else if (fsr <= 4000) { - bits = 0x02; - config->fsr = 4000; - } else { - bits = 0x03; - config->fsr = 8000; - } - - config->ctrl_reg1 = bits | (config->ctrl_reg1 & 0xFC); - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG1, config->ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGV("FSR: %d mg\n", config->fsr); - } - return result; -} - -/** - * @brief suspends the device to put it in its lowest power mode. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - struct mma8450_private_data *private_data = pdata->private_data; - - if (private_data->suspend.fsr == 4000) - slave->range.mantissa = 4; - else if (private_data->suspend.fsr == 8000) - slave->range.mantissa = 8; - else - slave->range.mantissa = 2; - slave->range.fraction = 0; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG1, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if (private_data->suspend.ctrl_reg1) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG1, - private_data->suspend.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - result = mma8450_set_irq(mlsl_handle, pdata, - &private_data->suspend, - true, private_data->suspend.irq_type); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -/** - * @brief resume the device in the proper power state given the configuration - * chosen. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - struct mma8450_private_data *private_data = pdata->private_data; - - /* Full Scale */ - if (private_data->resume.fsr == 4000) - slave->range.mantissa = 4; - else if (private_data->resume.fsr == 8000) - slave->range.mantissa = 8; - else - slave->range.mantissa = 2; - slave->range.fraction = 0; - - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG1, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if (private_data->resume.ctrl_reg1) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG1, - private_data->resume.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - result = mma8450_set_irq(mlsl_handle, pdata, - &private_data->resume, - true, private_data->resume.irq_type); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief read the sensor data from the device. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a buffer to store the data read. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - int result; - unsigned char local_data[4]; /* Status register + 3 bytes data */ - result = inv_serial_read(mlsl_handle, pdata->address, - 0x00, sizeof(local_data), local_data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - memcpy(data, &local_data[1], (slave->read_len) - 1); - - MPL_LOGV("Data Not Ready: %02x %02x %02x %02x\n", - local_data[0], local_data[1], - local_data[2], local_data[3]); - - return result; -} - -/** - * @brief one-time device driver initialization function. - * If the driver is built as a kernel module, this function will be - * called when the module is loaded in the kernel. - * If the driver is built-in in the kernel, this function will be - * called at boot time. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - struct mma8450_private_data *private_data; - private_data = (struct mma8450_private_data *) - kzalloc(sizeof(struct mma8450_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - mma8450_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 0); - mma8450_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - mma8450_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, 2000); - mma8450_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, 2000); - mma8450_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, - MPU_SLAVE_IRQ_TYPE_NONE); - mma8450_set_irq(mlsl_handle, pdata, &private_data->resume, - false, - MPU_SLAVE_IRQ_TYPE_NONE); - return INV_SUCCESS; -} - -/** - * @brief one-time device driver exit function. - * If the driver is built as a kernel module, this function will be - * called when the module is removed from the kernel. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -/** - * @brief device configuration facility. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to the configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct mma8450_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return mma8450_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return mma8450_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return mma8450_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return mma8450_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return mma8450_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return mma8450_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return mma8450_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return mma8450_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return mma8450_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return mma8450_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -/** - * @brief facility to retrieve the device configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a pointer to store the returned configuration data structure. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma8450_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct mma8450_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.irq_type; - break; - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static struct ext_slave_descr mma8450_descr = { - .init = mma8450_init, - .exit = mma8450_exit, - .suspend = mma8450_suspend, - .resume = mma8450_resume, - .read = mma8450_read, - .config = mma8450_config, - .get_config = mma8450_get_config, - .name = "mma8450", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_MMA8450, - .read_reg = 0x00, - .read_len = 4, - .endian = EXT_SLAVE_FS8_BIG_ENDIAN, - .range = {2, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *mma8450_get_slave_descr(void) -{ - return &mma8450_descr; -} - -/* -------------------------------------------------------------------------- */ -struct mma8450_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int mma8450_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct mma8450_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - mma8450_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int mma8450_mod_remove(struct i2c_client *client) -{ - struct mma8450_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - mma8450_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id mma8450_mod_id[] = { - { "mma8450", ACCEL_ID_MMA8450 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, mma8450_mod_id); - -static struct i2c_driver mma8450_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = mma8450_mod_probe, - .remove = mma8450_mod_remove, - .id_table = mma8450_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "mma8450_mod", - }, - .address_list = normal_i2c, -}; - -static int __init mma8450_mod_init(void) -{ - int res = i2c_add_driver(&mma8450_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "mma8450_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit mma8450_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&mma8450_mod_driver); -} - -module_init(mma8450_mod_init); -module_exit(mma8450_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate MMA8450 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("mma8450_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/mma845x.c b/drivers/misc/inv_mpu/accel/mma845x.c deleted file mode 100644 index 5f62b22..0000000 --- a/drivers/misc/inv_mpu/accel/mma845x.c +++ /dev/null @@ -1,713 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file mma845x.c - * @brief Accelerometer setup and handling methods for Freescale MMA845X - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -#define ACCEL_MMA845X_XYZ_DATA_CFG (0x0E) -#define ACCEL_MMA845X_CTRL_REG1 (0x2A) -#define ACCEL_MMA845X_CTRL_REG4 (0x2D) -#define ACCEL_MMA845X_CTRL_REG5 (0x2E) - -#define ACCEL_MMA845X_SLEEP_MASK (0x01) - -/* full scale setting - register & mask */ -#define ACCEL_MMA845X_CFG_REG (0x0E) -#define ACCEL_MMA845X_CTRL_MASK (0x03) - -/* -------------------------------------------------------------------------- */ - -struct mma845x_config { - unsigned int odr; - unsigned int fsr; /** < full scale range mg */ - unsigned int ths; /** < Motion no-motion thseshold mg */ - unsigned int dur; /** < Motion no-motion duration ms */ - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char ctrl_reg1; - unsigned char irq_type; - unsigned char mot_int1_cfg; -}; - -struct mma845x_private_data { - struct mma845x_config suspend; - struct mma845x_config resume; -}; - -/* -------------------------------------------------------------------------- */ - -static int mma845x_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma845x_config *config, - int apply, - long ths) -{ - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -static int mma845x_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma845x_config *config, - int apply, - long dur) -{ - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -/** - * @brief Sets the IRQ to fire when one of the IRQ events occur. - * Threshold and duration will not be used unless the type is MOT or - * NMOT. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * configuration to apply to, suspend or resume - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param irq_type - * the type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma845x_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma845x_config *config, - int apply, - long irq_type) -{ - int result = INV_SUCCESS; - unsigned char reg1; - unsigned char reg2; - - config->irq_type = (unsigned char)irq_type; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x01; - reg2 = 0x01; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_NONE) { - reg1 = 0x00; - reg2 = 0x00; - } else { - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - } - - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA845X_CTRL_REG4, reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA845X_CTRL_REG5, reg2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - return result; -} - -/** - * @brief Set the output data rate for the particular configuration. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * Config to modify with new ODR. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param odr - * Output data rate in units of 1/1000Hz (mHz). - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma845x_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma845x_config *config, - int apply, - long odr) -{ - unsigned char bits; - int result = INV_SUCCESS; - - if (odr > 400000) { - config->odr = 800000; - bits = 0x01; - } else if (odr > 200000) { - config->odr = 400000; - bits = 0x09; - } else if (odr > 100000) { - config->odr = 200000; - bits = 0x11; - } else if (odr > 50000) { - config->odr = 100000; - bits = 0x19; - } else if (odr > 12500) { - config->odr = 50000; - bits = 0x21; - } else if (odr > 6250) { - config->odr = 12500; - bits = 0x29; - } else if (odr > 1560) { - config->odr = 6250; - bits = 0x31; - } else if (odr > 0) { - config->odr = 1560; - bits = 0x39; - } else { - config->ctrl_reg1 = 0; /* Set FS1.FS2 to Standby */ - config->odr = 0; - bits = 0; - } - - config->ctrl_reg1 = bits; - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA845X_CTRL_REG1, - config->ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGV("ODR: %d mHz, 0x%02x\n", config->odr, - (int)config->ctrl_reg1); - } - return result; -} - -/** - * @brief Set the full scale range of the accels - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param pdata - * a pointer to the slave platform data. - * @param config - * pointer to configuration. - * @param apply - * whether to apply immediately or save the settings to be applied - * at the next resume. - * @param fsr - * requested full scale range. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma845x_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mma845x_config *config, - int apply, - long fsr) -{ - unsigned char bits; - int result = INV_SUCCESS; - - if (fsr <= 2000) { - bits = 0x00; - config->fsr = 2000; - } else if (fsr <= 4000) { - bits = 0x01; - config->fsr = 4000; - } else { - bits = 0x02; - config->fsr = 8000; - } - - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA845X_XYZ_DATA_CFG, - bits); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGV("FSR: %d mg\n", config->fsr); - } - return result; -} - -/** - * @brief suspends the device to put it in its lowest power mode. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma845x_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - struct mma845x_private_data *private_data = pdata->private_data; - - /* Full Scale */ - if (private_data->suspend.fsr == 4000) - slave->range.mantissa = 4; - else if (private_data->suspend.fsr == 8000) - slave->range.mantissa = 8; - else - slave->range.mantissa = 2; - - slave->range.fraction = 0; - - result = mma845x_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - true, private_data->suspend.fsr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA845X_CTRL_REG1, - private_data->suspend.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief resume the device in the proper power state given the configuration - * chosen. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma845x_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - struct mma845x_private_data *private_data = pdata->private_data; - - /* Full Scale */ - if (private_data->resume.fsr == 4000) - slave->range.mantissa = 4; - else if (private_data->resume.fsr == 8000) - slave->range.mantissa = 8; - else - slave->range.mantissa = 2; - - slave->range.fraction = 0; - - result = mma845x_set_fsr(mlsl_handle, pdata, - &private_data->resume, - true, private_data->resume.fsr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - ACCEL_MMA845X_CTRL_REG1, - private_data->resume.ctrl_reg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -/** - * @brief read the sensor data from the device. - * - * @param mlsl_handle - * the handle to the serial channel the device is connected to. - * @param slave - * a pointer to the slave descriptor data structure. - * @param pdata - * a pointer to the slave platform data. - * @param data - * a buffer to store the data read. - * - * @return INV_SUCCESS if successful or a non-zero error code. - */ -static int mma845x_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - int result; - unsigned char local_data[7]; /* Status register + 6 bytes data */ - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, sizeof(local_data), - local_data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - memcpy(data, &local_data[1], slave->read_len); - return result; -} - -static int mma845x_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - long range; - struct mma845x_private_data *private_data; - private_data = (struct mma845x_private_data *) - kzalloc(sizeof(struct mma845x_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - mma845x_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 0); - mma845x_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - - range = range_fixedpoint_to_long_mg(slave->range); - mma845x_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, range); - mma845x_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, range); - - mma845x_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, MPU_SLAVE_IRQ_TYPE_NONE); - mma845x_set_irq(mlsl_handle, pdata, &private_data->resume, - false, MPU_SLAVE_IRQ_TYPE_NONE); - return INV_SUCCESS; -} - -static int mma845x_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -static int mma845x_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct mma845x_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return mma845x_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return mma845x_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return mma845x_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return mma845x_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return mma845x_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return mma845x_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return mma845x_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return mma845x_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return mma845x_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return mma845x_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static int mma845x_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct mma845x_private_data *private_data = pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.irq_type; - break; - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static struct ext_slave_descr mma845x_descr = { - .init = mma845x_init, - .exit = mma845x_exit, - .suspend = mma845x_suspend, - .resume = mma845x_resume, - .read = mma845x_read, - .config = mma845x_config, - .get_config = mma845x_get_config, - .name = "mma845x", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_MMA845X, - .read_reg = 0x00, - .read_len = 6, - .endian = EXT_SLAVE_FS16_BIG_ENDIAN, - .range = {2, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *mma845x_get_slave_descr(void) -{ - return &mma845x_descr; -} - -/* -------------------------------------------------------------------------- */ -struct mma845x_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int mma845x_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct mma845x_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - mma845x_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int mma845x_mod_remove(struct i2c_client *client) -{ - struct mma845x_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - mma845x_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id mma845x_mod_id[] = { - { "mma845x", ACCEL_ID_MMA845X }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, mma845x_mod_id); - -static struct i2c_driver mma845x_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = mma845x_mod_probe, - .remove = mma845x_mod_remove, - .id_table = mma845x_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "mma845x_mod", - }, - .address_list = normal_i2c, -}; - -static int __init mma845x_mod_init(void) -{ - int res = i2c_add_driver(&mma845x_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "mma845x_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit mma845x_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&mma845x_mod_driver); -} - -module_init(mma845x_mod_init); -module_exit(mma845x_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate MMA845X sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("mma845x_mod"); - - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/mpu6050.c b/drivers/misc/inv_mpu/accel/mpu6050.c deleted file mode 100644 index 114164e..0000000 --- a/drivers/misc/inv_mpu/accel/mpu6050.c +++ /dev/null @@ -1,732 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup ACCELDL - * @brief Provides the interface to setup and handle an accelerometer. - * - * @{ - * @file mpu6050.c - * @brief Accelerometer setup and handling methods for Invensense MPU6050 - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mpu6050b1.h" -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* -------------------------------------------------------------------------- */ - -struct mpu6050_config { - unsigned int odr; /**< output data rate 1/1000 Hz */ - unsigned int fsr; /**< full scale range mg */ - unsigned int ths; /**< mot/no-mot thseshold mg */ - unsigned int dur; /**< mot/no-mot duration ms */ - unsigned int irq_type; /**< irq type */ -}; - -struct mpu6050_private_data { - struct mpu6050_config suspend; - struct mpu6050_config resume; - struct mldl_cfg *mldl_cfg_ref; -}; - -static int mpu6050_set_mldl_cfg_ref(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mldl_cfg *mldl_cfg_ref) -{ - struct mpu6050_private_data *private_data = - (struct mpu6050_private_data *)pdata->private_data; - private_data->mldl_cfg_ref = mldl_cfg_ref; - return 0; -} -static int mpu6050_set_lp_mode(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - unsigned char lpa_freq) -{ - unsigned char b = 0; - /* Reducing the duration setting for lp mode */ - b = 1; - inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_ACCEL_MOT_DUR, b); - /* Setting the cycle bit and LPA wake up freq */ - inv_serial_read(mlsl_handle, pdata->address, MPUREG_PWR_MGMT_1, 1, - &b); - b |= BIT_CYCLE | BIT_PD_PTAT; - inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_1, - b); - inv_serial_read(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, 1, &b); - b |= lpa_freq & BITS_LPA_WAKE_CTRL; - inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, b); - - return INV_SUCCESS; -} - -static int mpu6050_set_fp_mode(void *mlsl_handle, - struct ext_slave_platform_data *pdata) -{ - unsigned char b; - struct mpu6050_private_data *private_data = - (struct mpu6050_private_data *)pdata->private_data; - /* Resetting the cycle bit and LPA wake up freq */ - inv_serial_read(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_1, 1, &b); - b &= ~BIT_CYCLE & ~BIT_PD_PTAT; - inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_1, b); - inv_serial_read(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, 1, &b); - b &= ~BITS_LPA_WAKE_CTRL; - inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, b); - /* Resetting the duration setting for fp mode */ - b = (unsigned char)private_data->suspend.ths / ACCEL_MOT_DUR_LSB; - inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_ACCEL_MOT_DUR, b); - - return INV_SUCCESS; -} -/** - * Record the odr for use in computing duration values. - * - * @param config Config to set, suspend or resume structure - * @param odr output data rate in 1/1000 hz - */ -static int mpu6050_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mpu6050_config *config, long apply, long odr) -{ - int result; - unsigned char b; - unsigned char lpa_freq = 1; /* Default value */ - long base; - int total_divider; - struct mpu6050_private_data *private_data = - (struct mpu6050_private_data *)pdata->private_data; - struct mldl_cfg *mldl_cfg_ref = - (struct mldl_cfg *)private_data->mldl_cfg_ref; - - if (mldl_cfg_ref) { - base = 1000 * - inv_mpu_get_sampling_rate_hz(mldl_cfg_ref->mpu_gyro_cfg) - * (mldl_cfg_ref->mpu_gyro_cfg->divider + 1); - } else { - /* have no reference to mldl_cfg => assume base rate is 1000 */ - base = 1000000L; - } - - if (odr != 0) { - total_divider = (base / odr) - 1; - /* final odr MAY be different from requested odr due to - integer truncation */ - config->odr = base / (total_divider + 1); - } else { - config->odr = 0; - return 0; - } - - /* if the DMP and/or gyros are on, don't set the ODR => - the DMP/gyro mldl_cfg->divider setting will handle it */ - if (apply - && (mldl_cfg_ref && - !(mldl_cfg_ref->inv_mpu_cfg->requested_sensors & - INV_DMP_PROCESSOR))) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_SMPLRT_DIV, - (unsigned char)total_divider); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGI("ODR : %d mHz\n", config->odr); - } - /* Decide whether to put accel in LP mode or pull out of LP mode - based on the odr. */ - switch (odr) { - case 1000: - lpa_freq = BITS_LPA_WAKE_1HZ; - break; - case 2000: - lpa_freq = BITS_LPA_WAKE_2HZ; - break; - case 10000: - lpa_freq = BITS_LPA_WAKE_10HZ; - break; - case 40000: - lpa_freq = BITS_LPA_WAKE_40HZ; - break; - default: - inv_serial_read(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_1, 1, &b); - b &= BIT_CYCLE; - if (b == BIT_CYCLE) { - MPL_LOGI(" Accel LP - > FP mode.\n "); - mpu6050_set_fp_mode(mlsl_handle, pdata); - } - } - /* If lpa_freq default value was changed, set into LP mode */ - if (lpa_freq != 1) { - MPL_LOGI(" Accel FP - > LP mode.\n "); - mpu6050_set_lp_mode(mlsl_handle, pdata, lpa_freq); - } - return 0; -} - -static int mpu6050_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mpu6050_config *config, long apply, long fsr) -{ - unsigned char fsr_mask; - int result; - - if (fsr <= 2000) { - config->fsr = 2000; - fsr_mask = 0x00; - } else if (fsr <= 4000) { - config->fsr = 4000; - fsr_mask = 0x08; - } else if (fsr <= 8000) { - config->fsr = 8000; - fsr_mask = 0x10; - } else { /* fsr = [8001, oo) */ - config->fsr = 16000; - fsr_mask = 0x18; - } - - if (apply) { - unsigned char reg; - result = inv_serial_read(mlsl_handle, pdata->address, - MPUREG_ACCEL_CONFIG, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_ACCEL_CONFIG, - reg | fsr_mask); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGV("FSR: %d\n", config->fsr); - } - return 0; -} - -static int mpu6050_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct mpu6050_config *config, long apply, - long irq_type) -{ - int result; - unsigned char reg_int_cfg; - - return 0; - - switch (irq_type) { - case MPU_SLAVE_IRQ_TYPE_DATA_READY: - config->irq_type = irq_type; - reg_int_cfg = BIT_RAW_RDY_EN; - break; - /* todo: add MOTION, NO_MOTION, and FREEFALL */ - case MPU_SLAVE_IRQ_TYPE_NONE: - /* Do nothing, not even set the interrupt because it is - shared with the gyro */ - config->irq_type = irq_type; - return 0; - default: - return INV_ERROR_INVALID_PARAMETER; - } - - if (apply) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_INT_ENABLE, - reg_int_cfg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGV("irq_type: %d\n", config->irq_type); - } - - return 0; -} - -static int mpu6050_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *slave, - struct mpu6050_config *config, long apply, long ths) -{ - if (ths < 0) - ths = 0; - - config->ths = ths; - MPL_LOGV("THS: %d\n", config->ths); - return 0; -} - -static int mpu6050_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *slave, - struct mpu6050_config *config, long apply, long dur) -{ - if (dur < 0) - dur = 0; - - config->dur = dur; - MPL_LOGV("DUR: %d\n", config->dur); - return 0; -} - - -static int mpu6050_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - struct mpu6050_private_data *private_data; - - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - result = mpu6050_set_odr(mlsl_handle, pdata, &private_data->suspend, - false, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_odr(mlsl_handle, pdata, &private_data->resume, - false, 200000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_fsr(mlsl_handle, pdata, &private_data->suspend, - false, 2000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_fsr(mlsl_handle, pdata, &private_data->resume, - false, 2000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = mpu6050_set_irq(mlsl_handle, pdata, &private_data->suspend, - false, MPU_SLAVE_IRQ_TYPE_NONE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_irq(mlsl_handle, pdata, &private_data->resume, - false, MPU_SLAVE_IRQ_TYPE_NONE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = mpu6050_set_ths(mlsl_handle, pdata, &private_data->suspend, - false, 80); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_ths(mlsl_handle, pdata, &private_data->resume, - false, 40); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_dur(mlsl_handle, pdata, &private_data->suspend, - false, 1000); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_dur(mlsl_handle, pdata, &private_data->resume, - false, 2540); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return 0; -} - -static int mpu6050_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - pdata->private_data = NULL; - return 0; -} - -static int mpu6050_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - unsigned char reg; - int result; - struct mpu6050_private_data *private_data = - (struct mpu6050_private_data *)pdata->private_data; - - result = mpu6050_set_odr(mlsl_handle, pdata, &private_data->suspend, - true, private_data->suspend.odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = mpu6050_set_irq(mlsl_handle, pdata, &private_data->suspend, - true, private_data->suspend.irq_type); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_read(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - reg |= (BIT_STBY_XA | BIT_STBY_YA | BIT_STBY_ZA); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return 0; -} - -static int mpu6050_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg; - struct mpu6050_private_data *private_data = - (struct mpu6050_private_data *)pdata->private_data; - - result = inv_serial_read(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_1, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (reg & BIT_SLEEP) { - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_1, reg & ~BIT_SLEEP); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - msleep(20); - - result = inv_serial_read(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - reg &= ~(BIT_STBY_XA | BIT_STBY_YA | BIT_STBY_ZA); - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* settings */ - - result = mpu6050_set_fsr(mlsl_handle, pdata, &private_data->resume, - true, private_data->resume.fsr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_odr(mlsl_handle, pdata, &private_data->resume, - true, private_data->resume.odr); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu6050_set_irq(mlsl_handle, pdata, &private_data->resume, - true, private_data->resume.irq_type); - - /* motion, no_motion */ - /* TODO : port these in their respective _set_thrs and _set_dur - functions and use the APPLY paremeter to apply just like - _set_odr, _set_irq, and _set_fsr. */ - reg = (unsigned char)private_data->suspend.ths / ACCEL_MOT_THR_LSB; - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_ACCEL_MOT_THR, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - reg = (unsigned char) - ACCEL_ZRMOT_THR_LSB_CONVERSION(private_data->resume.ths); - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_ACCEL_ZRMOT_THR, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - reg = (unsigned char)private_data->suspend.ths / ACCEL_MOT_DUR_LSB; - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_ACCEL_MOT_DUR, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - reg = (unsigned char)private_data->resume.ths / ACCEL_ZRMOT_DUR_LSB; - result = inv_serial_single_write(mlsl_handle, pdata->address, - MPUREG_ACCEL_ZRMOT_DUR, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return 0; -} - -static int mpu6050_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - int x, y, z; - - result = inv_serial_read(mlsl_handle, pdata->address, - slave->read_reg, slave->read_len, data); -#if 1 - if (slave->read_len == 6) { - /* - pr_info("\n mantis_read cal x: %d y: %d z: %d\", - cal_data.x, cal_data.y, cal_data.z); - - x = (s16)((data[0] <<8) |data[1]); - y = (s16)((data[2] <<8) |data[3]); - z = (s16)((data[4] <<8) |data[5]); - - pr_info("mantis_read RAW x: %d y: %d z: %d", x, y, z); - */ - x = (s16)((data[0] << 8) | data[1]) - cal_data.x; - y = (s16)((data[2] << 8) | data[3]) - cal_data.y; - z = (s16)((data[4] << 8) | data[5]) - cal_data.z; - - /* - pr_info("mantis_read CAL x: %d y: %d z: %d", x, y, z); - */ - - data[0] = (x & 0xff00) >> 8; - data[1] = ((x << 4) >> 4) & 0xff; - data[2] = (y & 0xff00) >> 8; - data[3] = ((y << 4) >> 4) & 0xff; - data[4] = (z & 0xff00) >> 8; - data[5] = ((z << 4) >> 4) & 0xff; -/* - x = (s16)((data[0] <<8) |data[1]); - y = (s16)((data[2] <<8) |data[3]); - z = (s16)((data[4] <<8) |data[5]); - - pr_info("mantis_read CHK x: %d y: %d z: %d", x, y, z); -*/ - } -#endif - return result; -} - -static int mpu6050_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct mpu6050_private_data *private_data = - (struct mpu6050_private_data *)pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return mpu6050_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return mpu6050_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return mpu6050_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return mpu6050_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return mpu6050_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return mpu6050_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return mpu6050_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return mpu6050_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return mpu6050_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return mpu6050_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_INTERNAL_REFERENCE: - return mpu6050_set_mldl_cfg_ref(mlsl_handle, pdata, - (struct mldl_cfg *)data->data); - break; - - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return 0; -} - -static int mpu6050_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct mpu6050_private_data *private_data = - (struct mpu6050_private_data *)pdata->private_data; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.irq_type; - break; - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return 0; -} - -static struct ext_slave_descr mpu6050_descr = { - .init = mpu6050_init, - .exit = mpu6050_exit, - .suspend = mpu6050_suspend, - .resume = mpu6050_resume, - .read = mpu6050_read, - .config = mpu6050_config, - .get_config = mpu6050_get_config, - .name = "mpu6050", - .type = EXT_SLAVE_TYPE_ACCEL, - .id = ACCEL_ID_MPU6050, - .read_reg = 0x3B, - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {2, 0}, - .trigger = NULL, -}; - -struct ext_slave_descr *mpu6050_get_slave_descr(void) -{ - return &mpu6050_descr; -} - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/accel/mpu6050.h b/drivers/misc/inv_mpu/accel/mpu6050.h deleted file mode 100644 index a779255..0000000 --- a/drivers/misc/inv_mpu/accel/mpu6050.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - - -#ifndef __MPU6050_H__ -#define __MPU6050_H__ - -#include - -struct ext_slave_descr *mpu6050_get_slave_descr(void); - -#endif diff --git a/drivers/misc/inv_mpu/compass/Kconfig b/drivers/misc/inv_mpu/compass/Kconfig deleted file mode 100644 index 0881d8d..0000000 --- a/drivers/misc/inv_mpu/compass/Kconfig +++ /dev/null @@ -1,94 +0,0 @@ -menuconfig INV_SENSORS_MPU6050_COMPASS - bool "Compass Slave Sensors" - default y - ---help--- - Say Y here to get to see options for device drivers for various - compasses. This option alone does not add any kernel code. - - If you say N, all options in this submenu will be skipped and disabled. - -if INV_SENSORS_MPU6050_COMPASS - -config MPU_SENSORS_MPU6050_AK8975 - tristate "AKM ak8975" - help - This enables support for the AKM ak8975 compass - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -config MPU_SENSORS_MPU6050_AK8972 - tristate "AKM ak8972" - help - This enables support for the AKM ak8972 compass - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -config MPU_SENSORS_MPU6050_MMC314X - tristate "MEMSIC mmc314x" - help - This enables support for the MEMSIC mmc314x compass - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -config MPU_SENSORS_MPU6050_LSM303DLX_M - tristate "ST lsm303dlx" - help - This enables support for the ST lsm303dlh and lsm303dlm compasses - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -config MPU_SENSORS_MPU6050_MMC314XMS - tristate "MEMSIC mmc314xMS" - help - This enables support for the MEMSIC mmc314xMS compass - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -config MPU_SENSORS_MPU6050_YAS529 - tristate "Yamaha yas529" - depends on INPUT_YAS_MAGNETOMETER - help - This enables support for the Yamaha yas529 compass - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -config MPU_SENSORS_MPU6050_YAS530 - tristate "Yamaha yas530" - help - This enables support for the Yamaha yas530 compass - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -config MPU_SENSORS_MPU6050_HSCDTD002B - tristate "Alps hscdtd002b" - help - This enables support for the Alps hscdtd002b compass - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -config MPU_SENSORS_MPU6050_HSCDTD004A - tristate "Alps hscdtd004a" - help - This enables support for the Alps hscdtd004a compass - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one compass can be registered at a time. - Specifying more that one compass in the board file will result - in runtime errors. - -endif diff --git a/drivers/misc/inv_mpu/compass/Makefile b/drivers/misc/inv_mpu/compass/Makefile deleted file mode 100644 index 5533d84..0000000 --- a/drivers/misc/inv_mpu/compass/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# -# Compass Slaves MPUxxxx -# - -obj-$(CONFIG_MPU_SENSORS_MPU6050_LSM303DLX_M) += inv_mpu_lsm303dlx_m.o -inv_mpu_lsm303dlx_m-objs += lsm303dlx_m.o - -obj-$(CONFIG_MPU_SENSORS_MPU6050_MMC314X) += inv_mpu_mmc314x.o -inv_mpu_mmc314x-objs += mmc314x.o - -obj-$(CONFIG_MPU_SENSORS_MPU6050_YAS529) += inv_mpu_yas529.o -inv_mpu_yas529-objs += yas529-kernel.o - -obj-$(CONFIG_MPU_SENSORS_MPU6050_YAS530_411) += inv_mpu_yas530.o -inv_mpu_yas530-objs += yas530.o - -obj-$(CONFIG_MPU_SENSORS_MPU6050_HSCDTD002B) += inv_mpu_hscdtd002b.o -inv_mpu_hscdtd002b-objs += hscdtd002b.o - -obj-$(CONFIG_MPU_SENSORS_MPU6050_HSCDTD004A) += inv_mpu_hscdtd004a.o -inv_mpu_hscdtd004a-objs += hscdtd004a.o - -obj-$(CONFIG_MPU_SENSORS_MPU6050_AK8975) += inv_mpu_ak8975.o -inv_mpu_ak8975-objs += ak8975.o - -obj-$(CONFIG_MPU_SENSORS_MPU6050_AK8972) += inv_mpu_ak8972.o -inv_mpu_ak8972-objs += ak8972.o - -EXTRA_CFLAGS += -Idrivers/misc/inv_mpu -EXTRA_CFLAGS += -D__C99_DESIGNATED_INITIALIZER diff --git a/drivers/misc/inv_mpu/compass/ak8972.c b/drivers/misc/inv_mpu/compass/ak8972.c deleted file mode 100644 index 7eb15b4..0000000 --- a/drivers/misc/inv_mpu/compass/ak8972.c +++ /dev/null @@ -1,499 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup COMPASSDL - * - * @{ - * @file ak8972.c - * @brief Magnetometer setup and handling methods for the AKM AK8972 compass device. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/* -------------------------------------------------------------------------- */ -#define AK8972_REG_ST1 (0x02) -#define AK8972_REG_HXL (0x03) -#define AK8972_REG_ST2 (0x09) - -#define AK8972_REG_CNTL (0x0A) -#define AK8972_REG_ASAX (0x10) -#define AK8972_REG_ASAY (0x11) -#define AK8972_REG_ASAZ (0x12) - -#define AK8972_CNTL_MODE_POWER_DOWN (0x00) -#define AK8972_CNTL_MODE_SINGLE_MEASUREMENT (0x01) -#define AK8972_CNTL_MODE_FUSE_ROM_ACCESS (0x0f) - -/* -------------------------------------------------------------------------- */ -struct ak8972_config { - char asa[COMPASS_NUM_AXES]; /* axis sensitivity adjustment */ -}; - -struct ak8972_private_data { - struct ak8972_config init; -}; - -/* -------------------------------------------------------------------------- */ -static int ak8972_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char serial_data[COMPASS_NUM_AXES]; - - struct ak8972_private_data *private_data; - private_data = (struct ak8972_private_data *) - kzalloc(sizeof(struct ak8972_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - AK8972_REG_CNTL, - AK8972_CNTL_MODE_POWER_DOWN); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Wait at least 100us */ - udelay(100); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - AK8972_REG_CNTL, - AK8972_CNTL_MODE_FUSE_ROM_ACCESS); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Wait at least 200us */ - udelay(200); - - result = inv_serial_read(mlsl_handle, pdata->address, - AK8972_REG_ASAX, - COMPASS_NUM_AXES, serial_data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - pdata->private_data = private_data; - - private_data->init.asa[0] = serial_data[0]; - private_data->init.asa[1] = serial_data[1]; - private_data->init.asa[2] = serial_data[2]; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - AK8972_REG_CNTL, - AK8972_CNTL_MODE_POWER_DOWN); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - udelay(100); - return INV_SUCCESS; -} - -static int ak8972_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -static int ak8972_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - result = - inv_serial_single_write(mlsl_handle, pdata->address, - AK8972_REG_CNTL, - AK8972_CNTL_MODE_POWER_DOWN); - msleep(1); /* wait at least 100us */ - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -static int ak8972_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - result = - inv_serial_single_write(mlsl_handle, pdata->address, - AK8972_REG_CNTL, - AK8972_CNTL_MODE_SINGLE_MEASUREMENT); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -static int ak8972_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - unsigned char regs[8]; - unsigned char *stat = ®s[0]; - unsigned char *stat2 = ®s[7]; - int result = INV_SUCCESS; - int status = INV_SUCCESS; - - result = - inv_serial_read(mlsl_handle, pdata->address, AK8972_REG_ST1, - 8, regs); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Always return the data and the status registers */ - memcpy(data, ®s[1], 6); - data[6] = regs[0]; - data[7] = regs[7]; - - /* - * ST : data ready - - * Measurement has been completed and data is ready to be read. - */ - if (*stat & 0x01) - status = INV_SUCCESS; - - /* - * ST2 : data error - - * occurs when data read is started outside of a readable period; - * data read would not be correct. - * Valid in continuous measurement mode only. - * In single measurement mode this error should not occour but we - * stil account for it and return an error, since the data would be - * corrupted. - * DERR bit is self-clearing when ST2 register is read. - */ - if (*stat2 & 0x04) - status = INV_ERROR_COMPASS_DATA_ERROR; - /* - * ST2 : overflow - - * the sum of the absolute values of all axis |X|+|Y|+|Z| < 2400uT. - * This is likely to happen in presence of an external magnetic - * disturbance; it indicates, the sensor data is incorrect and should - * be ignored. - * An error is returned. - * HOFL bit clears when a new measurement starts. - */ - if (*stat2 & 0x08) - status = INV_ERROR_COMPASS_DATA_OVERFLOW; - /* - * ST : overrun - - * the previous sample was not fetched and lost. - * Valid in continuous measurement mode only. - * In single measurement mode this error should not occour and we - * don't consider this condition an error. - * DOR bit is self-clearing when ST2 or any meas. data register is - * read. - */ - if (*stat & 0x02) { - /* status = INV_ERROR_COMPASS_DATA_UNDERFLOW; */ - status = INV_SUCCESS; - } - - /* - * trigger next measurement if: - * - stat is non zero; - * - if stat is zero and stat2 is non zero. - * Won't trigger if data is not ready and there was no error. - */ - if (*stat != 0x00 || *stat2 != 0x00) { - result = inv_serial_single_write( - mlsl_handle, pdata->address, - AK8972_REG_CNTL, AK8972_CNTL_MODE_SINGLE_MEASUREMENT); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - return status; -} - -static int ak8972_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - int result; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_WRITE_REGISTERS: - result = inv_serial_write(mlsl_handle, pdata->address, - data->len, - (unsigned char *)data->data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - break; - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - case MPU_SLAVE_CONFIG_ODR_RESUME: - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - case MPU_SLAVE_CONFIG_FSR_RESUME: - case MPU_SLAVE_CONFIG_MOT_THS: - case MPU_SLAVE_CONFIG_NMOT_THS: - case MPU_SLAVE_CONFIG_MOT_DUR: - case MPU_SLAVE_CONFIG_NMOT_DUR: - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - case MPU_SLAVE_CONFIG_IRQ_RESUME: - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static int ak8972_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct ak8972_private_data *private_data = pdata->private_data; - int result; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_READ_REGISTERS: - { - unsigned char *serial_data = - (unsigned char *)data->data; - result = - inv_serial_read(mlsl_handle, pdata->address, - serial_data[0], data->len - 1, - &serial_data[1]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - break; - } - case MPU_SLAVE_READ_SCALE: - { - unsigned char *serial_data = - (unsigned char *)data->data; - serial_data[0] = private_data->init.asa[0]; - serial_data[1] = private_data->init.asa[1]; - serial_data[2] = private_data->init.asa[2]; - result = INV_SUCCESS; - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - break; - } - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = 0; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = 8000; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - case MPU_SLAVE_CONFIG_FSR_RESUME: - case MPU_SLAVE_CONFIG_MOT_THS: - case MPU_SLAVE_CONFIG_NMOT_THS: - case MPU_SLAVE_CONFIG_MOT_DUR: - case MPU_SLAVE_CONFIG_NMOT_DUR: - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - case MPU_SLAVE_CONFIG_IRQ_RESUME: - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static struct ext_slave_read_trigger ak8972_read_trigger = { - /*.reg = */ 0x0A, - /*.value = */ 0x01 -}; - -static struct ext_slave_descr ak8972_descr = { - .init = ak8972_init, - .exit = ak8972_exit, - .suspend = ak8972_suspend, - .resume = ak8972_resume, - .read = ak8972_read, - .config = ak8972_config, - .get_config = ak8972_get_config, - .name = "ak8972", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = COMPASS_ID_AK8972, - .read_reg = 0x01, - .read_len = 9, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {39321, 6000}, - .trigger = &ak8972_read_trigger, -}; - -static -struct ext_slave_descr *ak8972_get_slave_descr(void) -{ - return &ak8972_descr; -} - -/* -------------------------------------------------------------------------- */ -struct ak8972_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int ak8972_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct ak8972_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - ak8972_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int ak8972_mod_remove(struct i2c_client *client) -{ - struct ak8972_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - inv_mpu_unregister_slave(client, private_data->pdata, - ak8972_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id ak8972_mod_id[] = { - { "ak8972", COMPASS_ID_AK8972 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, ak8972_mod_id); - -static struct i2c_driver ak8972_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = ak8972_mod_probe, - .remove = ak8972_mod_remove, - .id_table = ak8972_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "ak8972_mod", - }, - .address_list = normal_i2c, -}; - -static int __init ak8972_mod_init(void) -{ - int res = i2c_add_driver(&ak8972_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "ak8972_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit ak8972_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&ak8972_mod_driver); -} - -module_init(ak8972_mod_init); -module_exit(ak8972_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate AK8972 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("ak8972_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/ak8975.c b/drivers/misc/inv_mpu/compass/ak8975.c deleted file mode 100644 index b8dea1b..0000000 --- a/drivers/misc/inv_mpu/compass/ak8975.c +++ /dev/null @@ -1,504 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup COMPASSDL - * - * @{ - * @file ak8975.c - * @brief Magnetometer setup and handling methods for the AKM AK8975, - * AKM AK8975B, and AKM AK8975C compass devices. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/* -------------------------------------------------------------------------- */ -#define AK8975_REG_ST1 (0x02) -#define AK8975_REG_HXL (0x03) -#define AK8975_REG_ST2 (0x09) - -#define AK8975_REG_CNTL (0x0A) -#define AK8975_REG_ASAX (0x10) -#define AK8975_REG_ASAY (0x11) -#define AK8975_REG_ASAZ (0x12) - -#define AK8975_CNTL_MODE_POWER_DOWN (0x10) -#define AK8975_CNTL_MODE_SINGLE_MEASUREMENT (0x11) -#define AK8975_CNTL_MODE_FUSE_ROM_ACCESS (0x1f) - -/* -------------------------------------------------------------------------- */ -struct ak8975_config { - char asa[COMPASS_NUM_AXES]; /* axis sensitivity adjustment */ -}; - -struct ak8975_private_data { - struct ak8975_config init; -}; - -/* -------------------------------------------------------------------------- */ -static int ak8975_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char serial_data[COMPASS_NUM_AXES]; - - struct ak8975_private_data *private_data; - private_data = (struct ak8975_private_data *) - kzalloc(sizeof(struct ak8975_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - AK8975_REG_CNTL, - AK8975_CNTL_MODE_POWER_DOWN); - if (result) { - LOG_RESULT_LOCATION(result); - kfree(private_data); - return result; - } - /* Wait at least 100us */ - udelay(100); - - result = inv_serial_single_write(mlsl_handle, pdata->address, - AK8975_REG_CNTL, - AK8975_CNTL_MODE_FUSE_ROM_ACCESS); - if (result) { - LOG_RESULT_LOCATION(result); - kfree(private_data); - return result; - } - - /* Wait at least 200us */ - udelay(200); - - result = inv_serial_read(mlsl_handle, pdata->address, - AK8975_REG_ASAX, - COMPASS_NUM_AXES, serial_data); - if (result) { - LOG_RESULT_LOCATION(result); - kfree(private_data); - return result; - } - - pdata->private_data = private_data; - - private_data->init.asa[0] = serial_data[0]; - private_data->init.asa[1] = serial_data[1]; - private_data->init.asa[2] = serial_data[2]; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - AK8975_REG_CNTL, - AK8975_CNTL_MODE_POWER_DOWN); - if (result) { - LOG_RESULT_LOCATION(result); - kfree(private_data); - return result; - } - - udelay(100); - return INV_SUCCESS; -} - -static int ak8975_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -static int ak8975_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - result = - inv_serial_single_write(mlsl_handle, pdata->address, - AK8975_REG_CNTL, - AK8975_CNTL_MODE_POWER_DOWN); - msleep(20); /* wait at least 100us */ - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -static int ak8975_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - result = - inv_serial_single_write(mlsl_handle, pdata->address, - AK8975_REG_CNTL, - AK8975_CNTL_MODE_SINGLE_MEASUREMENT); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return result; -} - -static int ak8975_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - unsigned char regs[8]; - unsigned char *stat = ®s[0]; - unsigned char *stat2 = ®s[7]; - int result = INV_SUCCESS; - int status = INV_SUCCESS; - - result = - inv_serial_read(mlsl_handle, pdata->address, AK8975_REG_ST1, - 8, regs); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Always return the data and the status registers */ - memcpy(data, ®s[1], 6); - data[6] = regs[0]; - data[7] = regs[7]; - - /* - * ST : data ready - - * Measurement has been completed and data is ready to be read. - */ - if (*stat & 0x01) - status = INV_SUCCESS; - - /* - * ST2 : data error - - * occurs when data read is started outside of a readable period; - * data read would not be correct. - * Valid in continuous measurement mode only. - * In single measurement mode this error should not occour but we - * stil account for it and return an error, since the data would be - * corrupted. - * DERR bit is self-clearing when ST2 register is read. - */ - if (*stat2 & 0x04) - status = INV_ERROR_COMPASS_DATA_ERROR; - /* - * ST2 : overflow - - * the sum of the absolute values of all axis |X|+|Y|+|Z| < 2400uT. - * This is likely to happen in presence of an external magnetic - * disturbance; it indicates, the sensor data is incorrect and should - * be ignored. - * An error is returned. - * HOFL bit clears when a new measurement starts. - */ - if (*stat2 & 0x08) - status = INV_ERROR_COMPASS_DATA_OVERFLOW; - /* - * ST : overrun - - * the previous sample was not fetched and lost. - * Valid in continuous measurement mode only. - * In single measurement mode this error should not occour and we - * don't consider this condition an error. - * DOR bit is self-clearing when ST2 or any meas. data register is - * read. - */ - if (*stat & 0x02) { - /* status = INV_ERROR_COMPASS_DATA_UNDERFLOW; */ - status = INV_SUCCESS; - } - - /* - * trigger next measurement if: - * - stat is non zero; - * - if stat is zero and stat2 is non zero. - * Won't trigger if data is not ready and there was no error. - */ - if (*stat != 0x00 || *stat2 != 0x00) { - result = inv_serial_single_write( - mlsl_handle, pdata->address, - AK8975_REG_CNTL, AK8975_CNTL_MODE_SINGLE_MEASUREMENT); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - return status; -} - -static int ak8975_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - int result; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_WRITE_REGISTERS: - result = inv_serial_write(mlsl_handle, pdata->address, - data->len, - (unsigned char *)data->data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - break; - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - case MPU_SLAVE_CONFIG_ODR_RESUME: - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - case MPU_SLAVE_CONFIG_FSR_RESUME: - case MPU_SLAVE_CONFIG_MOT_THS: - case MPU_SLAVE_CONFIG_NMOT_THS: - case MPU_SLAVE_CONFIG_MOT_DUR: - case MPU_SLAVE_CONFIG_NMOT_DUR: - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - case MPU_SLAVE_CONFIG_IRQ_RESUME: - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static int ak8975_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct ak8975_private_data *private_data = pdata->private_data; - int result; - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_READ_REGISTERS: - { - unsigned char *serial_data = - (unsigned char *)data->data; - result = - inv_serial_read(mlsl_handle, pdata->address, - serial_data[0], data->len - 1, - &serial_data[1]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - break; - } - case MPU_SLAVE_READ_SCALE: - { - unsigned char *serial_data = - (unsigned char *)data->data; - serial_data[0] = private_data->init.asa[0]; - serial_data[1] = private_data->init.asa[1]; - serial_data[2] = private_data->init.asa[2]; - result = INV_SUCCESS; - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - break; - } - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = 0; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = 8000; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - case MPU_SLAVE_CONFIG_FSR_RESUME: - case MPU_SLAVE_CONFIG_MOT_THS: - case MPU_SLAVE_CONFIG_NMOT_THS: - case MPU_SLAVE_CONFIG_MOT_DUR: - case MPU_SLAVE_CONFIG_NMOT_DUR: - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - case MPU_SLAVE_CONFIG_IRQ_RESUME: - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - -static struct ext_slave_read_trigger ak8975_read_trigger = { - /*.reg = */ 0x0A, - /*.value = */ 0x01 -}; - -static struct ext_slave_descr ak8975_descr = { - .init = ak8975_init, - .exit = ak8975_exit, - .suspend = ak8975_suspend, - .resume = ak8975_resume, - .read = ak8975_read, - .config = ak8975_config, - .get_config = ak8975_get_config, - .name = "ak8975", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = COMPASS_ID_AK8975, - .read_reg = 0x01, - .read_len = 10, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {9830, 4000}, - .trigger = &ak8975_read_trigger, -}; - -static -struct ext_slave_descr *ak8975_get_slave_descr(void) -{ - return &ak8975_descr; -} - -/* -------------------------------------------------------------------------- */ -struct ak8975_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int ak8975_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct ak8975_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - ak8975_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int ak8975_mod_remove(struct i2c_client *client) -{ - struct ak8975_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - inv_mpu_unregister_slave(client, private_data->pdata, - ak8975_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id ak8975_mod_id[] = { - { "ak8975_mod", COMPASS_ID_AK8975 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, ak8975_mod_id); - -static struct i2c_driver ak8975_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = ak8975_mod_probe, - .remove = ak8975_mod_remove, - .id_table = ak8975_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "ak8975_mod", - }, - .address_list = normal_i2c, -}; - -static int __init ak8975_mod_init(void) -{ - int res = i2c_add_driver(&ak8975_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "ak8975_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit ak8975_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&ak8975_mod_driver); -} - -module_init(ak8975_mod_init); -module_exit(ak8975_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate AK8975 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("ak8975_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/hscdtd002b.c b/drivers/misc/inv_mpu/compass/hscdtd002b.c deleted file mode 100644 index 4f6013c..0000000 --- a/drivers/misc/inv_mpu/compass/hscdtd002b.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup COMPASSDL - * - * @{ - * @file hscdtd002b.c - * @brief Magnetometer setup and handling methods for Alps HSCDTD002B - * compass. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/* -------------------------------------------------------------------------- */ -#define COMPASS_HSCDTD002B_STAT (0x18) -#define COMPASS_HSCDTD002B_CTRL1 (0x1B) -#define COMPASS_HSCDTD002B_CTRL2 (0x1C) -#define COMPASS_HSCDTD002B_CTRL3 (0x1D) -#define COMPASS_HSCDTD002B_DATAX (0x10) - -/* -------------------------------------------------------------------------- */ -static int hscdtd002b_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - /* Power mode: stand-by */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL1, 0x00); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); /* turn-off time */ - - return result; -} - -static int hscdtd002b_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - /* Soft reset */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL3, 0x80); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Force state; Power mode: active */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL1, 0x82); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Data ready enable */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL2, 0x08); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); /* turn-on time */ - - return result; -} - -static int hscdtd002b_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - unsigned char stat; - int result = INV_SUCCESS; - int status = INV_SUCCESS; - - /* Read status reg. to check if data is ready */ - result = - inv_serial_read(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_STAT, 1, &stat); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if (stat & 0x40) { - result = - inv_serial_read(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_DATAX, 6, - (unsigned char *)data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - status = INV_SUCCESS; - } else if (stat & 0x20) { - status = INV_ERROR_COMPASS_DATA_OVERFLOW; - } else { - status = INV_ERROR_COMPASS_DATA_NOT_READY; - } - /* trigger next measurement read */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL3, 0x40); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return status; -} - -static struct ext_slave_descr hscdtd002b_descr = { - .init = NULL, - .exit = NULL, - .suspend = hscdtd002b_suspend, - .resume = hscdtd002b_resume, - .read = hscdtd002b_read, - .config = NULL, - .get_config = NULL, - .name = "hscdtd002b", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = COMPASS_ID_HSCDTD002B, - .read_reg = 0x10, - .read_len = 6, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {9830, 4000}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *hscdtd002b_get_slave_descr(void) -{ - return &hscdtd002b_descr; -} - -/* -------------------------------------------------------------------------- */ -struct hscdtd002b_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int hscdtd002b_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct hscdtd002b_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - hscdtd002b_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int hscdtd002b_mod_remove(struct i2c_client *client) -{ - struct hscdtd002b_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - hscdtd002b_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id hscdtd002b_mod_id[] = { - { "hscdtd002b", COMPASS_ID_HSCDTD002B }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, hscdtd002b_mod_id); - -static struct i2c_driver hscdtd002b_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = hscdtd002b_mod_probe, - .remove = hscdtd002b_mod_remove, - .id_table = hscdtd002b_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "hscdtd002b_mod", - }, - .address_list = normal_i2c, -}; - -static int __init hscdtd002b_mod_init(void) -{ - int res = i2c_add_driver(&hscdtd002b_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "hscdtd002b_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit hscdtd002b_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&hscdtd002b_mod_driver); -} - -module_init(hscdtd002b_mod_init); -module_exit(hscdtd002b_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate HSCDTD002B sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("hscdtd002b_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/hscdtd004a.c b/drivers/misc/inv_mpu/compass/hscdtd004a.c deleted file mode 100644 index f091559..0000000 --- a/drivers/misc/inv_mpu/compass/hscdtd004a.c +++ /dev/null @@ -1,318 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup COMPASSDL - * - * @{ - * @file hscdtd004a.c - * @brief Magnetometer setup and handling methods for Alps HSCDTD004A - * compass. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/* -------------------------------------------------------------------------- */ -#define COMPASS_HSCDTD004A_STAT (0x18) -#define COMPASS_HSCDTD004A_CTRL1 (0x1B) -#define COMPASS_HSCDTD004A_CTRL2 (0x1C) -#define COMPASS_HSCDTD004A_CTRL3 (0x1D) -#define COMPASS_HSCDTD004A_DATAX (0x10) - -/* -------------------------------------------------------------------------- */ - -static int hscdtd004a_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - /* Power mode: stand-by */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL1, 0x00); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); /* turn-off time */ - - return result; -} - -static int hscdtd004a_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char data1, data2[2]; - - result = inv_serial_read(mlsl_handle, pdata->address, 0xf, 1, &data1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_read(mlsl_handle, pdata->address, 0xd, 2, data2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if (data1 != 0x49 || data2[0] != 0x45 || data2[1] != 0x54) { - LOG_RESULT_LOCATION(INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED); - return INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED; - } - return result; -} - -static int hscdtd004a_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - /* Soft reset */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL3, 0x80); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Normal state; Power mode: active */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL1, 0x82); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Data ready enable */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL2, 0x7C); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(1); /* turn-on time */ - return result; -} - -static int hscdtd004a_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - unsigned char stat; - int result = INV_SUCCESS; - int status = INV_SUCCESS; - - /* Read status reg. to check if data is ready */ - result = - inv_serial_read(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_STAT, 1, &stat); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if (stat & 0x48) { - result = - inv_serial_read(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_DATAX, 6, - (unsigned char *)data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - status = INV_SUCCESS; - } else if (stat & 0x68) { - status = INV_ERROR_COMPASS_DATA_OVERFLOW; - } else { - status = INV_ERROR_COMPASS_DATA_NOT_READY; - } - /* trigger next measurement read */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL3, 0x40); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return status; - -} - -static struct ext_slave_descr hscdtd004a_descr = { - .init = hscdtd004a_init, - .exit = NULL, - .suspend = hscdtd004a_suspend, - .resume = hscdtd004a_resume, - .read = hscdtd004a_read, - .config = NULL, - .get_config = NULL, - .name = "hscdtd004a", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = COMPASS_ID_HSCDTD004A, - .read_reg = 0x10, - .read_len = 6, - .endian = EXT_SLAVE_LITTLE_ENDIAN, - .range = {9830, 4000}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *hscdtd004a_get_slave_descr(void) -{ - return &hscdtd004a_descr; -} - -/* -------------------------------------------------------------------------- */ -struct hscdtd004a_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int hscdtd004a_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct hscdtd004a_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - hscdtd004a_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int hscdtd004a_mod_remove(struct i2c_client *client) -{ - struct hscdtd004a_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - hscdtd004a_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id hscdtd004a_mod_id[] = { - { "hscdtd004a", COMPASS_ID_HSCDTD004A }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, hscdtd004a_mod_id); - -static struct i2c_driver hscdtd004a_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = hscdtd004a_mod_probe, - .remove = hscdtd004a_mod_remove, - .id_table = hscdtd004a_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "hscdtd004a_mod", - }, - .address_list = normal_i2c, -}; - -static int __init hscdtd004a_mod_init(void) -{ - int res = i2c_add_driver(&hscdtd004a_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "hscdtd004a_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit hscdtd004a_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&hscdtd004a_mod_driver); -} - -module_init(hscdtd004a_mod_init); -module_exit(hscdtd004a_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate HSCDTD004A sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("hscdtd004a_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/lsm303dlx_m.c b/drivers/misc/inv_mpu/compass/lsm303dlx_m.c deleted file mode 100644 index 32f8cdd..0000000 --- a/drivers/misc/inv_mpu/compass/lsm303dlx_m.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup COMPASSDL - * - * @{ - * @file lsm303dlx_m.c - * @brief Magnetometer setup and handling methods for ST LSM303 - * compass. - * This magnetometer device is part of a combo chip with the - * ST LIS331DLH accelerometer and the logic in entirely based - * on the Honeywell HMC5883 magnetometer. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/* -------------------------------------------------------------------------- */ -enum LSM_REG { - LSM_REG_CONF_A = 0x0, - LSM_REG_CONF_B = 0x1, - LSM_REG_MODE = 0x2, - LSM_REG_X_M = 0x3, - LSM_REG_X_L = 0x4, - LSM_REG_Z_M = 0x5, - LSM_REG_Z_L = 0x6, - LSM_REG_Y_M = 0x7, - LSM_REG_Y_L = 0x8, - LSM_REG_STATUS = 0x9, - LSM_REG_ID_A = 0xA, - LSM_REG_ID_B = 0xB, - LSM_REG_ID_C = 0xC -}; - -enum LSM_CONF_A { - LSM_CONF_A_DRATE_MASK = 0x1C, - LSM_CONF_A_DRATE_0_75 = 0x00, - LSM_CONF_A_DRATE_1_5 = 0x04, - LSM_CONF_A_DRATE_3 = 0x08, - LSM_CONF_A_DRATE_7_5 = 0x0C, - LSM_CONF_A_DRATE_15 = 0x10, - LSM_CONF_A_DRATE_30 = 0x14, - LSM_CONF_A_DRATE_75 = 0x18, - LSM_CONF_A_MEAS_MASK = 0x3, - LSM_CONF_A_MEAS_NORM = 0x0, - LSM_CONF_A_MEAS_POS = 0x1, - LSM_CONF_A_MEAS_NEG = 0x2 -}; - -enum LSM_CONF_B { - LSM_CONF_B_GAIN_MASK = 0xE0, - LSM_CONF_B_GAIN_0_9 = 0x00, - LSM_CONF_B_GAIN_1_2 = 0x20, - LSM_CONF_B_GAIN_1_9 = 0x40, - LSM_CONF_B_GAIN_2_5 = 0x60, - LSM_CONF_B_GAIN_4_0 = 0x80, - LSM_CONF_B_GAIN_4_6 = 0xA0, - LSM_CONF_B_GAIN_5_5 = 0xC0, - LSM_CONF_B_GAIN_7_9 = 0xE0 -}; - -enum LSM_MODE { - LSM_MODE_MASK = 0x3, - LSM_MODE_CONT = 0x0, - LSM_MODE_SINGLE = 0x1, - LSM_MODE_IDLE = 0x2, - LSM_MODE_SLEEP = 0x3 -}; - -/* -------------------------------------------------------------------------- */ - -static int lsm303dlx_m_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - result = - inv_serial_single_write(mlsl_handle, pdata->address, - LSM_REG_MODE, LSM_MODE_SLEEP); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(3); - - return result; -} - -static int lsm303dlx_m_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - /* Use single measurement mode. Start at sleep state. */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - LSM_REG_MODE, LSM_MODE_SLEEP); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Config normal measurement */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - LSM_REG_CONF_A, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Adjust gain to 320 LSB/Gauss */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - LSM_REG_CONF_B, LSM_CONF_B_GAIN_5_5); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -static int lsm303dlx_m_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - unsigned char stat; - int result = INV_SUCCESS; - short axis_fixed; - - /* Read status reg. to check if data is ready */ - result = - inv_serial_read(mlsl_handle, pdata->address, LSM_REG_STATUS, 1, - &stat); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if (stat & 0x01) { - result = - inv_serial_read(mlsl_handle, pdata->address, - LSM_REG_X_M, 6, (unsigned char *)data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /*drop data if overflows */ - if ((data[0] == 0xf0) || (data[2] == 0xf0) - || (data[4] == 0xf0)) { - /* trigger next measurement read */ - result = - inv_serial_single_write(mlsl_handle, - pdata->address, - LSM_REG_MODE, - LSM_MODE_SINGLE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return INV_ERROR_COMPASS_DATA_OVERFLOW; - } - /* convert to fixed point and apply sensitivity correction for - Z-axis */ - axis_fixed = - (short)((unsigned short)data[5] + - (unsigned short)data[4] * 256); - /* scale up by 1.125 (36/32) approximate of 1.122 (320/285) */ - if (slave->id == COMPASS_ID_LSM303DLM) { - /* NOTE/IMPORTANT: - lsm303dlm compass axis definition doesn't - respect the right hand rule. We invert - the sign of the Z axis to fix that. */ - axis_fixed = (short)(-1 * axis_fixed * 36); - } else { - axis_fixed = (short)(axis_fixed * 36); - } - data[4] = axis_fixed >> 8; - data[5] = axis_fixed & 0xFF; - - axis_fixed = - (short)((unsigned short)data[3] + - (unsigned short)data[2] * 256); - axis_fixed = (short)(axis_fixed * 32); - data[2] = axis_fixed >> 8; - data[3] = axis_fixed & 0xFF; - - axis_fixed = - (short)((unsigned short)data[1] + - (unsigned short)data[0] * 256); - axis_fixed = (short)(axis_fixed * 32); - data[0] = axis_fixed >> 8; - data[1] = axis_fixed & 0xFF; - - /* trigger next measurement read */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - LSM_REG_MODE, LSM_MODE_SINGLE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return INV_SUCCESS; - } else { - /* trigger next measurement read */ - result = - inv_serial_single_write(mlsl_handle, pdata->address, - LSM_REG_MODE, LSM_MODE_SINGLE); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return INV_ERROR_COMPASS_DATA_NOT_READY; - } -} - -static struct ext_slave_descr lsm303dlx_m_descr = { - .init = NULL, - .exit = NULL, - .suspend = lsm303dlx_m_suspend, - .resume = lsm303dlx_m_resume, - .read = lsm303dlx_m_read, - .config = NULL, - .get_config = NULL, - .name = "lsm303dlx_m", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = ID_INVALID, - .read_reg = 0x06, - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {10240, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *lsm303dlx_m_get_slave_descr(void) -{ - return &lsm303dlx_m_descr; -} - -/* -------------------------------------------------------------------------- */ -struct lsm303dlx_m_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static const struct i2c_device_id lsm303dlx_m_mod_id[] = { - { "lsm303dlh", COMPASS_ID_LSM303DLH }, - { "lsm303dlm", COMPASS_ID_LSM303DLM }, - {} -}; -MODULE_DEVICE_TABLE(i2c, lsm303dlx_m_mod_id); - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int lsm303dlx_m_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct lsm303dlx_m_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - lsm303dlx_m_descr.id = devid->driver_data; - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - lsm303dlx_m_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int lsm303dlx_m_mod_remove(struct i2c_client *client) -{ - struct lsm303dlx_m_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - lsm303dlx_m_get_slave_descr); - - kfree(private_data); - return 0; -} - -static struct i2c_driver lsm303dlx_m_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = lsm303dlx_m_mod_probe, - .remove = lsm303dlx_m_mod_remove, - .id_table = lsm303dlx_m_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "lsm303dlx_m_mod", - }, - .address_list = normal_i2c, -}; - -static int __init lsm303dlx_m_mod_init(void) -{ - int res = i2c_add_driver(&lsm303dlx_m_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "lsm303dlx_m_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit lsm303dlx_m_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&lsm303dlx_m_mod_driver); -} - -module_init(lsm303dlx_m_mod_init); -module_exit(lsm303dlx_m_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate lsm303dlx_m sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("lsm303dlx_m_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/mmc314x.c b/drivers/misc/inv_mpu/compass/mmc314x.c deleted file mode 100644 index 786fadc..0000000 --- a/drivers/misc/inv_mpu/compass/mmc314x.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup COMPASSDL - * - * @{ - * @file mmc314x.c - * @brief Magnetometer setup and handling methods for the - * MEMSIC MMC314x compass. - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/* -------------------------------------------------------------------------- */ - -static int reset_int = 1000; -static int read_count = 1; -static char reset_mode; /* in Z-init section */ - -/* -------------------------------------------------------------------------- */ -#define MMC314X_REG_ST (0x00) -#define MMC314X_REG_X_MSB (0x01) - -#define MMC314X_CNTL_MODE_WAKE_UP (0x01) -#define MMC314X_CNTL_MODE_SET (0x02) -#define MMC314X_CNTL_MODE_RESET (0x04) - -/* -------------------------------------------------------------------------- */ - -static int mmc314x_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - return result; -} - -static int mmc314x_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - - int result; - result = - inv_serial_single_write(mlsl_handle, pdata->address, - MMC314X_REG_ST, MMC314X_CNTL_MODE_RESET); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(10); - result = - inv_serial_single_write(mlsl_handle, pdata->address, - MMC314X_REG_ST, MMC314X_CNTL_MODE_SET); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(10); - read_count = 1; - return INV_SUCCESS; -} - -static int mmc314x_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result, ii; - short tmp[3]; - unsigned char tmpdata[6]; - - if (read_count > 1000) - read_count = 1; - - result = - inv_serial_read(mlsl_handle, pdata->address, MMC314X_REG_X_MSB, - 6, (unsigned char *)data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - for (ii = 0; ii < 6; ii++) - tmpdata[ii] = data[ii]; - - for (ii = 0; ii < 3; ii++) { - tmp[ii] = (short)((tmpdata[2 * ii] << 8) + tmpdata[2 * ii + 1]); - tmp[ii] = tmp[ii] - 4096; - tmp[ii] = tmp[ii] * 16; - } - - for (ii = 0; ii < 3; ii++) { - data[2 * ii] = (unsigned char)(tmp[ii] >> 8); - data[2 * ii + 1] = (unsigned char)(tmp[ii]); - } - - if (read_count % reset_int == 0) { - if (reset_mode) { - result = - inv_serial_single_write(mlsl_handle, - pdata->address, - MMC314X_REG_ST, - MMC314X_CNTL_MODE_RESET); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - reset_mode = 0; - return INV_ERROR_COMPASS_DATA_NOT_READY; - } else { - result = - inv_serial_single_write(mlsl_handle, - pdata->address, - MMC314X_REG_ST, - MMC314X_CNTL_MODE_SET); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - reset_mode = 1; - read_count++; - return INV_ERROR_COMPASS_DATA_NOT_READY; - } - } - result = - inv_serial_single_write(mlsl_handle, pdata->address, - MMC314X_REG_ST, MMC314X_CNTL_MODE_WAKE_UP); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - read_count++; - - return INV_SUCCESS; -} - -static struct ext_slave_descr mmc314x_descr = { - .init = NULL, - .exit = NULL, - .suspend = mmc314x_suspend, - .resume = mmc314x_resume, - .read = mmc314x_read, - .config = NULL, - .get_config = NULL, - .name = "mmc314x", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = COMPASS_ID_MMC314X, - .read_reg = 0x01, - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {400, 0}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *mmc314x_get_slave_descr(void) -{ - return &mmc314x_descr; -} - -/* -------------------------------------------------------------------------- */ -struct mmc314x_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int mmc314x_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct mmc314x_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - mmc314x_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int mmc314x_mod_remove(struct i2c_client *client) -{ - struct mmc314x_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - mmc314x_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id mmc314x_mod_id[] = { - { "mmc314x", COMPASS_ID_MMC314X }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, mmc314x_mod_id); - -static struct i2c_driver mmc314x_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = mmc314x_mod_probe, - .remove = mmc314x_mod_remove, - .id_table = mmc314x_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "mmc314x_mod", - }, - .address_list = normal_i2c, -}; - -static int __init mmc314x_mod_init(void) -{ - int res = i2c_add_driver(&mmc314x_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "mmc314x_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit mmc314x_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&mmc314x_mod_driver); -} - -module_init(mmc314x_mod_init); -module_exit(mmc314x_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate MMC314X sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("mmc314x_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/yas529-kernel.c b/drivers/misc/inv_mpu/compass/yas529-kernel.c deleted file mode 100644 index f53223f..0000000 --- a/drivers/misc/inv_mpu/compass/yas529-kernel.c +++ /dev/null @@ -1,611 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/*----- YAMAHA YAS529 Registers ------*/ -enum YAS_REG { - YAS_REG_CMDR = 0x00, /* 000 < 5 */ - YAS_REG_XOFFSETR = 0x20, /* 001 < 5 */ - YAS_REG_Y1OFFSETR = 0x40, /* 010 < 5 */ - YAS_REG_Y2OFFSETR = 0x60, /* 011 < 5 */ - YAS_REG_ICOILR = 0x80, /* 100 < 5 */ - YAS_REG_CAL = 0xA0, /* 101 < 5 */ - YAS_REG_CONFR = 0xC0, /* 110 < 5 */ - YAS_REG_DOUTR = 0xE0 /* 111 < 5 */ -}; - -/* -------------------------------------------------------------------------- */ - -static long a1; -static long a2; -static long a3; -static long a4; -static long a5; -static long a6; -static long a7; -static long a8; -static long a9; - -/* -------------------------------------------------------------------------- */ -static int yas529_sensor_i2c_write(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned int len, unsigned char *data) -{ - struct i2c_msg msgs[1]; - int res; - - if (NULL == data || NULL == i2c_adap) - return -EINVAL; - - msgs[0].addr = address; - msgs[0].flags = 0; /* write */ - msgs[0].buf = (unsigned char *)data; - msgs[0].len = len; - - res = i2c_transfer(i2c_adap, msgs, 1); - if (res < 1) - return res; - else - return 0; -} - -static int yas529_sensor_i2c_read(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned char reg, - unsigned int len, unsigned char *data) -{ - struct i2c_msg msgs[2]; - int res; - - if (NULL == data || NULL == i2c_adap) - return -EINVAL; - - msgs[0].addr = address; - msgs[0].flags = I2C_M_RD; - msgs[0].buf = data; - msgs[0].len = len; - - res = i2c_transfer(i2c_adap, msgs, 1); - if (res < 1) - return res; - else - return 0; -} - -static int yas529_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - return result; -} - -static int yas529_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - unsigned char dummyData[1] = { 0 }; - unsigned char dummyRegister = 0; - unsigned char rawData[6]; - unsigned char calData[9]; - - short xoffset, y1offset, y2offset; - short d2, d3, d4, d5, d6, d7, d8, d9; - - /* YAS529 Application Manual MS-3C - Section 4.4.5 */ - /* =============================================== */ - /* Step 1 - register initialization */ - /* zero initialization coil register - "100 00 000" */ - dummyData[0] = YAS_REG_ICOILR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* zero config register - "110 00 000" */ - dummyData[0] = YAS_REG_CONFR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Step 2 - initialization coil operation */ - dummyData[0] = YAS_REG_ICOILR | 0x11; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x01; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x12; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x02; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x13; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x03; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x14; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x04; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x15; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x05; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x16; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x06; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x17; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x07; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x10; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_ICOILR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Step 3 - rough offset measurement */ - /* Config register - Measurements results - "110 00 000" */ - dummyData[0] = YAS_REG_CONFR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Measurements command register - Rough offset measurement - - "000 00001" */ - dummyData[0] = YAS_REG_CMDR | 0x01; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(2); /* wait at least 1.5ms */ - - /* Measurement data read */ - result = - yas529_sensor_i2c_read(mlsl_handle, pdata->address, - dummyRegister, 6, rawData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - xoffset = - (short)((unsigned short)rawData[5] + - ((unsigned short)rawData[4] & 0x7) * 256) - 5; - if (xoffset < 0) - xoffset = 0; - y1offset = - (short)((unsigned short)rawData[3] + - ((unsigned short)rawData[2] & 0x7) * 256) - 5; - if (y1offset < 0) - y1offset = 0; - y2offset = - (short)((unsigned short)rawData[1] + - ((unsigned short)rawData[0] & 0x7) * 256) - 5; - if (y2offset < 0) - y2offset = 0; - - /* Step 4 - rough offset setting */ - /* Set rough offset register values */ - dummyData[0] = YAS_REG_XOFFSETR | xoffset; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_Y1OFFSETR | y1offset; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - dummyData[0] = YAS_REG_Y2OFFSETR | y2offset; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* CAL matrix read (first read is invalid) */ - /* Config register - CAL register read - "110 01 000" */ - dummyData[0] = YAS_REG_CONFR | 0x08; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* CAL data read */ - result = - yas529_sensor_i2c_read(mlsl_handle, pdata->address, - dummyRegister, 9, calData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Config register - CAL register read - "110 01 000" */ - dummyData[0] = YAS_REG_CONFR | 0x08; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* CAL data read */ - result = - yas529_sensor_i2c_read(mlsl_handle, pdata->address, - dummyRegister, 9, calData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Calculate coefficients of the sensitivity correction matrix */ - a1 = 100; - d2 = (calData[0] & 0xFC) >> 2; /* [71..66] 6bit */ - a2 = (short)(d2 - 32); - /* [65..62] 4bit */ - d3 = ((calData[0] & 0x03) << 2) | ((calData[1] & 0xC0) >> 6); - a3 = (short)(d3 - 8); - d4 = (calData[1] & 0x3F); /* [61..56] 6bit */ - a4 = (short)(d4 - 32); - d5 = (calData[2] & 0xFC) >> 2; /* [55..50] 6bit */ - a5 = (short)(d5 - 32) + 70; - /* [49..44] 6bit */ - d6 = ((calData[2] & 0x03) << 4) | ((calData[3] & 0xF0) >> 4); - a6 = (short)(d6 - 32); - /* [43..38] 6bit */ - d7 = ((calData[3] & 0x0F) << 2) | ((calData[4] & 0xC0) >> 6); - a7 = (short)(d7 - 32); - d8 = (calData[4] & 0x3F); /* [37..32] 6bit */ - a8 = (short)(d8 - 32); - d9 = (calData[5] & 0xFE) >> 1; /* [31..25] 7bit */ - a9 = (short)(d9 - 64) + 130; - - return result; -} - -static int yas529_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - unsigned char stat; - unsigned char rawData[6]; - unsigned char dummyData[1] = { 0 }; - unsigned char dummyRegister = 0; - int result = INV_SUCCESS; - short SX, SY1, SY2, SY, SZ; - short row1fixed, row2fixed, row3fixed; - - /* Config register - Measurements results - "110 00 000" */ - dummyData[0] = YAS_REG_CONFR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Measurements command register - Normal magnetic field measurement - - "000 00000" */ - dummyData[0] = YAS_REG_CMDR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - msleep(10); - /* Measurement data read */ - result = - yas529_sensor_i2c_read(mlsl_handle, pdata->address, - dummyRegister, 6, (unsigned char *)&rawData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - stat = rawData[0] & 0x80; - if (stat == 0x00) { - /* Extract raw data */ - SX = (short)((unsigned short)rawData[5] + - ((unsigned short)rawData[4] & 0x7) * 256); - SY1 = - (short)((unsigned short)rawData[3] + - ((unsigned short)rawData[2] & 0x7) * 256); - SY2 = - (short)((unsigned short)rawData[1] + - ((unsigned short)rawData[0] & 0x7) * 256); - if ((SX <= 1) || (SY1 <= 1) || (SY2 <= 1)) - return INV_ERROR_COMPASS_DATA_UNDERFLOW; - if ((SX >= 1024) || (SY1 >= 1024) || (SY2 >= 1024)) - return INV_ERROR_COMPASS_DATA_OVERFLOW; - /* Convert to XYZ axis */ - SX = -1 * SX; - SY = SY2 - SY1; - SZ = SY1 + SY2; - - /* Apply sensitivity correction matrix */ - row1fixed = (short)((a1 * SX + a2 * SY + a3 * SZ) >> 7) * 41; - row2fixed = (short)((a4 * SX + a5 * SY + a6 * SZ) >> 7) * 41; - row3fixed = (short)((a7 * SX + a8 * SY + a9 * SZ) >> 7) * 41; - - data[0] = row1fixed >> 8; - data[1] = row1fixed & 0xFF; - data[2] = row2fixed >> 8; - data[3] = row2fixed & 0xFF; - data[4] = row3fixed >> 8; - data[5] = row3fixed & 0xFF; - - return INV_SUCCESS; - } else { - return INV_ERROR_COMPASS_DATA_NOT_READY; - } -} - -static struct ext_slave_descr yas529_descr = { - .init = NULL, - .exit = NULL, - .suspend = yas529_suspend, - .resume = yas529_resume, - .read = yas529_read, - .config = NULL, - .get_config = NULL, - .name = "yas529", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = COMPASS_ID_YAS529, - .read_reg = 0x06, - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {19660, 8000}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *yas529_get_slave_descr(void) -{ - return &yas529_descr; -} - -/* -------------------------------------------------------------------------- */ -struct yas529_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int yas529_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct yas529_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - yas529_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int yas529_mod_remove(struct i2c_client *client) -{ - struct yas529_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - yas529_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id yas529_mod_id[] = { - { "yas529", COMPASS_ID_YAS529 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, yas529_mod_id); - -static struct i2c_driver yas529_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = yas529_mod_probe, - .remove = yas529_mod_remove, - .id_table = yas529_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "yas529_mod", - }, - .address_list = normal_i2c, -}; - -static int __init yas529_mod_init(void) -{ - int res = i2c_add_driver(&yas529_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "yas529_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit yas529_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&yas529_mod_driver); -} - -module_init(yas529_mod_init); -module_exit(yas529_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate YAS529 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("yas529_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/yas530.c b/drivers/misc/inv_mpu/compass/yas530.c deleted file mode 100644 index 263990f..0000000 --- a/drivers/misc/inv_mpu/compass/yas530.c +++ /dev/null @@ -1,596 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup COMPASSDL - * - * @{ - * @file yas530.c - * @brief Magnetometer setup and handling methods for Yamaha YAS530 - * compass when used in a user-space solution (no kernel driver). - */ - -/* -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include "mpu-dev.h" - -#include "log.h" -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/* -------------------------------------------------------------------------- */ -#define YAS530_REGADDR_DEVICE_ID (0x80) -#define YAS530_REGADDR_ACTUATE_INIT_COIL (0x81) -#define YAS530_REGADDR_MEASURE_COMMAND (0x82) -#define YAS530_REGADDR_CONFIG (0x83) -#define YAS530_REGADDR_MEASURE_INTERVAL (0x84) -#define YAS530_REGADDR_OFFSET_X (0x85) -#define YAS530_REGADDR_OFFSET_Y1 (0x86) -#define YAS530_REGADDR_OFFSET_Y2 (0x87) -#define YAS530_REGADDR_TEST1 (0x88) -#define YAS530_REGADDR_TEST2 (0x89) -#define YAS530_REGADDR_CAL (0x90) -#define YAS530_REGADDR_MEASURE_DATA (0xb0) - -/* -------------------------------------------------------------------------- */ -static int Cx, Cy1, Cy2; -static int /*a1, */ a2, a3, a4, a5, a6, a7, a8, a9; -static int k; - -static unsigned char dx, dy1, dy2; -static unsigned char d2, d3, d4, d5, d6, d7, d8, d9, d0; -static unsigned char dck; - -/* -------------------------------------------------------------------------- */ - -static int set_hardware_offset(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - char offset_x, char offset_y1, char offset_y2) -{ - char data; - int result = INV_SUCCESS; - - data = offset_x & 0x3f; - result = inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_OFFSET_X, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - data = offset_y1 & 0x3f; - result = inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_OFFSET_Y1, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - data = offset_y2 & 0x3f; - result = inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_OFFSET_Y2, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -static int set_measure_command(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - int ldtc, int fors, int dlymes) -{ - int result = INV_SUCCESS; - - result = inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_MEASURE_COMMAND, 0x01); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -static int measure_normal(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - int *busy, unsigned short *t, - unsigned short *x, unsigned short *y1, - unsigned short *y2) -{ - unsigned char data[8]; - unsigned short b, to, xo, y1o, y2o; - int result; - ktime_t sleeptime; - result = set_measure_command(mlsl_handle, slave, pdata, 0, 0, 0); - sleeptime = ktime_set(0, 2 * NSEC_PER_MSEC); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_hrtimeout(&sleeptime, HRTIMER_MODE_REL); - - result = inv_serial_read(mlsl_handle, pdata->address, - YAS530_REGADDR_MEASURE_DATA, 8, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - b = (data[0] >> 7) & 0x01; - to = ((data[0] << 2) & 0x1fc) | ((data[1] >> 6) & 0x03); - xo = ((data[2] << 5) & 0xfe0) | ((data[3] >> 3) & 0x1f); - y1o = ((data[4] << 5) & 0xfe0) | ((data[5] >> 3) & 0x1f); - y2o = ((data[6] << 5) & 0xfe0) | ((data[7] >> 3) & 0x1f); - - *busy = b; - *t = to; - *x = xo; - *y1 = y1o; - *y2 = y2o; - - return result; -} - -static int check_offset(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - char offset_x, char offset_y1, char offset_y2, - int *flag_x, int *flag_y1, int *flag_y2) -{ - int result; - int busy; - short t, x, y1, y2; - - result = set_hardware_offset(mlsl_handle, slave, pdata, - offset_x, offset_y1, offset_y2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = measure_normal(mlsl_handle, slave, pdata, - &busy, &t, &x, &y1, &y2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - *flag_x = 0; - *flag_y1 = 0; - *flag_y2 = 0; - - if (x > 2048) - *flag_x = 1; - if (y1 > 2048) - *flag_y1 = 1; - if (y2 > 2048) - *flag_y2 = 1; - if (x < 2048) - *flag_x = -1; - if (y1 < 2048) - *flag_y1 = -1; - if (y2 < 2048) - *flag_y2 = -1; - - return result; -} - -static int measure_and_set_offset(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - char *offset) -{ - int i; - int result = INV_SUCCESS; - char offset_x = 0, offset_y1 = 0, offset_y2 = 0; - int flag_x = 0, flag_y1 = 0, flag_y2 = 0; - static const int correct[5] = { 16, 8, 4, 2, 1 }; - - for (i = 0; i < 5; i++) { - result = check_offset(mlsl_handle, slave, pdata, - offset_x, offset_y1, offset_y2, - &flag_x, &flag_y1, &flag_y2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (flag_x) - offset_x += flag_x * correct[i]; - if (flag_y1) - offset_y1 += flag_y1 * correct[i]; - if (flag_y2) - offset_y2 += flag_y2 * correct[i]; - } - - result = set_hardware_offset(mlsl_handle, slave, pdata, - offset_x, offset_y1, offset_y2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - offset[0] = offset_x; - offset[1] = offset_y1; - offset[2] = offset_y2; - - return result; -} - -static void coordinate_conversion(short x, short y1, short y2, short t, - int32_t *xo, int32_t *yo, int32_t *zo) -{ - int32_t sx, sy1, sy2, sy, sz; - int32_t hx, hy, hz; - - sx = x - (Cx * t) / 100; - sy1 = y1 - (Cy1 * t) / 100; - sy2 = y2 - (Cy2 * t) / 100; - - sy = sy1 - sy2; - sz = -sy1 - sy2; - - hx = k * ((100 * sx + a2 * sy + a3 * sz) / 10); - hy = k * ((a4 * sx + a5 * sy + a6 * sz) / 10); - hz = k * ((a7 * sx + a8 * sy + a9 * sz) / 10); - - *xo = hx; - *yo = hy; - *zo = hz; -} - -static int yas530_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - return result; -} - -static int yas530_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - unsigned char dummyData = 0x00; - char offset[3] = { 0, 0, 0 }; - unsigned char data[16]; - unsigned char read_reg[1]; - - /* =============================================== */ - - /* Step 1 - Test register initialization */ - dummyData = 0x00; - result = inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_TEST1, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = - inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_TEST2, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Device ID read */ - result = inv_serial_read(mlsl_handle, pdata->address, - YAS530_REGADDR_DEVICE_ID, 1, read_reg); - - /*Step 2 Read the CAL register */ - /* CAL data read */ - result = inv_serial_read(mlsl_handle, pdata->address, - YAS530_REGADDR_CAL, 16, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* CAL data Second Read */ - result = inv_serial_read(mlsl_handle, pdata->address, - YAS530_REGADDR_CAL, 16, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /*Cal data */ - dx = data[0]; - dy1 = data[1]; - dy2 = data[2]; - d2 = (data[3] >> 2) & 0x03f; - d3 = ((data[3] << 2) & 0x0c) | ((data[4] >> 6) & 0x03); - d4 = data[4] & 0x3f; - d5 = (data[5] >> 2) & 0x3f; - d6 = ((data[5] << 4) & 0x30) | ((data[6] >> 4) & 0x0f); - d7 = ((data[6] << 3) & 0x78) | ((data[7] >> 5) & 0x07); - d8 = ((data[7] << 1) & 0x3e) | ((data[8] >> 7) & 0x01); - d9 = ((data[8] << 1) & 0xfe) | ((data[9] >> 7) & 0x01); - d0 = (data[9] >> 2) & 0x1f; - dck = ((data[9] << 1) & 0x06) | ((data[10] >> 7) & 0x01); - - /*Correction Data */ - Cx = (int)dx * 6 - 768; - Cy1 = (int)dy1 * 6 - 768; - Cy2 = (int)dy2 * 6 - 768; - a2 = (int)d2 - 32; - a3 = (int)d3 - 8; - a4 = (int)d4 - 32; - a5 = (int)d5 + 38; - a6 = (int)d6 - 32; - a7 = (int)d7 - 64; - a8 = (int)d8 - 32; - a9 = (int)d9; - k = (int)d0 + 10; - - /*Obtain the [49:47] bits */ - dck &= 0x07; - - /*Step 3 : Storing the CONFIG with the CLK value */ - dummyData = 0x00 | (dck << 2); - result = inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_CONFIG, dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /*Step 4 : Set Acquisition Interval Register */ - dummyData = 0x00; - result = inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_MEASURE_INTERVAL, - dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /*Step 5 : Reset Coil */ - dummyData = 0x00; - result = inv_serial_single_write(mlsl_handle, pdata->address, - YAS530_REGADDR_ACTUATE_INIT_COIL, - dummyData); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Offset Measurement and Set */ - result = measure_and_set_offset(mlsl_handle, slave, pdata, offset); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - return result; -} - -static int yas530_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = INV_SUCCESS; - - int busy; - short t, x, y1, y2; - int32_t xyz[3]; - short rawfixed[3]; - - result = measure_normal(mlsl_handle, slave, pdata, - &busy, &t, &x, &y1, &y2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - coordinate_conversion(x, y1, y2, t, &xyz[0], &xyz[1], &xyz[2]); - - rawfixed[0] = (short)(xyz[0] / 100); - rawfixed[1] = (short)(xyz[1] / 100); - rawfixed[2] = (short)(xyz[2] / 100); - - data[0] = rawfixed[0] >> 8; - data[1] = rawfixed[0] & 0xFF; - data[2] = rawfixed[1] >> 8; - data[3] = rawfixed[1] & 0xFF; - data[4] = rawfixed[2] >> 8; - data[5] = rawfixed[2] & 0xFF; - - if (busy) - return INV_ERROR_COMPASS_DATA_NOT_READY; - return result; -} - -static int yas530_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - int result = INV_SUCCESS; - //struct yas530_private_data *private_data = pdata->private_data; - - switch (data->key) - { - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - } - return result; -} - -static struct ext_slave_descr yas530_descr = { - .init = NULL, - .exit = NULL, - .suspend = yas530_suspend, - .resume = yas530_resume, - .read = yas530_read, - .config = NULL, - .get_config = yas530_get_config, - .name = "yas530", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = COMPASS_ID_YAS530, - .read_reg = 0x06, - .read_len = 6, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {3276, 8001}, - .trigger = NULL, -}; - -static -struct ext_slave_descr *yas530_get_slave_descr(void) -{ - return &yas530_descr; -} - -/* -------------------------------------------------------------------------- */ -struct yas530_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int yas530_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct yas530_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - yas530_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int yas530_mod_remove(struct i2c_client *client) -{ - struct yas530_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - yas530_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id yas530_mod_id[] = { - { "yas530", COMPASS_ID_YAS530 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, yas530_mod_id); - -static struct i2c_driver yas530_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = yas530_mod_probe, - .remove = yas530_mod_remove, - .id_table = yas530_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "yas530_mod", - }, - .address_list = normal_i2c, -}; - -static int __init yas530_mod_init(void) -{ - int res = i2c_add_driver(&yas530_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "yas530_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit yas530_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&yas530_mod_driver); -} - -module_init(yas530_mod_init); -module_exit(yas530_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate YAS530 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("yas530_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/yas530_ext.c b/drivers/misc/inv_mpu/compass/yas530_ext.c deleted file mode 100644 index 7a64258..0000000 --- a/drivers/misc/inv_mpu/compass/yas530_ext.c +++ /dev/null @@ -1,288 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include -#include "mpu-dev.h" - -#include "log.h" -#include -#include "mlsl.h" -#include "mldl_cfg.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -struct yas530_ext_private_data { - int flags; - char offsets[3]; - const int *correction_matrix; -}; - - -extern int geomagnetic_api_read(int *xyz, int *raw, int *xy1y2, int *accuracy); -extern int geomagnetic_api_resume(void); -extern int geomagnetic_api_suspend(void); - - -static int yas530_ext_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - geomagnetic_api_suspend(); - - return result; -} - - -static int yas530_ext_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - - struct yas530_ext_private_data *private_data = pdata->private_data; - - geomagnetic_api_resume(); - - return result; -} - -static int yas530_ext_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = INV_SUCCESS; - int raw[3] = {0,}; - int xyz[3] = {0,}; - int accuracy = 0; - int i = 0; - short xyz_scaled[3] = {0,}; - - geomagnetic_api_read(xyz, raw, NULL, &accuracy); - - xyz_scaled[0] = (short)(xyz[0]/100); - xyz_scaled[1] = (short)(xyz[1]/100); - xyz_scaled[2] = (short)(xyz[2]/100); - - data[0] = xyz_scaled[0] >> 8; - data[1] = xyz_scaled[0] & 0xFF; - data[2] = xyz_scaled[1] >> 8; - data[3] = xyz_scaled[1] & 0xFF; - data[4] = xyz_scaled[2] >> 8; - data[5] = xyz_scaled[2] & 0xFF; - data[6] = (unsigned char)accuracy; - - - return result; - -} - -static int yas530_ext_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - int result = INV_SUCCESS; - struct yas530_private_data *private_data = pdata->private_data; - - - return result; - -} - - -static int yas530_ext_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - int result = INV_SUCCESS; - struct yas530_ext_private_data *private_data = pdata->private_data; - - switch (data->key) - { - default: - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - } - return result; -} - -static int yas530_ext_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - - struct yas530_ext_private_data *private_data; - int result = INV_SUCCESS; - char offset[3] = {0, 0, 0}; - - private_data = (struct yas530_ext_private_data *) - kzalloc(sizeof(struct yas530_ext_private_data), GFP_KERNEL); - - if (!private_data) - return INV_ERROR_MEMORY_EXAUSTED; - - private_data->correction_matrix = pdata->private_data; - - pdata->private_data = private_data; - - return result; -} - -static int yas530_ext_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - kfree(pdata->private_data); - return INV_SUCCESS; -} - -static struct ext_slave_descr yas530_ext_descr = { - .init = yas530_ext_init, - .exit = yas530_ext_exit, - .suspend = yas530_ext_suspend, - .resume = yas530_ext_resume, - .read = yas530_ext_read, - .config = yas530_ext_config, - .get_config = yas530_ext_get_config, - .name = "yas530ext", - .type = EXT_SLAVE_TYPE_COMPASS, - .id = COMPASS_ID_YAS530_EXT, - .read_reg = 0x06, - .read_len = 7, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {3276, 8001}, - .trigger = NULL, -}; - - -struct ext_slave_descr *yas530_ext_get_slave_descr(void) -{ - return &yas530_ext_descr; -} - -/* -------------------------------------------------------------------------- */ -struct yas530_ext_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int yas530_ext_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct yas530_ext_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - yas530_ext_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int yas530_ext_mod_remove(struct i2c_client *client) -{ - struct yas530_ext_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - yas530_ext_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id yas530_ext_mod_id[] = { - { "yas530ext", COMPASS_ID_YAS530_EXT}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, yas530_ext_mod_id); - -static struct i2c_driver yas530_ext_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = yas530_ext_mod_probe, - .remove = yas530_ext_mod_remove, - .id_table = yas530_ext_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "yas530_ext_mod", - }, - .address_list = normal_i2c, -}; - -static int __init yas530_ext_mod_init(void) -{ - int res = i2c_add_driver(&yas530_ext_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "yas530_ext_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit yas530_ext_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&yas530_ext_mod_driver); -} - -module_init(yas530_ext_mod_init); -module_exit(yas530_ext_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate YAS530 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("yas530_ext_mod"); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/compass/yas530_ext.h b/drivers/misc/inv_mpu/compass/yas530_ext.h deleted file mode 100644 index 0c343ec..0000000 --- a/drivers/misc/inv_mpu/compass/yas530_ext.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - - -#ifndef __YAS530_EXT_H__ -#define __YAS530_EXT_H__ - -#include - -struct ext_slave_descr *yas530_ext_get_slave_descr(void); - -#endif diff --git a/drivers/misc/inv_mpu/log.h b/drivers/misc/inv_mpu/log.h deleted file mode 100644 index 5630602e..0000000 --- a/drivers/misc/inv_mpu/log.h +++ /dev/null @@ -1,287 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/* - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright (C) 2005 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * C/C++ logging functions. See the logging documentation for API details. - * - * We'd like these to be available from C code (in case we import some from - * somewhere), so this has a C interface. - * - * The output will be correct when the log file is shared between multiple - * threads and/or multiple processes so long as the operating system - * supports O_APPEND. These calls have mutex-protected data structures - * and so are NOT reentrant. Do not use MPL_LOG in a signal handler. - */ -#ifndef _LIBS_CUTILS_MPL_LOG_H -#define _LIBS_CUTILS_MPL_LOG_H - -#include "mltypes.h" -#include - - -#include - - -/* --------------------------------------------------------------------- */ - -/* - * Normally we strip MPL_LOGV (VERBOSE messages) from release builds. - * You can modify this (for example with "#define MPL_LOG_NDEBUG 0" - * at the top of your source file) to change that behavior. - */ -#ifndef MPL_LOG_NDEBUG -#ifdef NDEBUG -#define MPL_LOG_NDEBUG 1 -#else -#define MPL_LOG_NDEBUG 0 -#endif -#endif - -#define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE -#define MPL_LOG_DEFAULT KERN_DEFAULT -#define MPL_LOG_VERBOSE KERN_CONT -#define MPL_LOG_DEBUG KERN_NOTICE -#define MPL_LOG_INFO KERN_INFO -#define MPL_LOG_WARN KERN_WARNING -#define MPL_LOG_ERROR KERN_ERR -#define MPL_LOG_SILENT MPL_LOG_VERBOSE - - - -/* - * This is the local tag used for the following simplified - * logging macros. You can change this preprocessor definition - * before using the other macros to change the tag. - */ -#ifndef MPL_LOG_TAG -#define MPL_LOG_TAG -#endif - -/* --------------------------------------------------------------------- */ - -/* - * Simplified macro to send a verbose log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGV -#if MPL_LOG_NDEBUG -#define MPL_LOGV(fmt, ...) \ - do { \ - if (0) \ - MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\ - } while (0) -#else -#define MPL_LOGV(fmt, ...) MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) -#endif -#endif - -#ifndef CONDITION -#define CONDITION(cond) ((cond) != 0) -#endif - -#ifndef MPL_LOGV_IF -#if MPL_LOG_NDEBUG -#define MPL_LOGV_IF(cond, fmt, ...) \ - do { if (0) MPL_LOG(fmt, ##__VA_ARGS__); } while (0) -#else -#define MPL_LOGV_IF(cond, fmt, ...) \ - ((CONDITION(cond)) \ - ? MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ - : (void)0) -#endif -#endif - -/* - * Simplified macro to send a debug log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGD -#define MPL_LOGD(fmt, ...) MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__) -#endif - -#ifndef MPL_LOGD_IF -#define MPL_LOGD_IF(cond, fmt, ...) \ - ((CONDITION(cond)) \ - ? MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ - : (void)0) -#endif - -/* - * Simplified macro to send an info log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGI -#define MPL_LOGI(fmt, ...) pr_info(KERN_INFO MPL_LOG_TAG fmt, ##__VA_ARGS__) -#endif - -#ifndef MPL_LOGI_IF -#define MPL_LOGI_IF(cond, fmt, ...) \ - ((CONDITION(cond)) \ - ? MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ - : (void)0) -#endif - -/* - * Simplified macro to send a warning log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGW -#define MPL_LOGW(fmt, ...) printk(KERN_WARNING MPL_LOG_TAG fmt, ##__VA_ARGS__) -#endif - -#ifndef MPL_LOGW_IF -#define MPL_LOGW_IF(cond, fmt, ...) \ - ((CONDITION(cond)) \ - ? MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ - : (void)0) -#endif - -/* - * Simplified macro to send an error log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGE -#define MPL_LOGE(fmt, ...) printk(KERN_ERR MPL_LOG_TAG fmt, ##__VA_ARGS__) -#endif - -#ifndef MPL_LOGE_IF -#define MPL_LOGE_IF(cond, fmt, ...) \ - ((CONDITION(cond)) \ - ? MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ - : (void)0) -#endif - -/* --------------------------------------------------------------------- */ - -/* - * Log a fatal error. If the given condition fails, this stops program - * execution like a normal assertion, but also generating the given message. - * It is NOT stripped from release builds. Note that the condition test - * is -inverted- from the normal assert() semantics. - */ -#define MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ...) \ - ((CONDITION(cond)) \ - ? ((void)android_printAssert(#cond, MPL_LOG_TAG, \ - fmt, ##__VA_ARGS__)) \ - : (void)0) - -#define MPL_LOG_ALWAYS_FATAL(fmt, ...) \ - (((void)android_printAssert(NULL, MPL_LOG_TAG, fmt, ##__VA_ARGS__))) - -/* - * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that - * are stripped out of release builds. - */ -#if MPL_LOG_NDEBUG -#define MPL_LOG_FATAL_IF(cond, fmt, ...) \ - do { \ - if (0) \ - MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__); \ - } while (0) -#define MPL_LOG_FATAL(fmt, ...) \ - do { \ - if (0) \ - MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__) \ - } while (0) -#else -#define MPL_LOG_FATAL_IF(cond, fmt, ...) \ - MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__) -#define MPL_LOG_FATAL(fmt, ...) \ - MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__) -#endif - -/* - * Assertion that generates a log message when the assertion fails. - * Stripped out of release builds. Uses the current MPL_LOG_TAG. - */ -#define MPL_LOG_ASSERT(cond, fmt, ...) \ - MPL_LOG_FATAL_IF(!(cond), fmt, ##__VA_ARGS__) - -/* --------------------------------------------------------------------- */ - -/* - * Basic log message macro. - * - * Example: - * MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno); - * - * The second argument may be NULL or "" to indicate the "global" tag. - */ -#ifndef MPL_LOG -#define MPL_LOG(priority, tag, fmt, ...) \ - MPL_LOG_PRI(priority, tag, fmt, ##__VA_ARGS__) -#endif - -/* - * Log macro that allows you to specify a number for the priority. - */ -#ifndef MPL_LOG_PRI -#define MPL_LOG_PRI(priority, tag, fmt, ...) \ - pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__) -#endif - -/* - * Log macro that allows you to pass in a varargs ("args" is a va_list). - */ -#ifndef MPL_LOG_PRI_VA -/* not allowed in the Kernel because there is no dev_dbg that takes a va_list */ -#endif - -/* --------------------------------------------------------------------- */ - -/* - * =========================================================================== - * - * The stuff in the rest of this file should not be used directly. - */ - -int _MLPrintLog(int priority, const char *tag, const char *fmt, ...); -int _MLPrintVaLog(int priority, const char *tag, const char *fmt, va_list args); -/* Final implementation of actual writing to a character device */ -int _MLWriteLog(const char *buf, int buflen); - -static inline void __print_result_location(int result, - const char *file, - const char *func, int line) -{ - MPL_LOGE("%s|%s|%d returning %d\n", file, func, line, result); -} - -#define LOG_RESULT_LOCATION(condition) \ - do { \ - __print_result_location((int)(condition), __FILE__, \ - __func__, __LINE__); \ - } while (0) - - -#endif /* _LIBS_CUTILS_MPL_LOG_H */ diff --git a/drivers/misc/inv_mpu/mldl_cfg.c b/drivers/misc/inv_mpu/mldl_cfg.c deleted file mode 100644 index e2d9900..0000000 --- a/drivers/misc/inv_mpu/mldl_cfg.c +++ /dev/null @@ -1,1913 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup MLDL - * - * @{ - * @file mldl_cfg.c - * @brief The Motion Library Driver Layer. - */ - -/* -------------------------------------------------------------------------- */ -#include -#include - -#include - -#include "mldl_cfg.h" -#include -#include "mpu6050b1.h" - -#include "mlsl.h" -#include "mldl_print_cfg.h" -#include "log.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "mldl_cfg:" - -/* -------------------------------------------------------------------------- */ - -#define SLEEP 0 -#define WAKE_UP 7 -#define RESET 1 -#define STANDBY 1 - -/* -------------------------------------------------------------------------- */ - -/** - * @brief Stop the DMP running - * - * @return INV_SUCCESS or non-zero error code - */ -static int dmp_stop(struct mldl_cfg *mldl_cfg, void *gyro_handle) -{ - unsigned char user_ctrl_reg; - int result; - - if (mldl_cfg->inv_mpu_state->status & MPU_DMP_IS_SUSPENDED) - return INV_SUCCESS; - - result = inv_serial_read(gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, 1, &user_ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - user_ctrl_reg = (user_ctrl_reg & (~BIT_FIFO_EN)) | BIT_FIFO_RST; - user_ctrl_reg = (user_ctrl_reg & (~BIT_DMP_EN)) | BIT_DMP_RST; - - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, user_ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - mldl_cfg->inv_mpu_state->status |= MPU_DMP_IS_SUSPENDED; - - return result; -} - -/** - * @brief Starts the DMP running - * - * @return INV_SUCCESS or non-zero error code - */ -static int dmp_start(struct mldl_cfg *mldl_cfg, void *mlsl_handle) -{ - unsigned char user_ctrl_reg; - int result; - - if ((!(mldl_cfg->inv_mpu_state->status & MPU_DMP_IS_SUSPENDED) && - mldl_cfg->mpu_gyro_cfg->dmp_enable) - || - ((mldl_cfg->inv_mpu_state->status & MPU_DMP_IS_SUSPENDED) && - !mldl_cfg->mpu_gyro_cfg->dmp_enable)) - return INV_SUCCESS; - - result = inv_serial_read(mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, 1, &user_ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, - ((user_ctrl_reg & (~BIT_FIFO_EN)) - | BIT_FIFO_RST)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, user_ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_read(mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, 1, &user_ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - user_ctrl_reg |= BIT_DMP_EN; - - if (mldl_cfg->mpu_gyro_cfg->fifo_enable) - user_ctrl_reg |= BIT_FIFO_EN; - else - user_ctrl_reg &= ~BIT_FIFO_EN; - - user_ctrl_reg |= BIT_DMP_RST; - - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, user_ctrl_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - mldl_cfg->inv_mpu_state->status &= ~MPU_DMP_IS_SUSPENDED; - - return result; -} - -/** - * @brief enables/disables the I2C bypass to an external device - * connected to MPU's secondary I2C bus. - * @param enable - * Non-zero to enable pass through. - * @return INV_SUCCESS if successful, a non-zero error code otherwise. - */ -static int mpu6050b1_set_i2c_bypass(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, unsigned char enable) -{ - unsigned char reg; - int result; - unsigned char status = mldl_cfg->inv_mpu_state->status; - if ((status & MPU_GYRO_IS_BYPASSED && enable) || - (!(status & MPU_GYRO_IS_BYPASSED) && !enable)) - return INV_SUCCESS; - - /*---- get current 'USER_CTRL' into b ----*/ - result = inv_serial_read(mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (!enable) { - /* setting int_config with the property flag BIT_BYPASS_EN - should be done by the setup functions */ - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_INT_PIN_CFG, - (mldl_cfg->pdata->int_config & ~(BIT_BYPASS_EN))); - if (!(reg & BIT_I2C_MST_EN)) { - result = - inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, - (reg | BIT_I2C_MST_EN)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - } else if (enable) { - if (reg & BIT_AUX_IF_EN) { - result = - inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_USER_CTRL, - (reg & (~BIT_I2C_MST_EN))); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /***************************************** - * To avoid hanging the bus we must sleep until all - * slave transactions have been completed. - * 24 bytes max slave reads - * +1 byte possible extra write - * +4 max slave address - * --- - * 33 Maximum bytes - * x9 Approximate bits per byte - * --- - * 297 bits. - * 2.97 ms minimum @ 100kbps - * 0.75 ms minimum @ 400kbps. - *****************************************/ - msleep(20); - } - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_INT_PIN_CFG, - (mldl_cfg->pdata->int_config | BIT_BYPASS_EN)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - if (enable) - mldl_cfg->inv_mpu_state->status |= MPU_GYRO_IS_BYPASSED; - else - mldl_cfg->inv_mpu_state->status &= ~MPU_GYRO_IS_BYPASSED; - - return result; -} - - - - -/** - * @brief enables/disables the I2C bypass to an external device - * connected to MPU's secondary I2C bus. - * @param enable - * Non-zero to enable pass through. - * @return INV_SUCCESS if successful, a non-zero error code otherwise. - */ -static int mpu_set_i2c_bypass(struct mldl_cfg *mldl_cfg, void *mlsl_handle, - unsigned char enable) -{ - return mpu6050b1_set_i2c_bypass(mldl_cfg, mlsl_handle, enable); -} - - -#define NUM_OF_PROD_REVS (ARRAY_SIZE(prod_rev_map)) - -/* NOTE : when not indicated, product revision - is considered an 'npp'; non production part */ - -/* produces an unique identifier for each device based on the - combination of product version and product revision */ -struct prod_rev_map_t { - unsigned short mpl_product_key; - unsigned char silicon_rev; - unsigned short gyro_trim; - unsigned short accel_trim; -}; - -/* NOTE: product entries are in chronological order */ -static struct prod_rev_map_t prod_rev_map[] = { - /* prod_ver = 0 */ - {MPL_PROD_KEY(0, 1), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 2), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 3), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 4), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 5), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 6), MPU_SILICON_REV_A2, 131, 16384}, /* (A2/C2-1) */ - /* prod_ver = 1, forced to 0 for MPU6050 A2 */ - {MPL_PROD_KEY(0, 7), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 8), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 9), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 10), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 11), MPU_SILICON_REV_A2, 131, 16384}, /* (A2/D2-1) */ - {MPL_PROD_KEY(0, 12), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 13), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 14), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 15), MPU_SILICON_REV_A2, 131, 16384}, - {MPL_PROD_KEY(0, 27), MPU_SILICON_REV_A2, 131, 16384}, /* (A2/D4) */ - /* prod_ver = 1 */ - {MPL_PROD_KEY(1, 16), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/D2-1) */ - {MPL_PROD_KEY(1, 17), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/D2-2) */ - {MPL_PROD_KEY(1, 18), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/D2-3) */ - {MPL_PROD_KEY(1, 19), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/D2-4) */ - {MPL_PROD_KEY(1, 20), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/D2-5) */ - {MPL_PROD_KEY(1, 28), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/D4) */ - {MPL_PROD_KEY(1, 1), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/E1-1) */ - {MPL_PROD_KEY(1, 2), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/E1-2) */ - {MPL_PROD_KEY(1, 3), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/E1-3) */ - {MPL_PROD_KEY(1, 4), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/E1-4) */ - {MPL_PROD_KEY(1, 5), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/E1-5) */ - {MPL_PROD_KEY(1, 6), MPU_SILICON_REV_B1, 131, 16384}, /* (B1/E1-6) */ - /* prod_ver = 2 */ - {MPL_PROD_KEY(2, 7), MPU_SILICON_REV_B1, 131, 16384}, /* (B2/E1-1) */ - {MPL_PROD_KEY(2, 8), MPU_SILICON_REV_B1, 131, 16384}, /* (B2/E1-2) */ - {MPL_PROD_KEY(2, 9), MPU_SILICON_REV_B1, 131, 16384}, /* (B2/E1-3) */ - {MPL_PROD_KEY(2, 10), MPU_SILICON_REV_B1, 131, 16384}, /* (B2/E1-4) */ - {MPL_PROD_KEY(2, 11), MPU_SILICON_REV_B1, 131, 16384}, /* (B2/E1-5) */ - {MPL_PROD_KEY(2, 12), MPU_SILICON_REV_B1, 131, 16384}, /* (B2/E1-6) */ - {MPL_PROD_KEY(2, 29), MPU_SILICON_REV_B1, 131, 16384}, /* (B2/D4) */ - /* prod_ver = 3 */ - {MPL_PROD_KEY(3, 30), MPU_SILICON_REV_B1, 131, 16384}, /* (B2/E2) */ - /* prod_ver = 4 */ - {MPL_PROD_KEY(4, 31), MPU_SILICON_REV_B1, 131, 8192}, /* (B2/F1) */ - {MPL_PROD_KEY(4, 1), MPU_SILICON_REV_B1, 131, 8192}, /* (B3/F1) */ - {MPL_PROD_KEY(4, 3), MPU_SILICON_REV_B1, 131, 8192}, /* (B4/F1) */ - /* prod_ver = 5 */ - {MPL_PROD_KEY(6, 19), MPU_SILICON_REV_B1, 131, 16384}, /* (B5/E2) */ - /* prod_ver = 7 */ - {MPL_PROD_KEY(7, 19), MPU_SILICON_REV_B1, 131, 16384}, /* (B5/E2) */ - /* prod_ver = 8 */ - {MPL_PROD_KEY(8, 19), MPU_SILICON_REV_B1, 131, 16384}, /* (B5/E2) */ - {MPL_PROD_KEY(40, 19), MPU_SILICON_REV_B1, 131, 16384} /* (B5/E2) */ -}; - -/** - * @internal - * @brief Inverse lookup of the index of an MPL product key . - * @param key - * the MPL product indentifier also referred to as 'key'. - * @return the index position of the key in the array, -1 if not found. - */ -short index_of_key(unsigned short key) -{ - int i; - pr_info("%s", __func__); - for (i = 0; i < NUM_OF_PROD_REVS; i++) - if (prod_rev_map[i].mpl_product_key == key) - return (short)i; - return -1; -} - -/** - * @internal - * @brief Get the product revision and version for MPU6050 and - * extract all per-part specific information. - * The product version number is read from the PRODUCT_ID register in - * user space register map. - * The product revision number is in read from OTP bank 0, ADDR6[7:2]. - * These 2 numbers, combined, provide an unique key to be used to - * retrieve some per-device information such as the silicon revision - * and the gyro and accel sensitivity trim values. - * - * @param mldl_cfg - * a pointer to the mldl config data structure. - * @param mlsl_handle - * an file handle to the serial communication device the - * device is connected to. - * - * @return 0 on success, a non-zero error code otherwise. - */ -static int inv_get_silicon_rev_mpu6050( - struct mldl_cfg *mldl_cfg, void *mlsl_handle) -{ - int result; - unsigned char prod_ver = 0x00, prod_rev = 0x00; - unsigned char bank = - (BIT_PRFTCH_EN | BIT_CFG_USER_BANK | MPU_MEM_OTP_BANK_0); - unsigned short memAddr = ((bank << 8) | 0x06); - unsigned short key; - short index; - struct mpu_chip_info *mpu_chip_info = mldl_cfg->mpu_chip_info; - - result = inv_serial_read(mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_PRODUCT_ID, 1, &prod_ver); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_serial_read_mem(mlsl_handle, mldl_cfg->mpu_chip_info->addr, - memAddr, 1, &prod_rev); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - prod_rev >>= 2; - - /* clean the prefetch and cfg user bank bits */ - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_BANK_SEL, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - key = MPL_PROD_KEY(prod_ver, prod_rev); - if (key == 0) { - MPL_LOGE("Product id read as 0 " - "indicates device is either " - "incompatible or an MPU3050\n"); - return INV_ERROR_INVALID_MODULE; - } - pr_info("%s key=%d", __func__, key); - index = index_of_key(key); - if (index == -1 || index >= NUM_OF_PROD_REVS) { - MPL_LOGE("Unsupported product key %d in MPL\n", key); - return INV_ERROR_INVALID_MODULE; - } - /* check MPL is compiled for this device */ - if (prod_rev_map[index].silicon_rev != MPU_SILICON_REV_B1) { - MPL_LOGE("MPL compiled for MPU6050B1 support " - "but device is not MPU6050B1 (%d)\n", key); - return INV_ERROR_INVALID_MODULE; - } - - mpu_chip_info->product_id = prod_ver; - mpu_chip_info->product_revision = prod_rev; - mpu_chip_info->silicon_revision = prod_rev_map[index].silicon_rev; - mpu_chip_info->gyro_sens_trim = prod_rev_map[index].gyro_trim; - mpu_chip_info->accel_sens_trim = prod_rev_map[index].accel_trim; - - return result; -} -#define inv_get_silicon_rev inv_get_silicon_rev_mpu6050 - - -/** - * @brief Enable / Disable the use MPU's secondary I2C interface level - * shifters. - * When enabled the secondary I2C interface to which the external - * device is connected runs at VDD voltage (main supply). - * When disabled the 2nd interface runs at VDDIO voltage. - * See the device specification for more details. - * - * @note using this API may produce unpredictable results, depending on how - * the MPU and slave device are setup on the target platform. - * Use of this API should entirely be restricted to system - * integrators. Once the correct value is found, there should be no - * need to change the level shifter at runtime. - * - * @pre Must be called after inv_serial_start(). - * @note Typically called before inv_dmp_open(). - * - * @param[in] enable: - * 0 to run at VDDIO (default), - * 1 to run at VDD. - * - * @return INV_SUCCESS if successfull, a non-zero error code otherwise. - */ -static int inv_mpu_set_level_shifter_bit(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, unsigned char enable) -{ - int result; - unsigned char regval; - - result = inv_serial_read(mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_YG_OFFS_TC, 1, ®val); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if (enable) - regval |= BIT_I2C_MST_VDDIO; - - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_YG_OFFS_TC, regval); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - return INV_SUCCESS; -} - - -/** - * @internal - * @brief MPU6050 B1 power management functions. - * @param mldl_cfg - * a pointer to the internal mldl_cfg data structure. - * @param mlsl_handle - * a file handle to the serial device used to communicate - * with the MPU6050 B1 device. - * @param reset - * 1 to reset hardware. - * @param sensors - * Bitfield of sensors to leave on - * - * @return 0 on success, a non-zero error code on error. - */ -static int mpu60xx_pwr_mgmt(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - unsigned int reset, unsigned long sensors) -{ - unsigned char pwr_mgmt[2]; - unsigned char pwr_mgmt_prev[2]; - int result; - int sleep = !(sensors & (INV_THREE_AXIS_GYRO | INV_THREE_AXIS_ACCEL - | INV_DMP_PROCESSOR)); - - if (reset) { - MPL_LOGI("Reset MPU6050 B1\n"); - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_PWR_MGMT_1, BIT_H_RESET); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - mldl_cfg->inv_mpu_state->status &= ~MPU_GYRO_IS_BYPASSED; - msleep(20); - } - - /* NOTE : reading both PWR_MGMT_1 and PWR_MGMT_2 for efficiency because - they are accessible even when the device is powered off */ - result = inv_serial_read(mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_PWR_MGMT_1, 2, pwr_mgmt_prev); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - pwr_mgmt[0] = pwr_mgmt_prev[0]; - pwr_mgmt[1] = pwr_mgmt_prev[1]; - - if (sleep) { - mldl_cfg->inv_mpu_state->status |= MPU_DEVICE_IS_SUSPENDED; - pwr_mgmt[0] |= BIT_SLEEP; - } else { - mldl_cfg->inv_mpu_state->status &= ~MPU_DEVICE_IS_SUSPENDED; - pwr_mgmt[0] &= ~BIT_SLEEP; - } - if (pwr_mgmt[0] != pwr_mgmt_prev[0]) { - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_PWR_MGMT_1, pwr_mgmt[0]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - pwr_mgmt[1] &= ~(BIT_STBY_XG | BIT_STBY_YG | BIT_STBY_ZG); - if (!(sensors & INV_X_GYRO)) - pwr_mgmt[1] |= BIT_STBY_XG; - if (!(sensors & INV_Y_GYRO)) - pwr_mgmt[1] |= BIT_STBY_YG; - if (!(sensors & INV_Z_GYRO)) - pwr_mgmt[1] |= BIT_STBY_ZG; - - if (pwr_mgmt[1] != pwr_mgmt_prev[1]) { - result = inv_serial_single_write( - mlsl_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_PWR_MGMT_2, pwr_mgmt[1]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - if ((pwr_mgmt[1] & (BIT_STBY_XG | BIT_STBY_YG | BIT_STBY_ZG)) == - (BIT_STBY_XG | BIT_STBY_YG | BIT_STBY_ZG)) { - mldl_cfg->inv_mpu_state->status |= MPU_GYRO_IS_SUSPENDED; - } else { - mldl_cfg->inv_mpu_state->status &= ~MPU_GYRO_IS_SUSPENDED; - } - - return INV_SUCCESS; -} - - -/** - * @brief sets the clock source for the gyros. - * @param mldl_cfg - * a pointer to the struct mldl_cfg data structure. - * @param gyro_handle - * an handle to the serial device the gyro is assigned to. - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -static int mpu_set_clock_source(void *gyro_handle, struct mldl_cfg *mldl_cfg) -{ - int result; - unsigned char cur_clk_src; - unsigned char reg; - - /* clock source selection */ - result = inv_serial_read(gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_PWR_MGM, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - cur_clk_src = reg & BITS_CLKSEL; - reg &= ~BITS_CLKSEL; - - - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_PWR_MGM, mldl_cfg->mpu_gyro_cfg->clk_src | reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* ERRATA: - workaroud to switch from any MPU_CLK_SEL_PLLGYROx to - MPU_CLK_SEL_INTERNAL and XGyro is powered up: - 1) Select INT_OSC - 2) PD XGyro - 3) PU XGyro - */ - if ((cur_clk_src == MPU_CLK_SEL_PLLGYROX - || cur_clk_src == MPU_CLK_SEL_PLLGYROY - || cur_clk_src == MPU_CLK_SEL_PLLGYROZ) - && mldl_cfg->mpu_gyro_cfg->clk_src == MPU_CLK_SEL_INTERNAL - && mldl_cfg->inv_mpu_cfg->requested_sensors & INV_X_GYRO) { - unsigned char first_result = INV_SUCCESS; - mldl_cfg->inv_mpu_cfg->requested_sensors &= ~INV_X_GYRO; - result = mpu60xx_pwr_mgmt( - mldl_cfg, gyro_handle, - false, mldl_cfg->inv_mpu_cfg->requested_sensors); - ERROR_CHECK_FIRST(first_result, result); - mldl_cfg->inv_mpu_cfg->requested_sensors |= INV_X_GYRO; - result = mpu60xx_pwr_mgmt( - mldl_cfg, gyro_handle, - false, mldl_cfg->inv_mpu_cfg->requested_sensors); - ERROR_CHECK_FIRST(first_result, result); - result = first_result; - } - return result; -} - -/** - * Configures the MPU I2C Master - * - * @mldl_cfg Handle to the configuration data - * @gyro_handle handle to the gyro communictation interface - * @slave Can be Null if turning off the slave - * @slave_pdata Can be null if turning off the slave - * @slave_id enum ext_slave_type to determine which index to use - * - * - * This fucntion configures the slaves by: - * 1) Setting up the read - * a) Read Register - * b) Read Length - * 2) Set up the data trigger (MPU6050 only) - * a) Set trigger write register - * b) Set Trigger write value - * 3) Set up the divider (MPU6050 only) - * 4) Set the slave bypass mode depending on slave - * - * returns INV_SUCCESS or non-zero error code - */ - -static int mpu_set_slave_mpu60xx(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *slave_pdata, - int slave_id) -{ - int result; - unsigned char reg; - /* Slave values */ - unsigned char slave_reg; - unsigned char slave_len; - unsigned char slave_endian; - unsigned char slave_address; - /* Which MPU6050 registers to use */ - unsigned char addr_reg; - unsigned char reg_reg; - unsigned char ctrl_reg; - /* Which MPU6050 registers to use for the trigger */ - unsigned char addr_trig_reg; - unsigned char reg_trig_reg; - unsigned char ctrl_trig_reg; - - unsigned char bits_slave_delay = 0; - /* Divide down rate for the Slave, from the mpu rate */ - unsigned char d0_trig_reg; - unsigned char delay_ctrl_orig; - unsigned char delay_ctrl; - long divider; - - if (NULL == slave || NULL == slave_pdata) { - slave_reg = 0; - slave_len = 0; - slave_endian = 0; - slave_address = 0; - } else { - slave_reg = slave->read_reg; - slave_len = slave->read_len; - slave_endian = slave->endian; - slave_address = slave_pdata->address; - slave_address |= BIT_I2C_READ; - } - - switch (slave_id) { - case EXT_SLAVE_TYPE_ACCEL: - addr_reg = MPUREG_I2C_SLV1_ADDR; - reg_reg = MPUREG_I2C_SLV1_REG; - ctrl_reg = MPUREG_I2C_SLV1_CTRL; - addr_trig_reg = 0; - reg_trig_reg = 0; - ctrl_trig_reg = 0; - bits_slave_delay = BIT_SLV1_DLY_EN; - break; - case EXT_SLAVE_TYPE_COMPASS: - addr_reg = MPUREG_I2C_SLV0_ADDR; - reg_reg = MPUREG_I2C_SLV0_REG; - ctrl_reg = MPUREG_I2C_SLV0_CTRL; - addr_trig_reg = MPUREG_I2C_SLV2_ADDR; - reg_trig_reg = MPUREG_I2C_SLV2_REG; - ctrl_trig_reg = MPUREG_I2C_SLV2_CTRL; - d0_trig_reg = MPUREG_I2C_SLV2_DO; - bits_slave_delay = BIT_SLV2_DLY_EN | BIT_SLV0_DLY_EN; - break; - case EXT_SLAVE_TYPE_PRESSURE: - addr_reg = MPUREG_I2C_SLV3_ADDR; - reg_reg = MPUREG_I2C_SLV3_REG; - ctrl_reg = MPUREG_I2C_SLV3_CTRL; - addr_trig_reg = MPUREG_I2C_SLV4_ADDR; - reg_trig_reg = MPUREG_I2C_SLV4_REG; - ctrl_trig_reg = MPUREG_I2C_SLV4_CTRL; - bits_slave_delay = BIT_SLV4_DLY_EN | BIT_SLV3_DLY_EN; - break; - default: - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - }; - - /* return if this slave has already been set */ - if ((slave_address && - ((mldl_cfg->inv_mpu_state->i2c_slaves_enabled & bits_slave_delay) - == bits_slave_delay)) || - (!slave_address && - (mldl_cfg->inv_mpu_state->i2c_slaves_enabled & bits_slave_delay) == - 0)) - return 0; - - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, true); - - /* Address */ - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - addr_reg, slave_address); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - /* Register */ - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - reg_reg, slave_reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Length, byte swapping, grouping & enable */ - if (slave_len > BITS_SLV_LENG) { - MPL_LOGW("Limiting slave burst read length to " - "the allowed maximum (15B, req. %d)\n", slave_len); - slave_len = BITS_SLV_LENG; - return INV_ERROR_INVALID_CONFIGURATION; - } - reg = slave_len; - if (slave_endian == EXT_SLAVE_LITTLE_ENDIAN) { - reg |= BIT_SLV_BYTE_SW; - if (slave_reg & 1) - reg |= BIT_SLV_GRP; - } - if (slave_address) - reg |= BIT_SLV_ENABLE; - - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - ctrl_reg, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Trigger */ - if (addr_trig_reg) { - /* If slave address is 0 this clears the trigger */ - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - addr_trig_reg, - slave_address & ~BIT_I2C_READ); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - if (slave && slave->trigger && reg_trig_reg) { - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - reg_trig_reg, - slave->trigger->reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - ctrl_trig_reg, - BIT_SLV_ENABLE | 0x01); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - d0_trig_reg, - slave->trigger->value); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } else if (ctrl_trig_reg) { - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - ctrl_trig_reg, 0x00); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - /* Data rate */ - if (slave) { - struct ext_slave_config config; - long data; - config.key = MPU_SLAVE_CONFIG_ODR_RESUME; - config.len = sizeof(long); - config.apply = false; - config.data = &data; - if (!(slave->get_config)) - return INV_ERROR_INVALID_CONFIGURATION; - - result = slave->get_config(NULL, slave, slave_pdata, &config); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - MPL_LOGI("Slave %d ODR: %ld Hz\n", slave_id, data / 1000); - divider = ((1000 * inv_mpu_get_sampling_rate_hz( - mldl_cfg->mpu_gyro_cfg)) - / data) - 1; - } else { - divider = 0; - } - - result = inv_serial_read(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - MPUREG_I2C_MST_DELAY_CTRL, - 1, &delay_ctrl_orig); - delay_ctrl = delay_ctrl_orig; - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (divider > 0 && divider <= MASK_I2C_MST_DLY) { - result = inv_serial_read(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - MPUREG_I2C_SLV4_CTRL, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if ((reg & MASK_I2C_MST_DLY) && - ((long)(reg & MASK_I2C_MST_DLY) != - (divider & MASK_I2C_MST_DLY))) { - MPL_LOGW("Changing slave divider: %ld to %ld\n", - (long)(reg & MASK_I2C_MST_DLY), - (divider & MASK_I2C_MST_DLY)); - - } - reg |= (unsigned char)(divider & MASK_I2C_MST_DLY); - result = inv_serial_single_write(gyro_handle, - mldl_cfg->mpu_chip_info->addr, - MPUREG_I2C_SLV4_CTRL, - reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - delay_ctrl |= bits_slave_delay; - } else { - delay_ctrl &= ~(bits_slave_delay); - } - if (delay_ctrl != delay_ctrl_orig) { - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_I2C_MST_DELAY_CTRL, - delay_ctrl); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - if (slave_address) - mldl_cfg->inv_mpu_state->i2c_slaves_enabled |= - bits_slave_delay; - else - mldl_cfg->inv_mpu_state->i2c_slaves_enabled &= - ~bits_slave_delay; - - return result; -} - -static int mpu_set_slave(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *slave_pdata, - int slave_id) -{ - return mpu_set_slave_mpu60xx(mldl_cfg, gyro_handle, slave, - slave_pdata, slave_id); -} -/** - * Check to see if the gyro was reset by testing a couple of registers known - * to change on reset. - * - * @mldl_cfg mldl configuration structure - * @gyro_handle handle used to communicate with the gyro - * - * @return INV_SUCCESS or non-zero error code - */ -static int mpu_was_reset(struct mldl_cfg *mldl_cfg, void *gyro_handle) -{ - int result = INV_SUCCESS; - unsigned char reg; - - result = inv_serial_read(gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_DMP_CFG_2, 1, ®); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (mldl_cfg->mpu_gyro_cfg->dmp_cfg2 != reg) - return true; - - if (0 != mldl_cfg->mpu_gyro_cfg->dmp_cfg1) - return false; - - /* Inconclusive assume it was reset */ - return true; -} - - -int inv_mpu_set_firmware(struct mldl_cfg *mldl_cfg, void *mlsl_handle, - const unsigned char *data, int size) -{ - int bank, offset, write_size; - int result; - unsigned char read[MPU_MEM_BANK_SIZE]; - - if (mldl_cfg->inv_mpu_state->status & MPU_DEVICE_IS_SUSPENDED) { -#if INV_CACHE_DMP == 1 - memcpy(mldl_cfg->mpu_ram->ram, data, size); - return INV_SUCCESS; -#else - LOG_RESULT_LOCATION(INV_ERROR_MEMORY_SET); - return INV_ERROR_MEMORY_SET; -#endif - } - - if (!(mldl_cfg->inv_mpu_state->status & MPU_DMP_IS_SUSPENDED)) { - LOG_RESULT_LOCATION(INV_ERROR_MEMORY_SET); - return INV_ERROR_MEMORY_SET; - } - /* Write and verify memory */ - for (bank = 0; size > 0; bank++, - size -= write_size, - data += write_size) { - if (size > MPU_MEM_BANK_SIZE) - write_size = MPU_MEM_BANK_SIZE; - else - write_size = size; - - result = inv_serial_write_mem(mlsl_handle, - mldl_cfg->mpu_chip_info->addr, - ((bank << 8) | 0x00), - write_size, - data); - if (result) { - LOG_RESULT_LOCATION(result); - MPL_LOGE("Write mem error in bank %d\n", bank); - return result; - } -#if 0 - result = inv_serial_read_mem(mlsl_handle, - mldl_cfg->mpu_chip_info->addr, - ((bank << 8) | 0x00), - write_size, - read); - if (result) { - LOG_RESULT_LOCATION(result); - MPL_LOGE("Read mem error in bank %d\n", bank); - return result; - } - -#define ML_SKIP_CHECK 38 - for (offset = 0; offset < write_size; offset++) { - /* skip the register memory locations */ - if (bank == 0 && offset < ML_SKIP_CHECK) - continue; - if (data[offset] != read[offset]) { - result = INV_ERROR_SERIAL_WRITE; - break; - } - } -#endif - if (result != INV_SUCCESS) { - LOG_RESULT_LOCATION(result); - MPL_LOGE("Read data mismatch at bank %d, offset %d\n", - bank, offset); - return result; - } - } - return INV_SUCCESS; -} - -static int gyro_resume(struct mldl_cfg *mldl_cfg, void *gyro_handle, - unsigned long sensors) -{ - int result; - int ii; - unsigned char reg; - unsigned char regs[7]; - - /* Wake up the part */ - result = mpu60xx_pwr_mgmt(mldl_cfg, gyro_handle, false, sensors); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Always set the INT_ENABLE and DIVIDER as the Accel Only mode for 6050 - can set these too */ - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_INT_ENABLE, (mldl_cfg->mpu_gyro_cfg->int_config)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_SMPLRT_DIV, mldl_cfg->mpu_gyro_cfg->divider); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (!(mldl_cfg->inv_mpu_state->status & MPU_GYRO_NEEDS_CONFIG) && - !mpu_was_reset(mldl_cfg, gyro_handle)) { - return INV_SUCCESS; - } - - /* Configure the MPU */ - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = mpu_set_clock_source(gyro_handle, mldl_cfg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - reg = MPUREG_GYRO_CONFIG_VALUE(0, 0, 0, - mldl_cfg->mpu_gyro_cfg->full_scale); - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_GYRO_CONFIG, reg); - reg = MPUREG_CONFIG_VALUE(mldl_cfg->mpu_gyro_cfg->ext_sync, - mldl_cfg->mpu_gyro_cfg->lpf); - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_CONFIG, reg); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_DMP_CFG_1, mldl_cfg->mpu_gyro_cfg->dmp_cfg1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_DMP_CFG_2, mldl_cfg->mpu_gyro_cfg->dmp_cfg2); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Write and verify memory */ -#if INV_CACHE_DMP != 0 - inv_mpu_set_firmware(mldl_cfg, gyro_handle, - mldl_cfg->mpu_ram->ram, mldl_cfg->mpu_ram->length); -#endif - - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_XG_OFFS_TC, - ((mldl_cfg->mpu_offsets->tc[0] << 1) & BITS_XG_OFFS_TC)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - regs[0] = ((mldl_cfg->mpu_offsets->tc[1] << 1) & BITS_YG_OFFS_TC); - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_YG_OFFS_TC, regs[0]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_single_write( - gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_ZG_OFFS_TC, - ((mldl_cfg->mpu_offsets->tc[2] << 1) & BITS_ZG_OFFS_TC)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - regs[0] = MPUREG_X_OFFS_USRH; - for (ii = 0; ii < ARRAY_SIZE(mldl_cfg->mpu_offsets->gyro); ii++) { - regs[1 + ii * 2] = - (unsigned char)(mldl_cfg->mpu_offsets->gyro[ii] >> 8) - & 0xff; - regs[1 + ii * 2 + 1] = - (unsigned char)(mldl_cfg->mpu_offsets->gyro[ii] & 0xff); - } - result = inv_serial_write(gyro_handle, mldl_cfg->mpu_chip_info->addr, - 7, regs); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Configure slaves */ - result = inv_mpu_set_level_shifter_bit(mldl_cfg, gyro_handle, - mldl_cfg->pdata->level_shifter); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - mldl_cfg->inv_mpu_state->status &= ~MPU_GYRO_NEEDS_CONFIG; - - return result; -} - -int gyro_config(void *mlsl_handle, - struct mldl_cfg *mldl_cfg, - struct ext_slave_config *data) -{ - struct mpu_gyro_cfg *mpu_gyro_cfg = mldl_cfg->mpu_gyro_cfg; - struct mpu_chip_info *mpu_chip_info = mldl_cfg->mpu_chip_info; - struct mpu_offsets *mpu_offsets = mldl_cfg->mpu_offsets; - int ii; - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_INT_CONFIG: - mpu_gyro_cfg->int_config = *((__u8 *)data->data); - break; - case MPU_SLAVE_EXT_SYNC: - mpu_gyro_cfg->ext_sync = *((__u8 *)data->data); - break; - case MPU_SLAVE_FULL_SCALE: - mpu_gyro_cfg->full_scale = *((__u8 *)data->data); - break; - case MPU_SLAVE_LPF: - mpu_gyro_cfg->lpf = *((__u8 *)data->data); - break; - case MPU_SLAVE_CLK_SRC: - mpu_gyro_cfg->clk_src = *((__u8 *)data->data); - break; - case MPU_SLAVE_DIVIDER: - mpu_gyro_cfg->divider = *((__u8 *)data->data); - break; - case MPU_SLAVE_DMP_ENABLE: - mpu_gyro_cfg->dmp_enable = *((__u8 *)data->data); - break; - case MPU_SLAVE_FIFO_ENABLE: - mpu_gyro_cfg->fifo_enable = *((__u8 *)data->data); - break; - case MPU_SLAVE_DMP_CFG1: - mpu_gyro_cfg->dmp_cfg1 = *((__u8 *)data->data); - break; - case MPU_SLAVE_DMP_CFG2: - mpu_gyro_cfg->dmp_cfg2 = *((__u8 *)data->data); - break; - case MPU_SLAVE_TC: - for (ii = 0; ii < GYRO_NUM_AXES; ii++) - mpu_offsets->tc[ii] = ((__u8 *)data->data)[ii]; - break; - case MPU_SLAVE_GYRO: - for (ii = 0; ii < GYRO_NUM_AXES; ii++) - mpu_offsets->gyro[ii] = ((__u16 *)data->data)[ii]; - break; - case MPU_SLAVE_ADDR: - mpu_chip_info->addr = *((__u8 *)data->data); - break; - case MPU_SLAVE_PRODUCT_REVISION: - mpu_chip_info->product_revision = *((__u8 *)data->data); - break; - case MPU_SLAVE_SILICON_REVISION: - mpu_chip_info->silicon_revision = *((__u8 *)data->data); - break; - case MPU_SLAVE_PRODUCT_ID: - mpu_chip_info->product_id = *((__u8 *)data->data); - break; - case MPU_SLAVE_GYRO_SENS_TRIM: - mpu_chip_info->gyro_sens_trim = *((__u16 *)data->data); - break; - case MPU_SLAVE_ACCEL_SENS_TRIM: - mpu_chip_info->accel_sens_trim = *((__u16 *)data->data); - break; - case MPU_SLAVE_RAM: - if (data->len != mldl_cfg->mpu_ram->length) - return INV_ERROR_INVALID_PARAMETER; - - memcpy(mldl_cfg->mpu_ram->ram, data->data, data->len); - break; - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - mldl_cfg->inv_mpu_state->status |= MPU_GYRO_NEEDS_CONFIG; - return INV_SUCCESS; -} - -int gyro_get_config(void *mlsl_handle, - struct mldl_cfg *mldl_cfg, - struct ext_slave_config *data) -{ - struct mpu_gyro_cfg *mpu_gyro_cfg = mldl_cfg->mpu_gyro_cfg; - struct mpu_chip_info *mpu_chip_info = mldl_cfg->mpu_chip_info; - struct mpu_offsets *mpu_offsets = mldl_cfg->mpu_offsets; - int ii; - - if (!data->data) - return INV_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_INT_CONFIG: - *((__u8 *)data->data) = mpu_gyro_cfg->int_config; - break; - case MPU_SLAVE_EXT_SYNC: - *((__u8 *)data->data) = mpu_gyro_cfg->ext_sync; - break; - case MPU_SLAVE_FULL_SCALE: - *((__u8 *)data->data) = mpu_gyro_cfg->full_scale; - break; - case MPU_SLAVE_LPF: - *((__u8 *)data->data) = mpu_gyro_cfg->lpf; - break; - case MPU_SLAVE_CLK_SRC: - *((__u8 *)data->data) = mpu_gyro_cfg->clk_src; - break; - case MPU_SLAVE_DIVIDER: - *((__u8 *)data->data) = mpu_gyro_cfg->divider; - break; - case MPU_SLAVE_DMP_ENABLE: - *((__u8 *)data->data) = mpu_gyro_cfg->dmp_enable; - break; - case MPU_SLAVE_FIFO_ENABLE: - *((__u8 *)data->data) = mpu_gyro_cfg->fifo_enable; - break; - case MPU_SLAVE_DMP_CFG1: - *((__u8 *)data->data) = mpu_gyro_cfg->dmp_cfg1; - break; - case MPU_SLAVE_DMP_CFG2: - *((__u8 *)data->data) = mpu_gyro_cfg->dmp_cfg2; - break; - case MPU_SLAVE_TC: - for (ii = 0; ii < GYRO_NUM_AXES; ii++) - ((__u8 *)data->data)[ii] = mpu_offsets->tc[ii]; - break; - case MPU_SLAVE_GYRO: - for (ii = 0; ii < GYRO_NUM_AXES; ii++) - ((__u16 *)data->data)[ii] = mpu_offsets->gyro[ii]; - break; - case MPU_SLAVE_ADDR: - *((__u8 *)data->data) = mpu_chip_info->addr; - break; - case MPU_SLAVE_PRODUCT_REVISION: - *((__u8 *)data->data) = mpu_chip_info->product_revision; - break; - case MPU_SLAVE_SILICON_REVISION: - *((__u8 *)data->data) = mpu_chip_info->silicon_revision; - break; - case MPU_SLAVE_PRODUCT_ID: - *((__u8 *)data->data) = mpu_chip_info->product_id; - break; - case MPU_SLAVE_GYRO_SENS_TRIM: - *((__u16 *)data->data) = mpu_chip_info->gyro_sens_trim; - break; - case MPU_SLAVE_ACCEL_SENS_TRIM: - *((__u16 *)data->data) = mpu_chip_info->accel_sens_trim; - break; - case MPU_SLAVE_RAM: - if (data->len != mldl_cfg->mpu_ram->length) - return INV_ERROR_INVALID_PARAMETER; - - memcpy(data->data, mldl_cfg->mpu_ram->ram, data->len); - break; - default: - LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED); - return INV_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return INV_SUCCESS; -} - - -/******************************************************************************* - ******************************************************************************* - * Exported functions - ******************************************************************************* - ******************************************************************************/ - -/** - * Initializes the pdata structure to defaults. - * - * Opens the device to read silicon revision, product id and whoami. - * - * @mldl_cfg - * The internal device configuration data structure. - * @mlsl_handle - * The serial communication handle. - * - * @return INV_SUCCESS if silicon revision, product id and woami are supported - * by this software. - */ -int inv_mpu_open(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, void *pressure_handle) -{ - int result; - void *slave_handle[EXT_SLAVE_NUM_TYPES]; - int ii; - - /* Default is Logic HIGH, pushpull, latch disabled, anyread to clear */ - ii = 0; - mldl_cfg->inv_mpu_cfg->ignore_system_suspend = false; - mldl_cfg->mpu_gyro_cfg->int_config = BIT_DMP_INT_EN; - mldl_cfg->mpu_gyro_cfg->clk_src = MPU_CLK_SEL_PLLGYROZ; - mldl_cfg->mpu_gyro_cfg->lpf = MPU_FILTER_42HZ; - mldl_cfg->mpu_gyro_cfg->full_scale = MPU_FS_2000DPS; - mldl_cfg->mpu_gyro_cfg->divider = 4; - mldl_cfg->mpu_gyro_cfg->dmp_enable = 1; - mldl_cfg->mpu_gyro_cfg->fifo_enable = 1; - mldl_cfg->mpu_gyro_cfg->ext_sync = 0; - mldl_cfg->mpu_gyro_cfg->dmp_cfg1 = 0; - mldl_cfg->mpu_gyro_cfg->dmp_cfg2 = 0; - mldl_cfg->inv_mpu_state->status = - MPU_DMP_IS_SUSPENDED | - MPU_GYRO_IS_SUSPENDED | - MPU_ACCEL_IS_SUSPENDED | - MPU_COMPASS_IS_SUSPENDED | - MPU_PRESSURE_IS_SUSPENDED | - MPU_DEVICE_IS_SUSPENDED; - mldl_cfg->inv_mpu_state->i2c_slaves_enabled = 0; - - slave_handle[EXT_SLAVE_TYPE_GYROSCOPE] = gyro_handle; - slave_handle[EXT_SLAVE_TYPE_ACCEL] = accel_handle; - slave_handle[EXT_SLAVE_TYPE_COMPASS] = compass_handle; - slave_handle[EXT_SLAVE_TYPE_PRESSURE] = pressure_handle; - - if (mldl_cfg->mpu_chip_info->addr == 0) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - /* - * Reset, - * Take the DMP out of sleep, and - * read the product_id, sillicon rev and whoami - */ - mldl_cfg->inv_mpu_state->status &= ~MPU_GYRO_IS_BYPASSED; - result = mpu60xx_pwr_mgmt(mldl_cfg, gyro_handle, true, - INV_THREE_AXIS_GYRO); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - result = inv_get_silicon_rev(mldl_cfg, gyro_handle); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Get the factory temperature compensation offsets */ - result = inv_serial_read(gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_XG_OFFS_TC, 1, - &mldl_cfg->mpu_offsets->tc[0]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_read(gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_YG_OFFS_TC, 1, - &mldl_cfg->mpu_offsets->tc[1]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_serial_read(gyro_handle, mldl_cfg->mpu_chip_info->addr, - MPUREG_ZG_OFFS_TC, 1, - &mldl_cfg->mpu_offsets->tc[2]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Into bypass mode before sleeping and calling the slaves init */ - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, true); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = inv_mpu_set_level_shifter_bit(mldl_cfg, gyro_handle, - mldl_cfg->pdata->level_shifter); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - for (ii = 0; ii < GYRO_NUM_AXES; ii++) { - mldl_cfg->mpu_offsets->tc[ii] = - (mldl_cfg->mpu_offsets->tc[ii] & BITS_XG_OFFS_TC) >> 1; - } - -#if INV_CACHE_DMP != 0 - result = mpu60xx_pwr_mgmt(mldl_cfg, gyro_handle, false, 0); -#endif - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - - return result; - -} - -/** - * Close the mpu interface - * - * @mldl_cfg pointer to the configuration structure - * @mlsl_handle pointer to the serial layer handle - * - * @return INV_SUCCESS or non-zero error code - */ -int inv_mpu_close(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle) -{ - return 0; -} - -/** - * @brief resume the MPU device and all the other sensor - * devices from their low power state. - * - * @mldl_cfg - * pointer to the configuration structure - * @gyro_handle - * the main file handle to the MPU device. - * @accel_handle - * an handle to the accelerometer device, if sitting - * onto a separate bus. Can match mlsl_handle if - * the accelerometer device operates on the same - * primary bus of MPU. - * @compass_handle - * an handle to the compass device, if sitting - * onto a separate bus. Can match mlsl_handle if - * the compass device operates on the same - * primary bus of MPU. - * @pressure_handle - * an handle to the pressure sensor device, if sitting - * onto a separate bus. Can match mlsl_handle if - * the pressure sensor device operates on the same - * primary bus of MPU. - * @resume_gyro - * whether resuming the gyroscope device is - * actually needed (if the device supports low power - * mode of some sort). - * @resume_accel - * whether resuming the accelerometer device is - * actually needed (if the device supports low power - * mode of some sort). - * @resume_compass - * whether resuming the compass device is - * actually needed (if the device supports low power - * mode of some sort). - * @resume_pressure - * whether resuming the pressure sensor device is - * actually needed (if the device supports low power - * mode of some sort). - * @return INV_SUCCESS or a non-zero error code. - */ -int inv_mpu_resume(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle, - unsigned long sensors) -{ - int result = INV_SUCCESS; - int ii; - bool resume_slave[EXT_SLAVE_NUM_TYPES]; - bool resume_dmp = sensors & INV_DMP_PROCESSOR; - void *slave_handle[EXT_SLAVE_NUM_TYPES]; - resume_slave[EXT_SLAVE_TYPE_GYROSCOPE] = - (sensors & (INV_X_GYRO | INV_Y_GYRO | INV_Z_GYRO)); - resume_slave[EXT_SLAVE_TYPE_ACCEL] = - sensors & INV_THREE_AXIS_ACCEL; - resume_slave[EXT_SLAVE_TYPE_COMPASS] = - sensors & INV_THREE_AXIS_COMPASS; - resume_slave[EXT_SLAVE_TYPE_PRESSURE] = - sensors & INV_THREE_AXIS_PRESSURE; - - slave_handle[EXT_SLAVE_TYPE_GYROSCOPE] = gyro_handle; - slave_handle[EXT_SLAVE_TYPE_ACCEL] = accel_handle; - slave_handle[EXT_SLAVE_TYPE_COMPASS] = compass_handle; - slave_handle[EXT_SLAVE_TYPE_PRESSURE] = pressure_handle; - - mldl_print_cfg(mldl_cfg); - - /* Skip the Gyro since slave[EXT_SLAVE_TYPE_GYROSCOPE] is NULL */ - for (ii = EXT_SLAVE_TYPE_ACCEL; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (resume_slave[ii] && - ((!mldl_cfg->slave[ii]) || - (!mldl_cfg->slave[ii]->resume))) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - } - - if ((resume_slave[EXT_SLAVE_TYPE_GYROSCOPE] || resume_dmp) - && ((mldl_cfg->inv_mpu_state->status & MPU_GYRO_IS_SUSPENDED) || - (mldl_cfg->inv_mpu_state->status & MPU_GYRO_NEEDS_CONFIG))) { - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = dmp_stop(mldl_cfg, gyro_handle); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = gyro_resume(mldl_cfg, gyro_handle, sensors); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!mldl_cfg->slave[ii] || - !mldl_cfg->pdata_slave[ii] || - !resume_slave[ii] || - !(mldl_cfg->inv_mpu_state->status & (1 << ii))) - continue; - - if (EXT_SLAVE_BUS_SECONDARY == - mldl_cfg->pdata_slave[ii]->bus) { - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, - true); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - result = mldl_cfg->slave[ii]->resume(slave_handle[ii], - mldl_cfg->slave[ii], - mldl_cfg->pdata_slave[ii]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - mldl_cfg->inv_mpu_state->status &= ~(1 << ii); - } - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (resume_dmp && - !(mldl_cfg->inv_mpu_state->status & (1 << ii)) && - mldl_cfg->pdata_slave[ii] && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata_slave[ii]->bus) { - result = mpu_set_slave(mldl_cfg, - gyro_handle, - mldl_cfg->slave[ii], - mldl_cfg->pdata_slave[ii], - mldl_cfg->slave[ii]->type); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - } - /* Turn on the master i2c iterface if necessary */ - if (resume_dmp) { - result = mpu_set_i2c_bypass( - mldl_cfg, gyro_handle, - !(mldl_cfg->inv_mpu_state->i2c_slaves_enabled)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* Now start */ - result = dmp_start(mldl_cfg, gyro_handle); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - mldl_cfg->inv_mpu_cfg->requested_sensors = sensors; - - return result; -} - -/** - * @brief suspend the MPU device and all the other sensor - * devices into their low power state. - * @mldl_cfg - * a pointer to the struct mldl_cfg internal data - * structure. - * @gyro_handle - * the main file handle to the MPU device. - * @accel_handle - * an handle to the accelerometer device, if sitting - * onto a separate bus. Can match gyro_handle if - * the accelerometer device operates on the same - * primary bus of MPU. - * @compass_handle - * an handle to the compass device, if sitting - * onto a separate bus. Can match gyro_handle if - * the compass device operates on the same - * primary bus of MPU. - * @pressure_handle - * an handle to the pressure sensor device, if sitting - * onto a separate bus. Can match gyro_handle if - * the pressure sensor device operates on the same - * primary bus of MPU. - * @accel - * whether suspending the accelerometer device is - * actually needed (if the device supports low power - * mode of some sort). - * @compass - * whether suspending the compass device is - * actually needed (if the device supports low power - * mode of some sort). - * @pressure - * whether suspending the pressure sensor device is - * actually needed (if the device supports low power - * mode of some sort). - * @return INV_SUCCESS or a non-zero error code. - */ -int inv_mpu_suspend(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle, - unsigned long sensors) -{ - int result = INV_SUCCESS; - int ii; - struct ext_slave_descr **slave = mldl_cfg->slave; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - bool suspend_dmp = ((sensors & INV_DMP_PROCESSOR) == INV_DMP_PROCESSOR); - bool suspend_slave[EXT_SLAVE_NUM_TYPES]; - void *slave_handle[EXT_SLAVE_NUM_TYPES]; - - suspend_slave[EXT_SLAVE_TYPE_GYROSCOPE] = - ((sensors & (INV_X_GYRO | INV_Y_GYRO | INV_Z_GYRO)) - == (INV_X_GYRO | INV_Y_GYRO | INV_Z_GYRO)); - suspend_slave[EXT_SLAVE_TYPE_ACCEL] = - ((sensors & INV_THREE_AXIS_ACCEL) == INV_THREE_AXIS_ACCEL); - suspend_slave[EXT_SLAVE_TYPE_COMPASS] = - ((sensors & INV_THREE_AXIS_COMPASS) == INV_THREE_AXIS_COMPASS); - suspend_slave[EXT_SLAVE_TYPE_PRESSURE] = - ((sensors & INV_THREE_AXIS_PRESSURE) == - INV_THREE_AXIS_PRESSURE); - - slave_handle[EXT_SLAVE_TYPE_GYROSCOPE] = gyro_handle; - slave_handle[EXT_SLAVE_TYPE_ACCEL] = accel_handle; - slave_handle[EXT_SLAVE_TYPE_COMPASS] = compass_handle; - slave_handle[EXT_SLAVE_TYPE_PRESSURE] = pressure_handle; - - if (suspend_dmp) { - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - result = dmp_stop(mldl_cfg, gyro_handle); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - /* Gyro */ - if (suspend_slave[EXT_SLAVE_TYPE_GYROSCOPE]) { - result = mpu60xx_pwr_mgmt(mldl_cfg, gyro_handle, false, - ((~sensors) & INV_ALL_SENSORS)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - bool is_suspended = mldl_cfg->inv_mpu_state->status & (1 << ii); - if (!slave[ii] || !pdata_slave[ii] || - is_suspended || !suspend_slave[ii]) - continue; - - if (EXT_SLAVE_BUS_SECONDARY == pdata_slave[ii]->bus) { - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - result = slave[ii]->suspend(slave_handle[ii], - slave[ii], - pdata_slave[ii]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - if (EXT_SLAVE_BUS_SECONDARY == pdata_slave[ii]->bus) { - result = mpu_set_slave(mldl_cfg, gyro_handle, - NULL, NULL, - slave[ii]->type); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - mldl_cfg->inv_mpu_state->status |= (1 << ii); - } - - /* Re-enable the i2c master if there are configured slaves and DMP */ - if (!suspend_dmp) { - result = mpu_set_i2c_bypass( - mldl_cfg, gyro_handle, - !(mldl_cfg->inv_mpu_state->i2c_slaves_enabled)); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - mldl_cfg->inv_mpu_cfg->requested_sensors = (~sensors) & INV_ALL_SENSORS; - - return result; -} - -int inv_mpu_slave_read(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *slave_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - int bypass_result; - int remain_bypassed = true; - - if (NULL == slave || NULL == slave->read) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_CONFIGURATION); - return INV_ERROR_INVALID_CONFIGURATION; - } - - if ((EXT_SLAVE_BUS_SECONDARY == pdata->bus) - && (!(mldl_cfg->inv_mpu_state->status & MPU_GYRO_IS_BYPASSED))) { - remain_bypassed = false; - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - result = slave->read(slave_handle, slave, pdata, data); - - if (!remain_bypassed) { - bypass_result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 0); - if (bypass_result) { - LOG_RESULT_LOCATION(bypass_result); - return bypass_result; - } - } - return result; -} - -int inv_mpu_slave_config(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *slave_handle, - struct ext_slave_config *data, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - int remain_bypassed = true; - - if (NULL == slave || NULL == slave->config) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_CONFIGURATION); - return INV_ERROR_INVALID_CONFIGURATION; - } - - if (data->apply && (EXT_SLAVE_BUS_SECONDARY == pdata->bus) - && (!(mldl_cfg->inv_mpu_state->status & MPU_GYRO_IS_BYPASSED))) { - remain_bypassed = false; - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - result = slave->config(slave_handle, slave, pdata, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (!remain_bypassed) { - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - return result; -} - -int inv_mpu_get_slave_config(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *slave_handle, - struct ext_slave_config *data, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - int remain_bypassed = true; - - if (NULL == slave || NULL == slave->get_config) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_CONFIGURATION); - return INV_ERROR_INVALID_CONFIGURATION; - } - - if (data->apply && (EXT_SLAVE_BUS_SECONDARY == pdata->bus) - && (!(mldl_cfg->inv_mpu_state->status & MPU_GYRO_IS_BYPASSED))) { - remain_bypassed = false; - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 1); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - - result = slave->get_config(slave_handle, slave, pdata, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - if (!remain_bypassed) { - result = mpu_set_i2c_bypass(mldl_cfg, gyro_handle, 0); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - } - return result; -} - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/mldl_cfg.h b/drivers/misc/inv_mpu/mldl_cfg.h deleted file mode 100644 index 1d676a9..0000000 --- a/drivers/misc/inv_mpu/mldl_cfg.h +++ /dev/null @@ -1,381 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup MLDL - * - * @{ - * @file mldl_cfg.h - * @brief The Motion Library Driver Layer Configuration header file. - */ - -#ifndef __MLDL_CFG_H__ -#define __MLDL_CFG_H__ - -#include "mltypes.h" -#include "mlsl.h" -#include -#include "mpu6050b1.h" - -#include "log.h" - -/************************************************************************* - * Sensors Bit definitions - *************************************************************************/ - -#define INV_X_GYRO (0x0001) -#define INV_Y_GYRO (0x0002) -#define INV_Z_GYRO (0x0004) -#define INV_DMP_PROCESSOR (0x0008) - -#define INV_X_ACCEL (0x0010) -#define INV_Y_ACCEL (0x0020) -#define INV_Z_ACCEL (0x0040) - -#define INV_X_COMPASS (0x0080) -#define INV_Y_COMPASS (0x0100) -#define INV_Z_COMPASS (0x0200) - -#define INV_X_PRESSURE (0x0300) -#define INV_Y_PRESSURE (0x0800) -#define INV_Z_PRESSURE (0x1000) - -#define INV_TEMPERATURE (0x2000) -#define INV_TIME (0x4000) - -#define INV_THREE_AXIS_GYRO (0x000F) -#define INV_THREE_AXIS_ACCEL (0x0070) -#define INV_THREE_AXIS_COMPASS (0x0380) -#define INV_THREE_AXIS_PRESSURE (0x1C00) - -#define INV_FIVE_AXIS (0x007B) -#define INV_SIX_AXIS_GYRO_ACCEL (0x007F) -#define INV_SIX_AXIS_ACCEL_COMPASS (0x03F0) -#define INV_NINE_AXIS (0x03FF) -#define INV_ALL_SENSORS (0x7FFF) - -#define MPL_PROD_KEY(ver, rev) (ver * 100 + rev) - -/* -------------------------------------------------------------------------- */ -struct mpu_ram { - __u16 length; - __u8 *ram; -}; - -struct mpu_gyro_cfg { - __u8 int_config; - __u8 ext_sync; - __u8 full_scale; - __u8 lpf; - __u8 clk_src; - __u8 divider; - __u8 dmp_enable; - __u8 fifo_enable; - __u8 dmp_cfg1; - __u8 dmp_cfg2; -}; - -/* Offset registers that can be calibrated */ -struct mpu_offsets { - __u8 tc[GYRO_NUM_AXES]; - __u16 gyro[GYRO_NUM_AXES]; -}; - -/* Chip related information that can be read and verified */ -struct mpu_chip_info { - __u8 addr; - __u8 product_revision; - __u8 silicon_revision; - __u8 product_id; - __u16 gyro_sens_trim; - /* Only used for MPU6050 */ - __u16 accel_sens_trim; -}; - - -struct inv_mpu_cfg { - __u32 requested_sensors; - __u8 ignore_system_suspend; -}; - -#define MPU_GYRO_IS_SUSPENDED (0x01 << EXT_SLAVE_TYPE_GYROSCOPE) -#define MPU_ACCEL_IS_SUSPENDED (0x01 << EXT_SLAVE_TYPE_ACCEL) -#define MPU_COMPASS_IS_SUSPENDED (0x01 << EXT_SLAVE_TYPE_COMPASS) -#define MPU_PRESSURE_IS_SUSPENDED (0x01 << EXT_SLAVE_TYPE_PRESSURE) -#define MPU_GYRO_IS_BYPASSED (0x10) -#define MPU_DMP_IS_SUSPENDED (0x20) -#define MPU_GYRO_NEEDS_CONFIG (0x40) -#define MPU_DEVICE_IS_SUSPENDED (0x80) - -/* Driver related state information */ -struct inv_mpu_state { - __u8 status; - /* 0-1 for 3050, bitfield of BIT_SLVx_DLY_EN, x = [0..4] */ - __u8 i2c_slaves_enabled; -}; - -/* Platform data for the MPU */ -struct mldl_cfg { - struct mpu_ram *mpu_ram; - struct mpu_gyro_cfg *mpu_gyro_cfg; - struct mpu_offsets *mpu_offsets; - struct mpu_chip_info *mpu_chip_info; - - /* MPU Related stored status and info */ - struct inv_mpu_cfg *inv_mpu_cfg; - struct inv_mpu_state *inv_mpu_state; - - /* Slave related information */ - struct ext_slave_descr *slave[EXT_SLAVE_NUM_TYPES]; - /* Platform Data */ - struct mpu_platform_data *pdata; - struct ext_slave_platform_data *pdata_slave[EXT_SLAVE_NUM_TYPES]; -}; - -/* -------------------------------------------------------------------------- */ - -int inv_mpu_open(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle); -int inv_mpu_close(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle); -int inv_mpu_resume(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle, - unsigned long sensors); -int inv_mpu_suspend(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle, - unsigned long sensors); -int inv_mpu_set_firmware(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - const unsigned char *data, - int size); - -/* -------------------------------------------------------------------------- */ -/* Slave Read functions */ -int inv_mpu_slave_read(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *slave_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data); -static inline int inv_mpu_read_accel(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, unsigned char *data) -{ - if (!mldl_cfg) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_slave_read( - mldl_cfg, gyro_handle, accel_handle, - mldl_cfg->slave[EXT_SLAVE_TYPE_ACCEL], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_ACCEL], - data); -} - -static inline int inv_mpu_read_compass(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *compass_handle, - unsigned char *data) -{ - if (!mldl_cfg) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_slave_read( - mldl_cfg, gyro_handle, compass_handle, - mldl_cfg->slave[EXT_SLAVE_TYPE_COMPASS], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_COMPASS], - data); -} - -static inline int inv_mpu_read_pressure(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *pressure_handle, - unsigned char *data) -{ - if (!mldl_cfg) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_slave_read( - mldl_cfg, gyro_handle, pressure_handle, - mldl_cfg->slave[EXT_SLAVE_TYPE_PRESSURE], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_PRESSURE], - data); -} - -int gyro_config(void *mlsl_handle, - struct mldl_cfg *mldl_cfg, - struct ext_slave_config *data); - -/* Slave Config functions */ -int inv_mpu_slave_config(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *slave_handle, - struct ext_slave_config *data, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata); -static inline int inv_mpu_config_accel(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - struct ext_slave_config *data) -{ - if (!mldl_cfg) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_slave_config( - mldl_cfg, gyro_handle, accel_handle, data, - mldl_cfg->slave[EXT_SLAVE_TYPE_ACCEL], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_ACCEL]); -} - -static inline int inv_mpu_config_compass(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *compass_handle, - struct ext_slave_config *data) -{ - if (!mldl_cfg) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_slave_config( - mldl_cfg, gyro_handle, compass_handle, data, - mldl_cfg->slave[EXT_SLAVE_TYPE_COMPASS], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_COMPASS]); -} - -static inline int inv_mpu_config_pressure(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *pressure_handle, - struct ext_slave_config *data) -{ - if (!mldl_cfg) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_slave_config( - mldl_cfg, gyro_handle, pressure_handle, data, - mldl_cfg->slave[EXT_SLAVE_TYPE_PRESSURE], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_PRESSURE]); -} - -int gyro_get_config(void *mlsl_handle, - struct mldl_cfg *mldl_cfg, - struct ext_slave_config *data); - -/* Slave get config functions */ -int inv_mpu_get_slave_config(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *slave_handle, - struct ext_slave_config *data, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata); - -static inline int inv_mpu_get_accel_config(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - struct ext_slave_config *data) -{ - if (!mldl_cfg) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_get_slave_config( - mldl_cfg, gyro_handle, accel_handle, data, - mldl_cfg->slave[EXT_SLAVE_TYPE_ACCEL], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_ACCEL]); -} - -static inline int inv_mpu_get_compass_config(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *compass_handle, - struct ext_slave_config *data) -{ - if (!mldl_cfg || !(mldl_cfg->pdata)) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_get_slave_config( - mldl_cfg, gyro_handle, compass_handle, data, - mldl_cfg->slave[EXT_SLAVE_TYPE_COMPASS], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_COMPASS]); -} - -static inline int inv_mpu_get_pressure_config(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *pressure_handle, - struct ext_slave_config *data) -{ - if (!mldl_cfg || !(mldl_cfg->pdata)) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - return inv_mpu_get_slave_config( - mldl_cfg, gyro_handle, pressure_handle, data, - mldl_cfg->slave[EXT_SLAVE_TYPE_PRESSURE], - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_PRESSURE]); -} - -/* -------------------------------------------------------------------------- */ - -static inline -long inv_mpu_get_sampling_rate_hz(struct mpu_gyro_cfg *gyro_cfg) -{ - if (((gyro_cfg->lpf) == 0) || ((gyro_cfg->lpf) == 7)) - return 8000L / (gyro_cfg->divider + 1); - else - return 1000L / (gyro_cfg->divider + 1); -} - -static inline -long inv_mpu_get_sampling_period_us(struct mpu_gyro_cfg *gyro_cfg) -{ - if (((gyro_cfg->lpf) == 0) || ((gyro_cfg->lpf) == 7)) - return (long) (1000000L * (gyro_cfg->divider + 1)) / 8000L; - else - return (long) (1000000L * (gyro_cfg->divider + 1)) / 1000L; -} - -#endif /* __MLDL_CFG_H__ */ - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/mldl_print_cfg.c b/drivers/misc/inv_mpu/mldl_print_cfg.c deleted file mode 100644 index 78d4090..0000000 --- a/drivers/misc/inv_mpu/mldl_print_cfg.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup MLDL - * - * @{ - * @file mldl_print_cfg.c - * @brief The Motion Library Driver Layer. - */ - -#include -#include "mldl_cfg.h" -#include "mlsl.h" -#include - -#include "log.h" -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "mldl_print_cfg:" - -#undef MPL_LOG_NDEBUG -#define MPL_LOG_NDEBUG 1 - -void mldl_print_cfg(struct mldl_cfg *mldl_cfg) -{ - struct mpu_gyro_cfg *mpu_gyro_cfg = mldl_cfg->mpu_gyro_cfg; - struct mpu_offsets *mpu_offsets = mldl_cfg->mpu_offsets; - struct mpu_chip_info *mpu_chip_info = mldl_cfg->mpu_chip_info; - struct inv_mpu_cfg *inv_mpu_cfg = mldl_cfg->inv_mpu_cfg; - struct inv_mpu_state *inv_mpu_state = mldl_cfg->inv_mpu_state; - struct ext_slave_descr **slave = mldl_cfg->slave; - struct mpu_platform_data *pdata = mldl_cfg->pdata; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - /* mpu_gyro_cfg */ - MPL_LOGV("int_config = %02x\n", mpu_gyro_cfg->int_config); - MPL_LOGV("ext_sync = %02x\n", mpu_gyro_cfg->ext_sync); - MPL_LOGV("full_scale = %02x\n", mpu_gyro_cfg->full_scale); - MPL_LOGV("lpf = %02x\n", mpu_gyro_cfg->lpf); - MPL_LOGV("clk_src = %02x\n", mpu_gyro_cfg->clk_src); - MPL_LOGV("divider = %02x\n", mpu_gyro_cfg->divider); - MPL_LOGV("dmp_enable = %02x\n", mpu_gyro_cfg->dmp_enable); - MPL_LOGV("fifo_enable = %02x\n", mpu_gyro_cfg->fifo_enable); - MPL_LOGV("dmp_cfg1 = %02x\n", mpu_gyro_cfg->dmp_cfg1); - MPL_LOGV("dmp_cfg2 = %02x\n", mpu_gyro_cfg->dmp_cfg2); - /* mpu_offsets */ - MPL_LOGV("tc[0] = %02x\n", mpu_offsets->tc[0]); - MPL_LOGV("tc[1] = %02x\n", mpu_offsets->tc[1]); - MPL_LOGV("tc[2] = %02x\n", mpu_offsets->tc[2]); - MPL_LOGV("gyro[0] = %04x\n", mpu_offsets->gyro[0]); - MPL_LOGV("gyro[1] = %04x\n", mpu_offsets->gyro[1]); - MPL_LOGV("gyro[2] = %04x\n", mpu_offsets->gyro[2]); - - /* mpu_chip_info */ - MPL_LOGV("addr = %02x\n", mldl_cfg->mpu_chip_info->addr); - - MPL_LOGV("silicon_revision = %02x\n", mpu_chip_info->silicon_revision); - MPL_LOGV("product_revision = %02x\n", mpu_chip_info->product_revision); - MPL_LOGV("product_id = %02x\n", mpu_chip_info->product_id); - MPL_LOGV("gyro_sens_trim = %02x\n", mpu_chip_info->gyro_sens_trim); - MPL_LOGV("accel_sens_trim = %02x\n", mpu_chip_info->accel_sens_trim); - - MPL_LOGV("requested_sensors = %04x\n", inv_mpu_cfg->requested_sensors); - MPL_LOGV("ignore_system_suspend= %04x\n", - inv_mpu_cfg->ignore_system_suspend); - MPL_LOGV("status = %04x\n", inv_mpu_state->status); - MPL_LOGV("i2c_slaves_enabled= %04x\n", - inv_mpu_state->i2c_slaves_enabled); - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!slave[ii]) - continue; - MPL_LOGV("SLAVE %d:\n", ii); - MPL_LOGV(" suspend = %02x\n", (int)slave[ii]->suspend); - MPL_LOGV(" resume = %02x\n", (int)slave[ii]->resume); - MPL_LOGV(" read = %02x\n", (int)slave[ii]->read); - MPL_LOGV(" type = %02x\n", slave[ii]->type); - MPL_LOGV(" reg = %02x\n", slave[ii]->read_reg); - MPL_LOGV(" len = %02x\n", slave[ii]->read_len); - MPL_LOGV(" endian = %02x\n", slave[ii]->endian); - MPL_LOGV(" range.mantissa= %02x\n", - slave[ii]->range.mantissa); - MPL_LOGV(" range.fraction= %02x\n", - slave[ii]->range.fraction); - } - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - continue; - MPL_LOGV("PDATA_SLAVE[%d]\n", ii); - MPL_LOGV(" irq = %02x\n", pdata_slave[ii]->irq); - MPL_LOGV(" adapt_num = %02x\n", pdata_slave[ii]->adapt_num); - MPL_LOGV(" bus = %02x\n", pdata_slave[ii]->bus); - MPL_LOGV(" address = %02x\n", pdata_slave[ii]->address); - MPL_LOGV(" orientation=\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n", - pdata_slave[ii]->orientation[0], - pdata_slave[ii]->orientation[1], - pdata_slave[ii]->orientation[2], - pdata_slave[ii]->orientation[3], - pdata_slave[ii]->orientation[4], - pdata_slave[ii]->orientation[5], - pdata_slave[ii]->orientation[6], - pdata_slave[ii]->orientation[7], - pdata_slave[ii]->orientation[8]); - } - - MPL_LOGV("pdata->int_config = %02x\n", pdata->int_config); - MPL_LOGV("pdata->level_shifter = %02x\n", pdata->level_shifter); - MPL_LOGV("pdata->orientation =\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n", - pdata->orientation[0], pdata->orientation[1], - pdata->orientation[2], pdata->orientation[3], - pdata->orientation[4], pdata->orientation[5], - pdata->orientation[6], pdata->orientation[7], - pdata->orientation[8]); -} diff --git a/drivers/misc/inv_mpu/mldl_print_cfg.h b/drivers/misc/inv_mpu/mldl_print_cfg.h deleted file mode 100644 index 2e19114..0000000 --- a/drivers/misc/inv_mpu/mldl_print_cfg.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup - * @brief - * - * @{ - * @file mldl_print_cfg.h - * @brief - * - * - */ -#ifndef __MLDL_PRINT_CFG__ -#define __MLDL_PRINT_CFG__ - -#include "mldl_cfg.h" - - -void mldl_print_cfg(struct mldl_cfg *mldl_cfg); - -#endif /* __MLDL_PRINT_CFG__ */ diff --git a/drivers/misc/inv_mpu/mlsl-kernel.c b/drivers/misc/inv_mpu/mlsl-kernel.c deleted file mode 100644 index f1c228f..0000000 --- a/drivers/misc/inv_mpu/mlsl-kernel.c +++ /dev/null @@ -1,420 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#include "mlsl.h" -#include -#include "log.h" -#include "mpu6050b1.h" - -static int inv_i2c_write(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned int len, unsigned char const *data) -{ - struct i2c_msg msgs[1]; - int res; - - if (!data || !i2c_adap) { - LOG_RESULT_LOCATION(-EINVAL); - return -EINVAL; - } - - msgs[0].addr = address; - msgs[0].flags = 0; /* write */ - msgs[0].buf = (unsigned char *)data; - msgs[0].len = len; - - res = i2c_transfer(i2c_adap, msgs, 1); - if (res < 1) { - if (res == 0) - res = -EIO; - LOG_RESULT_LOCATION(res); - return res; - } else - return 0; -} - -static int inv_i2c_write_register(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned char reg, unsigned char value) -{ - unsigned char data[2]; - - data[0] = reg; - data[1] = value; - return inv_i2c_write(i2c_adap, address, 2, data); -} - -static int inv_i2c_read(struct i2c_adapter *i2c_adap, - unsigned char address, unsigned char reg, - unsigned int len, unsigned char *data) -{ - struct i2c_msg msgs[2]; - int res; - - if (!data || !i2c_adap) { - LOG_RESULT_LOCATION(-EINVAL); - return -EINVAL; - } - - msgs[0].addr = address; - msgs[0].flags = 0; /* write */ - msgs[0].buf = ® - msgs[0].len = 1; - - msgs[1].addr = address; - msgs[1].flags = I2C_M_RD; - msgs[1].buf = data; - msgs[1].len = len; - - res = i2c_transfer(i2c_adap, msgs, 2); - if (res < 2) { - if (res >= 0) - res = -EIO; - LOG_RESULT_LOCATION(res); - return res; - } else - return 0; -} - -static int mpu_memory_read(struct i2c_adapter *i2c_adap, - unsigned char mpu_addr, - unsigned short mem_addr, - unsigned int len, unsigned char *data) -{ - unsigned char bank[2]; - unsigned char addr[2]; - unsigned char buf; - - struct i2c_msg msgs[4]; - int res; - - if (!data || !i2c_adap) { - LOG_RESULT_LOCATION(-EINVAL); - return -EINVAL; - } - - bank[0] = MPUREG_BANK_SEL; - bank[1] = mem_addr >> 8; - - addr[0] = MPUREG_MEM_START_ADDR; - addr[1] = mem_addr & 0xFF; - - buf = MPUREG_MEM_R_W; - - /* write message */ - msgs[0].addr = mpu_addr; - msgs[0].flags = 0; - msgs[0].buf = bank; - msgs[0].len = sizeof(bank); - - msgs[1].addr = mpu_addr; - msgs[1].flags = 0; - msgs[1].buf = addr; - msgs[1].len = sizeof(addr); - - msgs[2].addr = mpu_addr; - msgs[2].flags = 0; - msgs[2].buf = &buf; - msgs[2].len = 1; - - msgs[3].addr = mpu_addr; - msgs[3].flags = I2C_M_RD; - msgs[3].buf = data; - msgs[3].len = len; - - res = i2c_transfer(i2c_adap, msgs, 4); - if (res != 4) { - if (res >= 0) - res = -EIO; - LOG_RESULT_LOCATION(res); - return res; - } else - return 0; -} - -static int mpu_memory_write(struct i2c_adapter *i2c_adap, - unsigned char mpu_addr, - unsigned short mem_addr, - unsigned int len, unsigned char const *data) -{ - unsigned char bank[2]; - unsigned char addr[2]; - unsigned char buf[513]; - - struct i2c_msg msgs[3]; - int res; - - if (!data || !i2c_adap) { - LOG_RESULT_LOCATION(-EINVAL); - return -EINVAL; - } - if (len >= (sizeof(buf) - 1)) { - LOG_RESULT_LOCATION(-ENOMEM); - return -ENOMEM; - } - - bank[0] = MPUREG_BANK_SEL; - bank[1] = mem_addr >> 8; - - addr[0] = MPUREG_MEM_START_ADDR; - addr[1] = mem_addr & 0xFF; - - buf[0] = MPUREG_MEM_R_W; - memcpy(buf + 1, data, len); - - /* write message */ - msgs[0].addr = mpu_addr; - msgs[0].flags = 0; - msgs[0].buf = bank; - msgs[0].len = sizeof(bank); - - msgs[1].addr = mpu_addr; - msgs[1].flags = 0; - msgs[1].buf = addr; - msgs[1].len = sizeof(addr); - - msgs[2].addr = mpu_addr; - msgs[2].flags = 0; - msgs[2].buf = (unsigned char *)buf; - msgs[2].len = len + 1; - - res = i2c_transfer(i2c_adap, msgs, 3); - if (res != 3) { - if (res >= 0) - res = -EIO; - LOG_RESULT_LOCATION(res); - return res; - } else - return 0; -} - -int inv_serial_single_write( - void *sl_handle, - unsigned char slave_addr, - unsigned char register_addr, - unsigned char data) -{ - return inv_i2c_write_register((struct i2c_adapter *)sl_handle, - slave_addr, register_addr, data); -} -EXPORT_SYMBOL(inv_serial_single_write); - -int inv_serial_write( - void *sl_handle, - unsigned char slave_addr, - unsigned short length, - unsigned char const *data) -{ - int result; - const unsigned short data_length = length - 1; - const unsigned char start_reg_addr = data[0]; - unsigned char i2c_write[SERIAL_MAX_TRANSFER_SIZE + 1]; - unsigned short bytes_written = 0; - - while (bytes_written < data_length) { - unsigned short this_len = min(SERIAL_MAX_TRANSFER_SIZE, - data_length - bytes_written); - if (bytes_written == 0) { - result = inv_i2c_write((struct i2c_adapter *) - sl_handle, slave_addr, - 1 + this_len, data); - } else { - /* manually increment register addr between chunks */ - i2c_write[0] = start_reg_addr + bytes_written; - memcpy(&i2c_write[1], &data[1 + bytes_written], - this_len); - result = inv_i2c_write((struct i2c_adapter *) - sl_handle, slave_addr, - 1 + this_len, i2c_write); - } - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - bytes_written += this_len; - } - return 0; -} -EXPORT_SYMBOL(inv_serial_write); - -int inv_serial_read( - void *sl_handle, - unsigned char slave_addr, - unsigned char register_addr, - unsigned short length, - unsigned char *data) -{ - int result; - unsigned short bytes_read = 0; - - if ((slave_addr & 0x7E) == DEFAULT_MPU_SLAVEADDR - && (register_addr == MPUREG_FIFO_R_W || - register_addr == MPUREG_MEM_R_W)) { - LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER); - return INV_ERROR_INVALID_PARAMETER; - } - - while (bytes_read < length) { - unsigned short this_len = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytes_read); - result = inv_i2c_read((struct i2c_adapter *)sl_handle, - slave_addr, register_addr + bytes_read, - this_len, &data[bytes_read]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - bytes_read += this_len; - } - return 0; -} -EXPORT_SYMBOL(inv_serial_read); - -int inv_serial_write_mem( - void *sl_handle, - unsigned char slave_addr, - unsigned short mem_addr, - unsigned short length, - unsigned char const *data) -{ - int result; - unsigned short bytes_written = 0; - - if ((mem_addr & 0xFF) + length > MPU_MEM_BANK_SIZE) { - pr_err("memory read length (%d B) extends beyond its" - " limits (%d) if started at location %d\n", length, - MPU_MEM_BANK_SIZE, mem_addr & 0xFF); - return INV_ERROR_INVALID_PARAMETER; - } - while (bytes_written < length) { - unsigned short this_len = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytes_written); - result = mpu_memory_write((struct i2c_adapter *)sl_handle, - slave_addr, mem_addr + bytes_written, - this_len, &data[bytes_written]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - bytes_written += this_len; - } - return 0; -} -EXPORT_SYMBOL(inv_serial_write_mem); - -int inv_serial_read_mem( - void *sl_handle, - unsigned char slave_addr, - unsigned short mem_addr, - unsigned short length, - unsigned char *data) -{ - int result; - unsigned short bytes_read = 0; - - if ((mem_addr & 0xFF) + length > MPU_MEM_BANK_SIZE) { - printk - ("memory read length (%d B) extends beyond its limits (%d) " - "if started at location %d\n", length, - MPU_MEM_BANK_SIZE, mem_addr & 0xFF); - return INV_ERROR_INVALID_PARAMETER; - } - while (bytes_read < length) { - unsigned short this_len = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytes_read); - result = - mpu_memory_read((struct i2c_adapter *)sl_handle, - slave_addr, mem_addr + bytes_read, - this_len, &data[bytes_read]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - bytes_read += this_len; - } - return 0; -} -EXPORT_SYMBOL(inv_serial_read_mem); - -int inv_serial_write_fifo( - void *sl_handle, - unsigned char slave_addr, - unsigned short length, - unsigned char const *data) -{ - int result; - unsigned char i2c_write[SERIAL_MAX_TRANSFER_SIZE + 1]; - unsigned short bytes_written = 0; - - if (length > FIFO_HW_SIZE) { - printk(KERN_ERR - "maximum fifo write length is %d\n", FIFO_HW_SIZE); - return INV_ERROR_INVALID_PARAMETER; - } - while (bytes_written < length) { - unsigned short this_len = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytes_written); - i2c_write[0] = MPUREG_FIFO_R_W; - memcpy(&i2c_write[1], &data[bytes_written], this_len); - result = inv_i2c_write((struct i2c_adapter *)sl_handle, - slave_addr, this_len + 1, i2c_write); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - bytes_written += this_len; - } - return 0; -} -EXPORT_SYMBOL(inv_serial_write_fifo); - -int inv_serial_read_fifo( - void *sl_handle, - unsigned char slave_addr, - unsigned short length, - unsigned char *data) -{ - int result; - unsigned short bytes_read = 0; - - if (length > FIFO_HW_SIZE) { - printk(KERN_ERR - "maximum fifo read length is %d\n", FIFO_HW_SIZE); - return INV_ERROR_INVALID_PARAMETER; - } - while (bytes_read < length) { - unsigned short this_len = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytes_read); - result = inv_i2c_read((struct i2c_adapter *)sl_handle, - slave_addr, MPUREG_FIFO_R_W, this_len, - &data[bytes_read]); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - bytes_read += this_len; - } - - return 0; -} -EXPORT_SYMBOL(inv_serial_read_fifo); - -/** - * @} - */ diff --git a/drivers/misc/inv_mpu/mlsl.h b/drivers/misc/inv_mpu/mlsl.h deleted file mode 100644 index 3fc6be9..0000000 --- a/drivers/misc/inv_mpu/mlsl.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef __MLSL_H__ -#define __MLSL_H__ - -/** - * @defgroup MLSL - * @brief Motion Library - Serial Layer. - * The Motion Library System Layer provides the Motion Library - * with the communication interface to the hardware. - * - * The communication interface is assumed to support serial - * transfers in burst of variable length up to - * SERIAL_MAX_TRANSFER_SIZE. - * The default value for SERIAL_MAX_TRANSFER_SIZE is 128 bytes. - * Transfers of length greater than SERIAL_MAX_TRANSFER_SIZE, will - * be subdivided in smaller transfers of length <= - * SERIAL_MAX_TRANSFER_SIZE. - * The SERIAL_MAX_TRANSFER_SIZE definition can be modified to - * overcome any host processor transfer size limitation down to - * 1 B, the minimum. - * An higher value for SERIAL_MAX_TRANSFER_SIZE will favor - * performance and efficiency while requiring higher resource usage - * (mostly buffering). A smaller value will increase overhead and - * decrease efficiency but allows to operate with more resource - * constrained processor and master serial controllers. - * The SERIAL_MAX_TRANSFER_SIZE definition can be found in the - * mlsl.h header file and master serial controllers. - * The SERIAL_MAX_TRANSFER_SIZE definition can be found in the - * mlsl.h header file. - * - * @{ - * @file mlsl.h - * @brief The Motion Library System Layer. - * - */ - -#include "mltypes.h" -#include - - -/* acceleration data */ -struct acc_data { - s16 x; - s16 y; - s16 z; -}; - -/* - * NOTE : to properly support Yamaha compass reads, - * the max transfer size should be at least 9 B. - * Length in bytes, typically a power of 2 >= 2 - */ -#define SERIAL_MAX_TRANSFER_SIZE 128 - - -/** - * inv_serial_single_write() - used to write a single byte of data. - * @sl_handle pointer to the serial device used for the communication. - * @slave_addr I2C slave address of device. - * @register_addr Register address to write. - * @data Single byte of data to write. - * - * It is called by the MPL to write a single byte of data to the MPU. - * - * returns INV_SUCCESS if successful, a non-zero error code otherwise. - */ -int inv_serial_single_write( - void *sl_handle, - unsigned char slave_addr, - unsigned char register_addr, - unsigned char data); - -/** - * inv_serial_write() - used to write multiple bytes of data to registers. - * @sl_handle a file handle to the serial device used for the communication. - * @slave_addr I2C slave address of device. - * @register_addr Register address to write. - * @length Length of burst of data. - * @data Pointer to block of data. - * - * returns INV_SUCCESS if successful, a non-zero error code otherwise. - */ -int inv_serial_write( - void *sl_handle, - unsigned char slave_addr, - unsigned short length, - unsigned char const *data); - -/** - * inv_serial_read() - used to read multiple bytes of data from registers. - * @sl_handle a file handle to the serial device used for the communication. - * @slave_addr I2C slave address of device. - * @register_addr Register address to read. - * @length Length of burst of data. - * @data Pointer to block of data. - * - * returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise. - */ -int inv_serial_read( - void *sl_handle, - unsigned char slave_addr, - unsigned char register_addr, - unsigned short length, - unsigned char *data); - -/** - * inv_serial_read_mem() - used to read multiple bytes of data from the memory. - * This should be sent by I2C or SPI. - * - * @sl_handle a file handle to the serial device used for the communication. - * @slave_addr I2C slave address of device. - * @mem_addr The location in the memory to read from. - * @length Length of burst data. - * @data Pointer to block of data. - * - * returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise. - */ -int inv_serial_read_mem( - void *sl_handle, - unsigned char slave_addr, - unsigned short mem_addr, - unsigned short length, - unsigned char *data); - -/** - * inv_serial_write_mem() - used to write multiple bytes of data to the memory. - * @sl_handle a file handle to the serial device used for the communication. - * @slave_addr I2C slave address of device. - * @mem_addr The location in the memory to write to. - * @length Length of burst data. - * @data Pointer to block of data. - * - * returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise. - */ -int inv_serial_write_mem( - void *sl_handle, - unsigned char slave_addr, - unsigned short mem_addr, - unsigned short length, - unsigned char const *data); - -/** - * inv_serial_read_fifo() - used to read multiple bytes of data from the fifo. - * @sl_handle a file handle to the serial device used for the communication. - * @slave_addr I2C slave address of device. - * @length Length of burst of data. - * @data Pointer to block of data. - * - * returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise. - */ -int inv_serial_read_fifo( - void *sl_handle, - unsigned char slave_addr, - unsigned short length, - unsigned char *data); - -/** - * inv_serial_write_fifo() - used to write multiple bytes of data to the fifo. - * @sl_handle a file handle to the serial device used for the communication. - * @slave_addr I2C slave address of device. - * @length Length of burst of data. - * @data Pointer to block of data. - * - * returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise. - */ -int inv_serial_write_fifo( - void *sl_handle, - unsigned char slave_addr, - unsigned short length, - unsigned char const *data); - -/** - * @} - */ -#endif /* __MLSL_H__ */ diff --git a/drivers/misc/inv_mpu/mltypes.h b/drivers/misc/inv_mpu/mltypes.h deleted file mode 100644 index a249f93..0000000 --- a/drivers/misc/inv_mpu/mltypes.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup MLERROR - * @brief Definition of the error codes used within the MPL and - * returned to the user. - * Every function tries to return a meaningful error code basing - * on the occuring error condition. The error code is numeric. - * - * The available error codes and their associated values are: - * - (0) INV_SUCCESS - * - (32) INV_ERROR - * - (22 / EINVAL) INV_ERROR_INVALID_PARAMETER - * - (1 / EPERM) INV_ERROR_FEATURE_NOT_ENABLED - * - (36) INV_ERROR_FEATURE_NOT_IMPLEMENTED - * - (38) INV_ERROR_DMP_NOT_STARTED - * - (39) INV_ERROR_DMP_STARTED - * - (40) INV_ERROR_NOT_OPENED - * - (41) INV_ERROR_OPENED - * - (19 / ENODEV) INV_ERROR_INVALID_MODULE - * - (12 / ENOMEM) INV_ERROR_MEMORY_EXAUSTED - * - (44) INV_ERROR_DIVIDE_BY_ZERO - * - (45) INV_ERROR_ASSERTION_FAILURE - * - (46) INV_ERROR_FILE_OPEN - * - (47) INV_ERROR_FILE_READ - * - (48) INV_ERROR_FILE_WRITE - * - (49) INV_ERROR_INVALID_CONFIGURATION - * - (52) INV_ERROR_SERIAL_CLOSED - * - (53) INV_ERROR_SERIAL_OPEN_ERROR - * - (54) INV_ERROR_SERIAL_READ - * - (55) INV_ERROR_SERIAL_WRITE - * - (56) INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED - * - (57) INV_ERROR_SM_TRANSITION - * - (58) INV_ERROR_SM_IMPROPER_STATE - * - (62) INV_ERROR_FIFO_OVERFLOW - * - (63) INV_ERROR_FIFO_FOOTER - * - (64) INV_ERROR_FIFO_READ_COUNT - * - (65) INV_ERROR_FIFO_READ_DATA - * - (72) INV_ERROR_MEMORY_SET - * - (82) INV_ERROR_LOG_MEMORY_ERROR - * - (83) INV_ERROR_LOG_OUTPUT_ERROR - * - (92) INV_ERROR_OS_BAD_PTR - * - (93) INV_ERROR_OS_BAD_HANDLE - * - (94) INV_ERROR_OS_CREATE_FAILED - * - (95) INV_ERROR_OS_LOCK_FAILED - * - (102) INV_ERROR_COMPASS_DATA_OVERFLOW - * - (103) INV_ERROR_COMPASS_DATA_UNDERFLOW - * - (104) INV_ERROR_COMPASS_DATA_NOT_READY - * - (105) INV_ERROR_COMPASS_DATA_ERROR - * - (107) INV_ERROR_CALIBRATION_LOAD - * - (108) INV_ERROR_CALIBRATION_STORE - * - (109) INV_ERROR_CALIBRATION_LEN - * - (110) INV_ERROR_CALIBRATION_CHECKSUM - * - (111) INV_ERROR_ACCEL_DATA_OVERFLOW - * - (112) INV_ERROR_ACCEL_DATA_UNDERFLOW - * - (113) INV_ERROR_ACCEL_DATA_NOT_READY - * - (114) INV_ERROR_ACCEL_DATA_ERROR - * - * The available warning codes and their associated values are: - * - (115) INV_WARNING_MOTION_RACE - * - (116) INV_WARNING_QUAT_TRASHED - * - * @{ - * @file mltypes.h - * @} - */ - -#ifndef MLTYPES_H -#define MLTYPES_H - -#include -#include - - - - -/*--------------------------- - * ML Defines - *--------------------------*/ - -#ifndef NULL -#define NULL 0 -#endif - -/* - ML Errors. - */ -#define ERROR_NAME(x) (#x) -#define ERROR_CHECK_FIRST(first, x) \ - { if (INV_SUCCESS == first) first = x; } - -#define INV_SUCCESS (0) -/* Generic Error code. Proprietary Error Codes only */ -#define INV_ERROR_BASE (0x20) -#define INV_ERROR (INV_ERROR_BASE) - -/* Compatibility and other generic error codes */ -#define INV_ERROR_INVALID_PARAMETER (EINVAL) -#define INV_ERROR_FEATURE_NOT_ENABLED (EPERM) -#define INV_ERROR_FEATURE_NOT_IMPLEMENTED (INV_ERROR_BASE + 4) -#define INV_ERROR_DMP_NOT_STARTED (INV_ERROR_BASE + 6) -#define INV_ERROR_DMP_STARTED (INV_ERROR_BASE + 7) -#define INV_ERROR_NOT_OPENED (INV_ERROR_BASE + 8) -#define INV_ERROR_OPENED (INV_ERROR_BASE + 9) -#define INV_ERROR_INVALID_MODULE (ENODEV) -#define INV_ERROR_MEMORY_EXAUSTED (ENOMEM) -#define INV_ERROR_DIVIDE_BY_ZERO (INV_ERROR_BASE + 12) -#define INV_ERROR_ASSERTION_FAILURE (INV_ERROR_BASE + 13) -#define INV_ERROR_FILE_OPEN (INV_ERROR_BASE + 14) -#define INV_ERROR_FILE_READ (INV_ERROR_BASE + 15) -#define INV_ERROR_FILE_WRITE (INV_ERROR_BASE + 16) -#define INV_ERROR_INVALID_CONFIGURATION (INV_ERROR_BASE + 17) - -/* Serial Communication */ -#define INV_ERROR_SERIAL_CLOSED (INV_ERROR_BASE + 20) -#define INV_ERROR_SERIAL_OPEN_ERROR (INV_ERROR_BASE + 21) -#define INV_ERROR_SERIAL_READ (INV_ERROR_BASE + 22) -#define INV_ERROR_SERIAL_WRITE (INV_ERROR_BASE + 23) -#define INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED (INV_ERROR_BASE + 24) - -/* SM = State Machine */ -#define INV_ERROR_SM_TRANSITION (INV_ERROR_BASE + 25) -#define INV_ERROR_SM_IMPROPER_STATE (INV_ERROR_BASE + 26) - -/* Fifo */ -#define INV_ERROR_FIFO_OVERFLOW (INV_ERROR_BASE + 30) -#define INV_ERROR_FIFO_FOOTER (INV_ERROR_BASE + 31) -#define INV_ERROR_FIFO_READ_COUNT (INV_ERROR_BASE + 32) -#define INV_ERROR_FIFO_READ_DATA (INV_ERROR_BASE + 33) - -/* Memory & Registers, Set & Get */ -#define INV_ERROR_MEMORY_SET (INV_ERROR_BASE + 40) - -#define INV_ERROR_LOG_MEMORY_ERROR (INV_ERROR_BASE + 50) -#define INV_ERROR_LOG_OUTPUT_ERROR (INV_ERROR_BASE + 51) - -/* OS interface errors */ -#define INV_ERROR_OS_BAD_PTR (INV_ERROR_BASE + 60) -#define INV_ERROR_OS_BAD_HANDLE (INV_ERROR_BASE + 61) -#define INV_ERROR_OS_CREATE_FAILED (INV_ERROR_BASE + 62) -#define INV_ERROR_OS_LOCK_FAILED (INV_ERROR_BASE + 63) - -/* Compass errors */ -#define INV_ERROR_COMPASS_DATA_OVERFLOW (INV_ERROR_BASE + 70) -#define INV_ERROR_COMPASS_DATA_UNDERFLOW (INV_ERROR_BASE + 71) -#define INV_ERROR_COMPASS_DATA_NOT_READY (INV_ERROR_BASE + 72) -#define INV_ERROR_COMPASS_DATA_ERROR (INV_ERROR_BASE + 73) - -/* Load/Store calibration */ -#define INV_ERROR_CALIBRATION_LOAD (INV_ERROR_BASE + 75) -#define INV_ERROR_CALIBRATION_STORE (INV_ERROR_BASE + 76) -#define INV_ERROR_CALIBRATION_LEN (INV_ERROR_BASE + 77) -#define INV_ERROR_CALIBRATION_CHECKSUM (INV_ERROR_BASE + 78) - -/* Accel errors */ -#define INV_ERROR_ACCEL_DATA_OVERFLOW (INV_ERROR_BASE + 79) -#define INV_ERROR_ACCEL_DATA_UNDERFLOW (INV_ERROR_BASE + 80) -#define INV_ERROR_ACCEL_DATA_NOT_READY (INV_ERROR_BASE + 81) -#define INV_ERROR_ACCEL_DATA_ERROR (INV_ERROR_BASE + 82) - -/* No Motion Warning States */ -#define INV_WARNING_MOTION_RACE (INV_ERROR_BASE + 83) -#define INV_WARNING_QUAT_TRASHED (INV_ERROR_BASE + 84) -#define INV_WARNING_GYRO_MAG (INV_ERROR_BASE + 85) - -#ifdef INV_USE_LEGACY_NAMES -#define ML_SUCCESS INV_SUCCESS -#define ML_ERROR INV_ERROR -#define ML_ERROR_INVALID_PARAMETER INV_ERROR_INVALID_PARAMETER -#define ML_ERROR_FEATURE_NOT_ENABLED INV_ERROR_FEATURE_NOT_ENABLED -#define ML_ERROR_FEATURE_NOT_IMPLEMENTED INV_ERROR_FEATURE_NOT_IMPLEMENTED -#define ML_ERROR_DMP_NOT_STARTED INV_ERROR_DMP_NOT_STARTED -#define ML_ERROR_DMP_STARTED INV_ERROR_DMP_STARTED -#define ML_ERROR_NOT_OPENED INV_ERROR_NOT_OPENED -#define ML_ERROR_OPENED INV_ERROR_OPENED -#define ML_ERROR_INVALID_MODULE INV_ERROR_INVALID_MODULE -#define ML_ERROR_MEMORY_EXAUSTED INV_ERROR_MEMORY_EXAUSTED -#define ML_ERROR_DIVIDE_BY_ZERO INV_ERROR_DIVIDE_BY_ZERO -#define ML_ERROR_ASSERTION_FAILURE INV_ERROR_ASSERTION_FAILURE -#define ML_ERROR_FILE_OPEN INV_ERROR_FILE_OPEN -#define ML_ERROR_FILE_READ INV_ERROR_FILE_READ -#define ML_ERROR_FILE_WRITE INV_ERROR_FILE_WRITE -#define ML_ERROR_INVALID_CONFIGURATION INV_ERROR_INVALID_CONFIGURATION -#define ML_ERROR_SERIAL_CLOSED INV_ERROR_SERIAL_CLOSED -#define ML_ERROR_SERIAL_OPEN_ERROR INV_ERROR_SERIAL_OPEN_ERROR -#define ML_ERROR_SERIAL_READ INV_ERROR_SERIAL_READ -#define ML_ERROR_SERIAL_WRITE INV_ERROR_SERIAL_WRITE -#define ML_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED \ - INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED -#define ML_ERROR_SM_TRANSITION INV_ERROR_SM_TRANSITION -#define ML_ERROR_SM_IMPROPER_STATE INV_ERROR_SM_IMPROPER_STATE -#define ML_ERROR_FIFO_OVERFLOW INV_ERROR_FIFO_OVERFLOW -#define ML_ERROR_FIFO_FOOTER INV_ERROR_FIFO_FOOTER -#define ML_ERROR_FIFO_READ_COUNT INV_ERROR_FIFO_READ_COUNT -#define ML_ERROR_FIFO_READ_DATA INV_ERROR_FIFO_READ_DATA -#define ML_ERROR_MEMORY_SET INV_ERROR_MEMORY_SET -#define ML_ERROR_LOG_MEMORY_ERROR INV_ERROR_LOG_MEMORY_ERROR -#define ML_ERROR_LOG_OUTPUT_ERROR INV_ERROR_LOG_OUTPUT_ERROR -#define ML_ERROR_OS_BAD_PTR INV_ERROR_OS_BAD_PTR -#define ML_ERROR_OS_BAD_HANDLE INV_ERROR_OS_BAD_HANDLE -#define ML_ERROR_OS_CREATE_FAILED INV_ERROR_OS_CREATE_FAILED -#define ML_ERROR_OS_LOCK_FAILED INV_ERROR_OS_LOCK_FAILED -#define ML_ERROR_COMPASS_DATA_OVERFLOW INV_ERROR_COMPASS_DATA_OVERFLOW -#define ML_ERROR_COMPASS_DATA_UNDERFLOW INV_ERROR_COMPASS_DATA_UNDERFLOW -#define ML_ERROR_COMPASS_DATA_NOT_READY INV_ERROR_COMPASS_DATA_NOT_READY -#define ML_ERROR_COMPASS_DATA_ERROR INV_ERROR_COMPASS_DATA_ERROR -#define ML_ERROR_CALIBRATION_LOAD INV_ERROR_CALIBRATION_LOAD -#define ML_ERROR_CALIBRATION_STORE INV_ERROR_CALIBRATION_STORE -#define ML_ERROR_CALIBRATION_LEN INV_ERROR_CALIBRATION_LEN -#define ML_ERROR_CALIBRATION_CHECKSUM INV_ERROR_CALIBRATION_CHECKSUM -#define ML_ERROR_ACCEL_DATA_OVERFLOW INV_ERROR_ACCEL_DATA_OVERFLOW -#define ML_ERROR_ACCEL_DATA_UNDERFLOW INV_ERROR_ACCEL_DATA_UNDERFLOW -#define ML_ERROR_ACCEL_DATA_NOT_READY INV_ERROR_ACCEL_DATA_NOT_READY -#define ML_ERROR_ACCEL_DATA_ERROR INV_ERROR_ACCEL_DATA_ERROR -#endif - -/* For Linux coding compliance */ - -#endif /* MLTYPES_H */ diff --git a/drivers/misc/inv_mpu/mpu-dev.c b/drivers/misc/inv_mpu/mpu-dev.c deleted file mode 100644 index c025f50..0000000 --- a/drivers/misc/inv_mpu/mpu-dev.c +++ /dev/null @@ -1,2348 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "mpuirq.h" -#include "slaveirq.h" -#include "mlsl.h" -#include "mldl_cfg.h" -#include - -#include "accel/mpu6050.h" -#include "mpu-dev.h" - - -#ifdef CONFIG_INPUT_YAS_MAGNETOMETER -#include "compass/yas530_ext.h" -#endif - -#include - -#ifdef CONFIG_HAS_EARLYSUSPEND -#include -#endif - -#define MAG_VENDOR "AKM" -#define MAG_PART_ID "AK8963C" -#define MPU_VENDOR "INVENSENSE" -#define MPU_PART_ID "MPU-6050" - -#define MPU_EARLY_SUSPEND_IN_DRIVER 1 - - -#define CALIBRATION_FILE_PATH "/efs/calibration_data" -#define CALIBRATION_DATA_AMOUNT 100 - -struct acc_data cal_data = {0, 0, 0}; - - - -/* Platform data for the MPU */ -struct mpu_private_data { - struct miscdevice dev; - struct i2c_client *client; - - /* mldl_cfg data */ - struct mldl_cfg mldl_cfg; - struct mpu_ram mpu_ram; - struct mpu_gyro_cfg mpu_gyro_cfg; - struct mpu_offsets mpu_offsets; - struct mpu_chip_info mpu_chip_info; - struct inv_mpu_cfg inv_mpu_cfg; - struct inv_mpu_state inv_mpu_state; - - struct mutex mutex; - wait_queue_head_t mpu_event_wait; - struct completion completion; - struct timer_list timeout; - struct notifier_block nb; - struct mpuirq_data mpu_pm_event; - int response_timeout; - unsigned long event; - int pid; - struct module *slave_modules[EXT_SLAVE_NUM_TYPES]; - struct { - atomic_t enable; - unsigned char is_activated; - unsigned char turned_by_mpu_accel; - } mpu_accel; -#ifdef CONFIG_HAS_EARLYSUSPEND - struct early_suspend early_suspend; -#endif -}; - -static struct i2c_client *this_client; - -#define IDEAL_X 0 -#define IDEAL_Y 0 -#define IDEAL_Z -1024 -/*#define CAL_DIV 8*/ -static int CAL_DIV = 8; - -struct mpu_private_data *mpu_data; - -void mpu_accel_enable_set(int enable) -{ - - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - if (enable) { - mpu->mpu_accel.is_activated = - !(mldl_cfg->inv_mpu_state->status - & MPU_ACCEL_IS_SUSPENDED); - - (void)inv_mpu_resume(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - INV_THREE_AXIS_ACCEL); - - mpu->mpu_accel.turned_by_mpu_accel = 1; - } else { - if (!mpu->mpu_accel.is_activated - && mpu->mpu_accel.turned_by_mpu_accel) { - - (void)inv_mpu_suspend(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - INV_THREE_AXIS_ACCEL); - - mpu->mpu_accel.turned_by_mpu_accel = 0; - } - } - - atomic_set(&mpu->mpu_accel.enable, enable); -} - -int read_accel_raw_xyz(struct acc_data *acc) -{ - s16 x, y, z; - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - int retval = 0; - unsigned char data[6]; - - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - - retval = inv_serial_read(slave_adapter[EXT_SLAVE_TYPE_ACCEL], - 0x68, 0x3B, 6, data); - - if (mldl_cfg->mpu_chip_info->accel_sens_trim == 16384) - CAL_DIV = 16; - x = (s16)((data[0] << 8) | data[1])/CAL_DIV; - y = (s16)((data[2] << 8) | data[3])/CAL_DIV; - z = (s16)((data[4] << 8) | data[5])/CAL_DIV; - - acc->x = x; - - acc->y = y; - - acc->z = z; - - /* - pr_info("read_accel_raw_xyz acc x: %d y: %d z: %d", - acc->x,acc->y,acc->z); - */ - return 0; -} - -static int accel_open_calibration(void) -{ - struct file *cal_filp = NULL; - int err = 0; - mm_segment_t old_fs; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - - cal_filp = filp_open(CALIBRATION_FILE_PATH, O_RDONLY, 0666); - if (IS_ERR(cal_filp)) { - pr_err("%s: Can't open calibration file", __func__); - set_fs(old_fs); - err = PTR_ERR(cal_filp); - return err; - } - - err = cal_filp->f_op->read(cal_filp, - (char *)&cal_data, 3 * sizeof(s16), &cal_filp->f_pos); - if (err != 3 * sizeof(s16)) { - pr_err("%s: Can't read the cal data from file", __func__); - err = -EIO; - } - - pr_info("%s: (%u,%u,%u)", __func__, - cal_data.x, cal_data.y, cal_data.z); - - filp_close(cal_filp, current->files); - set_fs(old_fs); - - return err; -} - -static int accel_do_calibrate(int enable) -{ - struct acc_data data = { 0, }; - struct file *cal_filp = NULL; - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - /* struct i2c_client *client = mpu->client; */ - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - - int sum[3] = { 0, }; - int err = 0; - int i; - mm_segment_t old_fs; - - /* mutex_lock(&mpu->mutex); */ - mpu_accel_enable_set(1); - msleep(20); - - for (i = 0; i < CALIBRATION_DATA_AMOUNT; i++) { - err = read_accel_raw_xyz(&data); - if (err < 0) { - pr_err("%s: accel_read_accel_raw_xyz() " - "failed in the %dth loop", __func__, i); - return err; - } - - sum[0] += data.x; - sum[1] += data.y; - sum[2] += data.z; - } - - mpu_accel_enable_set(0); - msleep(20); - /* mutex_unlock(&mpu->mutex); */ - - if (mldl_cfg->mpu_chip_info->accel_sens_trim == 16384) - CAL_DIV = 16; - - if (enable) { - cal_data.x = ((sum[0] / CALIBRATION_DATA_AMOUNT) - - IDEAL_X)*CAL_DIV; - cal_data.y = ((sum[1] / CALIBRATION_DATA_AMOUNT) - - IDEAL_Y)*CAL_DIV; - cal_data.z = ((sum[2] / CALIBRATION_DATA_AMOUNT) - - IDEAL_Z)*CAL_DIV; - } else { - cal_data.x = 0; - cal_data.y = 0; - cal_data.z = 0; - } - - pr_info("%s: cal data (%d,%d,%d)", __func__, - cal_data.x, cal_data.y, cal_data.z); - - old_fs = get_fs(); - set_fs(KERNEL_DS); - - cal_filp = filp_open(CALIBRATION_FILE_PATH, - O_CREAT | O_TRUNC | O_WRONLY, 0666); - if (IS_ERR(cal_filp)) { - pr_err("%s: Can't open calibration file", __func__); - set_fs(old_fs); - err = PTR_ERR(cal_filp); - return err; - } - - err = cal_filp->f_op->write(cal_filp, - (char *)&cal_data, 3 * sizeof(s16), &cal_filp->f_pos); - if (err != 3 * sizeof(s16)) { - pr_err("%s: Can't write the cal data to file", __func__); - err = -EIO; - } - - filp_close(cal_filp, current->files); - set_fs(old_fs); - - return err; -} - -static void mpu_pm_timeout(u_long data) -{ - struct mpu_private_data *mpu = (struct mpu_private_data *)data; - struct i2c_client *client = mpu->client; - dev_dbg(&client->adapter->dev, "%s", __func__); - complete(&mpu->completion); -} -#if 0 -static int mpu_pm_notifier_callback(struct notifier_block *nb, - unsigned long event, void *unused) -{ - struct mpu_private_data *mpu = - container_of(nb, struct mpu_private_data, nb); - struct i2c_client *client = mpu->client; - struct timeval event_time; - dev_dbg(&client->adapter->dev, "%s: %ld", __func__, event); - - /* Prevent the file handle from being closed before we initialize - the completion event */ - pr_info("[%s] event = %ld", __func__, event); - mutex_lock(&mpu->mutex); - if (!(mpu->pid) || - (event != PM_SUSPEND_PREPARE && event != PM_POST_SUSPEND)) { - mutex_unlock(&mpu->mutex); - return NOTIFY_OK; - } - - if (event == PM_SUSPEND_PREPARE) - mpu->event = MPU_PM_EVENT_SUSPEND_PREPARE; - if (event == PM_POST_SUSPEND) - mpu->event = MPU_PM_EVENT_POST_SUSPEND; - - do_gettimeofday(&event_time); - mpu->mpu_pm_event.interruptcount++; - mpu->mpu_pm_event.irqtime = - (((long long)event_time.tv_sec) << 32) + event_time.tv_usec; - mpu->mpu_pm_event.data_type = MPUIRQ_DATA_TYPE_PM_EVENT; - mpu->mpu_pm_event.data = mpu->event; - - if (mpu->response_timeout > 0) { - mpu->timeout.expires = jiffies + mpu->response_timeout * HZ; - add_timer(&mpu->timeout); - } - INIT_COMPLETION(mpu->completion); - mutex_unlock(&mpu->mutex); - - wake_up_interruptible(&mpu->mpu_event_wait); - wait_for_completion(&mpu->completion); - del_timer_sync(&mpu->timeout); - dev_dbg(&client->adapter->dev, "%s: %ld DONE", __func__, event); - return NOTIFY_OK; -} -#endif -static int mpu_early_notifier_callback(struct mpu_private_data *mpu, - unsigned long event, void *unused) -{ - struct i2c_client *client = mpu->client; - struct timeval event_time; - dev_dbg(&client->adapter->dev, "%s: %s", __func__, - (event == MPU_PM_EVENT_SUSPEND_PREPARE) ? - "MPU_PM_EVENT_SUSPEND_PREPARE" : "MPU_PM_EVENT_POST_SUSPEND"); - - /* Prevent the file handle from being closed before we initialize - the completion event */ - pr_info("[%s] event = %ld", __func__, event); - mutex_lock(&mpu->mutex); - if (!(mpu->pid) || - (event != PM_SUSPEND_PREPARE && event != PM_POST_SUSPEND)) { - mutex_unlock(&mpu->mutex); - return NOTIFY_OK; - } - - if (event == PM_SUSPEND_PREPARE) - mpu->event = MPU_PM_EVENT_SUSPEND_PREPARE; - if (event == PM_POST_SUSPEND) - mpu->event = MPU_PM_EVENT_POST_SUSPEND; - - do_gettimeofday(&event_time); - mpu->mpu_pm_event.interruptcount++; - mpu->mpu_pm_event.irqtime = - (((long long)event_time.tv_sec) << 32) + event_time.tv_usec; - mpu->mpu_pm_event.data_type = MPUIRQ_DATA_TYPE_PM_EVENT; - mpu->mpu_pm_event.data = mpu->event; - - if (mpu->response_timeout > 0) { - mpu->timeout.expires = jiffies + mpu->response_timeout * HZ; - add_timer(&mpu->timeout); - } - INIT_COMPLETION(mpu->completion); - mutex_unlock(&mpu->mutex); - - wake_up_interruptible(&mpu->mpu_event_wait); - wait_for_completion(&mpu->completion); - del_timer_sync(&mpu->timeout); - dev_dbg(&client->adapter->dev, "%s: %s DONE", __func__, - (event == MPU_PM_EVENT_SUSPEND_PREPARE) ? - "MPU_PM_EVENT_SUSPEND_PREPARE" : "MPU_PM_EVENT_POST_SUSPEND"); - return NOTIFY_OK; -} - -static int mpu_dev_open(struct inode *inode, struct file *file) -{ - struct mpu_private_data *mpu = - container_of(file->private_data, struct mpu_private_data, dev); - struct i2c_client *client = mpu->client; - int result; - int ii; - dev_dbg(&client->adapter->dev, "%s", __func__); - dev_dbg(&client->adapter->dev, "current->pid %d", current->pid); - - accel_open_calibration(); - - result = mutex_lock_interruptible(&mpu->mutex); - if (mpu->pid) { - mutex_unlock(&mpu->mutex); - return -EBUSY; - } - mpu->pid = current->pid; - - /* Reset the sensors to the default */ - if (result) { - dev_err(&client->adapter->dev, - "%s: mutex_lock_interruptible returned %d", - __func__, result); - return result; - } - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) - __module_get(mpu->slave_modules[ii]); - - mutex_unlock(&mpu->mutex); - return 0; -} - -/* close function - called when the "file" /dev/mpu is closed in userspace */ -static int mpu_release(struct inode *inode, struct file *file) -{ - struct mpu_private_data *mpu = - container_of(file->private_data, struct mpu_private_data, dev); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - int result = 0; - int ii; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - mutex_lock(&mpu->mutex); - mldl_cfg->inv_mpu_cfg->requested_sensors = 0; - result = inv_mpu_suspend(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - INV_ALL_SENSORS); - mpu->pid = 0; - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) - module_put(mpu->slave_modules[ii]); - - mutex_unlock(&mpu->mutex); - complete(&mpu->completion); - dev_dbg(&client->adapter->dev, "mpu_release"); - - return result; -} - -/* read function called when from /dev/mpu is read. Read from the FIFO */ -static ssize_t mpu_read(struct file *file, - char __user *buf, size_t count, loff_t *offset) -{ - struct mpu_private_data *mpu = - container_of(file->private_data, struct mpu_private_data, dev); - struct i2c_client *client = mpu->client; - size_t len = sizeof(mpu->mpu_pm_event) + sizeof(unsigned long); - int err; - - if (!mpu->event && (!(file->f_flags & O_NONBLOCK))) - wait_event_interruptible(mpu->mpu_event_wait, mpu->event); - - if (!mpu->event || !buf - || count < sizeof(mpu->mpu_pm_event)) - return 0; - - err = copy_to_user(buf, &mpu->mpu_pm_event, sizeof(mpu->mpu_pm_event)); - if (err) { - dev_err(&client->adapter->dev, - "Copy to user returned %d", err); - return -EFAULT; - } - mpu->event = 0; - return len; -} - -static unsigned int mpu_poll(struct file *file, struct poll_table_struct *poll) -{ - struct mpu_private_data *mpu = - container_of(file->private_data, struct mpu_private_data, dev); - int mask = 0; - - poll_wait(file, &mpu->mpu_event_wait, poll); - if (mpu->event) - mask |= POLLIN | POLLRDNORM; - return mask; -} - -static int mpu_dev_ioctl_get_ext_slave_platform_data( - struct i2c_client *client, - struct ext_slave_platform_data __user *arg) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct ext_slave_platform_data *pdata_slave; - struct ext_slave_platform_data local_pdata_slave; - - if (copy_from_user(&local_pdata_slave, arg, sizeof(local_pdata_slave))) - return -EFAULT; - - if (local_pdata_slave.type >= EXT_SLAVE_NUM_TYPES) - return -EINVAL; - - pdata_slave = mpu->mldl_cfg.pdata_slave[local_pdata_slave.type]; - /* All but private data and irq_data */ - if (!pdata_slave) - return -ENODEV; - if (copy_to_user(arg, pdata_slave, sizeof(*pdata_slave))) - return -EFAULT; - return 0; -} - -static int mpu_dev_ioctl_get_mpu_platform_data( - struct i2c_client *client, - struct mpu_platform_data __user *arg) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mpu_platform_data *pdata = mpu->mldl_cfg.pdata; - - if (copy_to_user(arg, pdata, sizeof(*pdata))) - return -EFAULT; - return 0; -} - -static int mpu_dev_ioctl_get_ext_slave_descr( - struct i2c_client *client, - struct ext_slave_descr __user *arg) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct ext_slave_descr *slave; - struct ext_slave_descr local_slave; - - if (copy_from_user(&local_slave, arg, sizeof(local_slave))) - return -EFAULT; - - if (local_slave.type >= EXT_SLAVE_NUM_TYPES) - return -EINVAL; - - slave = mpu->mldl_cfg.slave[local_slave.type]; - /* All but private data and irq_data */ - if (!slave) - return -ENODEV; - if (copy_to_user(arg, slave, sizeof(*slave))) - return -EFAULT; - return 0; -} - - -/** - * slave_config() - Pass a requested slave configuration to the slave sensor - * - * @adapter the adaptor to use to communicate with the slave - * @mldl_cfg the mldl configuration structuer - * @slave pointer to the slave descriptor - * @usr_config The configuration to pass to the slave sensor - * - * returns 0 or non-zero error code - */ -static int inv_mpu_config(struct mldl_cfg *mldl_cfg, - void *gyro_adapter, - struct ext_slave_config __user *usr_config) -{ - int retval = 0; - struct ext_slave_config config; - - retval = copy_from_user(&config, usr_config, sizeof(config)); - if (retval) - return -EFAULT; - - if (config.len && config.data) { - void *data; - data = kmalloc(config.len, GFP_KERNEL); - if (!data) - return -ENOMEM; - - retval = copy_from_user(data, - (void __user *)config.data, config.len); - if (retval) { - retval = -EFAULT; - kfree(data); - return retval; - } - config.data = data; - } - retval = gyro_config(gyro_adapter, mldl_cfg, &config); - kfree(config.data); - return retval; -} - -static int inv_mpu_get_config(struct mldl_cfg *mldl_cfg, - void *gyro_adapter, - struct ext_slave_config __user *usr_config) -{ - int retval = 0; - struct ext_slave_config config; - void *user_data; - - retval = copy_from_user(&config, usr_config, sizeof(config)); - if (retval) - return -EFAULT; - - user_data = config.data; - if (config.len && config.data) { - void *data; - data = kmalloc(config.len, GFP_KERNEL); - if (!data) - return -ENOMEM; - - retval = copy_from_user(data, - (void __user *)config.data, config.len); - if (retval) { - retval = -EFAULT; - kfree(data); - return retval; - } - config.data = data; - } - retval = gyro_get_config(gyro_adapter, mldl_cfg, &config); - if (!retval) - retval = copy_to_user((unsigned char __user *)user_data, - config.data, config.len); - kfree(config.data); - return retval; -} - -static int slave_config(struct mldl_cfg *mldl_cfg, - void *gyro_adapter, - void *slave_adapter, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config __user *usr_config) -{ - int retval = 0; - struct ext_slave_config config; - if ((!slave) || (!slave->config)) - return -ENODEV; - - retval = copy_from_user(&config, usr_config, sizeof(config)); - if (retval) - return -EFAULT; - - if (config.len && config.data) { - void *data; - data = kmalloc(config.len, GFP_KERNEL); - if (!data) - return -ENOMEM; - - retval = copy_from_user(data, - (void __user *)config.data, config.len); - if (retval) { - retval = -EFAULT; - kfree(data); - return retval; - } - config.data = data; - } - retval = inv_mpu_slave_config(mldl_cfg, gyro_adapter, slave_adapter, - &config, slave, pdata); - kfree(config.data); - return retval; -} - -static int slave_get_config(struct mldl_cfg *mldl_cfg, - void *gyro_adapter, - void *slave_adapter, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config __user *usr_config) -{ - int retval = 0; - struct ext_slave_config config; - void *user_data; - if (!(slave) || !(slave->get_config)) - return -ENODEV; - - retval = copy_from_user(&config, usr_config, sizeof(config)); - if (retval) - return -EFAULT; - - user_data = config.data; - if (config.len && config.data) { - void *data; - data = kmalloc(config.len, GFP_KERNEL); - if (!data) - return -ENOMEM; - - retval = copy_from_user(data, - (void __user *)config.data, config.len); - if (retval) { - retval = -EFAULT; - kfree(data); - return retval; - } - config.data = data; - } - retval = inv_mpu_get_slave_config(mldl_cfg, gyro_adapter, - slave_adapter, &config, slave, pdata); - if (retval) { - kfree(config.data); - return retval; - } - retval = copy_to_user((unsigned char __user *)user_data, - config.data, config.len); - kfree(config.data); - return retval; -} - -static int inv_slave_read(struct mldl_cfg *mldl_cfg, - void *gyro_adapter, - void *slave_adapter, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - void __user *usr_data) -{ - int retval; - unsigned char *data; - data = kzalloc(slave->read_len, GFP_KERNEL); - if (!data) - return -EFAULT; - - retval = inv_mpu_slave_read(mldl_cfg, gyro_adapter, slave_adapter, - slave, pdata, data); - - if ((!retval) && - (copy_to_user((unsigned char __user *)usr_data, - data, slave->read_len))) - retval = -EFAULT; - - kfree(data); - return retval; -} - -static int mpu_handle_mlsl(void *sl_handle, - unsigned char addr, - unsigned int cmd, - struct mpu_read_write __user *usr_msg) -{ - int retval = 0; - struct mpu_read_write msg; - unsigned char *user_data; - retval = copy_from_user(&msg, usr_msg, sizeof(msg)); - if (retval) - return -EFAULT; - - user_data = msg.data; - if (msg.length && msg.data) { - unsigned char *data; - data = kmalloc(msg.length, GFP_KERNEL); - if (!data) - return -ENOMEM; - - retval = copy_from_user(data, - (void __user *)msg.data, msg.length); - if (retval) { - retval = -EFAULT; - kfree(data); - return retval; - } - msg.data = data; - } else { - return -EPERM; - } - - switch (cmd) { - case MPU_READ: - retval = inv_serial_read(sl_handle, addr, - (unsigned char)msg.address, msg.length, msg.data); - break; - case MPU_WRITE: - retval = inv_serial_write(sl_handle, addr, - msg.length, msg.data); - break; - case MPU_READ_MEM: - retval = inv_serial_read_mem(sl_handle, addr, - msg.address, msg.length, msg.data); - break; - case MPU_WRITE_MEM: - retval = inv_serial_write_mem(sl_handle, addr, - msg.address, msg.length, - msg.data); - break; - case MPU_READ_FIFO: - retval = inv_serial_read_fifo(sl_handle, addr, - msg.length, msg.data); - break; - case MPU_WRITE_FIFO: - retval = inv_serial_write_fifo(sl_handle, addr, - msg.length, msg.data); - break; - - }; - if (retval) { - dev_err(&((struct i2c_adapter *)sl_handle)->dev, - "%s: i2c %d error %d", - __func__, cmd, retval); - kfree(msg.data); - return retval; - } - retval = copy_to_user((unsigned char __user *)user_data, - msg.data, msg.length); - kfree(msg.data); - return retval; -} - -/* ioctl - I/O control */ -static long mpu_dev_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct mpu_private_data *mpu = - container_of(file->private_data, struct mpu_private_data, dev); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - int retval = 0; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_descr **slave = mldl_cfg->slave; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - retval = mutex_lock_interruptible(&mpu->mutex); - if (retval) { - dev_err(&client->adapter->dev, - "%s: mutex_lock_interruptible returned %d", - __func__, retval); - return retval; - } - - switch (cmd) { - case MPU_GET_EXT_SLAVE_PLATFORM_DATA: - retval = mpu_dev_ioctl_get_ext_slave_platform_data( - client, - (struct ext_slave_platform_data __user *)arg); - break; - case MPU_GET_MPU_PLATFORM_DATA: - retval = mpu_dev_ioctl_get_mpu_platform_data( - client, - (struct mpu_platform_data __user *)arg); - break; - case MPU_GET_EXT_SLAVE_DESCR: - retval = mpu_dev_ioctl_get_ext_slave_descr( - client, - (struct ext_slave_descr __user *)arg); - break; - case MPU_READ: - case MPU_WRITE: - case MPU_READ_MEM: - case MPU_WRITE_MEM: - case MPU_READ_FIFO: - case MPU_WRITE_FIFO: - retval = mpu_handle_mlsl( - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - mldl_cfg->mpu_chip_info->addr, cmd, - (struct mpu_read_write __user *)arg); - break; - case MPU_CONFIG_GYRO: - retval = inv_mpu_config( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - (struct ext_slave_config __user *)arg); - break; - case MPU_CONFIG_ACCEL: - retval = slave_config( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave[EXT_SLAVE_TYPE_ACCEL], - pdata_slave[EXT_SLAVE_TYPE_ACCEL], - (struct ext_slave_config __user *)arg); - break; - case MPU_CONFIG_COMPASS: - retval = slave_config( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave[EXT_SLAVE_TYPE_COMPASS], - pdata_slave[EXT_SLAVE_TYPE_COMPASS], - (struct ext_slave_config __user *)arg); - break; - case MPU_CONFIG_PRESSURE: - retval = slave_config( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - slave[EXT_SLAVE_TYPE_PRESSURE], - pdata_slave[EXT_SLAVE_TYPE_PRESSURE], - (struct ext_slave_config __user *)arg); - break; - case MPU_GET_CONFIG_GYRO: - retval = inv_mpu_get_config( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - (struct ext_slave_config __user *)arg); - break; - case MPU_GET_CONFIG_ACCEL: - retval = slave_get_config( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave[EXT_SLAVE_TYPE_ACCEL], - pdata_slave[EXT_SLAVE_TYPE_ACCEL], - (struct ext_slave_config __user *)arg); - break; - case MPU_GET_CONFIG_COMPASS: - retval = slave_get_config( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave[EXT_SLAVE_TYPE_COMPASS], - pdata_slave[EXT_SLAVE_TYPE_COMPASS], - (struct ext_slave_config __user *)arg); - break; - case MPU_GET_CONFIG_PRESSURE: - retval = slave_get_config( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - slave[EXT_SLAVE_TYPE_PRESSURE], - pdata_slave[EXT_SLAVE_TYPE_PRESSURE], - (struct ext_slave_config __user *)arg); - break; - case MPU_SUSPEND: - retval = inv_mpu_suspend( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - arg); - break; - case MPU_RESUME: - retval = inv_mpu_resume( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - arg); - break; - case MPU_PM_EVENT_HANDLED: - dev_dbg(&client->adapter->dev, "%s: %d", __func__, cmd); - complete(&mpu->completion); - break; - case MPU_READ_ACCEL: - retval = inv_slave_read( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave[EXT_SLAVE_TYPE_ACCEL], - pdata_slave[EXT_SLAVE_TYPE_ACCEL], - (unsigned char __user *)arg); - break; - case MPU_READ_COMPASS: - retval = inv_slave_read( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave[EXT_SLAVE_TYPE_COMPASS], - pdata_slave[EXT_SLAVE_TYPE_COMPASS], - (unsigned char __user *)arg); - break; - case MPU_READ_PRESSURE: - retval = inv_slave_read( - mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - slave[EXT_SLAVE_TYPE_PRESSURE], - pdata_slave[EXT_SLAVE_TYPE_PRESSURE], - (unsigned char __user *)arg); - break; - case MPU_GET_REQUESTED_SENSORS: - if (copy_to_user( - (__u32 __user *)arg, - &mldl_cfg->inv_mpu_cfg->requested_sensors, - sizeof(mldl_cfg->inv_mpu_cfg->requested_sensors))) - retval = -EFAULT; - break; - case MPU_SET_REQUESTED_SENSORS: - mldl_cfg->inv_mpu_cfg->requested_sensors = arg; - break; - case MPU_GET_IGNORE_SYSTEM_SUSPEND: - if (copy_to_user( - (unsigned char __user *)arg, - &mldl_cfg->inv_mpu_cfg->ignore_system_suspend, - sizeof(mldl_cfg->inv_mpu_cfg->ignore_system_suspend))) - retval = -EFAULT; - break; - case MPU_SET_IGNORE_SYSTEM_SUSPEND: - mldl_cfg->inv_mpu_cfg->ignore_system_suspend = arg; - break; - case MPU_GET_MLDL_STATUS: - if (copy_to_user( - (unsigned char __user *)arg, - &mldl_cfg->inv_mpu_state->status, - sizeof(mldl_cfg->inv_mpu_state->status))) - retval = -EFAULT; - break; - case MPU_GET_I2C_SLAVES_ENABLED: - if (copy_to_user( - (unsigned char __user *)arg, - &mldl_cfg->inv_mpu_state->i2c_slaves_enabled, - sizeof(mldl_cfg->inv_mpu_state->i2c_slaves_enabled))) - retval = -EFAULT; - break; - case MPU_READ_ACCEL_OFFSET: - { - - retval = copy_to_user((signed short __user *)arg, - &cal_data, sizeof(cal_data)); - if (INV_SUCCESS != retval) { - dev_err(&client->adapter->dev, - "%s: cmd %x, arg %lu", - __func__, cmd, arg); - } - } - break; - default: - dev_err(&client->adapter->dev, - "%s: Unknown cmd %x, arg %lu", - __func__, cmd, arg); - retval = -EINVAL; - }; - - mutex_unlock(&mpu->mutex); - dev_dbg(&client->adapter->dev, "%s: %08x, %08lx, %d", - __func__, cmd, arg, retval); - - if (retval > 0) - retval = -retval; - - return retval; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -void mpu_dev_early_suspend(struct early_suspend *h) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(this_client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - pr_info("----------\n%s\n----------", __func__); - - mpu_early_notifier_callback(mpu, PM_SUSPEND_PREPARE, NULL); - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = this_client->adapter; - mutex_lock(&mpu->mutex); - if (!mldl_cfg->inv_mpu_cfg->ignore_system_suspend) { - (void)inv_mpu_suspend(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - INV_ALL_SENSORS); - } - mutex_unlock(&mpu->mutex); -} - -void mpu_dev_early_resume(struct early_suspend *h) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(this_client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - pr_info("----------\n%s\n----------", __func__); - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = this_client->adapter; - - mutex_lock(&mpu->mutex); - if (mpu->pid && !mldl_cfg->inv_mpu_cfg->ignore_system_suspend) { - (void)inv_mpu_resume(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - mldl_cfg->inv_mpu_cfg->requested_sensors); - } - mutex_unlock(&mpu->mutex); - mpu_early_notifier_callback(mpu, PM_POST_SUSPEND, NULL); -} -#endif - - -void mpu_shutdown(struct i2c_client *client) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - mutex_lock(&mpu->mutex); - (void)inv_mpu_suspend(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - INV_ALL_SENSORS); - mutex_unlock(&mpu->mutex); - dev_dbg(&client->adapter->dev, "%s", __func__); -} - -int mpu_dev_suspend(struct i2c_client *client, pm_message_t mesg) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - pr_info("----------\n%s\n----------", __func__); - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - mutex_lock(&mpu->mutex); - if (!mldl_cfg->inv_mpu_cfg->ignore_system_suspend) { - dev_dbg(&client->adapter->dev, - "%s: suspending on event %d", __func__, mesg.event); - (void)inv_mpu_suspend(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - INV_ALL_SENSORS); - } else { - dev_dbg(&client->adapter->dev, - "%s: Already suspended %d", __func__, mesg.event); - } - mutex_unlock(&mpu->mutex); - return 0; -} - -int mpu_dev_resume(struct i2c_client *client) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - pr_info("----------\n%s\n----------", __func__); - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - mutex_lock(&mpu->mutex); - if (mpu->pid && !mldl_cfg->inv_mpu_cfg->ignore_system_suspend) { - (void)inv_mpu_resume(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - mldl_cfg->inv_mpu_cfg->requested_sensors); - dev_dbg(&client->adapter->dev, - "%s for pid %d", __func__, mpu->pid); - } - mutex_unlock(&mpu->mutex); - return 0; -} - -/* define which file operations are supported */ -static const struct file_operations mpu_fops = { - .owner = THIS_MODULE, - .read = mpu_read, - .poll = mpu_poll, - .unlocked_ioctl = mpu_dev_ioctl, - .open = mpu_dev_open, - .release = mpu_release, -}; - -int inv_mpu_register_slave(struct module *slave_module, - struct i2c_client *slave_client, - struct ext_slave_platform_data *slave_pdata, - struct ext_slave_descr *(*get_slave_descr)(void)) -{ - struct mpu_private_data *mpu = mpu_data; - struct mldl_cfg *mldl_cfg; - struct ext_slave_descr *slave_descr; - struct ext_slave_platform_data **pdata_slave; - char *irq_name = NULL; - int result = 0; - - if (!slave_client || !slave_pdata || !get_slave_descr) - return -EINVAL; - - if (!mpu) { - dev_err(&slave_client->adapter->dev, - "%s: Null mpu_private_data", __func__); - return -EINVAL; - } - mldl_cfg = &mpu->mldl_cfg; - pdata_slave = mldl_cfg->pdata_slave; - slave_descr = get_slave_descr(); - - if (!slave_descr) { - dev_err(&slave_client->adapter->dev, - "%s: Null ext_slave_descr", __func__); - return -EINVAL; - } - - mutex_lock(&mpu->mutex); - if (mpu->pid) { - mutex_unlock(&mpu->mutex); - return -EBUSY; - } - - if (pdata_slave[slave_descr->type]) { - result = -EBUSY; - goto out_unlock_mutex; - } - - slave_pdata->address = slave_client->addr; - slave_pdata->irq = slave_client->irq; - slave_pdata->adapt_num = i2c_adapter_id(slave_client->adapter); - - dev_info(&slave_client->adapter->dev, - "%s: +%s Type %d: Addr: %2x IRQ: %2d, Adapt: %2d", - __func__, - slave_descr->name, - slave_descr->type, - slave_pdata->address, - slave_pdata->irq, - slave_pdata->adapt_num); - - switch (slave_descr->type) { - case EXT_SLAVE_TYPE_ACCEL: - irq_name = "accelirq"; - break; - case EXT_SLAVE_TYPE_COMPASS: - irq_name = "compassirq"; - break; - case EXT_SLAVE_TYPE_PRESSURE: - irq_name = "pressureirq"; - break; - default: - irq_name = "none"; - }; - if (slave_descr->init) { - result = slave_descr->init(slave_client->adapter, - slave_descr, - slave_pdata); - if (result) { - dev_err(&slave_client->adapter->dev, - "%s init failed %d", - slave_descr->name, result); - goto out_unlock_mutex; - } - } - - if (slave_descr->type == EXT_SLAVE_TYPE_ACCEL && - slave_descr->id == ACCEL_ID_MPU6050 && - slave_descr->config) { - /* pass a reference to the mldl_cfg data - structure to the mpu6050 accel "class" */ - struct ext_slave_config config; - config.key = MPU_SLAVE_CONFIG_INTERNAL_REFERENCE; - config.len = sizeof(struct mldl_cfg *); - config.apply = true; - config.data = mldl_cfg; - result = slave_descr->config( - slave_client->adapter, slave_descr, - slave_pdata, &config); - if (result) { - LOG_RESULT_LOCATION(result); - goto out_slavedescr_exit; - } - } - pdata_slave[slave_descr->type] = slave_pdata; - mpu->slave_modules[slave_descr->type] = slave_module; - mldl_cfg->slave[slave_descr->type] = slave_descr; - - goto out_unlock_mutex; - -out_slavedescr_exit: - if (slave_descr->exit) - slave_descr->exit(slave_client->adapter, - slave_descr, slave_pdata); -out_unlock_mutex: - mutex_unlock(&mpu->mutex); - - if (!result && irq_name && (slave_pdata->irq > 0)) { - int warn_result; - dev_info(&slave_client->adapter->dev, - "Installing %s irq using %d", - irq_name, - slave_pdata->irq); - warn_result = slaveirq_init(slave_client->adapter, - slave_pdata, irq_name); - if (result) - dev_warn(&slave_client->adapter->dev, - "%s irq assigned error: %d", - slave_descr->name, warn_result); - } else { - dev_warn(&slave_client->adapter->dev, - "%s irq not assigned: %d %d %d", - slave_descr->name, - result, (int)irq_name, slave_pdata->irq); - } - - return result; -} -EXPORT_SYMBOL(inv_mpu_register_slave); - -void inv_mpu_unregister_slave(struct i2c_client *slave_client, - struct ext_slave_platform_data *slave_pdata, - struct ext_slave_descr *(*get_slave_descr)(void)) -{ - struct mpu_private_data *mpu = mpu_data; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct ext_slave_descr *slave_descr; - int result; - - dev_info(&slave_client->adapter->dev, "%s\n", __func__); - - if (!slave_client || !slave_pdata || !get_slave_descr) - return; - - if (slave_pdata->irq) - slaveirq_exit(slave_pdata); - - slave_descr = get_slave_descr(); - if (!slave_descr) - return; - - mutex_lock(&mpu->mutex); - - if (slave_descr->exit) { - result = slave_descr->exit(slave_client->adapter, - slave_descr, - slave_pdata); - if (result) - dev_err(&slave_client->adapter->dev, - "Accel exit failed %d\n", result); - } - mldl_cfg->slave[slave_descr->type] = NULL; - mldl_cfg->pdata_slave[slave_descr->type] = NULL; - mpu->slave_modules[slave_descr->type] = NULL; - - mutex_unlock(&mpu->mutex); - -} -EXPORT_SYMBOL(inv_mpu_unregister_slave); - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static const struct i2c_device_id mpu_id[] = { - {"mpu3050", 0}, - {"mpu6050", 0}, - {"mpu6050_no_accel", 0}, - {} -}; -MODULE_DEVICE_TABLE(i2c, mpu_id); - -static int mpu6050_factory_on(struct i2c_client *client) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(this_client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - int prev_gyro_suspended = 0; - - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - pr_info("----------\n%s\n----------", __func__); - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - mutex_lock(&mpu->mutex); - if (1) { - (void)inv_mpu_resume(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE], - mldl_cfg->inv_mpu_cfg->requested_sensors); - } - mutex_unlock(&mpu->mutex); - return prev_gyro_suspended; -} - -static ssize_t mpu6050_power_on(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int count = 0; - - dev_dbg(dev, "this_client = %d\n", (int)this_client); - count = sprintf(buf, "%d\n", (this_client != NULL ? 1 : 0)); - - return count; -} - -static ssize_t mpu6050_get_temp(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int count = 0; - short int temperature = 0; - unsigned char data[2]; - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(this_client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = this_client->adapter; - - mpu6050_factory_on(this_client); - - /* MPUREG_TEMP_OUT_H, */ /* 27 0x1b */ - /* MPUREG_TEMP_OUT_L, */ /* 28 0x1c */ - /* TEMP_OUT_H/L: 16-bit temperature data (2's complement data format) */ - inv_serial_read(slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - DEFAULT_MPU_SLAVEADDR, - MPUREG_TEMP_OUT_H, - 2, - data); - temperature = (short) (((data[0]) << 8) | data[1]); - temperature = (((temperature + 521) / 340) + 35); - pr_info("read temperature = %d\n", temperature); - - count = sprintf(buf, "%d\n", temperature); - - return count; -} - -static ssize_t mpu6050_acc_read(struct device *dev, - struct device_attribute *attr, char *buf) -{ - - s16 x, y, z; - int count = 0; - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - int retval = 0; - unsigned char data[6]; - - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - - /* mutex_lock(&mpu->mutex); */ - mpu_accel_enable_set(1); - msleep(20); - retval = inv_serial_read(slave_adapter[EXT_SLAVE_TYPE_ACCEL], - 0x68, 0x3B, 6, data); - - x = (s16)(((data[0] << 8) | data[1]) - cal_data.x);/*CAL_DIV;*/ - y = (s16)(((data[2] << 8) | data[3]) - cal_data.y);/*CAL_DIV;*/ - z = (s16)(((data[4] << 8) | data[5]) - cal_data.z);/*CAL_DIV;*/ - - z *= -1; - - pr_info("mpu6050_acc_read x: %d y: %d z: %d", y, x, z); - mpu_accel_enable_set(0); - msleep(20); - /* mutex_unlock(&mpu->mutex); */ - - count = sprintf(buf, "%d, %d, %d\n", y, x, z); - - return count; -} - -static ssize_t accel_calibration_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - - int count = 0; - - pr_info(" accel_calibration_show %d %d %d", - cal_data.x, cal_data.y, cal_data.z); - - count = sprintf(buf, "%d %d %d\n", cal_data.x, cal_data.y, cal_data.z); - return count; -} - -static ssize_t accel_calibration_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - bool do_calib; - int err; - int count = 0; - char str[11]; - - if (sysfs_streq(buf, "1")) - do_calib = true; - else if (sysfs_streq(buf, "0")) - do_calib = false; - else { - pr_debug("%s: invalid value %d", __func__, *buf); - return -EINVAL; - } - - err = accel_do_calibrate(do_calib); - if (err < 0) - pr_err("%s: accel_do_calibrate() failed", __func__); - - pr_info("accel_calibration_show :%d %d %d", - cal_data.x, cal_data.y, cal_data.z); - if (err > 0) - err = 0; - count = sprintf(str, "%d\n", err); - - strcpy(str, buf); - return count; -} - -static ssize_t mpu_vendor_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%s\n", MPU_VENDOR); -} - -static ssize_t mpu_name_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%s\n", MPU_PART_ID); -} - -static int akm8975_wait_for_data_ready(struct i2c_adapter *sl_adapter) -{ - int err; - u8 buf; - int count = 10; - - while (1) { - msleep(20); - err = inv_serial_read(sl_adapter, 0x0C, - AK8975_REG_ST1, sizeof(buf), &buf); - if (err) { - pr_err("%s: read data over i2c failed\n", __func__); - return -EIO; - } - - if (buf&0x1) - break; - - count--; - if (!count) - break; - } - return 0; - -} - -static ssize_t ak8975_adc(struct device *dev, - struct device_attribute *attr, char *strbuf) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - - - u8 buf[8]; - s16 x, y, z; - int err, success; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - - pr_info("%s %s", __func__, client->name); - - mutex_lock(&mpu->mutex); - - /* start ADC conversion */ - err = inv_serial_single_write(slave_adapter[EXT_SLAVE_TYPE_COMPASS], - 0x0C, AK8975_REG_CNTL, AK8975_MODE_SNG_MEASURE); - - if (err) - pr_err("ak8975_adc write err:%d\n", err); - - /* wait for ADC conversion to complete */ - - err = akm8975_wait_for_data_ready - (slave_adapter[EXT_SLAVE_TYPE_COMPASS]); - if (err) { - pr_err("%s: wait for data ready failed\n", __func__); - return err; - } - - msleep(20);/*msleep(10);*/ - /* get the value and report it */ - err = inv_serial_read(slave_adapter[EXT_SLAVE_TYPE_COMPASS], 0x0C, - AK8975_REG_ST1, sizeof(buf), buf); - - if (err) { - pr_err("%s: read data over i2c failed %d\n", __func__, err); - mutex_unlock(&mpu->mutex); - return -EIO; - } - mutex_unlock(&mpu->mutex); - - /* buf[0] is status1, buf[7] is status2 */ - if ((buf[0] == 0) | (buf[7] == 1)) - success = 0; - else - success = 1; - - x = buf[1] | (buf[2] << 8); - y = buf[3] | (buf[4] << 8); - z = buf[5] | (buf[6] << 8); - - pr_err("%s: raw x = %d, y = %d, z = %d\n", __func__, x, y, z); - - return snprintf(strbuf, PAGE_SIZE, "%s, %d, %d, %d\n", - (success ? "OK" : "NG"), x, y, z); -} - -static ssize_t ak8975_check_cntl(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - - int ii, err; - u8 data; - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - mutex_lock(&mpu->mutex); - err = inv_serial_single_write(slave_adapter[EXT_SLAVE_TYPE_COMPASS], - 0x0C, AK8975_REG_CNTL, - AK8975_MODE_POWER_DOWN); - - if (err) { - pr_err("ak8975_adc write err:%d\n", err); - mutex_unlock(&mpu->mutex); - return -EIO; - } - err = inv_serial_read(slave_adapter[EXT_SLAVE_TYPE_COMPASS], 0x0C, - AK8975_REG_CNTL, sizeof(data), &data); - if (err) { - pr_err("%s: read data over i2c failed %d\n", __func__, err); - mutex_unlock(&mpu->mutex); - return -EIO; - } - mutex_unlock(&mpu->mutex); - - return snprintf(buf, PAGE_SIZE, "%s\n", - data == AK8975_MODE_POWER_DOWN ? "OK" : "NG"); - -} - -static ssize_t akm8975_rawdata_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - - short x = 0, y = 0, z = 0; - int err; - u8 data[8]; - - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - - mutex_lock(&mpu->mutex); - err = inv_serial_single_write(slave_adapter[EXT_SLAVE_TYPE_COMPASS], - 0x0C, AK8975_REG_CNTL, - AK8975_MODE_SNG_MEASURE); - - if (err) { - pr_err("ak8975_adc write err:%d\n", err); - mutex_unlock(&mpu->mutex); - goto done; - - } - - err = akm8975_wait_for_data_ready - (slave_adapter[EXT_SLAVE_TYPE_COMPASS]); - if (err) { - mutex_unlock(&mpu->mutex); - goto done; - } - - /* get the value and report it */ - err = inv_serial_read(slave_adapter[EXT_SLAVE_TYPE_COMPASS], 0x0C, - AK8975_REG_ST1, sizeof(data), data); - - if (err) { - pr_err("%s: read data over i2c failed %d\n", __func__, err); - mutex_unlock(&mpu->mutex); - return -EIO; - } - - mutex_unlock(&mpu->mutex); - - if (err) { - pr_err("%s: failed to read %d bytes of mag data\n", - __func__, sizeof(data)); - goto done; - } - - if (data[0] & 0x01) { - x = (data[2] << 8) + data[1]; - y = (data[4] << 8) + data[3]; - z = (data[6] << 8) + data[5]; - } else - pr_err("%s: invalid raw data(st1 = %d)\n", - __func__, data[0] & 0x01); - -done: - return snprintf(buf, PAGE_SIZE, "%d,%d,%d\n", x, y, z); -} - -struct ak8975_config { - char asa[COMPASS_NUM_AXES]; /* axis sensitivity adjustment */ -}; - -struct ak8975_private_data { - struct ak8975_config init; -}; -static ssize_t ak8975c_get_status(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int success; - - struct ak8975_private_data *private_data = - (struct ak8975_private_data *) - pdata_slave[EXT_SLAVE_TYPE_COMPASS]->private_data; - if ((private_data->init.asa[0] == 0) | - (private_data->init.asa[0] == 0xff) | - (private_data->init.asa[1] == 0) | - (private_data->init.asa[1] == 0xff) | - (private_data->init.asa[2] == 0) | - (private_data->init.asa[2] == 0xff)) - success = 0; - else - success = 1; - - return snprintf(buf, PAGE_SIZE, "%s\n", (success ? "OK" : "NG")); - -} - -int ak8975c_selftest(struct i2c_adapter *slave_adapter, - struct ak8975_private_data *private_data, int *sf) -{ - int err; - u8 data; - u8 buf[6]; - int count = 20; - s16 x, y, z; - - /* set ATSC self test bit to 1 */ - err = inv_serial_single_write(slave_adapter, 0x0C, - AK8975_REG_ASTC, 0x40); - - /* start self test */ - err = inv_serial_single_write(slave_adapter, 0x0C, - AK8975_REG_CNTL, AK8975_MODE_SELF_TEST); - - /* wait for data ready */ - while (1) { - msleep(20); - err = inv_serial_read(slave_adapter, 0x0C, - AK8975_REG_ST1, sizeof(data), &data); - - if (data == 1) - break; - count--; - if (!count) - break; - } - err = inv_serial_read(slave_adapter, 0x0C, - AK8975_REG_HXL, sizeof(buf), buf); - - /* set ATSC self test bit to 0 */ - err = inv_serial_single_write(slave_adapter, 0x0C, - AK8975_REG_ASTC, 0x00); - - x = buf[0] | (buf[1] << 8); - y = buf[2] | (buf[3] << 8); - z = buf[4] | (buf[5] << 8); - - /* Hadj = (H*(Asa+128))/256 */ - x = (x*(private_data->init.asa[0] + 128)) >> 8; - y = (y*(private_data->init.asa[1] + 128)) >> 8; - z = (z*(private_data->init.asa[2] + 128)) >> 8; - - pr_info("%s: self test x = %d, y = %d, z = %d\n", - __func__, x, y, z); - if ((x >= -200) && (x <= 200)) - pr_info("%s: x passed self test, expect -200<=x<=200\n", - __func__); - else - pr_info("%s: x failed self test, expect -200<=x<=200\n", - __func__); - if ((y >= -200) && (y <= 200)) - pr_info("%s: y passed self test, expect -200<=y<=200\n", - __func__); - else - pr_info("%s: y failed self test, expect -200<=y<=200\n", - __func__); - if ((z >= -3200) && (z <= -800)) - pr_info("%s: z passed self test, expect -3200<=z<=-800\n", - __func__); - else - pr_info("%s: z failed self test, expect -3200<=z<=-800\n", - __func__); - - sf[0] = x; - sf[1] = y; - sf[2] = z; - - if (((x >= -200) && (x <= 200)) && - ((y >= -200) && (y <= 200)) && - ((z >= -3200) && (z <= -800))) - return 1; - else - return 0; -} - -static ssize_t ak8975c_get_selftest(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *) i2c_get_clientdata(this_client); - struct i2c_client *client = mpu->client; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - struct ak8975_private_data *private_data = - (struct ak8975_private_data *) - pdata_slave[EXT_SLAVE_TYPE_COMPASS]->private_data; - int ii, success; - int sf[3] = {0,}; - int retry = 3; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - do { - retry--; - success = ak8975c_selftest( - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - private_data, sf); - if (success) - break; - } while (retry > 0); - - return snprintf(buf, PAGE_SIZE, "%d, %d, %d, %d\n", - success, sf[0], sf[1], sf[2]); -} - -static ssize_t akm_vendor_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%s\n", MAG_VENDOR); -} - -static ssize_t akm_name_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%s\n", MAG_PART_ID); -} - -static DEVICE_ATTR(power_on, S_IRUGO, mpu6050_power_on, NULL); -static DEVICE_ATTR(temperature, S_IRUGO, mpu6050_get_temp, NULL); - -static DEVICE_ATTR(calibration, S_IRUGO | S_IWUSR, - accel_calibration_show, accel_calibration_store); - -static DEVICE_ATTR(raw_data, S_IRUGO, mpu6050_acc_read, NULL); - -static DEVICE_ATTR(vendor, S_IRUGO, mpu_vendor_show, NULL); -static DEVICE_ATTR(name, S_IRUGO, mpu_name_show, NULL); - - -static DEVICE_ATTR(adc, S_IRUGO, ak8975_adc, NULL); - -static DEVICE_ATTR(dac, S_IRUGO, ak8975_check_cntl, NULL); -static DEVICE_ATTR(status, S_IRUGO, ak8975c_get_status, NULL); -static DEVICE_ATTR(selftest, S_IRUGO, ak8975c_get_selftest, NULL); - -static struct device_attribute dev_attr_mag_rawdata = - __ATTR(raw_data, S_IRUGO, akm8975_rawdata_show, NULL); - -static struct device_attribute dev_attr_mag_vendor = - __ATTR(vendor, S_IRUGO, akm_vendor_show, NULL); - -static struct device_attribute dev_attr_mag_name = - __ATTR(name, S_IRUGO, akm_name_show, NULL); - -static struct device_attribute *gyro_sensor_attrs[] = { - &dev_attr_power_on, - &dev_attr_temperature, - &dev_attr_vendor, - &dev_attr_name, - NULL, -}; - -static struct device_attribute *accel_sensor_attrs[] = { - &dev_attr_raw_data, - &dev_attr_calibration, - &dev_attr_vendor, - &dev_attr_name, - NULL, -}; - -static struct device_attribute *magnetic_sensor_attrs[] = { - &dev_attr_adc, - &dev_attr_mag_rawdata, - &dev_attr_dac, - &dev_attr_status, - &dev_attr_selftest, - &dev_attr_mag_vendor, - &dev_attr_mag_name, - NULL, -}; - -int mpu_probe(struct i2c_client *client, const struct i2c_device_id *devid) -{ - struct mpu_platform_data *pdata; - struct mpu_private_data *mpu; - struct mldl_cfg *mldl_cfg; - struct device *gyro_sensor_device = NULL; - struct device *accel_sensor_device = NULL; - struct device *magnetic_sensor_device = NULL; - int res = 0; - int ii; - - pr_info("===========\n%s\n===========", __func__); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - res = -ENODEV; - goto out_check_functionality_failed; - } - - mpu = kzalloc(sizeof(struct mpu_private_data), GFP_KERNEL); - if (!mpu) { - res = -ENOMEM; - goto out_alloc_data_failed; - } - mldl_cfg = &mpu->mldl_cfg; - mldl_cfg->mpu_ram = &mpu->mpu_ram; - mldl_cfg->mpu_gyro_cfg = &mpu->mpu_gyro_cfg; - mldl_cfg->mpu_offsets = &mpu->mpu_offsets; - mldl_cfg->mpu_chip_info = &mpu->mpu_chip_info; - mldl_cfg->inv_mpu_cfg = &mpu->inv_mpu_cfg; - mldl_cfg->inv_mpu_state = &mpu->inv_mpu_state; - - mldl_cfg->mpu_ram->length = MPU_MEM_NUM_RAM_BANKS * MPU_MEM_BANK_SIZE; - mldl_cfg->mpu_ram->ram = kzalloc(mldl_cfg->mpu_ram->length, GFP_KERNEL); - if (!mldl_cfg->mpu_ram->ram) { - res = -ENOMEM; - goto out_alloc_ram_failed; - } - mpu_data = mpu; - i2c_set_clientdata(client, mpu); - this_client = client; - mpu->client = client; - - init_waitqueue_head(&mpu->mpu_event_wait); - mutex_init(&mpu->mutex); - init_completion(&mpu->completion); - - - mpu->response_timeout = 1; /* Seconds */ - mpu->timeout.function = mpu_pm_timeout; - mpu->timeout.data = (u_long) mpu; - init_timer(&mpu->timeout); -#if 0 - mpu->nb.notifier_call = mpu_pm_notifier_callback; - mpu->nb.priority = 0; - res = register_pm_notifier(&mpu->nb); - if (res) { - dev_err(&client->adapter->dev, - "Unable to register pm_notifier %d", res); - goto out_register_pm_notifier_failed; - } -#endif - pdata = (struct mpu_platform_data *)client->dev.platform_data; - if (!pdata) { - dev_warn(&client->adapter->dev, - "Missing platform data for mpu"); - } - mldl_cfg->pdata = pdata; - - mldl_cfg->mpu_chip_info->addr = client->addr; - res = inv_mpu_open(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL); - - if (res) { - dev_err(&client->adapter->dev, - "Unable to open %s %d", MPU_NAME, res); - res = -ENODEV; - goto out_whoami_failed; - } - - mpu->dev.minor = MISC_DYNAMIC_MINOR; - mpu->dev.name = "mpu"; - mpu->dev.fops = &mpu_fops; - res = misc_register(&mpu->dev); - if (res < 0) { - dev_err(&client->adapter->dev, - "ERROR: misc_register returned %d", res); - goto out_misc_register_failed; - } - - if (client->irq) { - dev_info(&client->adapter->dev, - "Installing irq using %d", client->irq); - res = mpuirq_init(client, mldl_cfg); - if (res) - goto out_mpuirq_failed; - } else { - dev_warn(&client->adapter->dev, - "Missing %s IRQ", MPU_NAME); - } - if (!strcmp(mpu_id[1].name, devid->name)) { - /* Special case to re-use the inv_mpu_register_slave */ - struct ext_slave_platform_data *slave_pdata; - slave_pdata = kzalloc(sizeof(*slave_pdata), GFP_KERNEL); - if (!slave_pdata) { - res = -ENOMEM; - goto out_slave_pdata_kzalloc_failed; - } - slave_pdata->bus = EXT_SLAVE_BUS_PRIMARY; - for (ii = 0; ii < 9; ii++) - slave_pdata->orientation[ii] = pdata->orientation[ii]; - res = inv_mpu_register_slave( - NULL, client, - slave_pdata, - mpu6050_get_slave_descr); - if (res) { - /* if inv_mpu_register_slave fails there are no pointer - references to the memory allocated to slave_pdata */ - kfree(slave_pdata); - goto out_slave_pdata_kzalloc_failed; - } - } - - res = sensors_register(gyro_sensor_device, NULL, gyro_sensor_attrs, - "gyro_sensor"); - if (res) { - pr_err("%s: cound not register gyro sensor device(%d).", - __func__, res); - goto out_sensor_register_failed; - } - - res = sensors_register(accel_sensor_device, NULL, accel_sensor_attrs, - "accelerometer_sensor"); - if (res) { - pr_err("%s: cound not register accelerometer " \ - "sensor device(%d).", - __func__, res); - goto out_sensor_register_failed; - } - - res = sensors_register(magnetic_sensor_device, NULL, - magnetic_sensor_attrs, "magnetic_sensor"); - if (res) { - pr_err("%s: cound not register magnetic sensor device(%d).", - __func__, res); - goto out_sensor_register_failed; - } - -#ifdef CONFIG_HAS_EARLYSUSPEND - mpu->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; - mpu->early_suspend.suspend = mpu_dev_early_suspend; - mpu->early_suspend.resume = mpu_dev_early_resume; - register_early_suspend(&mpu->early_suspend); -#endif - - return res; - -out_sensor_register_failed: -out_slave_pdata_kzalloc_failed: - if (client->irq) - mpuirq_exit(); -out_mpuirq_failed: - misc_deregister(&mpu->dev); -out_misc_register_failed: - inv_mpu_close(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL); -out_whoami_failed: - unregister_pm_notifier(&mpu->nb); -#if 0 -out_register_pm_notifier_failed: -#endif - kfree(mldl_cfg->mpu_ram->ram); - mpu_data = NULL; -out_alloc_ram_failed: - kfree(mpu); -out_alloc_data_failed: -out_check_functionality_failed: - dev_err(&client->adapter->dev, "%s failed %d", __func__, res); - return res; - -} - -static int mpu_remove(struct i2c_client *client) -{ - struct mpu_private_data *mpu = i2c_get_clientdata(client); - struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES]; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave; - int ii; - - for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) { - if (!pdata_slave[ii]) - slave_adapter[ii] = NULL; - else - slave_adapter[ii] = - i2c_get_adapter(pdata_slave[ii]->adapt_num); - } - - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter; - dev_dbg(&client->adapter->dev, "%s", __func__); - - inv_mpu_close(mldl_cfg, - slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE], - slave_adapter[EXT_SLAVE_TYPE_ACCEL], - slave_adapter[EXT_SLAVE_TYPE_COMPASS], - slave_adapter[EXT_SLAVE_TYPE_PRESSURE]); - - if (mldl_cfg->slave[EXT_SLAVE_TYPE_ACCEL] && - (mldl_cfg->slave[EXT_SLAVE_TYPE_ACCEL]->id == - ACCEL_ID_MPU6050)) { - struct ext_slave_platform_data *slave_pdata = - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_ACCEL]; - inv_mpu_unregister_slave( - client, - mldl_cfg->pdata_slave[EXT_SLAVE_TYPE_ACCEL], - mpu6050_get_slave_descr); - kfree(slave_pdata); - } - - if (client->irq) - mpuirq_exit(); - - misc_deregister(&mpu->dev); - - unregister_pm_notifier(&mpu->nb); - - kfree(mpu->mldl_cfg.mpu_ram->ram); - kfree(mpu); - - return 0; -} - -static struct i2c_driver mpu_driver = { - .class = I2C_CLASS_HWMON, - .probe = mpu_probe, - .remove = mpu_remove, - .id_table = mpu_id, - .driver = { - .owner = THIS_MODULE, - .name = MPU_NAME, - }, - .address_list = normal_i2c, - .shutdown = mpu_shutdown, /* optional */ - .suspend = mpu_dev_suspend, /* optional */ - .resume = mpu_dev_resume, /* optional */ - -}; - -static int __init mpu_init(void) -{ - int res = i2c_add_driver(&mpu_driver); - pr_info("%s: Probe name %s", __func__, MPU_NAME); - if (res) - pr_err("%s failed", __func__); - return res; -} - -static void __exit mpu_exit(void) -{ - pr_info("%s", __func__); - i2c_del_driver(&mpu_driver); -} - -module_init(mpu_init); -module_exit(mpu_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("User space character device interface for MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS(MPU_NAME); diff --git a/drivers/misc/inv_mpu/mpu-dev.h b/drivers/misc/inv_mpu/mpu-dev.h deleted file mode 100644 index 0b352c9..0000000 --- a/drivers/misc/inv_mpu/mpu-dev.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - - -#ifndef __MPU_DEV_H__ -#define __MPU_DEV_H__ - -#include -#include -#include - -int inv_mpu_register_slave(struct module *slave_module, - struct i2c_client *client, - struct ext_slave_platform_data *pdata, - struct ext_slave_descr *(*slave_descr)(void)); - -void inv_mpu_unregister_slave(struct i2c_client *client, - struct ext_slave_platform_data *pdata, - struct ext_slave_descr *(*slave_descr)(void)); - -extern signed short gAccelOffset[3]; -extern struct class *sensors_class; -extern int sensors_register(struct device *dev, void * drvdata, - struct device_attribute *attributes[], char *name); - -#endif diff --git a/drivers/misc/inv_mpu/mpu6050b1.h b/drivers/misc/inv_mpu/mpu6050b1.h deleted file mode 100644 index c486784..0000000 --- a/drivers/misc/inv_mpu/mpu6050b1.h +++ /dev/null @@ -1,437 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup - * @brief - * - * @{ - * @file mpu6050.h - * @brief - */ - -#ifndef __MPU_H_ -#error Do not include this file directly. Include mpu.h instead. -#endif - -#ifndef __MPU6050B1_H_ -#define __MPU6050B1_H_ - - -#define MPU_NAME "mpu6050" -#define DEFAULT_MPU_SLAVEADDR 0x68 -extern struct acc_data cal_data; - - -/*==== MPU6050B1 REGISTER SET ====*/ -enum { - MPUREG_XG_OFFS_TC = 0, /* 0x00, 0 */ - MPUREG_YG_OFFS_TC, /* 0x01, 1 */ - MPUREG_ZG_OFFS_TC, /* 0x02, 2 */ - MPUREG_X_FINE_GAIN, /* 0x03, 3 */ - MPUREG_Y_FINE_GAIN, /* 0x04, 4 */ - MPUREG_Z_FINE_GAIN, /* 0x05, 5 */ - MPUREG_XA_OFFS_H, /* 0x06, 6 */ - MPUREG_XA_OFFS_L, /* 0x07, 7 */ - MPUREG_YA_OFFS_H, /* 0x08, 8 */ - MPUREG_YA_OFFS_L, /* 0x09, 9 */ - MPUREG_ZA_OFFS_H, /* 0x0a, 10 */ - MPUREG_ZA_OFFS_L, /* 0x0B, 11 */ - MPUREG_PRODUCT_ID, /* 0x0c, 12 */ - MPUREG_0D_RSVD, /* 0x0d, 13 */ - MPUREG_0E_RSVD, /* 0x0e, 14 */ - MPUREG_0F_RSVD, /* 0x0f, 15 */ - MPUREG_10_RSVD, /* 0x00, 16 */ - MPUREG_11_RSVD, /* 0x11, 17 */ - MPUREG_12_RSVD, /* 0x12, 18 */ - MPUREG_XG_OFFS_USRH, /* 0x13, 19 */ - MPUREG_XG_OFFS_USRL, /* 0x14, 20 */ - MPUREG_YG_OFFS_USRH, /* 0x15, 21 */ - MPUREG_YG_OFFS_USRL, /* 0x16, 22 */ - MPUREG_ZG_OFFS_USRH, /* 0x17, 23 */ - MPUREG_ZG_OFFS_USRL, /* 0x18, 24 */ - MPUREG_SMPLRT_DIV, /* 0x19, 25 */ - MPUREG_CONFIG, /* 0x1A, 26 */ - MPUREG_GYRO_CONFIG, /* 0x1b, 27 */ - MPUREG_ACCEL_CONFIG, /* 0x1c, 28 */ - MPUREG_ACCEL_FF_THR, /* 0x1d, 29 */ - MPUREG_ACCEL_FF_DUR, /* 0x1e, 30 */ - MPUREG_ACCEL_MOT_THR, /* 0x1f, 31 */ - MPUREG_ACCEL_MOT_DUR, /* 0x20, 32 */ - MPUREG_ACCEL_ZRMOT_THR, /* 0x21, 33 */ - MPUREG_ACCEL_ZRMOT_DUR, /* 0x22, 34 */ - MPUREG_FIFO_EN, /* 0x23, 35 */ - MPUREG_I2C_MST_CTRL, /* 0x24, 36 */ - MPUREG_I2C_SLV0_ADDR, /* 0x25, 37 */ - MPUREG_I2C_SLV0_REG, /* 0x26, 38 */ - MPUREG_I2C_SLV0_CTRL, /* 0x27, 39 */ - MPUREG_I2C_SLV1_ADDR, /* 0x28, 40 */ - MPUREG_I2C_SLV1_REG, /* 0x29, 41 */ - MPUREG_I2C_SLV1_CTRL, /* 0x2a, 42 */ - MPUREG_I2C_SLV2_ADDR, /* 0x2B, 43 */ - MPUREG_I2C_SLV2_REG, /* 0x2c, 44 */ - MPUREG_I2C_SLV2_CTRL, /* 0x2d, 45 */ - MPUREG_I2C_SLV3_ADDR, /* 0x2E, 46 */ - MPUREG_I2C_SLV3_REG, /* 0x2f, 47 */ - MPUREG_I2C_SLV3_CTRL, /* 0x30, 48 */ - MPUREG_I2C_SLV4_ADDR, /* 0x31, 49 */ - MPUREG_I2C_SLV4_REG, /* 0x32, 50 */ - MPUREG_I2C_SLV4_DO, /* 0x33, 51 */ - MPUREG_I2C_SLV4_CTRL, /* 0x34, 52 */ - MPUREG_I2C_SLV4_DI, /* 0x35, 53 */ - MPUREG_I2C_MST_STATUS, /* 0x36, 54 */ - MPUREG_INT_PIN_CFG, /* 0x37, 55 */ - MPUREG_INT_ENABLE, /* 0x38, 56 */ - MPUREG_DMP_INT_STATUS, /* 0x39, 57 */ - MPUREG_INT_STATUS, /* 0x3A, 58 */ - MPUREG_ACCEL_XOUT_H, /* 0x3B, 59 */ - MPUREG_ACCEL_XOUT_L, /* 0x3c, 60 */ - MPUREG_ACCEL_YOUT_H, /* 0x3d, 61 */ - MPUREG_ACCEL_YOUT_L, /* 0x3e, 62 */ - MPUREG_ACCEL_ZOUT_H, /* 0x3f, 63 */ - MPUREG_ACCEL_ZOUT_L, /* 0x40, 64 */ - MPUREG_TEMP_OUT_H, /* 0x41, 65 */ - MPUREG_TEMP_OUT_L, /* 0x42, 66 */ - MPUREG_GYRO_XOUT_H, /* 0x43, 67 */ - MPUREG_GYRO_XOUT_L, /* 0x44, 68 */ - MPUREG_GYRO_YOUT_H, /* 0x45, 69 */ - MPUREG_GYRO_YOUT_L, /* 0x46, 70 */ - MPUREG_GYRO_ZOUT_H, /* 0x47, 71 */ - MPUREG_GYRO_ZOUT_L, /* 0x48, 72 */ - MPUREG_EXT_SLV_SENS_DATA_00, /* 0x49, 73 */ - MPUREG_EXT_SLV_SENS_DATA_01, /* 0x4a, 74 */ - MPUREG_EXT_SLV_SENS_DATA_02, /* 0x4b, 75 */ - MPUREG_EXT_SLV_SENS_DATA_03, /* 0x4c, 76 */ - MPUREG_EXT_SLV_SENS_DATA_04, /* 0x4d, 77 */ - MPUREG_EXT_SLV_SENS_DATA_05, /* 0x4e, 78 */ - MPUREG_EXT_SLV_SENS_DATA_06, /* 0x4F, 79 */ - MPUREG_EXT_SLV_SENS_DATA_07, /* 0x50, 80 */ - MPUREG_EXT_SLV_SENS_DATA_08, /* 0x51, 81 */ - MPUREG_EXT_SLV_SENS_DATA_09, /* 0x52, 82 */ - MPUREG_EXT_SLV_SENS_DATA_10, /* 0x53, 83 */ - MPUREG_EXT_SLV_SENS_DATA_11, /* 0x54, 84 */ - MPUREG_EXT_SLV_SENS_DATA_12, /* 0x55, 85 */ - MPUREG_EXT_SLV_SENS_DATA_13, /* 0x56, 86 */ - MPUREG_EXT_SLV_SENS_DATA_14, /* 0x57, 87 */ - MPUREG_EXT_SLV_SENS_DATA_15, /* 0x58, 88 */ - MPUREG_EXT_SLV_SENS_DATA_16, /* 0x59, 89 */ - MPUREG_EXT_SLV_SENS_DATA_17, /* 0x5a, 90 */ - MPUREG_EXT_SLV_SENS_DATA_18, /* 0x5B, 91 */ - MPUREG_EXT_SLV_SENS_DATA_19, /* 0x5c, 92 */ - MPUREG_EXT_SLV_SENS_DATA_20, /* 0x5d, 93 */ - MPUREG_EXT_SLV_SENS_DATA_21, /* 0x5e, 94 */ - MPUREG_EXT_SLV_SENS_DATA_22, /* 0x5f, 95 */ - MPUREG_EXT_SLV_SENS_DATA_23, /* 0x60, 96 */ - MPUREG_ACCEL_INTEL_STATUS, /* 0x61, 97 */ - MPUREG_62_RSVD, /* 0x62, 98 */ - MPUREG_I2C_SLV0_DO, /* 0x63, 99 */ - MPUREG_I2C_SLV1_DO, /* 0x64, 100 */ - MPUREG_I2C_SLV2_DO, /* 0x65, 101 */ - MPUREG_I2C_SLV3_DO, /* 0x66, 102 */ - MPUREG_I2C_MST_DELAY_CTRL, /* 0x67, 103 */ - MPUREG_SIGNAL_PATH_RESET, /* 0x68, 104 */ - MPUREG_ACCEL_INTEL_CTRL, /* 0x69, 105 */ - MPUREG_USER_CTRL, /* 0x6A, 106 */ - MPUREG_PWR_MGMT_1, /* 0x6B, 107 */ - MPUREG_PWR_MGMT_2, /* 0x6C, 108 */ - MPUREG_BANK_SEL, /* 0x6D, 109 */ - MPUREG_MEM_START_ADDR, /* 0x6E, 100 */ - MPUREG_MEM_R_W, /* 0x6F, 111 */ - MPUREG_DMP_CFG_1, /* 0x70, 112 */ - MPUREG_DMP_CFG_2, /* 0x71, 113 */ - MPUREG_FIFO_COUNTH, /* 0x72, 114 */ - MPUREG_FIFO_COUNTL, /* 0x73, 115 */ - MPUREG_FIFO_R_W, /* 0x74, 116 */ - MPUREG_WHOAMI, /* 0x75, 117 */ - - NUM_OF_MPU_REGISTERS /* = 0x76, 118 */ -}; - -/*==== MPU6050B1 MEMORY ====*/ -enum MPU_MEMORY_BANKS { - MEM_RAM_BANK_0 = 0, - MEM_RAM_BANK_1, - MEM_RAM_BANK_2, - MEM_RAM_BANK_3, - MEM_RAM_BANK_4, - MEM_RAM_BANK_5, - MEM_RAM_BANK_6, - MEM_RAM_BANK_7, - MEM_RAM_BANK_8, - MEM_RAM_BANK_9, - MEM_RAM_BANK_10, - MEM_RAM_BANK_11, - MPU_MEM_NUM_RAM_BANKS, - MPU_MEM_OTP_BANK_0 = 16 -}; - - -/*==== MPU6050B1 parameters ====*/ - -#define NUM_REGS (NUM_OF_MPU_REGISTERS) -#define START_SENS_REGS (0x3B) -#define NUM_SENS_REGS (0x60 - START_SENS_REGS + 1) - -/*---- MPU Memory ----*/ -#define NUM_BANKS (MPU_MEM_NUM_RAM_BANKS) -#define BANK_SIZE (256) -#define MEM_SIZE (NUM_BANKS * BANK_SIZE) -#define MPU_MEM_BANK_SIZE (BANK_SIZE) /*alternative name */ - -#define FIFO_HW_SIZE (1024) - -#define NUM_EXT_SLAVES (4) - - -/*==== BITS FOR MPU6050B1 ====*/ -/*---- MPU6050B1 'XG_OFFS_TC' register (0, 1, 2) ----*/ -#define BIT_PU_SLEEP_MODE 0x80 -#define BITS_XG_OFFS_TC 0x7E -#define BIT_OTP_BNK_VLD 0x01 - -#define BIT_I2C_MST_VDDIO 0x80 -#define BITS_YG_OFFS_TC 0x7E -#define BITS_ZG_OFFS_TC 0x7E -/*---- MPU6050B1 'FIFO_EN' register (23) ----*/ -#define BIT_TEMP_OUT 0x80 -#define BIT_GYRO_XOUT 0x40 -#define BIT_GYRO_YOUT 0x20 -#define BIT_GYRO_ZOUT 0x10 -#define BIT_ACCEL 0x08 -#define BIT_SLV_2 0x04 -#define BIT_SLV_1 0x02 -#define BIT_SLV_0 0x01 -/*---- MPU6050B1 'CONFIG' register (1A) ----*/ -/*NONE 0xC0 */ -#define BITS_EXT_SYNC_SET 0x38 -#define BITS_DLPF_CFG 0x07 -/*---- MPU6050B1 'GYRO_CONFIG' register (1B) ----*/ -/* voluntarily modified label from BITS_FS_SEL to - * BITS_GYRO_FS_SEL to avoid confusion with MPU - */ -#define BITS_GYRO_FS_SEL 0x18 -/*NONE 0x07 */ -/*---- MPU6050B1 'ACCEL_CONFIG' register (1C) ----*/ -#define BITS_ACCEL_FS_SEL 0x18 -#define BITS_ACCEL_HPF 0x07 -/*---- MPU6050B1 'I2C_MST_CTRL' register (24) ----*/ -#define BIT_MULT_MST_EN 0x80 -#define BIT_WAIT_FOR_ES 0x40 -#define BIT_SLV_3_FIFO_EN 0x20 -#define BIT_I2C_MST_PSR 0x10 -#define BITS_I2C_MST_CLK 0x0F -/*---- MPU6050B1 'I2C_SLV?_ADDR' register (27,2A,2D,30) ----*/ -#define BIT_I2C_READ 0x80 -#define BIT_I2C_WRITE 0x00 -#define BITS_I2C_ADDR 0x7F -/*---- MPU6050B1 'I2C_SLV?_CTRL' register (27,2A,2D,30) ----*/ -#define BIT_SLV_ENABLE 0x80 -#define BIT_SLV_BYTE_SW 0x40 -#define BIT_SLV_REG_DIS 0x20 -#define BIT_SLV_GRP 0x10 -#define BITS_SLV_LENG 0x0F -/*---- MPU6050B1 'I2C_SLV4_ADDR' register (31) ----*/ -#define BIT_I2C_SLV4_RNW 0x80 -/*---- MPU6050B1 'I2C_SLV4_CTRL' register (34) ----*/ -#define BIT_I2C_SLV4_EN 0x80 -#define BIT_SLV4_DONE_INT_EN 0x40 -#define BIT_SLV4_REG_DIS 0x20 -#define MASK_I2C_MST_DLY 0x1F -/*---- MPU6050B1 'I2C_MST_STATUS' register (36) ----*/ -#define BIT_PASS_THROUGH 0x80 -#define BIT_I2C_SLV4_DONE 0x40 -#define BIT_I2C_LOST_ARB 0x20 -#define BIT_I2C_SLV4_NACK 0x10 -#define BIT_I2C_SLV3_NACK 0x08 -#define BIT_I2C_SLV2_NACK 0x04 -#define BIT_I2C_SLV1_NACK 0x02 -#define BIT_I2C_SLV0_NACK 0x01 -/*---- MPU6050B1 'INT_PIN_CFG' register (37) ----*/ -#define BIT_ACTL 0x80 -#define BIT_ACTL_LOW 0x80 -#define BIT_ACTL_HIGH 0x00 -#define BIT_OPEN 0x40 -#define BIT_LATCH_INT_EN 0x20 -#define BIT_INT_ANYRD_2CLEAR 0x10 -#define BIT_ACTL_FSYNC 0x08 -#define BIT_FSYNC_INT_EN 0x04 -#define BIT_BYPASS_EN 0x02 -#define BIT_CLKOUT_EN 0x01 -/*---- MPU6050B1 'INT_ENABLE' register (38) ----*/ -#define BIT_FF_EN 0x80 -#define BIT_MOT_EN 0x40 -#define BIT_ZMOT_EN 0x20 -#define BIT_FIFO_OVERFLOW_EN 0x10 -#define BIT_I2C_MST_INT_EN 0x08 -#define BIT_PLL_RDY_EN 0x04 -#define BIT_DMP_INT_EN 0x02 -#define BIT_RAW_RDY_EN 0x01 -/*---- MPU6050B1 'DMP_INT_STATUS' register (39) ----*/ -/*NONE 0x80 */ -/*NONE 0x40 */ -#define BIT_DMP_INT_5 0x20 -#define BIT_DMP_INT_4 0x10 -#define BIT_DMP_INT_3 0x08 -#define BIT_DMP_INT_2 0x04 -#define BIT_DMP_INT_1 0x02 -#define BIT_DMP_INT_0 0x01 -/*---- MPU6050B1 'INT_STATUS' register (3A) ----*/ -#define BIT_FF_INT 0x80 -#define BIT_MOT_INT 0x40 -#define BIT_ZMOT_INT 0x20 -#define BIT_FIFO_OVERFLOW_INT 0x10 -#define BIT_I2C_MST_INT 0x08 -#define BIT_PLL_RDY_INT 0x04 -#define BIT_DMP_INT 0x02 -#define BIT_RAW_DATA_RDY_INT 0x01 -/*---- MPU6050B1 'MPUREG_I2C_MST_DELAY_CTRL' register (0x67) ----*/ -#define BIT_DELAY_ES_SHADOW 0x80 -#define BIT_SLV4_DLY_EN 0x10 -#define BIT_SLV3_DLY_EN 0x08 -#define BIT_SLV2_DLY_EN 0x04 -#define BIT_SLV1_DLY_EN 0x02 -#define BIT_SLV0_DLY_EN 0x01 -/*---- MPU6050B1 'BANK_SEL' register (6D) ----*/ -#define BIT_PRFTCH_EN 0x40 -#define BIT_CFG_USER_BANK 0x20 -#define BITS_MEM_SEL 0x1f -/*---- MPU6050B1 'USER_CTRL' register (6A) ----*/ -#define BIT_DMP_EN 0x80 -#define BIT_FIFO_EN 0x40 -#define BIT_I2C_MST_EN 0x20 -#define BIT_I2C_IF_DIS 0x10 -#define BIT_DMP_RST 0x08 -#define BIT_FIFO_RST 0x04 -#define BIT_I2C_MST_RST 0x02 -#define BIT_SIG_COND_RST 0x01 -/*---- MPU6050B1 'PWR_MGMT_1' register (6B) ----*/ -#define BIT_H_RESET 0x80 -#define BIT_SLEEP 0x40 -#define BIT_CYCLE 0x20 -#define BIT_PD_PTAT 0x08 -#define BITS_CLKSEL 0x07 -/*---- MPU6050B1 'PWR_MGMT_2' register (6C) ----*/ -#define BITS_LPA_WAKE_CTRL 0xC0 -#define BITS_LPA_WAKE_1HZ 0x00 -#define BITS_LPA_WAKE_2HZ 0x40 -#define BITS_LPA_WAKE_10HZ 0x80 -#define BITS_LPA_WAKE_40HZ 0xC0 -#define BIT_STBY_XA 0x20 -#define BIT_STBY_YA 0x10 -#define BIT_STBY_ZA 0x08 -#define BIT_STBY_XG 0x04 -#define BIT_STBY_YG 0x02 -#define BIT_STBY_ZG 0x01 - -#define ACCEL_MOT_THR_LSB (32) /* mg */ -#define ACCEL_MOT_DUR_LSB (1) -#define ACCEL_ZRMOT_THR_LSB_CONVERSION(mg) ((mg * 1000) / 255) -#define ACCEL_ZRMOT_DUR_LSB (64) - -/*----------------------------------------------------------------------------*/ -/*---- Alternative names to take care of conflicts with current mpu3050.h ----*/ -/*----------------------------------------------------------------------------*/ - -/*-- registers --*/ -#define MPUREG_DLPF_FS_SYNC MPUREG_CONFIG /* 0x1A */ - -#define MPUREG_PWR_MGM MPUREG_PWR_MGMT_1 /* 0x6B */ -#define MPUREG_FIFO_EN1 MPUREG_FIFO_EN /* 0x23 */ -#define MPUREG_INT_CFG MPUREG_INT_ENABLE /* 0x38 */ -#define MPUREG_X_OFFS_USRH MPUREG_XG_OFFS_USRH /* 0x13 */ -#define MPUREG_WHO_AM_I MPUREG_WHOAMI /* 0x75 */ -#define MPUREG_23_RSVD MPUREG_EXT_SLV_SENS_DATA_00 /* 0x49 */ - -/*-- bits --*/ -/* 'USER_CTRL' register */ -#define BIT_AUX_IF_EN BIT_I2C_MST_EN -#define BIT_AUX_RD_LENG BIT_I2C_MST_EN -#define BIT_IME_IF_RST BIT_I2C_MST_RST -#define BIT_GYRO_RST BIT_SIG_COND_RST -/* 'INT_ENABLE' register */ -#define BIT_RAW_RDY BIT_RAW_DATA_RDY_INT -#define BIT_MPU_RDY_EN BIT_PLL_RDY_EN -/* 'INT_STATUS' register */ -#define BIT_INT_STATUS_FIFO_OVERLOW BIT_FIFO_OVERFLOW_INT - -/*---- MPU6050 Silicon Revisions ----*/ -#define MPU_SILICON_REV_A2 1 /* MPU6050A2 Device */ -#define MPU_SILICON_REV_B1 2 /* MPU6050B1 Device */ - -/*---- MPU6050 notable product revisions ----*/ -#define MPU_PRODUCT_KEY_B1_E1_5 105 -#define MPU_PRODUCT_KEY_B2_F1 431 - -/*---- structure containing control variables used by MLDL ----*/ -/*---- MPU clock source settings ----*/ -/*---- MPU filter selections ----*/ -enum mpu_filter { - MPU_FILTER_256HZ_NOLPF2 = 0, - MPU_FILTER_188HZ, - MPU_FILTER_98HZ, - MPU_FILTER_42HZ, - MPU_FILTER_20HZ, - MPU_FILTER_10HZ, - MPU_FILTER_5HZ, - MPU_FILTER_2100HZ_NOLPF, - NUM_MPU_FILTER -}; - -enum mpu_fullscale { - MPU_FS_250DPS = 0, - MPU_FS_500DPS, - MPU_FS_1000DPS, - MPU_FS_2000DPS, - NUM_MPU_FS -}; - -enum mpu_clock_sel { - MPU_CLK_SEL_INTERNAL = 0, - MPU_CLK_SEL_PLLGYROX, - MPU_CLK_SEL_PLLGYROY, - MPU_CLK_SEL_PLLGYROZ, - MPU_CLK_SEL_PLLEXT32K, - MPU_CLK_SEL_PLLEXT19M, - MPU_CLK_SEL_RESERVED, - MPU_CLK_SEL_STOP, - NUM_CLK_SEL -}; - -enum mpu_ext_sync { - MPU_EXT_SYNC_NONE = 0, - MPU_EXT_SYNC_TEMP, - MPU_EXT_SYNC_GYROX, - MPU_EXT_SYNC_GYROY, - MPU_EXT_SYNC_GYROZ, - MPU_EXT_SYNC_ACCELX, - MPU_EXT_SYNC_ACCELY, - MPU_EXT_SYNC_ACCELZ, - NUM_MPU_EXT_SYNC -}; - -#define MPUREG_CONFIG_VALUE(ext_sync, lpf) \ - ((ext_sync << 3) | lpf) - -#define MPUREG_GYRO_CONFIG_VALUE(x_st, y_st, z_st, full_scale) \ - ((x_st ? 0x80 : 0) | \ - (y_st ? 0x70 : 0) | \ - (z_st ? 0x60 : 0) | \ - (full_scale << 3)) - -#endif /* __MPU6050_H_ */ diff --git a/drivers/misc/inv_mpu/mpuirq.c b/drivers/misc/inv_mpu/mpuirq.c deleted file mode 100644 index 2a850fa..0000000 --- a/drivers/misc/inv_mpu/mpuirq.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include "mpuirq.h" -#include "mldl_cfg.h" - -#define MPUIRQ_NAME "mpuirq" - -/* function which gets accel data and sends it to MPU */ - -DECLARE_WAIT_QUEUE_HEAD(mpuirq_wait); - -struct mpuirq_dev_data { - struct i2c_client *mpu_client; - struct miscdevice *dev; - int irq; - int pid; - int accel_divider; - int data_ready; - int timeout; -}; - -static struct mpuirq_dev_data mpuirq_dev_data; -static struct mpuirq_data mpuirq_data; -static char *interface = MPUIRQ_NAME; - -static int mpuirq_open(struct inode *inode, struct file *file) -{ - dev_dbg(mpuirq_dev_data.dev->this_device, - "%s current->pid %d\n", __func__, current->pid); - mpuirq_dev_data.pid = current->pid; - file->private_data = &mpuirq_dev_data; - return 0; -} - -/* close function - called when the "file" /dev/mpuirq is closed in userspace */ -static int mpuirq_release(struct inode *inode, struct file *file) -{ - dev_dbg(mpuirq_dev_data.dev->this_device, "mpuirq_release\n"); - return 0; -} - -/* read function called when from /dev/mpuirq is read */ -static ssize_t mpuirq_read(struct file *file, - char *buf, size_t count, loff_t *ppos) -{ - int len, err; - struct mpuirq_dev_data *p_mpuirq_dev_data = file->private_data; - - if (!mpuirq_dev_data.data_ready && - mpuirq_dev_data.timeout && (!(file->f_flags & O_NONBLOCK))) { - wait_event_interruptible_timeout(mpuirq_wait, - mpuirq_dev_data.data_ready, - mpuirq_dev_data.timeout); - } - - if (mpuirq_dev_data.data_ready && NULL != buf - && count >= sizeof(mpuirq_data)) { - err = copy_to_user(buf, &mpuirq_data, sizeof(mpuirq_data)); - mpuirq_data.data_type = 0; - } else { - return 0; - } - if (err != 0) { - dev_err(p_mpuirq_dev_data->dev->this_device, - "Copy to user returned %d\n", err); - return -EFAULT; - } - mpuirq_dev_data.data_ready = 0; - len = sizeof(mpuirq_data); - return len; -} - -unsigned int mpuirq_poll(struct file *file, struct poll_table_struct *poll) -{ - int mask = 0; - - poll_wait(file, &mpuirq_wait, poll); - if (mpuirq_dev_data.data_ready) - mask |= POLLIN | POLLRDNORM; - return mask; -} - -/* ioctl - I/O control */ -static long mpuirq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - int retval = 0; - int data; - - switch (cmd) { - case MPUIRQ_SET_TIMEOUT: - mpuirq_dev_data.timeout = arg; - break; - - case MPUIRQ_GET_INTERRUPT_CNT: - data = mpuirq_data.interruptcount - 1; - if (mpuirq_data.interruptcount > 1) - mpuirq_data.interruptcount = 1; - - if (copy_to_user((int *)arg, &data, sizeof(int))) - return -EFAULT; - break; - case MPUIRQ_GET_IRQ_TIME: - if (copy_to_user((int *)arg, &mpuirq_data.irqtime, - sizeof(mpuirq_data.irqtime))) - return -EFAULT; - mpuirq_data.irqtime = 0; - break; - case MPUIRQ_SET_FREQUENCY_DIVIDER: - mpuirq_dev_data.accel_divider = arg; - break; - default: - retval = -EINVAL; - } - return retval; -} - -static irqreturn_t mpuirq_handler(int irq, void *dev_id) -{ - static int mycount; - struct timeval irqtime; - mycount++; - - mpuirq_data.interruptcount++; - - /* wake up (unblock) for reading data from userspace */ - /* and ignore first interrupt generated in module init */ - mpuirq_dev_data.data_ready = 1; - - do_gettimeofday(&irqtime); - mpuirq_data.irqtime = (((long long)irqtime.tv_sec) << 32); - mpuirq_data.irqtime += irqtime.tv_usec; - mpuirq_data.data_type = MPUIRQ_DATA_TYPE_MPU_IRQ; - mpuirq_data.data = 0; - - wake_up_interruptible(&mpuirq_wait); - - return IRQ_HANDLED; - -} - -/* define which file operations are supported */ -const struct file_operations mpuirq_fops = { - .owner = THIS_MODULE, - .read = mpuirq_read, - .poll = mpuirq_poll, - - .unlocked_ioctl = mpuirq_ioctl, - .open = mpuirq_open, - .release = mpuirq_release, -}; - -static struct miscdevice mpuirq_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = MPUIRQ_NAME, - .fops = &mpuirq_fops, -}; - -int mpuirq_init(struct i2c_client *mpu_client, struct mldl_cfg *mldl_cfg) -{ - - int res; - - mpuirq_dev_data.mpu_client = mpu_client; - - dev_info(&mpu_client->adapter->dev, - "Module Param interface = %s\n", interface); - - mpuirq_dev_data.irq = mpu_client->irq; - mpuirq_dev_data.pid = 0; - mpuirq_dev_data.accel_divider = -1; - mpuirq_dev_data.data_ready = 0; - mpuirq_dev_data.timeout = 0; - mpuirq_dev_data.dev = &mpuirq_device; - - if (mpuirq_dev_data.irq) { - unsigned long flags; - if (BIT_ACTL_LOW == ((mldl_cfg->pdata->int_config) & BIT_ACTL)) - flags = IRQF_TRIGGER_FALLING; - else - flags = IRQF_TRIGGER_RISING; - - flags |= IRQF_SHARED; - res = - request_irq(mpuirq_dev_data.irq, mpuirq_handler, flags, - interface, &mpuirq_dev_data.irq); - - /* mpu_irq Interrupt isr enable */ - if (mldl_cfg->pdata && mldl_cfg->pdata->enable_irq_handler) - mldl_cfg->pdata->enable_irq_handler(); - if (res) { - dev_err(&mpu_client->adapter->dev, - "myirqtest: cannot register IRQ %d\n", - mpuirq_dev_data.irq); - } else { - res = misc_register(&mpuirq_device); - if (res < 0) { - dev_err(&mpu_client->adapter->dev, - "misc_register returned %d\n", res); - free_irq(mpuirq_dev_data.irq, - &mpuirq_dev_data.irq); - } - } - - } else { - res = 0; - } - - return res; -} - -void mpuirq_exit(void) -{ - if (mpuirq_dev_data.irq > 0) - free_irq(mpuirq_dev_data.irq, &mpuirq_dev_data.irq); - - dev_info(mpuirq_device.this_device, "Unregistering %s\n", MPUIRQ_NAME); - misc_deregister(&mpuirq_device); - - return; -} - -module_param(interface, charp, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(interface, "The Interface name"); diff --git a/drivers/misc/inv_mpu/mpuirq.h b/drivers/misc/inv_mpu/mpuirq.h deleted file mode 100644 index 3348071..0000000 --- a/drivers/misc/inv_mpu/mpuirq.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef __MPUIRQ__ -#define __MPUIRQ__ - -#include -#include -#include -#include "mldl_cfg.h" - -#define MPUIRQ_SET_TIMEOUT _IOW(MPU_IOCTL, 0x40, unsigned long) -#define MPUIRQ_GET_INTERRUPT_CNT _IOR(MPU_IOCTL, 0x41, unsigned long) -#define MPUIRQ_GET_IRQ_TIME _IOR(MPU_IOCTL, 0x42, struct timeval) -#define MPUIRQ_SET_FREQUENCY_DIVIDER _IOW(MPU_IOCTL, 0x43, unsigned long) - -void mpuirq_exit(void); -int mpuirq_init(struct i2c_client *mpu_client, struct mldl_cfg *mldl_cfg); - -#endif diff --git a/drivers/misc/inv_mpu/pressure/Kconfig b/drivers/misc/inv_mpu/pressure/Kconfig deleted file mode 100644 index 9fe7763..0000000 --- a/drivers/misc/inv_mpu/pressure/Kconfig +++ /dev/null @@ -1,20 +0,0 @@ -menuconfig: INV_SENSORS_PRESSURE - bool "Pressure Sensor Slaves" - depends on INV_SENSORS - default y - help - Select y to see a list of supported pressure sensors that can be - integrated with the MPUxxxx set of motion processors. - -if INV_SENSORS_PRESSURE - -config MPU_SENSORS_BMA085_411 - tristate "Bosch BMA085" - help - This enables support for the Bosch bma085 pressure sensor - This support is for integration with the MPU3050 or MPU6050 gyroscope - device driver. Only one accelerometer can be registered at a time. - Specifying more that one accelerometer in the board file will result - in runtime errors. - -endif diff --git a/drivers/misc/inv_mpu/pressure/Makefile b/drivers/misc/inv_mpu/pressure/Makefile deleted file mode 100644 index a69ee3a..0000000 --- a/drivers/misc/inv_mpu/pressure/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# -# Pressure Slaves to MPUxxxx -# -obj-$(CONFIG_MPU_SENSORS_BMA085_411) += inv_mpu_bma085.o -inv_mpu_bma085-objs += bma085.o - -EXTRA_CFLAGS += -Idrivers/misc/inv_mpu -EXTRA_CFLAGS += -D__C99_DESIGNATED_INITIALIZER diff --git a/drivers/misc/inv_mpu/pressure/bma085.c b/drivers/misc/inv_mpu/pressure/bma085.c deleted file mode 100644 index 696d2b6..0000000 --- a/drivers/misc/inv_mpu/pressure/bma085.c +++ /dev/null @@ -1,367 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Pressure Driver Layer) - * @brief Provides the interface to setup and handle a pressure - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file bma085.c - * @brief Pressure setup and handling methods. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#include -#include -#include -#include -#include -#include -#include -#include "mpu-dev.h" - -#include -#include "mlsl.h" -#include "log.h" - -/* - * this structure holds all device specific calibration parameters - */ -struct bmp085_calibration_param_t { - short ac1; - short ac2; - short ac3; - unsigned short ac4; - unsigned short ac5; - unsigned short ac6; - short b1; - short b2; - short mb; - short mc; - short md; - long param_b5; -}; - -struct bmp085_calibration_param_t cal_param; - -#define PRESSURE_BMA085_PARAM_MG 3038 /* calibration parameter */ -#define PRESSURE_BMA085_PARAM_MH -7357 /* calibration parameter */ -#define PRESSURE_BMA085_PARAM_MI 3791 /* calibration parameter */ - -/********************************************* - * Pressure Initialization Functions - *********************************************/ - -static int bma085_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = INV_SUCCESS; - return result; -} - -#define PRESSURE_BMA085_PROM_START_ADDR (0xAA) -#define PRESSURE_BMA085_PROM_DATA_LEN (22) -#define PRESSURE_BMP085_CTRL_MEAS_REG (0xF4) -/* temperature measurent */ -#define PRESSURE_BMP085_T_MEAS (0x2E) -/* pressure measurement; oversampling_setting */ -#define PRESSURE_BMP085_P_MEAS_OSS_0 (0x34) -#define PRESSURE_BMP085_P_MEAS_OSS_1 (0x74) -#define PRESSURE_BMP085_P_MEAS_OSS_2 (0xB4) -#define PRESSURE_BMP085_P_MEAS_OSS_3 (0xF4) -#define PRESSURE_BMP085_ADC_OUT_MSB_REG (0xF6) -#define PRESSURE_BMP085_ADC_OUT_LSB_REG (0xF7) - -static int bma085_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char data[PRESSURE_BMA085_PROM_DATA_LEN]; - - result = - inv_serial_read(mlsl_handle, pdata->address, - PRESSURE_BMA085_PROM_START_ADDR, - PRESSURE_BMA085_PROM_DATA_LEN, data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - - /* parameters AC1-AC6 */ - cal_param.ac1 = (data[0] << 8) | data[1]; - cal_param.ac2 = (data[2] << 8) | data[3]; - cal_param.ac3 = (data[4] << 8) | data[5]; - cal_param.ac4 = (data[6] << 8) | data[7]; - cal_param.ac5 = (data[8] << 8) | data[9]; - cal_param.ac6 = (data[10] << 8) | data[11]; - - /* parameters B1,B2 */ - cal_param.b1 = (data[12] << 8) | data[13]; - cal_param.b2 = (data[14] << 8) | data[15]; - - /* parameters MB,MC,MD */ - cal_param.mb = (data[16] << 8) | data[17]; - cal_param.mc = (data[18] << 8) | data[19]; - cal_param.md = (data[20] << 8) | data[21]; - - return result; -} - -static int bma085_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - long pressure, x1, x2, x3, b3, b6; - unsigned long b4, b7; - unsigned long up; - unsigned short ut; - short oversampling_setting = 0; - short temperature; - long divisor; - - /* get temprature */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - PRESSURE_BMP085_CTRL_MEAS_REG, - PRESSURE_BMP085_T_MEAS); - msleep(5); - result = - inv_serial_read(mlsl_handle, pdata->address, - PRESSURE_BMP085_ADC_OUT_MSB_REG, 2, - (unsigned char *)data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - ut = (data[0] << 8) | data[1]; - - x1 = (((long) ut - (long)cal_param.ac6) * (long)cal_param.ac5) >> 15; - divisor = x1 + cal_param.md; - if (!divisor) - return INV_ERROR_DIVIDE_BY_ZERO; - - x2 = ((long)cal_param.mc << 11) / (x1 + cal_param.md); - cal_param.param_b5 = x1 + x2; - /* temperature in 0.1 degree C */ - temperature = (short)((cal_param.param_b5 + 8) >> 4); - - /* get pressure */ - result = inv_serial_single_write(mlsl_handle, pdata->address, - PRESSURE_BMP085_CTRL_MEAS_REG, - PRESSURE_BMP085_P_MEAS_OSS_0); - msleep(5); - result = - inv_serial_read(mlsl_handle, pdata->address, - PRESSURE_BMP085_ADC_OUT_MSB_REG, 2, - (unsigned char *)data); - if (result) { - LOG_RESULT_LOCATION(result); - return result; - } - up = (((unsigned long) data[0] << 8) | ((unsigned long) data[1])); - - b6 = cal_param.param_b5 - 4000; - /* calculate B3 */ - x1 = (b6*b6) >> 12; - x1 *= cal_param.b2; - x1 >>= 11; - - x2 = (cal_param.ac2*b6); - x2 >>= 11; - - x3 = x1 + x2; - - b3 = (((((long)cal_param.ac1) * 4 + x3) - << oversampling_setting) + 2) >> 2; - - /* calculate B4 */ - x1 = (cal_param.ac3 * b6) >> 13; - x2 = (cal_param.b1 * ((b6*b6) >> 12)) >> 16; - x3 = ((x1 + x2) + 2) >> 2; - b4 = (cal_param.ac4 * (unsigned long) (x3 + 32768)) >> 15; - if (!b4) - return INV_ERROR; - - b7 = ((unsigned long)(up - b3) * (50000>>oversampling_setting)); - if (b7 < 0x80000000) - pressure = (b7 << 1) / b4; - else - pressure = (b7 / b4) << 1; - - x1 = pressure >> 8; - x1 *= x1; - x1 = (x1 * PRESSURE_BMA085_PARAM_MG) >> 16; - x2 = (pressure * PRESSURE_BMA085_PARAM_MH) >> 16; - /* pressure in Pa */ - pressure += (x1 + x2 + PRESSURE_BMA085_PARAM_MI) >> 4; - - data[0] = (unsigned char)(pressure >> 16); - data[1] = (unsigned char)(pressure >> 8); - data[2] = (unsigned char)(pressure & 0xFF); - - return result; -} - -static struct ext_slave_descr bma085_descr = { - .init = NULL, - .exit = NULL, - .suspend = bma085_suspend, - .resume = bma085_resume, - .read = bma085_read, - .config = NULL, - .get_config = NULL, - .name = "bma085", - .type = EXT_SLAVE_TYPE_PRESSURE, - .id = PRESSURE_ID_BMA085, - .read_reg = 0xF6, - .read_len = 3, - .endian = EXT_SLAVE_BIG_ENDIAN, - .range = {0, 0}, -}; - -static -struct ext_slave_descr *bma085_get_slave_descr(void) -{ - return &bma085_descr; -} - -/* Platform data for the MPU */ -struct bma085_mod_private_data { - struct i2c_client *client; - struct ext_slave_platform_data *pdata; -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static int bma085_mod_probe(struct i2c_client *client, - const struct i2c_device_id *devid) -{ - struct ext_slave_platform_data *pdata; - struct bma085_mod_private_data *private_data; - int result = 0; - - dev_info(&client->adapter->dev, "%s: %s\n", __func__, devid->name); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - result = -ENODEV; - goto out_no_free; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->adapter->dev, - "Missing platform data for slave %s\n", devid->name); - result = -EFAULT; - goto out_no_free; - } - - private_data = kzalloc(sizeof(*private_data), GFP_KERNEL); - if (!private_data) { - result = -ENOMEM; - goto out_no_free; - } - - i2c_set_clientdata(client, private_data); - private_data->client = client; - private_data->pdata = pdata; - - result = inv_mpu_register_slave(THIS_MODULE, client, pdata, - bma085_get_slave_descr); - if (result) { - dev_err(&client->adapter->dev, - "Slave registration failed: %s, %d\n", - devid->name, result); - goto out_free_memory; - } - - return result; - -out_free_memory: - kfree(private_data); -out_no_free: - dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result); - return result; - -} - -static int bma085_mod_remove(struct i2c_client *client) -{ - struct bma085_mod_private_data *private_data = - i2c_get_clientdata(client); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - inv_mpu_unregister_slave(client, private_data->pdata, - bma085_get_slave_descr); - - kfree(private_data); - return 0; -} - -static const struct i2c_device_id bma085_mod_id[] = { - { "bma085", PRESSURE_ID_BMA085 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, bma085_mod_id); - -static struct i2c_driver bma085_mod_driver = { - .class = I2C_CLASS_HWMON, - .probe = bma085_mod_probe, - .remove = bma085_mod_remove, - .id_table = bma085_mod_id, - .driver = { - .owner = THIS_MODULE, - .name = "bma085_mod", - }, - .address_list = normal_i2c, -}; - -static int __init bma085_mod_init(void) -{ - int res = i2c_add_driver(&bma085_mod_driver); - pr_info("%s: Probe name %s\n", __func__, "bma085_mod"); - if (res) - pr_err("%s failed\n", __func__); - return res; -} - -static void __exit bma085_mod_exit(void) -{ - pr_info("%s\n", __func__); - i2c_del_driver(&bma085_mod_driver); -} - -module_init(bma085_mod_init); -module_exit(bma085_mod_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Driver to integrate BMA085 sensor with the MPU"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("bma085_mod"); -/** - * @} -**/ diff --git a/drivers/misc/inv_mpu/sensors_core.c b/drivers/misc/inv_mpu/sensors_core.c deleted file mode 100644 index b652631..0000000 --- a/drivers/misc/inv_mpu/sensors_core.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Universal sensors core class - * - * Author : Ryunkyun Park - */ - -#include -#include -#include -#include -#include -#include -/* #include */ - -struct class *sensors_class; -static atomic_t sensor_count; -static DEFINE_MUTEX(sensors_mutex); - -/** - * Create sysfs interface - */ -static void set_sensor_attr(struct device *dev, - struct device_attribute *attributes[]) -{ - int i; - - for (i = 0; attributes[i] != NULL; i++) { - if ((device_create_file(dev, attributes[i])) < 0) { - pr_info("[SENSOR CORE] fail!!! device_create_file" \ - "( dev, attributes[%d] )\n", i); - } - } -} - -int sensors_register(struct device *dev, void *drvdata, - struct device_attribute *attributes[], char *name) -{ - int ret = 0; - - if (!sensors_class) { - sensors_class = class_create(THIS_MODULE, "sensors"); - if (IS_ERR(sensors_class)) - return PTR_ERR(sensors_class); - } - - mutex_lock(&sensors_mutex); - - dev = device_create(sensors_class, NULL, 0, drvdata, "%s", name); - - if (IS_ERR(dev)) { - ret = PTR_ERR(dev); - pr_err("[SENSORS CORE] device_create failed! [%d]\n", ret); - return ret; - } - - set_sensor_attr(dev, attributes); - - atomic_inc(&sensor_count); - - mutex_unlock(&sensors_mutex); - - return 0; -} - -void sensors_unregister(struct device *dev) -{ - /* TODO : Unregister device */ -} - -static int __init sensors_class_init(void) -{ - pr_info("[SENSORS CORE] sensors_class_init\n"); - sensors_class = class_create(THIS_MODULE, "sensors"); - - if (IS_ERR(sensors_class)) - return PTR_ERR(sensors_class); - - atomic_set(&sensor_count, 0); - sensors_class->dev_uevent = NULL; - - return 0; -} - -static void __exit sensors_class_exit(void) -{ - class_destroy(sensors_class); -} - -EXPORT_SYMBOL_GPL(sensors_register); -EXPORT_SYMBOL_GPL(sensors_unregister); - -/* exported for the APM Power driver, APM emulation */ -EXPORT_SYMBOL_GPL(sensors_class); - -subsys_initcall(sensors_class_init); -module_exit(sensors_class_exit); - -MODULE_DESCRIPTION("Universal sensors core class"); -MODULE_AUTHOR("Ryunkyun Park "); -MODULE_LICENSE("GPL"); diff --git a/drivers/misc/inv_mpu/slaveirq.c b/drivers/misc/inv_mpu/slaveirq.c deleted file mode 100644 index fdabcdd..0000000 --- a/drivers/misc/inv_mpu/slaveirq.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "slaveirq.h" -#include "mldl_cfg.h" - -/* function which gets slave data and sends it to SLAVE */ - -struct slaveirq_dev_data { - struct miscdevice dev; - struct i2c_client *slave_client; - struct mpuirq_data data; - wait_queue_head_t slaveirq_wait; - int irq; - int pid; - int data_ready; - int timeout; -}; - -/* The following depends on patch fa1f68db6ca7ebb6fc4487ac215bffba06c01c28 - * drivers: misc: pass miscdevice pointer via file private data - */ -static int slaveirq_open(struct inode *inode, struct file *file) -{ - /* Device node is availabe in the file->private_data, this is - * exactly what we want so we leave it there */ - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - - dev_dbg(data->dev.this_device, - "%s current->pid %d\n", __func__, current->pid); - data->pid = current->pid; - return 0; -} - -static int slaveirq_release(struct inode *inode, struct file *file) -{ - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - dev_dbg(data->dev.this_device, "slaveirq_release\n"); - return 0; -} - -/* read function called when from /dev/slaveirq is read */ -static ssize_t slaveirq_read(struct file *file, - char *buf, size_t count, loff_t *ppos) -{ - int len, err; - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - - if (!data->data_ready && data->timeout && - !(file->f_flags & O_NONBLOCK)) { - wait_event_interruptible_timeout(data->slaveirq_wait, - data->data_ready, - data->timeout); - } - - if (data->data_ready && NULL != buf && count >= sizeof(data->data)) { - err = copy_to_user(buf, &data->data, sizeof(data->data)); - data->data.data_type = 0; - } else { - return 0; - } - if (err != 0) { - dev_err(data->dev.this_device, - "Copy to user returned %d\n", err); - return -EFAULT; - } - data->data_ready = 0; - len = sizeof(data->data); - return len; -} - -static unsigned int slaveirq_poll(struct file *file, - struct poll_table_struct *poll) -{ - int mask = 0; - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - - poll_wait(file, &data->slaveirq_wait, poll); - if (data->data_ready) - mask |= POLLIN | POLLRDNORM; - return mask; -} - -/* ioctl - I/O control */ -static long slaveirq_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - int retval = 0; - int tmp; - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - - switch (cmd) { - case SLAVEIRQ_SET_TIMEOUT: - data->timeout = arg; - break; - - case SLAVEIRQ_GET_INTERRUPT_CNT: - tmp = data->data.interruptcount - 1; - if (data->data.interruptcount > 1) - data->data.interruptcount = 1; - - if (copy_to_user((int *)arg, &tmp, sizeof(int))) - return -EFAULT; - break; - case SLAVEIRQ_GET_IRQ_TIME: - if (copy_to_user((int *)arg, &data->data.irqtime, - sizeof(data->data.irqtime))) - return -EFAULT; - data->data.irqtime = 0; - break; - default: - retval = -EINVAL; - } - return retval; -} - -static irqreturn_t slaveirq_handler(int irq, void *dev_id) -{ - struct slaveirq_dev_data *data = (struct slaveirq_dev_data *)dev_id; - static int mycount; - struct timeval irqtime; - mycount++; - - data->data.interruptcount++; - - /* wake up (unblock) for reading data from userspace */ - data->data_ready = 1; - - do_gettimeofday(&irqtime); - data->data.irqtime = (((long long)irqtime.tv_sec) << 32); - data->data.irqtime += irqtime.tv_usec; - data->data.data_type |= 1; - - wake_up_interruptible(&data->slaveirq_wait); - - return IRQ_HANDLED; - -} - -/* define which file operations are supported */ -static const struct file_operations slaveirq_fops = { - .owner = THIS_MODULE, - .read = slaveirq_read, - .poll = slaveirq_poll, - -#if HAVE_COMPAT_IOCTL - .compat_ioctl = slaveirq_ioctl, -#endif -#if HAVE_UNLOCKED_IOCTL - .unlocked_ioctl = slaveirq_ioctl, -#endif - .open = slaveirq_open, - .release = slaveirq_release, -}; - -int slaveirq_init(struct i2c_adapter *slave_adapter, - struct ext_slave_platform_data *pdata, char *name) -{ - - int res; - struct slaveirq_dev_data *data; - - if (!pdata->irq) - return -EINVAL; - - pdata->irq_data = kzalloc(sizeof(*data), GFP_KERNEL); - data = (struct slaveirq_dev_data *)pdata->irq_data; - if (!data) - return -ENOMEM; - - data->dev.minor = MISC_DYNAMIC_MINOR; - data->dev.name = name; - data->dev.fops = &slaveirq_fops; - data->irq = pdata->irq; - data->pid = 0; - data->data_ready = 0; - data->timeout = 0; - - init_waitqueue_head(&data->slaveirq_wait); - - res = request_irq(data->irq, slaveirq_handler, - IRQF_TRIGGER_RISING | IRQF_SHARED, - data->dev.name, data); - - if (res) { - dev_err(&slave_adapter->dev, - "myirqtest: cannot register IRQ %d\n", data->irq); - goto out_request_irq; - } - - res = misc_register(&data->dev); - if (res < 0) { - dev_err(&slave_adapter->dev, - "misc_register returned %d\n", res); - goto out_misc_register; - } - - return res; - -out_misc_register: - free_irq(data->irq, data); -out_request_irq: - kfree(pdata->irq_data); - pdata->irq_data = NULL; - - return res; -} - -void slaveirq_exit(struct ext_slave_platform_data *pdata) -{ - struct slaveirq_dev_data *data = pdata->irq_data; - - if (!pdata->irq_data || data->irq <= 0) - return; - - dev_info(data->dev.this_device, "Unregistering %s\n", data->dev.name); - - free_irq(data->irq, data); - misc_deregister(&data->dev); - kfree(pdata->irq_data); - pdata->irq_data = NULL; -} diff --git a/drivers/misc/inv_mpu/slaveirq.h b/drivers/misc/inv_mpu/slaveirq.h deleted file mode 100644 index 6926634..0000000 --- a/drivers/misc/inv_mpu/slaveirq.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef __SLAVEIRQ__ -#define __SLAVEIRQ__ - -#include - -#include -#include "mpuirq.h" - -#define SLAVEIRQ_SET_TIMEOUT _IOW(MPU_IOCTL, 0x50, unsigned long) -#define SLAVEIRQ_GET_INTERRUPT_CNT _IOR(MPU_IOCTL, 0x51, unsigned long) -#define SLAVEIRQ_GET_IRQ_TIME _IOR(MPU_IOCTL, 0x52, unsigned long) - -void slaveirq_exit(struct ext_slave_platform_data *pdata); -int slaveirq_init(struct i2c_adapter *slave_adapter, - struct ext_slave_platform_data *pdata, char *name); - -#endif diff --git a/drivers/misc/inv_mpu/timerirq.c b/drivers/misc/inv_mpu/timerirq.c deleted file mode 100644 index b7b0b1e..0000000 --- a/drivers/misc/inv_mpu/timerirq.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "mltypes.h" -#include "timerirq.h" - -/* function which gets timer data and sends it to TIMER */ -struct timerirq_data { - int pid; - int data_ready; - int run; - int timeout; - unsigned long period; - struct mpuirq_data data; - struct completion timer_done; - wait_queue_head_t timerirq_wait; - struct timer_list timer; - struct miscdevice *dev; -}; - -static struct miscdevice *timerirq_dev_data; - -static void timerirq_handler(unsigned long arg) -{ - struct timerirq_data *data = (struct timerirq_data *)arg; - struct timeval irqtime; - - data->data.interruptcount++; - - data->data_ready = 1; - - do_gettimeofday(&irqtime); - data->data.irqtime = (((long long)irqtime.tv_sec) << 32); - data->data.irqtime += irqtime.tv_usec; - data->data.data_type |= 1; - - dev_dbg(data->dev->this_device, - "%s, %lld, %ld\n", __func__, data->data.irqtime, - (unsigned long)data); - - wake_up_interruptible(&data->timerirq_wait); - - if (data->run) - mod_timer(&data->timer, - jiffies + msecs_to_jiffies(data->period)); - else - complete(&data->timer_done); -} - -static int start_timerirq(struct timerirq_data *data) -{ - dev_dbg(data->dev->this_device, - "%s current->pid %d\n", __func__, current->pid); - - /* Timer already running... success */ - if (data->run) - return 0; - - /* Don't allow a period of 0 since this would fire constantly */ - if (!data->period) - return -EINVAL; - - data->run = true; - data->data_ready = false; - - init_completion(&data->timer_done); - setup_timer(&data->timer, timerirq_handler, (unsigned long)data); - - return mod_timer(&data->timer, - jiffies + msecs_to_jiffies(data->period)); -} - -static int stop_timerirq(struct timerirq_data *data) -{ - dev_dbg(data->dev->this_device, - "%s current->pid %lx\n", __func__, (unsigned long)data); - - if (data->run) { - data->run = false; - mod_timer(&data->timer, jiffies + 1); - wait_for_completion(&data->timer_done); - } - return 0; -} - -/* The following depends on patch fa1f68db6ca7ebb6fc4487ac215bffba06c01c28 - * drivers: misc: pass miscdevice pointer via file private data - */ -static int timerirq_open(struct inode *inode, struct file *file) -{ - /* Device node is availabe in the file->private_data, this is - * exactly what we want so we leave it there */ - struct miscdevice *dev_data = file->private_data; - struct timerirq_data *data = kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - data->dev = dev_data; - file->private_data = data; - data->pid = current->pid; - init_waitqueue_head(&data->timerirq_wait); - - dev_dbg(data->dev->this_device, - "%s current->pid %d\n", __func__, current->pid); - return 0; -} - -static int timerirq_release(struct inode *inode, struct file *file) -{ - struct timerirq_data *data = file->private_data; - dev_dbg(data->dev->this_device, "timerirq_release\n"); - if (data->run) - stop_timerirq(data); - kfree(data); - return 0; -} - -/* read function called when from /dev/timerirq is read */ -static ssize_t timerirq_read(struct file *file, - char *buf, size_t count, loff_t *ppos) -{ - int len, err; - struct timerirq_data *data = file->private_data; - - if (!data->data_ready && data->timeout && - !(file->f_flags & O_NONBLOCK)) { - wait_event_interruptible_timeout(data->timerirq_wait, - data->data_ready, - data->timeout); - } - - if (data->data_ready && NULL != buf && count >= sizeof(data->data)) { - err = copy_to_user(buf, &data->data, sizeof(data->data)); - data->data.data_type = 0; - } else { - return 0; - } - if (err != 0) { - dev_err(data->dev->this_device, - "Copy to user returned %d\n", err); - return -EFAULT; - } - data->data_ready = 0; - len = sizeof(data->data); - return len; -} - -static unsigned int timerirq_poll(struct file *file, - struct poll_table_struct *poll) -{ - int mask = 0; - struct timerirq_data *data = file->private_data; - - poll_wait(file, &data->timerirq_wait, poll); - if (data->data_ready) - mask |= POLLIN | POLLRDNORM; - return mask; -} - -/* ioctl - I/O control */ -static long timerirq_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - int retval = 0; - int tmp; - struct timerirq_data *data = file->private_data; - - dev_dbg(data->dev->this_device, - "%s current->pid %d, %d, %ld\n", - __func__, current->pid, cmd, arg); - - if (!data) - return -EFAULT; - - switch (cmd) { - case TIMERIRQ_SET_TIMEOUT: - data->timeout = arg; - break; - case TIMERIRQ_GET_INTERRUPT_CNT: - tmp = data->data.interruptcount - 1; - if (data->data.interruptcount > 1) - data->data.interruptcount = 1; - - if (copy_to_user((int *)arg, &tmp, sizeof(int))) - return -EFAULT; - break; - case TIMERIRQ_START: - data->period = arg; - retval = start_timerirq(data); - break; - case TIMERIRQ_STOP: - retval = stop_timerirq(data); - break; - default: - retval = -EINVAL; - } - return retval; -} - -/* define which file operations are supported */ -static const struct file_operations timerirq_fops = { - .owner = THIS_MODULE, - .read = timerirq_read, - .poll = timerirq_poll, - -#if HAVE_COMPAT_IOCTL - .compat_ioctl = timerirq_ioctl, -#endif -#if HAVE_UNLOCKED_IOCTL - .unlocked_ioctl = timerirq_ioctl, -#endif - .open = timerirq_open, - .release = timerirq_release, -}; - -static int __init timerirq_init(void) -{ - - int res; - static struct miscdevice *data; - - data = kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - timerirq_dev_data = data; - data->minor = MISC_DYNAMIC_MINOR; - data->name = "timerirq"; - data->fops = &timerirq_fops; - - res = misc_register(data); - if (res < 0) { - dev_err(data->this_device, "misc_register returned %d\n", res); - return res; - } - - return res; -} - -module_init(timerirq_init); - -static void __exit timerirq_exit(void) -{ - struct miscdevice *data = timerirq_dev_data; - - dev_info(data->this_device, "Unregistering %s\n", data->name); - - misc_deregister(data); - kfree(data); - - timerirq_dev_data = NULL; -} - -module_exit(timerirq_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Timer IRQ device driver."); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("timerirq"); diff --git a/drivers/misc/inv_mpu/timerirq.h b/drivers/misc/inv_mpu/timerirq.h deleted file mode 100644 index f69f07a..0000000 --- a/drivers/misc/inv_mpu/timerirq.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - $License: - Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef __TIMERIRQ__ -#define __TIMERIRQ__ - -#include - -#define TIMERIRQ_SET_TIMEOUT _IOW(MPU_IOCTL, 0x60, unsigned long) -#define TIMERIRQ_GET_INTERRUPT_CNT _IOW(MPU_IOCTL, 0x61, unsigned long) -#define TIMERIRQ_START _IOW(MPU_IOCTL, 0x62, unsigned long) -#define TIMERIRQ_STOP _IO(MPU_IOCTL, 0x63) - -#endif diff --git a/drivers/misc/modem_if_na/Kconfig b/drivers/misc/modem_if_na/Kconfig deleted file mode 100644 index d2679e4..0000000 --- a/drivers/misc/modem_if_na/Kconfig +++ /dev/null @@ -1,30 +0,0 @@ -menuconfig SEC_MODEM - bool "Samsung Mobile Modem Interface" - default n - ---help--- - Samsung Modem Interface Driver. - -config CDMA_MODEM_CBP71 - bool "modem chip : VIA CBP7.1" - depends on SEC_MODEM - default n - -config LTE_MODEM_CMC220 - bool "modem chip : cmc220" - depends on SEC_MODEM - default n - -config LINK_DEVICE_DPRAM - bool "modem driver link device DPRAM" - depends on SEC_MODEM - default n - -config LINK_DEVICE_USB - bool "modem driver link device USB" - depends on SEC_MODEM - default n - -config INTERNAL_MODEM_IF - bool "modem feature for INTERNAL MODEM IF" - depends on SEC_MODEM - default n diff --git a/drivers/misc/modem_if_na/Makefile b/drivers/misc/modem_if_na/Makefile deleted file mode 100644 index d680f41..0000000 --- a/drivers/misc/modem_if_na/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# Makefile of modem_if - -obj-y += modem.o modem_io_device.o modem_net_flowcontrol_device.o - -obj-$(CONFIG_CDMA_MODEM_CBP71) += modem_modemctl_device_cbp71.o -obj-$(CONFIG_LTE_MODEM_CMC220) += modem_modemctl_device_cmc220.o lte_modem_bootloader.o -obj-$(CONFIG_LINK_DEVICE_DPRAM) += modem_link_device_dpram.o -obj-$(CONFIG_LINK_DEVICE_USB) += modem_link_device_usb.o modem_link_pm_usb.o diff --git a/drivers/misc/modem_if_na/lte_modem_bootloader.c b/drivers/misc/modem_if_na/lte_modem_bootloader.c deleted file mode 100644 index 0798b38..0000000 --- a/drivers/misc/modem_if_na/lte_modem_bootloader.c +++ /dev/null @@ -1,320 +0,0 @@ -/* Lte modem bootloader support for Samsung Tuna Board. - * - * Copyright (C) 2011 Google, Inc. - * Copyright (C) 2011 Samsung Electronics. - * - * 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. - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define LEN_XMIT_DELEY 10 -#define MAX_XMIT_SIZE 16 - -int factory_mode; - -enum xmit_bootloader_status { - XMIT_BOOT_READY, - XMIT_LOADER_READY, -}; - -struct lte_modem_bootloader { - struct spi_device *spi_dev; - struct miscdevice dev; - - struct mutex lock; - - unsigned int gpio_lte2ap_status; - enum xmit_bootloader_status xmit_status; -}; -#define to_loader(misc) container_of(misc, struct lte_modem_bootloader, dev); - -static inline -int spi_xmit(struct lte_modem_bootloader *loader, - const char *buf, int size_per_xmit) -{ - int i; - int ret; - unsigned char xmit_buf[MAX_XMIT_SIZE]; - struct spi_message msg; - struct spi_transfer xfers[MAX_XMIT_SIZE]; - - memcpy(xmit_buf, buf, sizeof(xmit_buf)); - spi_message_init(&msg); - memset(xfers, 0, sizeof(xfers)); - for (i = 0; i < size_per_xmit ; i++) { - xfers[i].cs_change = 1; - xfers[i].len = 1; - xfers[i].tx_buf = xmit_buf + i; - spi_message_add_tail(&xfers[i], &msg); - } - ret = spi_sync(loader->spi_dev, &msg); - - if (ret < 0) - dev_err(&loader->spi_dev->dev, - "%s - error %d\n", __func__, ret); - - return ret; -} - - -static -int bootloader_write(struct lte_modem_bootloader *loader, - const char *addr, const int len) -{ - int i; - int ret = 0; - unsigned char lenbuf[4]; - - if (loader->xmit_status == XMIT_LOADER_READY) { - memcpy(lenbuf, &len, ARRAY_SIZE(lenbuf)); - ret = spi_xmit(loader, lenbuf, - ARRAY_SIZE(lenbuf)); - if (ret < 0) - return ret; - msleep(LEN_XMIT_DELEY); - } - - for (i = 0 ; i < len / MAX_XMIT_SIZE ; i++) { - ret = spi_xmit(loader, - addr + i * MAX_XMIT_SIZE, - MAX_XMIT_SIZE); - if (ret < 0) - return ret; - } - ret = spi_xmit(loader, addr + i * MAX_XMIT_SIZE , len % MAX_XMIT_SIZE); - - return 0; -} - - -static -int bootloader_open(struct inode *inode, struct file *flip) -{ - struct lte_modem_bootloader *loader = to_loader(flip->private_data); - flip->private_data = loader; - - return 0; -} - -static -long bootloader_ioctl(struct file *flip, - unsigned int cmd, unsigned long arg) -{ - int ret = 0; - int status; - struct lte_modem_bootloader_param param; - struct lte_modem_bootloader *loader = flip->private_data; - - mutex_lock(&loader->lock); - switch (cmd) { - case IOCTL_LTE_MODEM_XMIT_BOOT: - - ret = copy_from_user(¶m, (const void __user *)arg, - sizeof(param)); - if (ret) { - dev_err(&loader->spi_dev->dev, "%s - can not copy userdata\n", - __func__); - ret = -EFAULT; - goto exit_err; - } - - dev_info(&loader->spi_dev->dev, - "IOCTL_LTE_MODEM_XMIT_BOOT - bin size: %d\n", - param.len); - - ret = bootloader_write(loader, param.buf, param.len); - if (ret < 0) { - dev_err(&loader->spi_dev->dev, "failed to xmit boot bin\n"); - } else { - if (loader->xmit_status == XMIT_BOOT_READY) - loader->xmit_status = XMIT_LOADER_READY; - else - loader->xmit_status = XMIT_BOOT_READY; - } - - break; - case IOCTL_LTE_MODEM_LTE2AP_STATUS: - status = gpio_get_value(loader->gpio_lte2ap_status); - pr_debug("LTE2AP status :%d\n", status); - ret = copy_to_user((unsigned int *)arg, &status, - sizeof(status)); - - break; - - case IOCTL_LTE_MODEM_FACTORY_MODE_ON: - factory_mode = 1; - pr_info("usb %s, Factory Mode On\n", __func__); - break; - - case IOCTL_LTE_MODEM_FACTORY_MODE_OFF: - factory_mode = 0; - pr_info("usb %s, Factory Mode Off\n", __func__); - break; - - default: - dev_err(&loader->spi_dev->dev, - "%s - ioctl cmd error\n", - __func__); - ret = -ENOIOCTLCMD; - - break; - } - mutex_unlock(&loader->lock); - -exit_err: - return ret; -} - -static const struct file_operations lte_modem_bootloader_fops = { - .owner = THIS_MODULE, - .open = bootloader_open, - .unlocked_ioctl = bootloader_ioctl, -}; - -static -int bootloader_gpio_setup(struct lte_modem_bootloader *loader) -{ - if (!loader->gpio_lte2ap_status) - return -EINVAL; - - gpio_request(loader->gpio_lte2ap_status, "GPIO_LTE2AP_STATUS"); - gpio_direction_input(loader->gpio_lte2ap_status); - - return 0; -} - -static -int __devinit lte_modem_bootloader_probe(struct spi_device *spi) -{ - int ret; - - struct lte_modem_bootloader *loader; - struct lte_modem_bootloader_platform_data *pdata; - - loader = kzalloc(sizeof(*loader), GFP_KERNEL); - if (!loader) { - pr_err("failed to allocate for lte_modem_bootloader\n"); - ret = -ENOMEM; - goto err_alloc; - } - mutex_init(&loader->lock); - - spi->bits_per_word = 8; - - if (spi_setup(spi)) { - pr_err("failed to setup spi for lte_modem_bootloader\n"); - ret = -EINVAL; - goto err_setup; - } - - loader->spi_dev = spi; - - if (!spi->dev.platform_data) { - pr_err("failed to get platform data for lte_modem_bootloader\n"); - ret = -EINVAL; - goto err_setup; - } - pdata = (struct lte_modem_bootloader_platform_data *) \ - spi->dev.platform_data; - loader->gpio_lte2ap_status = pdata->gpio_lte2ap_status; - - ret = bootloader_gpio_setup(loader); - if (ret) { - pr_err("failed to set gpio for lte_modem_boot_loader\n"); - goto err_setup; - } - - loader->gpio_lte2ap_status = pdata->gpio_lte2ap_status; - loader->xmit_status = XMIT_BOOT_READY; - - spi_set_drvdata(spi, loader); - - loader->dev.minor = MISC_DYNAMIC_MINOR; - loader->dev.name = "lte_spi"; - loader->dev.fops = <e_modem_bootloader_fops; - ret = misc_register(&loader->dev); - if (ret) { - pr_err("failed to register misc dev for lte_modem_bootloader\n"); - goto err_setup; - } - pr_info("lte_modem_bootloader successfully probed\n"); - - factory_mode = 0; - - return 0; - -err_setup: - mutex_destroy(&loader->lock); - kfree(loader); - -err_alloc: - - return ret; -} - -static -int __devexit lte_modem_bootloader_remove(struct spi_device *spi) -{ - struct lte_modem_bootloader *loader = spi_get_drvdata(spi); - - misc_deregister(&loader->dev); - mutex_destroy(&loader->lock); - kfree(loader); - - return 0; -} - -static -struct spi_driver lte_modem_bootloader_driver = { - .driver = { - .name = "lte_modem_spi", - .bus = &spi_bus_type, - .owner = THIS_MODULE, - }, - .probe = lte_modem_bootloader_probe, - .remove = __devexit_p(lte_modem_bootloader_remove), -}; - -static -int __init lte_modem_bootloader_init(void) -{ - return spi_register_driver(<e_modem_bootloader_driver); -} - -static -void __exit lte_modem_bootloader_exit(void) -{ - spi_unregister_driver(<e_modem_bootloader_driver); -} - -module_init(lte_modem_bootloader_init); -module_exit(lte_modem_bootloader_exit); - -MODULE_DESCRIPTION("LTE Modem Bootloader driver"); -MODULE_LICENSE("GPL"); diff --git a/drivers/misc/modem_if_na/modem.c b/drivers/misc/modem_if_na/modem.c deleted file mode 100644 index dde1ea1..0000000 --- a/drivers/misc/modem_if_na/modem.c +++ /dev/null @@ -1,221 +0,0 @@ -/* linux/drivers/modem/modem.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_variation.h" - - -static struct modem_ctl *create_modemctl_device(struct platform_device *pdev) -{ - int ret = 0; - struct modem_data *pdata; - struct modem_ctl *modemctl; - struct device *dev = &pdev->dev; - - /* create modem control device */ - modemctl = kzalloc(sizeof(struct modem_ctl), GFP_KERNEL); - if (!modemctl) - return NULL; - - modemctl->dev = dev; - modemctl->phone_state = STATE_OFFLINE; - - pdata = pdev->dev.platform_data; - modemctl->name = pdata->name; - - /* init modemctl device for getting modemctl operations */ - ret = call_modem_init_func(modemctl, pdata); - if (ret) { - printk(KERN_ERR "[MODEM_IF] call_modem_init_func is failed\n"); - kfree(modemctl); - return NULL; - } - - pr_debug("[MODEM_IF] %s:create_modemctl_device DONE\n", modemctl->name); - return modemctl; -} - -static struct io_device *create_io_device(struct modem_io_t *io_t, - struct modem_ctl *modemctl, enum modem_network modem_net) -{ - int ret = 0; - struct io_device *iod = NULL; - - iod = kzalloc(sizeof(struct io_device), GFP_KERNEL); - if (!iod) { - pr_err("[MODEM_IF] io device memory alloc fail\n"); - return NULL; - } - - iod->name = io_t->name; - iod->id = io_t->id; - iod->format = io_t->format; - iod->io_typ = io_t->io_type; - iod->net_typ = modem_net; - - /* link between io device and modem control */ - iod->mc = modemctl; - if (iod->format == IPC_FMT) - modemctl->iod = iod; - - /* register misc device or net device */ - ret = init_io_device(iod); - if (ret) { - kfree(iod); - return NULL; - } - - pr_debug("[MODEM_IF] %s : create_io_device DONE\n", io_t->name); - return iod; -} -static int __devinit modem_probe(struct platform_device *pdev) -{ - int i; - struct modem_data *pdata; - struct modem_ctl *modemctl; - struct io_device *iod[MAX_NUM_IO_DEV]; - struct link_device *ld; - struct io_raw_devices *io_raw_devs = NULL; - - pdata = pdev->dev.platform_data; - memset(iod, 0, sizeof(iod)); - - modemctl = create_modemctl_device(pdev); - if (!modemctl) { - printk(KERN_ERR "[MODEM_IF] modemctl is null\n"); - return -ENOMEM; - } - /* create link device */ - ld = call_link_init_func(pdev, pdata->link_type); - if (!ld) - goto err_free_modemctl; - - io_raw_devs = kzalloc(sizeof(struct io_raw_devices), GFP_KERNEL); - if (!io_raw_devs) { - printk(KERN_ERR "[MODEM_IF] io_raw_devs is null\n"); - return -ENOMEM; - } - - /* create io deivces and connect to modemctl device */ - for (i = 0; i < pdata->num_iodevs; i++) { - iod[i] = create_io_device(&pdata->iodevs[i], modemctl, - pdata->modem_net); - if (!iod[i]) - goto err_free_modemctl; - - if (iod[i]->format == IPC_RAW) { - int ch = iod[i]->id & 0x1F; - io_raw_devs->raw_devices[ch] = iod[i]; - io_raw_devs->num_of_raw_devs++; - iod[i]->link = ld; - } else { - /* connect io devices to one link device */ - ld->attach(ld, iod[i]); - } - - if (iod[i]->format == IPC_MULTI_RAW) - iod[i]->private_data = (void *)io_raw_devs; - } - - platform_set_drvdata(pdev, modemctl); - - pr_debug("[MODEM_IF] modem_probe DONE\n"); - return 0; - -err_free_modemctl: - for (i = 0; i < pdata->num_iodevs; i++) - if (iod[i] != NULL) - kfree(iod[i]); - - if (io_raw_devs != NULL) - kfree(io_raw_devs); - - if (modemctl != NULL) - kfree(modemctl); - - return -ENOMEM; -} - -static void modem_shutdown(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct modem_ctl *mc = dev_get_drvdata(dev); - - if (!mc) - return; - - free_irq(mc->irq_phone_active, mc); - - if (mc->ops.modem_off) - mc->ops.modem_off(mc); -} - -static int modem_suspend(struct device *pdev) -{ - struct modem_ctl *mc = dev_get_drvdata(pdev); - gpio_set_value(mc->gpio_pda_active, 0); - return 0; -} - -static int modem_resume(struct device *pdev) -{ - struct modem_ctl *mc = dev_get_drvdata(pdev); - gpio_set_value(mc->gpio_pda_active, 1); - return 0; -} - -static const struct dev_pm_ops modem_pm_ops = { - .suspend = modem_suspend, - .resume = modem_resume, -}; - -static struct platform_driver modem_driver = { - .probe = modem_probe, - .shutdown = modem_shutdown, - .driver = { - .name = "modem_if", - .pm = &modem_pm_ops, - }, -}; - -static int __init modem_init(void) -{ - return platform_driver_register(&modem_driver); -} - -module_init(modem_init); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Samsung Modem Interface Driver"); diff --git a/drivers/misc/modem_if_na/modem_io_device.c b/drivers/misc/modem_if_na/modem_io_device.c deleted file mode 100644 index 1a936b1..0000000 --- a/drivers/misc/modem_if_na/modem_io_device.c +++ /dev/null @@ -1,965 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_io_device.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" - - -#define HDLC_START 0x7F -#define HDLC_END 0x7E -#define SIZE_OF_HDLC_START 1 -#define SIZE_OF_HDLC_END 1 -#define MAX_RXDATA_SIZE (4096 - 512) - -static const char hdlc_start[1] = { HDLC_START }; -static const char hdlc_end[1] = { HDLC_END }; - -struct fmt_hdr { - u16 len; - u8 control; -} __packed; - -struct raw_hdr { - u32 len; - u8 channel; - u8 control; -} __packed; - -struct rfs_hdr { - u32 len; - u8 cmd; - u8 id; -} __packed; - -static const char const *modem_state_name[] = { - [STATE_OFFLINE] = "OFFLINE", - [STATE_CRASH_EXIT] = "CRASH_EXIT", - [STATE_BOOTING] = "BOOTING", - [STATE_ONLINE] = "ONLINE", - [STATE_LOADER_DONE] = "LOADER_DONE", - [STATE_NV_REBUILDING] = "NV_REBUILDING", -}; - -static int rx_iodev_skb(struct io_device *iod); - -static int get_header_size(struct io_device *iod) -{ - switch (iod->format) { - case IPC_FMT: - return sizeof(struct fmt_hdr); - - case IPC_RAW: - case IPC_MULTI_RAW: - return sizeof(struct raw_hdr); - - case IPC_RFS: - return sizeof(struct rfs_hdr); - - case IPC_BOOT: - /* minimum size for transaction align */ - return 4; - - case IPC_RAMDUMP: - default: - return 0; - } -} - -static int get_hdlc_size(struct io_device *iod, char *buf) -{ - struct fmt_hdr *fmt_header; - struct raw_hdr *raw_header; - struct rfs_hdr *rfs_header; - - pr_debug("[MODEM_IF] buf : %02x %02x %02x (%d)\n", *buf, *(buf + 1), - *(buf + 2), __LINE__); - - switch (iod->format) { - case IPC_FMT: - fmt_header = (struct fmt_hdr *)buf; - return fmt_header->len; - case IPC_RAW: - case IPC_MULTI_RAW: - raw_header = (struct raw_hdr *)buf; - return raw_header->len; - case IPC_RFS: - rfs_header = (struct rfs_hdr *)buf; - return rfs_header->len; - default: - break; - } - return 0; -} - -static void *get_header(struct io_device *iod, size_t count, - char *frame_header_buf) -{ - struct fmt_hdr *fmt_h; - struct raw_hdr *raw_h; - struct rfs_hdr *rfs_h; - - switch (iod->format) { - case IPC_FMT: - fmt_h = (struct fmt_hdr *)frame_header_buf; - - fmt_h->len = count + sizeof(struct fmt_hdr); - fmt_h->control = 0; - - return (void *)frame_header_buf; - - case IPC_RAW: - case IPC_MULTI_RAW: - raw_h = (struct raw_hdr *)frame_header_buf; - - raw_h->len = count + sizeof(struct raw_hdr); - raw_h->channel = iod->id & 0x1F; - raw_h->control = 0; - - return (void *)frame_header_buf; - - case IPC_RFS: - rfs_h = (struct rfs_hdr *)frame_header_buf; - - rfs_h->len = count + sizeof(struct raw_hdr); - rfs_h->id = iod->id; - - return (void *)frame_header_buf; - - default: - return 0; - } -} - -static inline int rx_hdlc_head_start_check(char *buf) -{ - /* check hdlc head and return size of start byte */ - return (buf[0] == HDLC_START) ? SIZE_OF_HDLC_START : -EBADMSG; -} - -static inline int rx_hdlc_tail_check(char *buf) -{ - /* check hdlc tail and return size of tail byte */ - return (buf[0] == HDLC_END) ? SIZE_OF_HDLC_END : -EBADMSG; -} - -/* remove hdlc header and store IPC header */ -static int rx_hdlc_head_check(struct io_device *iod, char *buf, unsigned rest) -{ - struct header_data *hdr = &iod->h_data; - int head_size = get_header_size(iod); - int done_len = 0; - int len = 0; - struct modem_data *md = (struct modem_data *)\ - iod->mc->dev->platform_data; - - /* first frame, remove start header 7F */ - if (!hdr->start) { - len = rx_hdlc_head_start_check(buf); - if (len < 0) { - pr_err("[MODEM_IF] Wrong HDLC start: 0x%x(%s)\n", - *buf, iod->name); - return len; /*Wrong hdlc start*/ - } - - pr_debug("[MODEM_IF] check len : %d, rest : %d (%d)\n", len, - rest, __LINE__); - - /* set the start flag of current packet */ - hdr->start = HDLC_START; - hdr->len = 0; - - buf += len; - done_len += len; - rest -= len; /* rest, call by value */ - } - - pr_debug("[MODEM_IF] check len : %d, rest : %d (%d)\n", len, rest, - __LINE__); - - /* store the IPC header to iod priv */ - if (hdr->len < head_size) { - len = min(rest, head_size - hdr->len); - memcpy(hdr->hdr + hdr->len, buf, len); - - /* Skip the dummy byte inserted for 2-byte alignment in header. - RAW format header size is 6 bytes. Start + 6 + 1 (skip byte) */ - if (md->align == 1) { - if ((iod->format == IPC_RAW - || iod->format == IPC_MULTI_RAW) - && (iod->net_typ == CDMA_NETWORK) - && !(len & 0x01)) - len++; - } - hdr->len += len; - done_len += len; - } - - pr_debug("[MODEM_IF] check done_len : %d, rest : %d (%d)\n", done_len, - rest, __LINE__); - return done_len; -} - -/* alloc skb and copy dat to skb */ -static int rx_hdlc_data_check(struct io_device *iod, char *buf, unsigned rest) -{ - struct header_data *hdr = &iod->h_data; - struct sk_buff *skb = iod->skb_recv; - int head_size = get_header_size(iod); - int data_size = get_hdlc_size(iod, hdr->hdr) - head_size; - int alloc_size = min(data_size, MAX_RXDATA_SIZE); - int len; - int done_len = 0; - int rest_len = data_size - hdr->flag_len; - - /* first payload data - alloc skb */ - if (!skb) { - switch (iod->format) { - case IPC_RFS: - alloc_size = min(data_size + head_size, \ - MAX_RXDATA_SIZE); - skb = alloc_skb(alloc_size, GFP_ATOMIC); - if (unlikely(!skb)) - return -ENOMEM; - /* copy the RFS haeder to skb->data */ - memcpy(skb_put(skb, head_size), hdr->hdr, head_size); - break; - - case IPC_MULTI_RAW: - if (data_size > MAX_RXDATA_SIZE) { \ - pr_err("%s: %s: packet size too large (%d)\n",\ - __func__, iod->name, data_size); - return -EINVAL; - } - - if (iod->net_typ == UMTS_NETWORK) - skb = alloc_skb(alloc_size, GFP_ATOMIC); - else - skb = alloc_skb(alloc_size + - sizeof(struct ethhdr), GFP_ATOMIC); - if (unlikely(!skb)) - return -ENOMEM; - - if (iod->net_typ != UMTS_NETWORK) - skb_reserve(skb, sizeof(struct ethhdr)); - break; - - default: - skb = alloc_skb(alloc_size, GFP_ATOMIC); - if (unlikely(!skb)) - return -ENOMEM; - break; - } - iod->skb_recv = skb; - } - - while (rest > 0) { - len = min(rest, alloc_size - skb->len); - len = min(len, rest_len); - memcpy(skb_put(skb, len), buf, len); - buf += len; - done_len += len; - hdr->flag_len += len; - rest -= len; - rest_len -= len; - - if (!rest_len || !rest) - break; - - rx_iodev_skb(iod); - iod->skb_recv = NULL; - - alloc_size = min(rest_len, MAX_RXDATA_SIZE); - skb = alloc_skb(alloc_size, GFP_ATOMIC); - if (unlikely(!skb)) - return -ENOMEM; - iod->skb_recv = skb; - } - - return done_len; -} - -static int rx_iodev_skb_raw(struct io_device *iod) -{ - int err; - struct sk_buff *skb = iod->skb_recv; - struct net_device *ndev; - struct iphdr *ip_header; - struct ethhdr *ehdr; - const char source[ETH_ALEN] = SOURCE_MAC_ADDR; - - switch (iod->io_typ) { - case IODEV_MISC: - skb_queue_tail(&iod->sk_rx_q, iod->skb_recv); - wake_up(&iod->wq); - return 0; - - case IODEV_NET: - ndev = iod->ndev; - if (!ndev) - return NET_RX_DROP; - - skb->dev = ndev; - ndev->stats.rx_packets++; - ndev->stats.rx_bytes += skb->len; - - /* check the version of IP */ - ip_header = (struct iphdr *)skb->data; - if (ip_header->version == IP6VERSION) - skb->protocol = htons(ETH_P_IPV6); - else - skb->protocol = htons(ETH_P_IP); - - if (iod->net_typ == UMTS_NETWORK) { - skb_reset_mac_header(skb); - } else { - ehdr = (void *)skb_push(skb, sizeof(struct ethhdr)); - memcpy(ehdr->h_dest, ndev->dev_addr, ETH_ALEN); - memcpy(ehdr->h_source, source, ETH_ALEN); - ehdr->h_proto = skb->protocol; - skb->ip_summed = CHECKSUM_NONE; - skb_reset_mac_header(skb); - - skb_pull(skb, sizeof(struct ethhdr)); - } - - err = netif_rx_ni(skb); - if (err != NET_RX_SUCCESS) - dev_err(&ndev->dev, "rx error: %d\n", err); - return err; - - default: - pr_err("[MODEM_IF] wrong io_type : %d\n", iod->io_typ); - return -EINVAL; - } -} - -static void rx_iodev_work(struct work_struct *work) -{ - int ret; - struct sk_buff *skb; - struct io_device *real_iod; - struct io_device *iod = container_of(work, struct io_device, - rx_work.work); - - skb = skb_dequeue(&iod->sk_rx_q); - while (skb) { - real_iod = *((struct io_device **)skb->cb); - real_iod->skb_recv = skb; - - ret = rx_iodev_skb_raw(real_iod); - if (ret == NET_RX_DROP) { - pr_err("[MODEM_IF] %s: queue delayed work!\n", - __func__); - skb_queue_head(&iod->sk_rx_q, skb); - schedule_delayed_work(&iod->rx_work, - msecs_to_jiffies(20)); - break; - } else if (ret < 0) - dev_kfree_skb_any(skb); - - skb = skb_dequeue(&iod->sk_rx_q); - } -} - - -static int rx_multipdp(struct io_device *iod) -{ - u8 ch; - struct raw_hdr *raw_header = (struct raw_hdr *)&iod->h_data.hdr; - struct io_raw_devices *io_raw_devs = - (struct io_raw_devices *)iod->private_data; - struct io_device *real_iod; - - ch = raw_header->channel; - real_iod = io_raw_devs->raw_devices[ch]; - if (!real_iod) { - pr_err("[MODEM_IF] %s: wrong channel %d\n", __func__, ch); - return -1; - } - - *((struct io_device **)iod->skb_recv->cb) = real_iod; - skb_queue_tail(&iod->sk_rx_q, iod->skb_recv); - pr_debug("sk_rx_qlen:%d\n", iod->sk_rx_q.qlen); - - schedule_delayed_work(&iod->rx_work, 0); - return 0; -} - -/* de-mux function draft */ -static int rx_iodev_skb(struct io_device *iod) -{ - switch (iod->format) { - case IPC_MULTI_RAW: - return rx_multipdp(iod); - - case IPC_FMT: - case IPC_RFS: - default: - skb_queue_tail(&iod->sk_rx_q, iod->skb_recv); - - pr_debug("[MODEM_IF] wake up fmt,rfs skb\n"); - wake_up(&iod->wq); - return 0; - } -} - -static int rx_hdlc_packet(struct io_device *iod, const char *data, - unsigned recv_size) -{ - unsigned rest = recv_size; - char *buf = (char *)data; - int err = 0; - int len; - struct modem_data *md = (struct modem_data *)\ - iod->mc->dev->platform_data; - - - if (rest <= 0) - goto exit; - - pr_debug("[MODEM_IF] RX_SIZE=%d\n", rest); - - if (iod->h_data.flag_len) - goto data_check; - -next_frame: - err = len = rx_hdlc_head_check(iod, buf, rest); - if (err < 0) - goto exit; /* buf++; rest--; goto next_frame; */ - pr_debug("[MODEM_IF] check len : %d, rest : %d (%d)\n", len, rest, - __LINE__); - - buf += len; - rest -= len; - if (rest <= 0) - goto exit; - -data_check: - err = len = rx_hdlc_data_check(iod, buf, rest); - if (err < 0) - goto exit; - pr_debug("[MODEM_IF] check len : %d, rest : %d (%d)\n", len, rest, - __LINE__); - - /* If the lenght of actual data is odd. Skip the dummy bit*/ - if (md->align == 1) { - if ((iod->format == IPC_RAW || iod->format == IPC_MULTI_RAW) - && (iod->net_typ == CDMA_NETWORK) && (len & 0x01)) - len++; - } - buf += len; - rest -= len; - - if (!rest && iod->h_data.flag_len) - return 0; - else if (rest <= 0) - goto exit; - - err = len = rx_hdlc_tail_check(buf); - if (err < 0) { - pr_err("[MODEM_IF] Wrong HDLC end: 0x%x(%s)\n", - *buf, iod->name); - goto exit; - } - pr_debug("[MODEM_IF] check len : %d, rest : %d (%d)\n", len, rest, - __LINE__); - - /* Skip the dummy byte inserted for 2-byte alignment in header. - Ox7E 00.*/ - if (md->align == 1) { - if ((iod->format == IPC_RAW || iod->format == IPC_MULTI_RAW) - && (iod->net_typ == CDMA_NETWORK)) - len++; - } - buf += len; - rest -= len; - if (rest < 0) - goto exit; - - err = rx_iodev_skb(iod); - if (err < 0) - goto exit; - - /* initialize header & skb */ - iod->skb_recv = NULL; - memset(&iod->h_data, 0x00, sizeof(struct header_data)); - - if (rest) - goto next_frame; - -exit: - /* free buffers. mipi-hsi re-use recv buf */ - if (rest < 0) - err = -ERANGE; - - if (err < 0) { - /* clear headers */ - memset(&iod->h_data, 0x00, sizeof(struct header_data)); - - if (iod->skb_recv) { - dev_kfree_skb_any(iod->skb_recv); - iod->skb_recv = NULL; - } - } - - return err; -} - -/* called from link device when a packet arrives for this io device */ -static int io_dev_recv_data_from_link_dev(struct io_device *iod, - const char *data, unsigned int len) -{ - struct sk_buff *skb; - int err; - - switch (iod->format) { - case IPC_FMT: - case IPC_RAW: - case IPC_RFS: - case IPC_MULTI_RAW: - err = rx_hdlc_packet(iod, data, len); - if (err < 0) - pr_err("[MODEM_IF] fail process hdlc fram\n"); - return err; - - case IPC_CMD: - /* TODO- handle flow control command from CP */ - return 0; - - case IPC_BOOT: - case IPC_RAMDUMP: - /* save packet to sk_buff */ - skb = alloc_skb(len, GFP_ATOMIC); - if (!skb) { - pr_err("[MODEM_IF] fail alloc skb (%d)\n", __LINE__); - return -ENOMEM; - } - - pr_debug("[MODEM_IF] boot len : %d\n", len); - - memcpy(skb_put(skb, len), data, len); - skb_queue_tail(&iod->sk_rx_q, skb); - pr_debug("[MODEM_IF] skb len : %d\n", skb->len); - - wake_up(&iod->wq); - return len; - - default: - return -EINVAL; - } -} - -/* inform the IO device that the modem is now online or offline or - * crashing or whatever... - */ -static void io_dev_modem_state_changed(struct io_device *iod, - enum modem_state state) -{ - iod->mc->phone_state = state; - pr_info("[MODEM_IF] %s state changed: %s\n", \ - iod->name, modem_state_name[state]); - - if ((state == STATE_CRASH_EXIT) || (state == STATE_NV_REBUILDING)) - wake_up(&iod->wq); -} - -static int misc_open(struct inode *inode, struct file *filp) -{ - struct io_device *iod = to_io_device(filp->private_data); - filp->private_data = (void *)iod; - - if (iod->format != IPC_BOOT && iod->format != IPC_RAMDUMP) - pr_info("[MODEM_IF] misc_open : %s\n", iod->name); - - if (iod->link->init_comm) - return iod->link->init_comm(iod->link, iod); - return 0; -} - -static int misc_release(struct inode *inode, struct file *filp) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - - if (iod->format != IPC_BOOT && iod->format != IPC_RAMDUMP) - pr_info("[MODEM_IF] misc_release : %s\n", iod->name); - - if (iod->link->terminate_comm) - iod->link->terminate_comm(iod->link, iod); - - skb_queue_purge(&iod->sk_rx_q); - return 0; -} - -static unsigned int misc_poll(struct file *filp, - struct poll_table_struct *wait) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - - poll_wait(filp, &iod->wq, wait); - - if ((!skb_queue_empty(&iod->sk_rx_q)) - && (iod->mc->phone_state != STATE_OFFLINE)) - return POLLIN | POLLRDNORM; - else if ((iod->mc->phone_state == STATE_CRASH_EXIT) || - (iod->mc->phone_state == STATE_NV_REBUILDING)) - return POLLHUP; - else - return 0; -} - -static long misc_ioctl(struct file *filp, unsigned int cmd, unsigned long _arg) -{ - int p_state; - struct io_device *iod = (struct io_device *)filp->private_data; - - pr_debug("[MODEM_IF] misc_ioctl : 0x%x\n", cmd); - - switch (cmd) { - case IOCTL_MODEM_ON: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_ON\n"); - return iod->mc->ops.modem_on(iod->mc); - - case IOCTL_MODEM_OFF: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_OFF\n"); - return iod->mc->ops.modem_off(iod->mc); - - case IOCTL_MODEM_RESET: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_RESET\n"); - return iod->mc->ops.modem_reset(iod->mc); - - case IOCTL_MODEM_FORCE_CRASH_EXIT: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_FORCE_CRASH_EXIT\n"); - return iod->mc->ops.modem_force_crash_exit(iod->mc); - - case IOCTL_MODEM_DUMP_RESET: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_FORCE_CRASH_EXIT\n"); - return iod->mc->ops.modem_dump_reset(iod->mc); - - case IOCTL_MODEM_BOOT_ON: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_BOOT_ON\n"); - return iod->mc->ops.modem_boot_on(iod->mc); - - case IOCTL_MODEM_BOOT_OFF: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_BOOT_OFF\n"); - return iod->mc->ops.modem_boot_off(iod->mc); - - /* TODO - will remove this command after ril updated */ - case IOCTL_MODEM_START: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_START\n"); - return 0; - - case IOCTL_MODEM_STATUS: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_STATUS\n"); - p_state = iod->mc->phone_state; - if (p_state == STATE_NV_REBUILDING) { - pr_info("[MODEM_IF] nv rebuild state : %d\n", p_state); - iod->mc->phone_state = STATE_ONLINE; - } - return p_state; - - case IOCTL_MODEM_DUMP_START: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_DUMP_START\n"); - return iod->link->dump_start(iod->link, iod); - - case IOCTL_MODEM_DUMP_UPDATE: - pr_debug("[MODEM_IF] misc_ioctl : IOCTL_MODEM_DUMP_UPDATE\n"); - return iod->link->dump_update(iod->link, iod, _arg); - - case IOCTL_MODEM_GOTA_START: - pr_debug("[GOTA] misc_ioctl : IOCTL_MODEM_GOTA_START\n"); - return iod->link->gota_start(iod->link, iod); - - case IOCTL_MODEM_FW_UPDATE: - pr_debug("[GOTA] misc_ioctl : IOCTL_MODEM_FW_UPDATE\n"); - return iod->link->modem_update(iod->link, iod, _arg); - - default: - return -EINVAL; - } -} - -static ssize_t misc_write(struct file *filp, const char __user * buf, - size_t count, loff_t *ppos) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - int frame_len = 0; - char frame_header_buf[sizeof(struct raw_hdr)]; - struct sk_buff *skb; - - /* TODO - check here flow control for only raw data */ - - if (iod->format == IPC_BOOT || iod->format == IPC_RAMDUMP) - frame_len = count + get_header_size(iod); - else - frame_len = count + SIZE_OF_HDLC_START + get_header_size(iod) - + SIZE_OF_HDLC_END; - - skb = alloc_skb(frame_len, GFP_KERNEL); - if (!skb) { - pr_err("[MODEM_IF] fail alloc skb (%d)\n", __LINE__); - return -ENOMEM; - } - - switch (iod->format) { - case IPC_BOOT: - case IPC_RAMDUMP: - if (copy_from_user(skb_put(skb, count), buf, count) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - break; - - case IPC_RFS: - memcpy(skb_put(skb, SIZE_OF_HDLC_START), hdlc_start, - SIZE_OF_HDLC_START); - if (copy_from_user(skb_put(skb, count), buf, count) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - memcpy(skb_put(skb, SIZE_OF_HDLC_END), hdlc_end, - SIZE_OF_HDLC_END); - break; - - default: - memcpy(skb_put(skb, SIZE_OF_HDLC_START), hdlc_start, - SIZE_OF_HDLC_START); - memcpy(skb_put(skb, get_header_size(iod)), - get_header(iod, count, frame_header_buf), - get_header_size(iod)); - if (copy_from_user(skb_put(skb, count), buf, count) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - memcpy(skb_put(skb, SIZE_OF_HDLC_END), hdlc_end, - SIZE_OF_HDLC_END); - break; - } - - /* send data with sk_buff, link device will put sk_buff - * into the specific sk_buff_q and run work-q to send data - */ - return iod->link->send(iod->link, iod, skb); -} - -static ssize_t misc_read(struct file *filp, char *buf, size_t count, - loff_t *f_pos) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - struct sk_buff *skb; - int pktsize = 0; - - skb = skb_dequeue(&iod->sk_rx_q); - if (!skb) { - printk_ratelimited(KERN_ERR "[MODEM_IF] no data from sk_rx_q, " - "modem_state : %s(%s)\n", - modem_state_name[iod->mc->phone_state], iod->name); - return 0; - } - - if (skb->len > count) { - pr_err("[MODEM_IF] skb len is too big = %d,%d!(%d)\n", - count, skb->len, __LINE__); - dev_kfree_skb_any(skb); - return -EIO; - } - pr_debug("[MODEM_IF] skb len : %d\n", skb->len); - - pktsize = skb->len; - if (copy_to_user(buf, skb->data, pktsize) != 0) - return -EIO; - dev_kfree_skb_any(skb); - - pr_debug("[MODEM_IF] copy to user : %d\n", pktsize); - - return pktsize; -} - -static const struct file_operations misc_io_fops = { - .owner = THIS_MODULE, - .open = misc_open, - .release = misc_release, - .poll = misc_poll, - .unlocked_ioctl = misc_ioctl, - .write = misc_write, - .read = misc_read, -}; - -static int vnet_open(struct net_device *ndev) -{ - netif_start_queue(ndev); - return 0; -} - -static int vnet_stop(struct net_device *ndev) -{ - netif_stop_queue(ndev); - return 0; -} - -static int vnet_xmit(struct sk_buff *skb, struct net_device *ndev) -{ - int ret; - struct raw_hdr hd; - struct sk_buff *skb_new; - struct vnet *vnet = netdev_priv(ndev); - struct io_device *iod = vnet->iod; - - /* umts doesn't need to discard ethernet header */ - if (iod->net_typ != UMTS_NETWORK) { - if (iod->id >= PSD_DATA_CHID_BEGIN && - iod->id <= PSD_DATA_CHID_END) - skb_pull(skb, sizeof(struct ethhdr)); - } - - hd.len = skb->len + sizeof(hd); - hd.control = 0; - hd.channel = iod->id & 0x1F; - - skb_new = skb_copy_expand(skb, sizeof(hd) + sizeof(hdlc_start), - sizeof(hdlc_end), GFP_ATOMIC); - if (!skb_new) { - dev_kfree_skb_any(skb); - return -ENOMEM; - } - - memcpy(skb_push(skb_new, sizeof(hd)), &hd, sizeof(hd)); - memcpy(skb_push(skb_new, sizeof(hdlc_start)), hdlc_start, - sizeof(hdlc_start)); - memcpy(skb_put(skb_new, sizeof(hdlc_end)), hdlc_end, sizeof(hdlc_end)); - - ret = iod->link->send(iod->link, iod, skb_new); - if (ret < 0) { - dev_kfree_skb_any(skb); - return NETDEV_TX_BUSY; - } - - ndev->stats.tx_packets++; - ndev->stats.tx_bytes += skb->len; - dev_kfree_skb_any(skb); - - return NETDEV_TX_OK; -} - -static struct net_device_ops vnet_ops = { - .ndo_open = vnet_open, - .ndo_stop = vnet_stop, - .ndo_start_xmit = vnet_xmit, -}; - -static void vnet_setup(struct net_device *ndev) -{ - ndev->netdev_ops = &vnet_ops; - ndev->type = ARPHRD_PPP; - ndev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; - ndev->addr_len = 0; - ndev->hard_header_len = 0; - ndev->tx_queue_len = 1000; - ndev->mtu = ETH_DATA_LEN; - ndev->watchdog_timeo = 5 * HZ; -} - -static void vnet_setup_ether(struct net_device *ndev) -{ - ndev->netdev_ops = &vnet_ops; - ndev->type = ARPHRD_ETHER; - ndev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST | IFF_SLAVE; - ndev->addr_len = ETH_ALEN; - random_ether_addr(ndev->dev_addr); - ndev->hard_header_len = 0; - ndev->tx_queue_len = 1000; - ndev->mtu = ETH_DATA_LEN; - ndev->watchdog_timeo = 5 * HZ; -} - -int init_io_device(struct io_device *iod) -{ - int ret = 0; - struct vnet *vnet; - - /* get modem state from modem control device */ - iod->modem_state_changed = io_dev_modem_state_changed; - /* get data from link device */ - iod->recv = io_dev_recv_data_from_link_dev; - - INIT_LIST_HEAD(&iod->list); - - /* register misc or net drv */ - switch (iod->io_typ) { - case IODEV_MISC: - init_waitqueue_head(&iod->wq); - skb_queue_head_init(&iod->sk_rx_q); - INIT_DELAYED_WORK(&iod->rx_work, rx_iodev_work); - - iod->miscdev.minor = MISC_DYNAMIC_MINOR; - iod->miscdev.name = iod->name; - iod->miscdev.fops = &misc_io_fops; - - ret = misc_register(&iod->miscdev); - if (ret) - pr_err("failed to register misc io device : %s\n", - iod->name); - - break; - - case IODEV_NET: - if (iod->net_typ == UMTS_NETWORK) - iod->ndev = alloc_netdev(0, iod->name, vnet_setup); - else - iod->ndev = alloc_netdev(0, iod->name, - vnet_setup_ether); - if (!iod->ndev) { - pr_err("failed to alloc netdev\n"); - return -ENOMEM; - } - - ret = register_netdev(iod->ndev); - if (ret) - free_netdev(iod->ndev); - - pr_debug("%s: %d(iod:0x%p)\n", __func__, __LINE__, iod); - vnet = netdev_priv(iod->ndev); - pr_debug("%s: %d(vnet:0x%p)\n", __func__, __LINE__, vnet); - vnet->iod = iod; - - break; - - case IODEV_DUMMY: - skb_queue_head_init(&iod->sk_rx_q); - INIT_DELAYED_WORK(&iod->rx_work, rx_iodev_work); - - break; - - default: - pr_err("wrong io_type : %d\n", iod->io_typ); - return -EINVAL; - } - - pr_debug("[MODEM_IF] %s(%d) : init_io_device() done : %d\n", - iod->name, iod->io_typ, ret); - return ret; -} diff --git a/drivers/misc/modem_if_na/modem_link_device_dpram.c b/drivers/misc/modem_if_na/modem_link_device_dpram.c deleted file mode 100644 index bf4f61a..0000000 --- a/drivers/misc/modem_if_na/modem_link_device_dpram.c +++ /dev/null @@ -1,1504 +0,0 @@ -/* - * Copyright (C) 2011 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "modem_prj.h" -#include "modem_link_device_dpram.h" - -/* interrupt masks.*/ -#define INT_MASK_VALID 0x0080 -#define INT_MASK_CMD 0x0040 -#define INT_MASK_REQ_ACK_F 0x0020 -#define INT_MASK_REQ_ACK_R 0x0010 -#define INT_MASK_RES_ACK_F 0x0008 -#define INT_MASK_RES_ACK_R 0x0004 -#define INT_MASK_SEND_F 0x0002 -#define INT_MASK_SEND_R 0x0001 -#define INT_VALID(x) ((x) & INT_MASK_VALID) -#define INT_CMD_VALID(x) ((x) & INT_MASK_CMD) -#define INT_NON_CMD(x) (INT_MASK_VALID | (x)) -#define INT_CMD(x) (INT_MASK_VALID | INT_MASK_CMD | (x)) - -#define INT_CMD_MASK(x) ((x) & 0xF) -#define INT_CMD_INIT_START 0x1 -#define INT_CMD_INIT_END 0x2 -#define INT_CMD_REQ_ACTIVE 0x3 -#define INT_CMD_RES_ACTIVE 0x4 -#define INT_CMD_REQ_TIME_SYNC 0x5 -#define INT_CMD_PHONE_START 0x8 -#define INT_CMD_ERR_DISPLAY 0x9 -#define INT_CMD_PHONE_DEEP_SLEEP 0xA -#define INT_CMD_NV_REBUILDING 0xB -#define INT_CMD_EMER_DOWN 0xC -#define INT_CMD_PIF_INIT_DONE 0xD -#define INT_CMD_SILENT_NV_REBUILDING 0xE -#define INT_CMD_NORMAL_POWER_OFF 0xF - -/* special interrupt cmd indicating modem boot failure. */ -#define INT_POWERSAFE_FAIL 0xDEAD - -#define GOTA_CMD_VALID(x) (((x) & 0xA000) == 0xA000) -#define GOTA_RESULT_FAIL 0x2 -#define GOTA_RESULT_SUCCESS 0x1 -#define GOTA_CMD_MASK(x) (((x) >> 8) & 0xF) -#define GOTA_CMD_RECEIVE_READY 0x1 -#define GOTA_CMD_DOWNLOAD_START_REQ 0x2 -#define GOTA_CMD_DOWNLOAD_START_RESP 0x3 -#define GOTA_CMD_IMAGE_SEND_REQ 0x4 -#define GOTA_CMD_IMAGE_SEND_RESP 0x5 -#define GOTA_CMD_SEND_DONE_REQ 0x6 -#define GOTA_CMD_SEND_DONE_RESP 0x7 -#define GOTA_CMD_STATUS_UPDATE 0x8 -#define GOTA_CMD_UPDATE_DONE 0x9 -#define GOTA_CMD_EFS_CLEAR_RESP 0xB -#define GOTA_CMD_ALARM_BOOT_OK 0xC -#define GOTA_CMD_ALARM_BOOT_FAIL 0xD - -#define CMD_DL_START_REQ 0x9200 -#define CMD_IMG_SEND_REQ 0x9400 -#define CMD_DL_SEND_DONE_REQ 0x9600 -#define CMD_UL_RECEIVE_RESP 0x9601 -#define CMD_UL_RECEIVE_DONE_RESP 0x9801 - -#define START_INDEX 0x7F -#define END_INDEX 0x7E - -#define DP_MAGIC_CODE 0xAA -#define DP_MAGIC_DMDL 0x4445444C -#define DP_MAGIC_UMDL 0x4445444D -#define DP_DPRAM_SIZE 0x4000 -#define DP_DEFAULT_WRITE_LEN 8168 -#define DP_DEFAULT_DUMP_LEN 16366 -#ifdef CONFIG_INTERNAL_MODEM_IF -#define DP_DUMP_HEADER_SIZE 8 -#else -#define DP_DUMP_HEADER_SIZE 7 -#endif -#define GOTA_TIMEOUT (50 * HZ) -#define GOTA_SEND_TIMEOUT (200 * HZ) -#define DUMP_TIMEOUT (30 * HZ) -#define DUMP_START_TIMEOUT (100 * HZ) -#define IDPRAM_PHY_START 0x13A00000 -#define IDPRAM_SIZE 0x4000 - - - -static int -dpram_download(struct dpram_link_device *dpld, const char *buf, int len); -static int -dpram_upload(struct dpram_link_device *dpld, struct dpram_firmware *uploaddata); -static inline void -dpram_writeh(u16 value, void __iomem *p_dest); -static void -dpram_clear(struct dpram_link_device *dpld); -static struct io_device * -dpram_find_iod(struct dpram_link_device *dpld, int id); -static void -dpram_write_command(struct dpram_link_device *dpld, u16 cmd); -static inline int -dpram_readh(void __iomem *p_dest); - -#ifdef CONFIG_INTERNAL_MODEM_IF - -#define INT_MASK_CMD_PDA_SLEEP 0x0C -#define INT_MASK_CMD_DPRAM_DOWN 0x0C -#define INT_MASK_CMD_PDA_WAKEUP 0x0A -#define INT_MASK_CMD_CP_WAKEUP_START 0x0A -#define INT_MASK_CMD_DPRAM_DOWN_NACK 0x07 - -#include -#include - -struct idpram_link_pm_data *pm; - -void idpram_magickey_init(struct idpram_link_pm_data *pm_data) -{ - u16 acc_code = 0x01; - - dpram_writeh(DP_MAGIC_CODE, &pm_data->dpld->dpram->magic); - dpram_writeh(acc_code, &pm_data->dpld->dpram->enable); -} - -int idpram_get_write_lock(struct idpram_link_pm_data *pm_data) -{ - return atomic_read(&pm_data->write_lock); -} - -static int idpram_write_lock(struct idpram_link_pm_data *pm_data, int lock) -{ - int lock_value = 0; - - mif_info("MIF: idpram write_lock(%d)\n", lock); - - switch (lock) { - case 0: /* unlock */ - if (atomic_read(&pm_data->write_lock)) - lock_value = atomic_dec_return(&pm_data->write_lock); - if (lock_value) - mif_err("MIF: ipdram write unlock but lock value=%d\n", - lock_value); - break; - case 1: /* lock */ - if (!atomic_read(&pm_data->write_lock)) - lock_value = atomic_inc_return(&pm_data->write_lock); - if (lock_value != 1) - mif_err("MIF: ipdram write lock but lock value=%d\n", - lock_value); - break; - } - return 0; -} - -static int idpram_resume_init(struct idpram_link_pm_data *pm_data) -{ - - pm_data->pm_states = IDPRAM_PM_RESUME_START; - pm_data->last_pm_mailbox = 0; - - dpram_clear(pm_data->dpld); - idpram_magickey_init(pm_data); - - /* Initialize the dpram controller */ - pm_data->mdata->sfr_init(); - - /*re-initialize internal dpram gpios */ - s3c_gpio_cfgpin(pm_data->mdata->gpio_mbx_intr, S3C_GPIO_SFN(0x2)); - - idpram_write_lock(pm_data, 0); - return 0; -} - - -void idpram_timeout_handler(struct idpram_link_pm_data *pm_data) -{ - struct io_device *iod = dpram_find_iod(pm_data->dpld, FMT_IDX); - - mif_info("MIF: <%s>", __func__); - - if (!gpio_get_value(pm_data->mdata->gpio_phone_active)) { - mif_err("MIF: <%s:%s> (Crash silent Reset)\n", - __func__, pm_data->dpld->ld.name); - - if (iod && iod->modem_state_changed) - iod->modem_state_changed(iod, STATE_CRASH_EXIT); - } -} - -static int idpram_resume_check(struct idpram_link_pm_data *pm_data) -{ - /* check last pm mailbox */ - mif_info("MIF: idpram %s, last_pm_mailbox=%x\n", __func__, - pm_data->last_pm_mailbox); - - if (pm_data->last_pm_mailbox == INT_CMD(INT_MASK_CMD_PDA_WAKEUP)) { - pm_data->last_pm_mailbox = 0; - return 0; - } - - dpram_write_command(pm_data->dpld, INT_CMD(INT_MASK_CMD_PDA_WAKEUP)); - mif_info("MIF: idpram sent PDA_WAKEUP Mailbox(0x%x)\n", - INT_CMD(INT_MASK_CMD_PDA_WAKEUP)); - - return -1; -} - -static void idpram_resume_retry(struct work_struct *work) -{ - struct idpram_link_pm_data *pm_data = - container_of(work, struct idpram_link_pm_data, \ - resume_work.work); - - mif_debug("MIF: %s\n", __func__); - - if (!idpram_resume_check(pm_data)) { - mif_info("MIF: idpram resume ok\n"); - idpram_write_lock(pm_data, 0); - wake_lock_timeout(&pm_data->hold_wlock, msecs_to_jiffies(20)); - return; - } - if (pm_data->resume_retry--) { - schedule_delayed_work(&pm_data->resume_work, \ - msecs_to_jiffies(200)); - wake_lock_timeout(&pm_data->hold_wlock, msecs_to_jiffies(260)); - } else { - mif_info("MIF: idpram resume T-I-M-E-O-UT\n"); - idpram_timeout_handler(pm_data); - /* hold wakelock until uevnet sent to rild */ - wake_lock_timeout(&pm_data->hold_wlock, HZ*7); - idpram_write_lock(pm_data, 0); - } -} - - -static irqreturn_t link_ap_wakeup_handler(int irq, void *data) -{ - struct idpram_link_pm_data *pm_data = data; - - mif_info("MIF: <%s> 5 seconds.\n", __func__); - wake_lock_timeout(&pm_data->host_wakeup_wlock, 5*HZ); - - return IRQ_HANDLED; -} - -static int idpram_pm_suspend(struct device *dev) -{ - struct idpram_link_pm_data *pm_data = pm; - - pm_data->pm_states = IDPRAM_PM_SUSPEND_START; - gpio_set_value(pm_data->mdata->gpio_pda_active, 0); - - mif_debug("MIF: <%s>\n", __func__); - - return 0; -} -static int idpram_pm_resume(struct device *dev) -{ - struct idpram_link_pm_data *pm_data = pm; - - idpram_resume_init(pm_data); - gpio_set_value(pm_data->mdata->gpio_pda_active, 1); - mif_debug("MIF: <%s>\n", __func__); - return 0; -} - -static int __devinit idpram_pm_probe(struct platform_device *pdev) -{ - return 0; -} -static void idpram_pm_shutdown(struct platform_device *pdev) -{ -} - -static const struct dev_pm_ops idpram_pm_ops = { - .suspend = idpram_pm_suspend, - .resume = idpram_pm_resume, -}; - -static struct platform_driver idpram_pm_driver = { - .probe = idpram_pm_probe, - .shutdown = idpram_pm_shutdown, - .driver = { - .name = "idparam_pm", - .pm = &idpram_pm_ops, - }, -}; - -static void idpram_powerup_start(struct idpram_link_pm_data *pm_data) -{ - pm_data->last_pm_mailbox = INT_CMD(INT_MASK_CMD_PDA_WAKEUP); - pm_data->pm_states = IDPRAM_PM_ACTIVE; - mif_debug("MIF: <%s>\n", __func__); -} - -static void idpram_power_down_nack(struct idpram_link_pm_data *pm_data) -{ - pm_data->last_pm_mailbox = INT_CMD(INT_MASK_CMD_DPRAM_DOWN_NACK); - complete(&pm_data->idpram_down); - mif_debug("MIF: <%s>\n", __func__); -} - -static void idpram_power_down(struct idpram_link_pm_data *pm_data) -{ - pm_data->last_pm_mailbox = INT_CMD(INT_MASK_CMD_DPRAM_DOWN); - complete(&pm_data->idpram_down); - mif_debug("MIF: <%s>\n", __func__); -} - -static int idpram_post_resume(struct idpram_link_pm_data *pm_data) -{ - int gpio_val = 0; - - mif_info("MIF: idpram %s\n", __func__); - - switch (pm_data->pm_states) { - /* schedule_work */ - case IDPRAM_PM_DPRAM_POWER_DOWN: - gpio_set_value(pm_data->mdata->gpio_pda_active, 0); - mif_info("MIF: idpram PDA_ACTIVE LOW\n"); - - msleep(50); - - idpram_resume_init(pm_data); - - msleep(50); - - gpio_set_value(pm_data->mdata->gpio_pda_active, 1); - - msleep(20); - - gpio_val = gpio_get_value(pm_data->mdata->gpio_pda_active); - mif_info("MIF: idpram PDA_ACTIVE (%d)\n", gpio_val); - - if (gpio_val == 0) { - gpio_set_value(pm_data->mdata->gpio_pda_active, 1); - mif_info("MIF: idpram PDA_ACTIVE set again.\n"); - } - break; - - case IDPRAM_PM_RESUME_START: - break; - - case IDPRAM_PM_SUSPEND_PREPARE: - break; - } - return 0; -} - - -static int idpram_pre_suspend(struct idpram_link_pm_data *pm_data) -{ - int timeout_ret = 0; - int suspend_retry = 2; - u16 intr_out = INT_CMD(INT_MASK_CMD_PDA_SLEEP); - - pm_data->pm_states = IDPRAM_PM_SUSPEND_PREPARE; - pm_data->last_pm_mailbox = 0; - idpram_write_lock(pm_data, 1); - - gpio_set_value(pm_data->mdata->gpio_mbx_intr, 1); - - /* prevent PDA_ACTIVE ststus is low */ - gpio_set_value(pm_data->mdata->gpio_pda_active, 1); - - if (!atomic_read(&pm_data->read_lock)) { - do { - init_completion(&pm_data->idpram_down); - dpram_write_command(pm_data->dpld, intr_out); - mif_err("MIF: idpram sent PDA_SLEEP Mailbox(0x%X)\n", - intr_out); - timeout_ret = - wait_for_completion_timeout(&pm_data->idpram_down, - (HZ/5)); - mif_err("MIF: suspend_enter cnt = %d\n", - suspend_retry); - } while (!timeout_ret && suspend_retry--); - - switch (pm_data->last_pm_mailbox) { - case INT_CMD(INT_MASK_CMD_DPRAM_DOWN): - break; - - /* if nack or other interrup, hold wakelock for DPM resume*/ - case INT_CMD(INT_MASK_CMD_DPRAM_DOWN_NACK): - mif_err("MIF: idpram dpram down get NACK\n"); - - default: - mif_err("MIF: CP dpram Down not ready! intr=0x%X\n", - dpram_readh(&pm_data->dpld->dpram->mbx_cp2ap)); - wake_lock_timeout(&pm_data->hold_wlock, - msecs_to_jiffies(500)); - idpram_write_lock(pm_data, 0); - return 0; - } - /* - * Because, if dpram was powered down, cp dpram random intr was - * ocurred. so, fixed by muxing cp dpram intr pin to GPIO output - * high,.. - */ - gpio_set_value(pm_data->mdata->gpio_mbx_intr, 1); - s3c_gpio_cfgpin(pm_data->mdata->gpio_mbx_intr, S3C_GPIO_OUTPUT); - pm_data->pm_states = IDPRAM_PM_DPRAM_POWER_DOWN; - - return 0; - } else { - mif_err("MIF: idpram hold read_lock\n"); - return -EBUSY; - } -} - -static int idpram_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - int err; - - switch (event) { - case PM_SUSPEND_PREPARE: - mif_debug("MIF: PM_SUSPEND_PREPARE+\n"); - err = idpram_pre_suspend(pm); - if (err) - mif_err("MIF: pre-suspend err\n"); - break; - - case PM_POST_SUSPEND: - mif_debug("MIF: PM_POST_SUSPEND+\n"); - err = idpram_post_resume(pm); - if (err) - mif_err("MIF: pre-suspend err\n"); - break; - } - return NOTIFY_DONE; -} - -static struct notifier_block idpram_link_pm_notifier = { - .notifier_call = idpram_notifier_event, -}; - -static int idpram_link_pm_init -( -struct dpram_link_device *idpram_ld, -struct platform_device *pdev -) -{ - int r = 0; - unsigned irq = 0; - struct modem_data *pdata = - (struct modem_data *)pdev->dev.platform_data; - - mif_info("MIF: <%s>\n", __func__); - - pm = kzalloc(sizeof(struct idpram_link_pm_data), GFP_KERNEL); - if (!pm) { - mif_err("MIF: %s: link_pm_data is NULL\n", __func__); - return -ENOMEM; - } - - pm->mdata = pdata; - pm->dpld = idpram_ld; - idpram_ld->link_pm_data = pm; - - /*for pm notifire*/ - register_pm_notifier(&idpram_link_pm_notifier); - - - init_completion(&pm->idpram_down); - wake_lock_init(&pm->host_wakeup_wlock, - WAKE_LOCK_SUSPEND, - "HOST_WAKEUP_WLOCK"); - wake_lock_init(&pm->rd_wlock, WAKE_LOCK_SUSPEND, "dpram_pwrdn"); - wake_lock_init(&pm->hold_wlock, WAKE_LOCK_SUSPEND, "dpram_hold"); - wake_lock_init(&pm->wakeup_wlock, WAKE_LOCK_SUSPEND, "dpram_wakeup"); - atomic_set(&pm->read_lock, 0); - atomic_set(&pm->write_lock, 0); - INIT_DELAYED_WORK(&pm->resume_work, idpram_resume_retry); - - r = platform_driver_register(&idpram_pm_driver); - if (r) { - mif_err("MIF: wakelocks_init: platform_driver_register failed\n"); - goto err_platform_driver_register; - } - - irq = gpio_to_irq(pdata->gpio_ap_wakeup); - r = request_irq(irq, link_ap_wakeup_handler, - IRQF_TRIGGER_RISING, - "idpram_host_wakeup", (void *)pm); - - mif_info("MIF: <%s> DPRAM IRQ# = %d, %d\n", __func__, - irq, - pm->mdata->gpio_ap_wakeup); - - if (r) { - mif_err("MIF: %s:fail to request irq(%d) host_wake_irq\n", - __func__, r); - goto err_request_irq; - } - - r = enable_irq_wake(irq); - if (r) { - mif_err("MIF: %s: failed to enable_irq_wake:%d host_wake_irq\n", - __func__, r); - goto err_set_wake_irq; - } - - mif_info("MIF: <%s> END\n", __func__); - return 0; - -err_set_wake_irq: - free_irq(irq, (void *)pm); -err_request_irq: - platform_driver_unregister(&idpram_pm_driver); -err_platform_driver_register: - kfree(pm); - return r; -} -#endif /*CONFIG_INTERNAL_MODEM_IF*/ - - - -static inline int dpram_readh(void __iomem *p_dest) -{ - unsigned long dest = (unsigned long)p_dest; - return ioread16(dest); -} - -static inline void dpram_writew(u32 value, void __iomem *p_dest) -{ - unsigned long dest = (unsigned long)p_dest; - iowrite32(value, dest); -} - -static inline void dpram_writeh(u16 value, void __iomem *p_dest) -{ - unsigned long dest = (unsigned long)p_dest; - iowrite16(value, dest); -} - -static inline void dpram_writeb(u8 value, void __iomem *p_dest) -{ - unsigned long dest = (unsigned long)p_dest; - iowrite8(value, dest); -} - - -static void dpram_write_command(struct dpram_link_device *dpld, u16 cmd) -{ - dpram_writeh(cmd, &dpld->dpram->mbx_ap2cp); -} - -static void dpram_clear_interrupt(struct dpram_link_device *dpld) -{ - dpram_writeh(0, &dpld->dpram->mbx_cp2ap); -} - -static void dpram_drop_data(struct dpram_device *device, u16 head) -{ - dpram_writeh(head, &device->in->tail); -} - -static void dpram_zero_circ(struct dpram_circ *circ) -{ - dpram_writeh(0, &circ->head); - dpram_writeh(0, &circ->tail); -} - -static void dpram_clear(struct dpram_link_device *dpld) -{ - dpram_zero_circ(&dpld->dpram->fmt_out); - dpram_zero_circ(&dpld->dpram->raw_out); - dpram_zero_circ(&dpld->dpram->fmt_in); - dpram_zero_circ(&dpld->dpram->raw_in); -} - -static bool dpram_circ_valid(int size, u16 head, u16 tail) -{ - if (head >= size) { - mif_err("MIF: head(%d) >= size(%d)\n", head, size); - return false; - } - if (tail >= size) { - mif_err("MIF: tail(%d) >= size(%d)\n", tail, size); - return false; - } - return true; -} - -static int dpram_init_and_report(struct dpram_link_device *dpld) -{ - const u16 init_end = INT_CMD(INT_CMD_INIT_END); - u16 magic; - u16 enable; - - dpram_writeh(0, &dpld->dpram->enable); - dpram_clear(dpld); - dpram_writeh(DP_MAGIC_CODE, &dpld->dpram->magic); - dpram_writeh(1, &dpld->dpram->enable); - - /* Send init end code to modem */ - dpram_write_command(dpld, init_end); - - magic = dpram_readh(&dpld->dpram->magic); - if (magic != DP_MAGIC_CODE) { - mif_err("MIF:: %s: Failed to check magic\n", __func__); - return -1; - } - - enable = dpram_readh(&dpld->dpram->enable); - if (!enable) { - mif_err("MIF:: %s: DPRAM enable failed\n", __func__); - return -1; - } - - return 0; -} - -static struct io_device *dpram_find_iod(struct dpram_link_device *dpld, int id) -{ - struct io_device *iod; - - list_for_each_entry(iod, &dpld->list_of_io_devices, list) { - if ((id == FMT_IDX && iod->format == IPC_FMT) || - (id == RAW_IDX && iod->format == IPC_MULTI_RAW)) - return iod; - } - - return NULL; -} - -static void cmd_req_active_handler(struct dpram_link_device *dpld) -{ - dpram_write_command(dpld, INT_CMD(INT_CMD_RES_ACTIVE)); -} - -static void cmd_error_display_handler(struct dpram_link_device *dpld) -{ - struct io_device *iod = dpram_find_iod(dpld, FMT_IDX); - - mif_info("MIF: Received 0xc9 from modem (CP Crash)\n"); - mif_info("MIF: %s\n", dpld->dpram->fmt_in_buff); - - if (iod && iod->modem_state_changed) - iod->modem_state_changed(iod, STATE_CRASH_EXIT); -} - -static void cmd_phone_start_handler(struct dpram_link_device *dpld) -{ - mif_debug("MIF: Received 0xc8 from modem (Boot OK)\n"); - complete_all(&dpld->dpram_init_cmd); - dpram_init_and_report(dpld); -} - -static void cmd_nv_rebuild_handler(struct dpram_link_device *dpld) -{ - struct io_device *iod = dpram_find_iod(dpld, FMT_IDX); - - mif_info("MIF: Received nv rebuilding from modem\n"); - mif_info("MIF: %s\n", dpld->dpram->fmt_in_buff); - - if (iod && iod->modem_state_changed) - iod->modem_state_changed(iod, STATE_NV_REBUILDING); -} - - -static void command_handler(struct dpram_link_device *dpld, u16 cmd) -{ - mif_debug("MIF: %s: %x\n", __func__, cmd); - - switch (INT_CMD_MASK(cmd)) { - case INT_CMD_REQ_ACTIVE: - cmd_req_active_handler(dpld); - break; - - case INT_CMD_ERR_DISPLAY: - cmd_error_display_handler(dpld); - break; - - case INT_CMD_PHONE_START: - cmd_phone_start_handler(dpld); - break; - - case INT_CMD_NV_REBUILDING: - mif_err("[MODEM_IF] NV_REBUILDING\n"); - cmd_nv_rebuild_handler(dpld); - break; - - case INT_CMD_PIF_INIT_DONE: - complete_all(&dpld->modem_pif_init_done); - break; - - case INT_CMD_SILENT_NV_REBUILDING: - mif_err("[MODEM_IF] SILENT_NV_REBUILDING\n"); - break; - -#ifdef CONFIG_INTERNAL_MODEM_IF - case INT_MASK_CMD_DPRAM_DOWN: - idpram_power_down(dpld->link_pm_data); - break; - - case INT_MASK_CMD_DPRAM_DOWN_NACK: - idpram_power_down_nack(dpld->link_pm_data); - break; - - case INT_MASK_CMD_CP_WAKEUP_START: - idpram_powerup_start(dpld->link_pm_data); - break; -#else - case INT_CMD_NORMAL_POWER_OFF: - /*ToDo:*/ - /*kernel_sec_set_cp_ack()*/; - break; - - case INT_CMD_REQ_TIME_SYNC: - case INT_CMD_PHONE_DEEP_SLEEP: - case INT_CMD_EMER_DOWN: - break; -#endif - - default: - mif_err("Unknown command.. %x\n", cmd); - } -} - - -static int dpram_process_modem_update(struct dpram_link_device *dpld, - struct dpram_firmware *pfw) -{ - int ret = 0; - char *buff = vmalloc(pfw->size); - - mif_debug("[GOTA] modem size =[%d]\n", pfw->size); - - if (!buff) - return -ENOMEM; - - ret = copy_from_user(buff, pfw->firmware, pfw->size); - if (ret < 0) { - mif_err("[%s:%d] Copy from user failed\n", __func__, __LINE__); - goto out; - } - - ret = dpram_download(dpld, buff, pfw->size); - if (ret < 0) - mif_err("firmware write failed\n"); - -out: - vfree(buff); - return ret; -} - - -static int dpram_modem_update(struct link_device *ld, struct io_device *iod, - unsigned long _arg) -{ - int ret; - struct dpram_link_device *dpld = to_dpram_link_device(ld); - struct dpram_firmware fw; - - mif_debug("[GOTA] dpram_modem_update\n"); - - ret = copy_from_user(&fw, (void __user *)_arg, sizeof(fw)); - if (ret < 0) { - mif_err("copy from user failed!"); - return ret; - } - - return dpram_process_modem_update(dpld, &fw); -} - -static int dpram_dump_update(struct link_device *ld, struct io_device *iod, - unsigned long _arg) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - struct dpram_firmware *fw = (struct dpram_firmware *)_arg ; - - mif_debug("MIF: dpram_dump_update()\n"); - - return dpram_upload(dpld, fw); -} - -static int dpram_read(struct dpram_link_device *dpld, - struct dpram_device *device, int dev_idx) -{ - struct io_device *iod; - int size; - int tmp_size; - u16 head, tail; - char *buff; - - head = dpram_readh(&device->in->head); - tail = dpram_readh(&device->in->tail); - mif_debug("=====> %s, head: %d, tail: %d\n", __func__, head, tail); - - if (head == tail) { - mif_err("MIF: %s: head == tail\n", __func__); - goto err_dpram_read; - } - - if (!dpram_circ_valid(device->in_buff_size, head, tail)) { - mif_err("MIF: %s: invalid circular buffer\n", __func__); - dpram_zero_circ(device->in); - goto err_dpram_read; - } - - iod = dpram_find_iod(dpld, dev_idx); - if (!iod) { - mif_err("MIF: iod == NULL\n"); - goto err_dpram_read; - } - - /* Get data size in DPRAM*/ - size = (head > tail) ? (head - tail) : - (device->in_buff_size - tail + head); - - /* ----- (tail) 7f 00 00 7e (head) ----- */ - if (head > tail) { - buff = device->in_buff_addr + tail; - if (iod->recv(iod, buff, size) < 0) { - mif_err("MIF: %s: recv error, dropping data\n", - __func__); - dpram_drop_data(device, head); - goto err_dpram_read; - } - } else { /* 00 7e (head) ----------- (tail) 7f 00 */ - /* 1. tail -> buffer end.*/ - tmp_size = device->in_buff_size - tail; - buff = device->in_buff_addr + tail; - if (iod->recv(iod, buff, tmp_size) < 0) { - mif_err("MIF: %s: recv error, dropping data\n", - __func__); - dpram_drop_data(device, head); - goto err_dpram_read; - } - - /* 2. buffer start -> head.*/ - if (size > tmp_size) { - buff = (char *)device->in_buff_addr; - if (iod->recv(iod, buff, (size - tmp_size)) < 0) { - mif_err("MIF: %s: recv error, dropping data\n", - __func__); - dpram_drop_data(device, head); - goto err_dpram_read; - } - } - } - - /* new tail */ - tail = (u16)((tail + size) % device->in_buff_size); - dpram_writeh(tail, &device->in->tail); - - return size; - -err_dpram_read: - return -EINVAL; -} - -static void non_command_handler(struct dpram_link_device *dpld, - u16 non_cmd) -{ - struct dpram_device *device = NULL; - u16 head, tail; - u16 magic, access; - int ret = 0; - - mif_debug("MIF: Entering non_command_handler(0x%04X)\n", non_cmd); - - magic = dpram_readh(&dpld->dpram->magic); - access = dpram_readh(&dpld->dpram->enable); - - if (!access || magic != DP_MAGIC_CODE) { - mif_err("fmr recevie error!!!! access = 0x%x, magic =0x%x", - access, magic); - return; - } - - /* Check formatted data region */ - device = &dpld->dev_map[FMT_IDX]; - head = dpram_readh(&device->in->head); - tail = dpram_readh(&device->in->tail); - - if (!dpram_circ_valid(device->in_buff_size, head, tail)) { - mif_err("MIF: %s: invalid circular buffer\n", __func__); - dpram_zero_circ(device->in); - return; - } - - if (head != tail) { - if (non_cmd & INT_MASK_REQ_ACK_F) - atomic_inc(&dpld->fmt_txq_req_ack_rcvd); - - ret = dpram_read(dpld, device, FMT_IDX); - if (ret < 0) - mif_err("%s, dpram_read failed\n", __func__); - - if (atomic_read(&dpld->fmt_txq_req_ack_rcvd) > 0) { - dpram_write_command(dpld, - INT_NON_CMD(INT_MASK_RES_ACK_F)); - atomic_set(&dpld->fmt_txq_req_ack_rcvd, 0); - } - } else { - if (non_cmd & INT_MASK_REQ_ACK_F) { - dpram_write_command(dpld, - INT_NON_CMD(INT_MASK_RES_ACK_F)); - atomic_set(&dpld->fmt_txq_req_ack_rcvd, 0); - } - } - - /* Check raw data region */ - device = &dpld->dev_map[RAW_IDX]; - head = dpram_readh(&device->in->head); - tail = dpram_readh(&device->in->tail); - - if (!dpram_circ_valid(device->in_buff_size, head, tail)) { - mif_err("MIF: %s: invalid circular buffer\n", __func__); - dpram_zero_circ(device->in); - return; - } - - if (head != tail) { - if (non_cmd & INT_MASK_REQ_ACK_R) - atomic_inc(&dpld->raw_txq_req_ack_rcvd); - - ret = dpram_read(dpld, device, RAW_IDX); - if (ret < 0) - mif_err("%s, dpram_read failed\n", __func__); - - if (atomic_read(&dpld->raw_txq_req_ack_rcvd) > 0) { - dpram_write_command(dpld, - INT_NON_CMD(INT_MASK_RES_ACK_R)); - atomic_set(&dpld->raw_txq_req_ack_rcvd, 0); - } - } else { - if (non_cmd & INT_MASK_REQ_ACK_R) { - dpram_write_command(dpld, - INT_NON_CMD(INT_MASK_RES_ACK_R)); - atomic_set(&dpld->raw_txq_req_ack_rcvd, 0); - } - } -} - -static void gota_cmd_handler(struct dpram_link_device *dpld, u16 cmd) -{ - if (cmd & GOTA_RESULT_FAIL) { - mif_err("[GOTA] Command failed: %04x\n", cmd); - return; - } - - switch (GOTA_CMD_MASK(cmd)) { - case GOTA_CMD_RECEIVE_READY: - mif_debug("[GOTA] Send CP-->AP RECEIVE_READY\n"); - dpram_write_command(dpld, CMD_DL_START_REQ); - break; - - case GOTA_CMD_DOWNLOAD_START_RESP: - mif_debug("[GOTA] Send CP-->AP DOWNLOAD_START_RESP\n"); - complete_all(&dpld->gota_download_start_complete); - break; - - case GOTA_CMD_SEND_DONE_RESP: - mif_debug("[GOTA] Send CP-->AP SEND_DONE_RESP\n"); - complete_all(&dpld->gota_send_done); - break; - - case GOTA_CMD_UPDATE_DONE: - mif_debug("[GOTA] Send CP-->AP UPDATE_DONE\n"); - complete_all(&dpld->gota_update_done); - break; - - case GOTA_CMD_IMAGE_SEND_RESP: - mif_debug("MIF: Send CP-->AP IMAGE_SEND_RESP\n"); - complete_all(&dpld->dump_receive_done); - break; - - default: - mif_err("[GOTA] Unknown command.. %x\n", cmd); - } -} - -static irqreturn_t dpram_irq_handler(int irq, void *p_ld) -{ - u16 cp2ap; - - struct link_device *ld = (struct link_device *)p_ld; - struct dpram_link_device *dpld = to_dpram_link_device(ld); - - cp2ap = dpram_readh(&dpld->dpram->mbx_cp2ap); -#if 0 - mif_err("MIF: received CP2AP = 0x%x\n", cp2ap); -#endif - if (cp2ap == INT_POWERSAFE_FAIL) { - mif_err("MIF: Received POWERSAFE_FAIL\n"); - goto exit_irq; - } - - if (GOTA_CMD_VALID(cp2ap)) - gota_cmd_handler(dpld, cp2ap); - else if (INT_CMD_VALID(cp2ap)) - command_handler(dpld, cp2ap); - else if (INT_VALID(cp2ap)) - non_command_handler(dpld, cp2ap); - else - mif_err("MIF: Invalid command %04x\n", cp2ap); - -exit_irq: -#ifdef CONFIG_INTERNAL_MODEM_IF - dpld->clear_interrupt(); -#endif - return IRQ_HANDLED; -} - -static int dpram_attach_io_dev(struct link_device *ld, struct io_device *iod) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - - iod->link = ld; - /* list up io devices */ - list_add(&iod->list, &dpld->list_of_io_devices); - - return 0; -} - -static int dpram_write(struct dpram_link_device *dpld, - struct dpram_device *device, - const unsigned char *buf, - int len) -{ - u16 head; - u16 tail; - u16 irq_mask; - int free_space; - int last_size; - -#ifdef CONFIG_INTERNAL_MODEM_IF - /* Internal DPRAM, check dpram ready?*/ - if (idpram_get_write_lock(dpld->link_pm_data)) { - printk(KERN_INFO "dpram_write_net - not ready return -EAGAIN\n"); - return -EAGAIN; - } -#endif - - head = dpram_readh(&device->out->head); - tail = dpram_readh(&device->out->tail); - - if (!dpram_circ_valid(device->out_buff_size, head, tail)) { - mif_err("MIF: %s: invalid circular buffer\n", __func__); - dpram_zero_circ(device->out); - return -EINVAL; - } - - free_space = (head < tail) ? tail - head - 1 : - device->out_buff_size + tail - head - 1; - if (len > free_space) { - mif_debug("WRITE: No space in Q\n" - "len[%d] free_space[%d] head[%u] tail[%u] out_buff_size =%d\n", - len, free_space, head, tail, device->out_buff_size); - return -EINVAL; - } - - mif_debug("WRITE: len[%d] free_space[%d] head[%u] tail[%u] out_buff_size =%d\n", - len, free_space, head, tail, device->out_buff_size); - - if (head < tail) { - /* +++++++++ head ---------- tail ++++++++++ */ - memcpy((device->out_buff_addr + head), buf, len); - } else { - /* ------ tail +++++++++++ head ------------ */ - last_size = device->out_buff_size - head; - memcpy((device->out_buff_addr + head), buf, - len > last_size ? last_size : len); - if (len > last_size) { - memcpy(device->out_buff_addr, (buf + last_size), - (len - last_size)); - } - } - - /* Update new head */ - head = (u16)((head + len) % device->out_buff_size); - dpram_writeh(head, &device->out->head); - - irq_mask = INT_MASK_VALID; - - if (len > 0) - irq_mask |= device->mask_send; - - dpram_write_command(dpld, irq_mask); - - return len; -} - -static void dpram_write_work(struct work_struct *work) -{ - struct link_device *ld = - container_of(work, struct link_device, tx_delayed_work.work); - struct dpram_link_device *dpld = to_dpram_link_device(ld); - struct dpram_device *device; - struct sk_buff *skb; - bool reschedule = false; - int ret; - - device = &dpld->dev_map[FMT_IDX]; - while ((skb = skb_dequeue(&ld->sk_fmt_tx_q))) { - ret = dpram_write(dpld, device, skb->data, skb->len); - if (ret < 0) { - skb_queue_head(&ld->sk_fmt_tx_q, skb); - reschedule = true; - break; - } - dev_kfree_skb_any(skb); - } - - device = &dpld->dev_map[RAW_IDX]; - while ((skb = skb_dequeue(&ld->sk_raw_tx_q))) { - ret = dpram_write(dpld, device, skb->data, skb->len); - if (ret < 0) { - skb_queue_head(&ld->sk_raw_tx_q, skb); - reschedule = true; - break; - } - dev_kfree_skb_any(skb); - } - - if (reschedule) - schedule_delayed_work(&ld->tx_delayed_work, - msecs_to_jiffies(10)); -} - -static int dpram_send(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb) -{ - int len = skb->len; - mif_debug("%s: iod->format = %d\n", __func__, iod->format); - - switch (iod->format) { - case IPC_FMT: - skb_queue_tail(&ld->sk_fmt_tx_q, skb); - break; - - case IPC_RAW: - skb_queue_tail(&ld->sk_raw_tx_q, skb); - break; - - case IPC_BOOT: - case IPC_RFS: - default: - dev_kfree_skb_any(skb); - return 0; - } - - schedule_delayed_work(&ld->tx_delayed_work, 0); - return len; -} - -static void dpram_table_init(struct dpram_link_device *dpld) -{ - struct dpram_device *dev; - struct dpram_map __iomem *dpram = dpld->dpram; - - dev = &dpld->dev_map[FMT_IDX]; - dev->in = &dpram->fmt_in; - dev->in_buff_addr = dpram->fmt_in_buff; - dev->in_buff_size = DP_FMT_IN_BUFF_SIZE; - dev->out = &dpram->fmt_out; - dev->out_buff_addr = dpram->fmt_out_buff; - dev->out_buff_size = DP_FMT_OUT_BUFF_SIZE; - dev->mask_req_ack = INT_MASK_REQ_ACK_F; - dev->mask_res_ack = INT_MASK_RES_ACK_F; - dev->mask_send = INT_MASK_SEND_F; - - dev = &dpld->dev_map[RAW_IDX]; - dev->in = &dpram->raw_in; - dev->in_buff_addr = dpram->raw_in_buff; - dev->in_buff_size = DP_RAW_IN_BUFF_SIZE; - dev->out = &dpram->raw_out; - dev->out_buff_addr = dpram->raw_out_buff; - dev->out_buff_size = DP_RAW_OUT_BUFF_SIZE; - dev->mask_req_ack = INT_MASK_REQ_ACK_R; - dev->mask_res_ack = INT_MASK_RES_ACK_R; - dev->mask_send = INT_MASK_SEND_R; -} - -static int dpram_set_dlmagic(struct link_device *ld, struct io_device *iod) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - dpram_writew(DP_MAGIC_DMDL, &dpld->dpram->magic); - return 0; -} - -static int dpram_set_ulmagic(struct link_device *ld, struct io_device *iod) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - struct dpram_map *dpram = (void *)dpld->dpram; - u8 *dest; - dest = (u8 *)(&dpram->fmt_out); - - dpram_writew(DP_MAGIC_UMDL, &dpld->dpram->magic); - - dpram_writeb((u8)START_INDEX, dest + 0); - dpram_writeb((u8)0x1, dest + 1); - dpram_writeb((u8)0x1, dest + 2); - dpram_writeb((u8)0x0, dest + 3); - dpram_writeb((u8)END_INDEX, dest + 4); - - init_completion(&dpld->gota_download_start_complete); - dpram_write_command(dpld, CMD_DL_START_REQ); - - return 0; -} - -static int -dpram_download(struct dpram_link_device *dpld, const char *buf, int len) -{ - struct dpram_map *dpram = (void *)dpld->dpram; - struct dpram_ota_header header; - u16 nframes; - u16 curframe = 1; - u16 plen; - u8 *dest; - int ret; - - nframes = DIV_ROUND_UP(len, DP_DEFAULT_WRITE_LEN); - - mif_debug("[GOTA] download len = %d\n", len); - - header.start_index = START_INDEX; - header.nframes = nframes; - -#ifdef CONFIG_INTERNAL_MODEM_IF - dpld->board_ota_reset(); -#endif - while (len > 0) { - plen = min(len, DP_DEFAULT_WRITE_LEN); - dest = (u8 *)&dpram->fmt_out; - - mif_debug("[GOTA] Start write frame %d/%d\n", \ - curframe, nframes); - - header.curframe = curframe; - header.len = plen; - - memcpy(dest, &header, sizeof(header)); - dest += sizeof(header); - - memcpy(dest, buf, plen); - dest += plen; - buf += plen; - len -= plen; - - dpram_writeb(END_INDEX, dest+3); - - init_completion(&dpld->gota_send_done); - - if (curframe == 1) { -#ifdef CONFIG_INTERNAL_MODEM_IF - init_completion(&dpld->gota_download_start_complete); - dpram_write_command(dpld, 0); -#endif - ret = wait_for_completion_interruptible_timeout( - &dpld->gota_download_start_complete, - GOTA_TIMEOUT); - if (!ret) { - mif_err("[GOTA] CP didn't send DOWNLOAD_START\n"); - return -ENXIO; - } - } - - dpram_write_command(dpld, CMD_IMG_SEND_REQ); - ret = wait_for_completion_interruptible_timeout( - &dpld->gota_send_done, GOTA_SEND_TIMEOUT); - if (!ret) { - mif_err("[GOTA] CP didn't send SEND_DONE_RESP\n"); - return -ENXIO; - } - - curframe++; - } - - dpram_write_command(dpld, CMD_DL_SEND_DONE_REQ); - ret = wait_for_completion_interruptible_timeout( - &dpld->gota_update_done, GOTA_TIMEOUT); - if (!ret) { - mif_err("[GOTA] CP didn't send UPDATE_DONE_NOTIFICATION\n"); - return -ENXIO; - } - - return 0; -} - -static int -dpram_upload(struct dpram_link_device *dpld, struct dpram_firmware *uploaddata) -{ - struct dpram_map *dpram = (void *)dpld->dpram; - struct ul_header header; - u8 *dest; - u8 *buff = vmalloc(DP_DEFAULT_DUMP_LEN); - u16 plen = 0; - u32 tlen = 0; - int ret; - int region = 0; - - mif_debug("MIF: dpram_upload()\n"); - - ret = wait_for_completion_interruptible_timeout( - &dpld->gota_download_start_complete, - DUMP_START_TIMEOUT); - if (!ret) { - mif_err("[GOTA] CP didn't send DOWNLOAD_START\n"); - goto err_out; - } - - wake_lock(&dpld->dpram_wake_lock); - - memset(buff, 0, DP_DEFAULT_DUMP_LEN); - - dpram_write_command(dpld, CMD_IMG_SEND_REQ); - mif_debug("MIF: write CMD_IMG_SEND_REQ(0x9400)\n"); - - while (1) { - init_completion(&dpld->dump_receive_done); - ret = wait_for_completion_interruptible_timeout( - &dpld->dump_receive_done, DUMP_TIMEOUT); - if (!ret) { - mif_err("MIF: CP didn't send DATA_SEND_DONE_RESP\n"); - goto err_out; - } - - dest = (u8 *)(&dpram->fmt_out); - -#ifdef CONFIG_INTERNAL_MODEM_IF - header.bop = *(u16 *)(dest); - header.total_frame = *(u16 *)(dest + 2); - header.curr_frame = *(u16 *)(dest + 4); - header.len = *(u16 *)(dest + 6); -#else - header.bop = *(u8 *)(dest); - header.total_frame = *(u16 *)(dest + 1); - header.curr_frame = *(u16 *)(dest + 3); - header.len = *(u16 *)(dest + 5); -#endif - - mif_err("total frame:%d, current frame:%d, data len:%d\n", - header.total_frame, header.curr_frame, - header.len); - - dest += DP_DUMP_HEADER_SIZE; - plen = min(header.len, (u16)DP_DEFAULT_DUMP_LEN); - - memcpy(buff, dest, plen); - dest += plen; - - ret = copy_to_user(uploaddata->firmware + tlen, buff, plen); - if (ret < 0) { - mif_err("MIF: Copy to user failed\n"); - goto err_out; - } - - tlen += plen; - - if (header.total_frame == header.curr_frame) { - if (region) { - uploaddata->is_delta = tlen - uploaddata->size; - dpram_write_command(dpld, CMD_UL_RECEIVE_RESP); - break; - } else { - uploaddata->size = tlen; - region = 1; - } - } - dpram_write_command(dpld, CMD_UL_RECEIVE_RESP); - } - - mif_debug("1st dump region data size=%d\n", uploaddata->size); - mif_debug("2st dump region data size=%d\n", uploaddata->is_delta); - - init_completion(&dpld->gota_send_done); - ret = wait_for_completion_interruptible_timeout( - &dpld->gota_send_done, DUMP_TIMEOUT); - if (!ret) { - mif_err("[GOTA] CP didn't send SEND_DONE_RESP\n"); - goto err_out; - } - - dpram_write_command(dpld, CMD_UL_RECEIVE_DONE_RESP); - mif_debug("MIF: write CMD_UL_RECEIVE_DONE_RESP(0x9801)\n"); - - dpram_writew(0, &dpld->dpram->magic); /*clear magic code */ - - wake_unlock(&dpld->dpram_wake_lock); - - vfree(buff); - return 0; - -err_out: - vfree(buff); - dpram_writew(0, &dpld->dpram->magic); - mif_err("CDMA dump error out\n"); - wake_unlock(&dpld->dpram_wake_lock); - return -EIO; -} - -struct link_device *dpram_create_link_device(struct platform_device *pdev) -{ - int ret; - struct dpram_link_device *dpld; - struct link_device *ld; - struct resource *res; - unsigned long flag = 0; -#ifdef CONFIG_INTERNAL_MODEM_IF - struct modem_data *pdata = (struct modem_data *)pdev->dev.platform_data; -#endif - BUILD_BUG_ON(sizeof(struct dpram_map) != DP_DPRAM_SIZE); - - dpld = kzalloc(sizeof(struct dpram_link_device), GFP_KERNEL); - if (!dpld) - return NULL; - ld = &dpld->ld; - - INIT_LIST_HEAD(&dpld->list_of_io_devices); - skb_queue_head_init(&ld->sk_fmt_tx_q); - skb_queue_head_init(&ld->sk_raw_tx_q); - INIT_DELAYED_WORK(&ld->tx_delayed_work, dpram_write_work); - - wake_lock_init(&dpld->dpram_wake_lock, WAKE_LOCK_SUSPEND, "DPRAM"); - - init_completion(&dpld->modem_pif_init_done); - init_completion(&dpld->dpram_init_cmd); - init_completion(&dpld->gota_send_done); - init_completion(&dpld->gota_update_done); - init_completion(&dpld->gota_download_start_complete); - init_completion(&dpld->dump_receive_done); - - ld->name = "dpram"; - ld->attach = dpram_attach_io_dev; - ld->send = dpram_send; - ld->gota_start = dpram_set_dlmagic; - ld->modem_update = dpram_modem_update; - ld->dump_start = dpram_set_ulmagic; - ld->dump_update = dpram_dump_update; - -#ifdef CONFIG_INTERNAL_MODEM_IF - dpld->clear_interrupt = pdata->clear_intr; - dpld->board_ota_reset = pdata->ota_reset; -#endif - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - mif_err("MIF: Failed to get mem region\n"); - goto err; - } - dpld->dpram = ioremap(res->start, resource_size(res)); - printk(KERN_INFO " MIF: start address:0x%08x\n", \ - res->start); - dpld->irq = platform_get_irq_byname(pdev, "dpram_irq"); - if (!dpld->irq) { - mif_err("MIF: %s: Failed to get IRQ\n", __func__); - goto err; - } - - dpram_table_init(dpld); - - atomic_set(&dpld->raw_txq_req_ack_rcvd, 0); - atomic_set(&dpld->fmt_txq_req_ack_rcvd, 0); - - dpram_writeh(0, &dpld->dpram->magic); -#ifdef CONFIG_INTERNAL_MODEM_IF - ret = idpram_link_pm_init(dpld, pdev); - - if (ret) - mif_err("MIF: idpram_link_pm_init fail.(%d)\n", ret); -#endif - flag = IRQF_DISABLED; - printk(KERN_ERR "dpram irq: %d\n", dpld->irq); - dpld->clear_interrupt(); - ret = request_irq(dpld->irq, dpram_irq_handler, flag, - "dpram irq", ld); - if (ret) { - mif_err("MIF: DPRAM interrupt handler failed\n"); - goto err; - } - - return ld; - -err: - iounmap(dpld->dpram); - kfree(dpld); - return NULL; -} diff --git a/drivers/misc/modem_if_na/modem_link_device_dpram.h b/drivers/misc/modem_if_na/modem_link_device_dpram.h deleted file mode 100644 index aaa8e82..0000000 --- a/drivers/misc/modem_if_na/modem_link_device_dpram.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2011 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ -#include - -#ifndef __MODEM_LINK_DEVICE_DPRAM_H__ -#define __MODEM_LINK_DEVICE_DPRAM_H__ - -#define FMT_IDX 0 -#define RAW_IDX 1 -#define MAX_IDX 2 -#define DP_FMT_OUT_BUFF_SIZE 2044 -#define DP_RAW_OUT_BUFF_SIZE 6128 -#define DP_FMT_IN_BUFF_SIZE 2044 -#define DP_RAW_IN_BUFF_SIZE 6128 -struct dpram_circ { - u16 head; - u16 tail; -}; - -struct dpram_ota_header { - u8 start_index; - u16 nframes; - u16 curframe; - u16 len; - -} __packed; - -struct dpram_map { - u16 magic; - u16 enable; - - struct dpram_circ fmt_out; - u8 fmt_out_buff[DP_FMT_OUT_BUFF_SIZE]; - - struct dpram_circ raw_out; - u8 raw_out_buff[DP_RAW_OUT_BUFF_SIZE]; - - struct dpram_circ fmt_in; - u8 fmt_in_buff[DP_FMT_IN_BUFF_SIZE]; - - struct dpram_circ raw_in; - u8 raw_in_buff[DP_RAW_IN_BUFF_SIZE]; - - u8 padding[16]; -#ifdef CONFIG_INTERNAL_MODEM_IF - u16 mbx_ap2cp; - u16 mbx_cp2ap; -#else - u16 mbx_cp2ap; - u16 mbx_ap2cp; -#endif -} __packed; - -struct dpram_device { - struct dpram_circ __iomem *in; - u8 __iomem *in_buff_addr; - int in_buff_size; - - struct dpram_circ __iomem *out; - u8 __iomem *out_buff_addr; - int out_buff_size; - - u16 mask_req_ack; - u16 mask_res_ack; - u16 mask_send; -}; - -struct ul_header { -#ifdef CONFIG_INTERNAL_MODEM_IF - u16 bop; - u16 total_frame; - u16 curr_frame; - u16 len; -#else - u8 bop; - u16 total_frame; - u16 curr_frame; - u16 len; -#endif -}; - -#ifdef CONFIG_INTERNAL_MODEM_IF -enum idpram_link_pm_states { - IDPRAM_PM_SUSPEND_PREPARE, - IDPRAM_PM_DPRAM_POWER_DOWN, - IDPRAM_PM_SUSPEND_START, - IDPRAM_PM_RESUME_START, - IDPRAM_PM_ACTIVE, -}; - -struct idpram_link_pm_data { - struct dpram_link_device *dpld; - struct modem_data *mdata; - - unsigned last_pm_mailbox; /* 0xCC or 0x CA*/ - unsigned resume_retry; - unsigned pm_states; - - int idpram_wpend; - - struct completion idpram_down; - - struct delayed_work resume_work; - - atomic_t read_lock; - atomic_t write_lock; - - struct wake_lock host_wakeup_wlock; - struct wake_lock rd_wlock; - struct wake_lock hold_wlock; - struct wake_lock wakeup_wlock; -}; -#endif - - -struct dpram_link_device { - struct link_device ld; - - /* maybe -list of io devices for the link device to use - * to find where to send incoming packets to */ - struct list_head list_of_io_devices; - - atomic_t raw_txq_req_ack_rcvd; - atomic_t fmt_txq_req_ack_rcvd; - - struct dpram_map __iomem *dpram; - struct dpram_device dev_map[MAX_IDX]; - - struct wake_lock dpram_wake_lock; - - struct completion dpram_init_cmd; - struct completion modem_pif_init_done; - struct completion gota_download_start_complete; - struct completion gota_send_done; - struct completion gota_update_done; - struct completion dump_receive_done; - - int irq; -#ifdef CONFIG_INTERNAL_MODEM_IF - void (*clear_interrupt)(void); - int (*board_ota_reset) (void); - struct idpram_link_pm_data *link_pm_data; - int (*init_magic_num)(struct dpram_link_device *dpld); -#else - void (*clear_interrupt)(struct dpram_link_device *); -#endif -}; - -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_dpram_link_device(linkdev) \ - container_of(linkdev, struct dpram_link_device, ld) - -#endif diff --git a/drivers/misc/modem_if_na/modem_link_device_usb.c b/drivers/misc/modem_if_na/modem_link_device_usb.c deleted file mode 100644 index 6bdd7b5..0000000 --- a/drivers/misc/modem_if_na/modem_link_device_usb.c +++ /dev/null @@ -1,1031 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#define DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_usb.h" -#include "modem_link_pm_usb.h" - -#include - -#define URB_COUNT 4 - -extern int factory_mode; - -static int enable_autosuspend; -static int wakelock_held; - -static int usb_tx_urb_with_skb(struct usb_link_device *usb_ld, - struct sk_buff *skb, struct if_usb_devdata *pipe_data); - -static void -usb_change_modem_state(struct usb_link_device *usb_ld, enum modem_state state); - -static int usb_attach_io_dev(struct link_device *ld, - struct io_device *iod) -{ - struct usb_link_device *usb_ld = to_usb_link_device(ld); - - iod->link = ld; - - /* list up io devices */ - list_add(&iod->list, &usb_ld->list_of_io_devices); - - return 0; -} - -static void -usb_free_urbs(struct usb_link_device *usb_ld, struct if_usb_devdata *pipe) -{ - struct usb_device *usbdev = usb_ld->usbdev; - struct urb *urb; - - while ((urb = usb_get_from_anchor(&pipe->urbs))) { - usb_poison_urb(urb); - usb_free_coherent(usbdev, pipe->rx_buf_size, - urb->transfer_buffer, urb->transfer_dma); - urb->transfer_buffer = NULL; - usb_put_urb(urb); - usb_free_urb(urb); - } -} - -static int usb_init_communication(struct link_device *ld, - struct io_device *iod) -{ - int err = 0; - switch (iod->format) { - case IPC_BOOT: - ld->com_state = COM_BOOT; - skb_queue_purge(&ld->sk_fmt_tx_q); - break; - - case IPC_RAMDUMP: - ld->com_state = COM_CRASH; - break; - - case IPC_FMT: - case IPC_RFS: - case IPC_RAW: - - default: - ld->com_state = COM_ONLINE; - break; - } - - mif_debug("com_state = %d\n", ld->com_state); - return err; -} - -static void usb_terminate_communication( - struct link_device *ld, struct io_device *iod) -{ - if (iod->format != IPC_BOOT && iod->format != IPC_RAMDUMP) - mif_debug("com_state = %d\n", ld->com_state); -} - -static int usb_rx_submit(struct if_usb_devdata *pipe, struct urb *urb, - gfp_t gfp_flags) -{ - int ret; - - usb_anchor_urb(urb, &pipe->reading); - ret = usb_submit_urb(urb, gfp_flags); - if (ret) { - usb_unanchor_urb(urb); - usb_anchor_urb(urb, &pipe->urbs); - mif_err("submit urb fail with ret (%d)\n", ret); - } - - usb_mark_last_busy(urb->dev); - return ret; -} - -static void usb_rx_complete(struct urb *urb) -{ - struct if_usb_devdata *pipe_data = urb->context; - struct usb_link_device *usb_ld = usb_get_intfdata(pipe_data->data_intf); - struct io_device *iod; - int iod_format = IPC_FMT; - int ret; - - usb_mark_last_busy(urb->dev); - - switch (urb->status) { - case 0: - case -ENOENT: - if (!urb->actual_length) - goto re_submit; - /* call iod recv */ - /* how we can distinguish boot ch with fmt ch ?? */ - switch (pipe_data->format) { - case IF_USB_FMT_EP: - iod_format = IPC_FMT; - /* - print_hex_dump(KERN_INFO, "[FMT-RX] ", - DUMP_PREFIX_OFFSET, 16, 1, - urb->transfer_buffer, - min(urb->actual_length, (u32)64), true); - */ - break; - case IF_USB_RAW_EP: - iod_format = IPC_MULTI_RAW; - break; - case IF_USB_RFS_EP: - iod_format = IPC_RFS; - break; - default: - break; - } - - list_for_each_entry(iod, &usb_ld->list_of_io_devices, list) { - /* during boot stage fmt end point */ - /* shared with boot io device */ - /* when we use fmt device only, at boot and ipc exchange - it can be reduced to 1 device */ - if (iod_format == IPC_FMT && - usb_ld->ld.com_state == COM_BOOT) - iod_format = IPC_BOOT; - if (iod_format == IPC_FMT && - usb_ld->ld.com_state == COM_CRASH) - iod_format = IPC_RAMDUMP; - - if (iod->format == iod_format) { - ret = iod->recv(iod, - (char *)urb->transfer_buffer, - urb->actual_length); - if (ret < 0) - mif_err("io device recv error :%d\n", - ret); - break; - } - } -re_submit: - if (urb->status || atomic_read(&usb_ld->suspend_count)) - break; - - usb_mark_last_busy(urb->dev); - usb_rx_submit(pipe_data, urb, GFP_ATOMIC); - return; - case -ESHUTDOWN: - case -EPROTO: - break; - case -EOVERFLOW: - mif_err("RX overflow\n"); - break; - default: - mif_err("RX complete Status (%d)\n", urb->status); - break; - } - - usb_anchor_urb(urb, &pipe_data->urbs); -} - -static int usb_send(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb) -{ - struct sk_buff_head *txq; - - if (iod->format == IPC_RAW) - txq = &ld->sk_raw_tx_q; - else - txq = &ld->sk_fmt_tx_q; - - /* save io device into cb area */ - *((struct io_device **)skb->cb) = iod; - /* en queue skb data */ - skb_queue_tail(txq, skb); - - queue_delayed_work(ld->tx_wq, &ld->tx_delayed_work, 0); - - return skb->len; -} - -static void usb_tx_complete(struct urb *urb) -{ - int ret = 0; - struct sk_buff *skb = urb->context; - - switch (urb->status) { - case 0: - break; - default: - mif_err("TX error (%d)\n", urb->status); - } - - usb_mark_last_busy(urb->dev); - ret = pm_runtime_put_autosuspend(&urb->dev->dev); - if (ret < 0) - mif_debug("pm_runtime_put_autosuspend failed : ret(%d)\n", ret); - usb_free_urb(urb); - dev_kfree_skb_any(skb); -} - -static void if_usb_force_disconnect(struct work_struct *work) -{ - struct usb_link_device *usb_ld = - container_of(work, struct usb_link_device, disconnect_work); - struct usb_device *udev = usb_ld->usbdev; - - if (!udev || !(&udev->dev)) - return; - - pm_runtime_get_sync(&udev->dev); - if (udev->state != USB_STATE_NOTATTACHED) { - usb_force_disconnect(udev); - mif_info("force disconnect by modem not responding!!\n"); - } - pm_runtime_put_autosuspend(&udev->dev); -} - -static void -usb_change_modem_state(struct usb_link_device *usb_ld, enum modem_state state) -{ - struct io_device *iod; - - list_for_each_entry(iod, &usb_ld->list_of_io_devices, list) { - if (iod->format == IPC_FMT) { - iod->modem_state_changed(iod, state); - return; - } - } -} - -static int usb_tx_urb_with_skb(struct usb_link_device *usb_ld, - struct sk_buff *skb, struct if_usb_devdata *pipe_data) -{ - int ret, cnt = 0; - struct urb *urb; - struct usb_device *usbdev = usb_ld->usbdev; - unsigned long flags; - - if (!usbdev || (usbdev->state == USB_STATE_NOTATTACHED) || - usb_ld->host_wake_timeout_flag) - return -ENODEV; - - pm_runtime_get_noresume(&usbdev->dev); - - if (usbdev->dev.power.runtime_status == RPM_SUSPENDED || - usbdev->dev.power.runtime_status == RPM_SUSPENDING) { - usb_ld->resume_status = AP_INITIATED_RESUME; - SET_SLAVE_WAKEUP(usb_ld->pdata, 1); - - while (!wait_event_interruptible_timeout(usb_ld->l2_wait, - usbdev->dev.power.runtime_status == RPM_ACTIVE - || pipe_data->disconnected, - HOST_WAKEUP_TIMEOUT_JIFFIES)) { - - if (cnt == MAX_RETRY) { - mif_err("host wakeup timeout !!\n"); - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - pm_runtime_put_autosuspend(&usbdev->dev); - schedule_work(&usb_ld->disconnect_work); - usb_ld->host_wake_timeout_flag = 1; - return -1; - } - mif_err("host wakeup timeout ! retry..\n"); - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - udelay(100); - SET_SLAVE_WAKEUP(usb_ld->pdata, 1); - cnt++; - } - - if (pipe_data->disconnected) { - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - pm_runtime_put_autosuspend(&usbdev->dev); - return -ENODEV; - } - - mif_debug("wait_q done (runtime_status=%d)\n", - usbdev->dev.power.runtime_status); - } - - urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - mif_err("alloc urb error\n"); - if (pm_runtime_put_autosuspend(&usbdev->dev) < 0) - mif_debug("pm_runtime_put_autosuspend fail\n"); - return -ENOMEM; - } - - urb->transfer_flags = URB_ZERO_PACKET; - usb_fill_bulk_urb(urb, usbdev, pipe_data->tx_pipe, skb->data, - skb->len, usb_tx_complete, (void *)skb); - - spin_lock_irqsave(&usb_ld->lock, flags); - if (atomic_read(&usb_ld->suspend_count)) { - /* transmission will be done in resume */ - usb_anchor_urb(urb, &usb_ld->deferred); - usb_put_urb(urb); - mif_debug("anchor urb (0x%p)\n", urb); - spin_unlock_irqrestore(&usb_ld->lock, flags); - return 0; - } - spin_unlock_irqrestore(&usb_ld->lock, flags); - - ret = usb_submit_urb(urb, GFP_KERNEL); - if (ret < 0) { - mif_err("usb_submit_urb with ret(%d)\n", ret); - if (pm_runtime_put_autosuspend(&usbdev->dev) < 0) - mif_debug("pm_runtime_put_autosuspend fail\n"); - } - return ret; -} - -static void usb_tx_work(struct work_struct *work) -{ - int ret = 0; - struct link_device *ld = - container_of(work, struct link_device, tx_delayed_work.work); - struct usb_link_device *usb_ld = to_usb_link_device(ld); - struct io_device *iod; - struct sk_buff *skb; - struct if_usb_devdata *pipe_data; - struct link_pm_data *pm_data = usb_ld->link_pm_data; - - /*TODO: check the PHONE ACTIVE STATES */ - /* because tx data wait until hub on with wait_for_complettion, it - should queue to single_threaded work queue */ - if (!link_pm_set_active(usb_ld)) - return; - - while (ld->sk_fmt_tx_q.qlen || ld->sk_raw_tx_q.qlen) { - /* send skb from fmt_txq and raw_txq, - * one by one for fair flow control */ - skb = skb_dequeue(&ld->sk_fmt_tx_q); - if (skb) { - iod = *((struct io_device **)skb->cb); - switch (iod->format) { - case IPC_FMT: - /* - print_hex_dump(KERN_INFO, "[FMT-TX] ", - DUMP_PREFIX_OFFSET, 16, 1, - skb->data, - min(skb->len, (u32)64), true); - */ - case IPC_BOOT: - case IPC_RAMDUMP: - /* boot device uses same intf with fmt*/ - pipe_data = &usb_ld->devdata[IF_USB_FMT_EP]; - break; - case IPC_RFS: - pipe_data = &usb_ld->devdata[IF_USB_RFS_EP]; - break; - default: - /* wrong packet for fmt tx q , drop it */ - dev_kfree_skb_any(skb); - continue; - } - - ret = usb_tx_urb_with_skb(usb_ld, skb, pipe_data); - if (ret < 0) { - mif_err("usb_tx_urb_with_skb, ret(%d)\n", - ret); - skb_queue_head(&ld->sk_fmt_tx_q, skb); - - if (edc_inc(&usb_ld->urb_edc, EDC_MAX_ERRORS, - EDC_ERROR_TIMEFRAME)) { - mif_err("maximum error in URB exceeded\n"); - usb_change_modem_state(usb_ld, - STATE_CRASH_EXIT); - } - return; - } - } - - skb = skb_dequeue(&ld->sk_raw_tx_q); - if (skb) { - pipe_data = &usb_ld->devdata[IF_USB_RAW_EP]; - ret = usb_tx_urb_with_skb(usb_ld, skb, pipe_data); - if (ret < 0) { - mif_err("usb_tx_urb_with_skb " - "for raw, ret(%d)\n", - ret); - skb_queue_head(&ld->sk_raw_tx_q, skb); - - if (edc_inc(&usb_ld->urb_edc, EDC_MAX_ERRORS, - EDC_ERROR_TIMEFRAME)) { - mif_err("maximum error in URB exceeded\n"); - usb_change_modem_state(usb_ld, - STATE_CRASH_EXIT); - } - return; - } - } - } -} - -static int if_usb_suspend(struct usb_interface *intf, pm_message_t message) -{ - struct usb_link_device *usb_ld = usb_get_intfdata(intf); - int i; - - if (atomic_inc_return(&usb_ld->suspend_count) == IF_USB_DEVNUM_MAX) { - mif_debug("L2\n"); - - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) - usb_kill_anchored_urbs(&usb_ld->devdata[i].reading); - - /* - if (usb_ld->link_pm_data->cpufreq_unlock) - usb_ld->link_pm_data->cpufreq_unlock(); - */ - if (wakelock_held) { - wakelock_held = 0; - wake_unlock(&usb_ld->susplock); - } - } - - return 0; -} - -static void runtime_pm_work(struct work_struct *work) -{ - struct usb_link_device *usb_ld = container_of(work, - struct usb_link_device, runtime_pm_work.work); - int ret; - - ret = pm_request_autosuspend(&usb_ld->usbdev->dev); - - if (ret == -EAGAIN || ret == 1) - queue_delayed_work(system_nrt_wq, &usb_ld->runtime_pm_work, - msecs_to_jiffies(50)); -} - -static void post_resume_work(struct work_struct *work) -{ - struct usb_link_device *usb_ld = container_of(work, - struct usb_link_device, post_resume_work.work); - - /* lock cpu frequency when L2->L0 */ - /* - if (usb_ld->link_pm_data->cpufreq_lock) - usb_ld->link_pm_data->cpufreq_lock(); - */ -} - -static void wait_enumeration_work(struct work_struct *work) -{ - struct usb_link_device *usb_ld = container_of(work, - struct usb_link_device, wait_enumeration.work); - - /* Work around code for factory device test & verification. - * To measure device sleep current speedly, do not call silent reset in - * factory mode. CMC22x disconect usb forcely and go sleep - * without normal L3 process if in factory mode. Also AP do. */ - if (factory_mode) - return; - - if (usb_ld->if_usb_connected == 0) { - mif_err("USB disconnected and not enumerated for long time\n"); - usb_change_modem_state(usb_ld, STATE_CRASH_EXIT); - } -} - -static int if_usb_resume(struct usb_interface *intf) -{ - int i, ret; - struct sk_buff *skb; - struct usb_link_device *usb_ld = usb_get_intfdata(intf); - struct if_usb_devdata *pipe; - struct urb *urb; - - spin_lock_irq(&usb_ld->lock); - if (!atomic_dec_return(&usb_ld->suspend_count)) { - spin_unlock_irq(&usb_ld->lock); - - mif_debug("\n"); - wake_lock(&usb_ld->susplock); - wakelock_held = 1; - - /* HACK: Runtime pm does not allow requesting autosuspend from - * resume callback, delayed it after resume */ - queue_delayed_work(system_nrt_wq, &usb_ld->runtime_pm_work, - msecs_to_jiffies(50)); - - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) { - pipe = &usb_ld->devdata[i]; - while ((urb = usb_get_from_anchor(&pipe->urbs))) { - ret = usb_rx_submit(pipe, urb, GFP_KERNEL); - if (ret < 0) { - usb_put_urb(urb); - mif_err( - "usb_rx_submit error with (%d)\n", - ret); - return ret; - } - usb_put_urb(urb); - } - } - - while ((urb = usb_get_from_anchor(&usb_ld->deferred))) { - mif_debug("got urb (0x%p) from anchor & resubmit\n", - urb); - ret = usb_submit_urb(urb, GFP_KERNEL); - if (ret < 0) { - mif_err("resubmit failed\n"); - skb = urb->context; - dev_kfree_skb_any(skb); - usb_free_urb(urb); - if (pm_runtime_put_autosuspend( - &usb_ld->usbdev->dev) < 0) - mif_debug( - "pm_runtime_put_autosuspend fail\n"); - } - } - SET_SLAVE_WAKEUP(usb_ld->pdata, 1); - udelay(100); - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - - if (!link_pm_is_connected(usb_ld)) - enable_autosuspend = 1; - - /* if_usb_resume() is atomic. post_resume_work is - * a kind of bottom halves - */ - /* - queue_delayed_work(system_nrt_wq, &usb_ld->post_resume_work, 0); - */ - - return 0; - } - - spin_unlock_irq(&usb_ld->lock); - return 0; -} - -static int if_usb_reset_resume(struct usb_interface *intf) -{ - int ret; - - mif_debug("\n"); - ret = if_usb_resume(intf); - return ret; -} - -static struct usb_device_id if_usb_ids[] = { - { USB_DEVICE(0x04e8, 0x6999), /* CMC221 LTE Modem */ - /*.driver_info = 0,*/ - }, - { } /* terminating entry */ -}; -MODULE_DEVICE_TABLE(usb, if_usb_ids); - -static struct usb_driver if_usb_driver; -static void if_usb_disconnect(struct usb_interface *intf) -{ - struct usb_link_device *usb_ld = usb_get_intfdata(intf); - struct usb_device *usbdev = usb_ld->usbdev; - int dev_id = intf->altsetting->desc.bInterfaceNumber; - struct if_usb_devdata *pipe_data = &usb_ld->devdata[dev_id]; - - usb_set_intfdata(intf, NULL); - - pipe_data->disconnected = 1; - smp_wmb(); - - wake_up(&usb_ld->l2_wait); - if (wakelock_held) { - wakelock_held = 0; - wake_unlock(&usb_ld->susplock); - } - /* - if (usb_ld->if_usb_connected) { - disable_irq_wake(usb_ld->pdata->irq_host_wakeup); - free_irq(usb_ld->pdata->irq_host_wakeup, usb_ld); - } - */ - - usb_ld->if_usb_connected = 0; - usb_ld->flow_suspend = 1; - - dev_dbg(&usbdev->dev, "%s\n", __func__); - usb_ld->dev_count--; - usb_driver_release_interface(&if_usb_driver, pipe_data->data_intf); - - usb_kill_anchored_urbs(&pipe_data->reading); - usb_free_urbs(usb_ld, pipe_data); - - if (usb_ld->dev_count == 0) { - cancel_delayed_work_sync(&usb_ld->runtime_pm_work); - /* - cancel_delayed_work_sync(&usb_ld->post_resume_work); - */ - cancel_delayed_work_sync(&usb_ld->ld.tx_delayed_work); - cancel_work_sync(&usb_ld->disconnect_work); - usb_put_dev(usbdev); - usb_ld->usbdev = NULL; - - wake_lock(&usb_ld->link_pm_data->boot_wake); - - schedule_delayed_work(&usb_ld->wait_enumeration, - WAIT_ENUMURATION_TIMEOUT_JIFFIES); - } -} - -static int __devinit if_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ - struct usb_host_interface *data_desc; - struct usb_link_device *usb_ld = - (struct usb_link_device *)id->driver_info; - struct link_device *ld = &usb_ld->ld; - struct usb_interface *data_intf; - struct usb_device *usbdev = interface_to_usbdev(intf); - struct device *dev; - struct if_usb_devdata *pipe; - struct urb *urb; - int i; - int j; - int dev_id; - int err; - - /* To detect usb device order probed */ - dev_id = intf->cur_altsetting->desc.bInterfaceNumber; - - if (dev_id >= IF_USB_DEVNUM_MAX) { - dev_err(&intf->dev, "Device id %d cannot support\n", - dev_id); - return -EINVAL; - } - - if (!usb_ld) { - dev_err(&intf->dev, - "if_usb device doesn't be allocated\n"); - err = ENOMEM; - goto out; - } - - mif_info("probe dev_id=%d usb_device_id(0x%p), usb_ld (0x%p)\n", - dev_id, id, usb_ld); - - usb_ld->usbdev = usbdev; - - usb_get_dev(usbdev); - - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) { - data_intf = usb_ifnum_to_if(usbdev, i); - - /* remap endpoint of RAW to no.1 for LTE modem */ - if (i == 0) - pipe = &usb_ld->devdata[1]; - else if (i == 1) - pipe = &usb_ld->devdata[0]; - else - pipe = &usb_ld->devdata[i]; - - pipe->disconnected = 0; - pipe->data_intf = data_intf; - data_desc = data_intf->cur_altsetting; - - /* Endpoints */ - if (usb_pipein(data_desc->endpoint[0].desc.bEndpointAddress)) { - pipe->rx_pipe = usb_rcvbulkpipe(usbdev, - data_desc->endpoint[0].desc.bEndpointAddress); - pipe->tx_pipe = usb_sndbulkpipe(usbdev, - data_desc->endpoint[1].desc.bEndpointAddress); - pipe->rx_buf_size = 1024*4; - } else { - pipe->rx_pipe = usb_rcvbulkpipe(usbdev, - data_desc->endpoint[1].desc.bEndpointAddress); - pipe->tx_pipe = usb_sndbulkpipe(usbdev, - data_desc->endpoint[0].desc.bEndpointAddress); - pipe->rx_buf_size = 1024*4; - } - - if (i == 0) { - dev_info(&usbdev->dev, "USB IF USB device found\n"); - } else { - err = usb_driver_claim_interface(&if_usb_driver, - data_intf, usb_ld); - if (err < 0) { - mif_err("failed to cliam usb interface\n"); - goto out; - } - } - - usb_set_intfdata(data_intf, usb_ld); - usb_ld->dev_count++; - pm_suspend_ignore_children(&data_intf->dev, true); - - for (j = 0; j < URB_COUNT; j++) { - urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - mif_err("alloc urb fail\n"); - err = -ENOMEM; - goto out2; - } - - urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - urb->transfer_buffer = usb_alloc_coherent(usbdev, - pipe->rx_buf_size, GFP_KERNEL, - &urb->transfer_dma); - if (!urb->transfer_buffer) { - mif_err( - "Failed to allocate transfer buffer\n"); - usb_free_urb(urb); - err = -ENOMEM; - goto out2; - } - - usb_fill_bulk_urb(urb, usbdev, pipe->rx_pipe, - urb->transfer_buffer, pipe->rx_buf_size, - usb_rx_complete, pipe); - usb_anchor_urb(urb, &pipe->urbs); - } - } - - /* temporary call reset_resume */ - atomic_set(&usb_ld->suspend_count, 1); - if_usb_reset_resume(data_intf); - atomic_set(&usb_ld->suspend_count, 0); - - SET_HOST_ACTIVE(usb_ld->pdata, 1); - usb_ld->host_wake_timeout_flag = 0; - - if (gpio_get_value(usb_ld->pdata->gpio_phone_active)) { - struct link_pm_data *pm_data = usb_ld->link_pm_data; - int delay = AUTOSUSPEND_DELAY_MS; - pm_runtime_set_autosuspend_delay(&usbdev->dev, delay); - dev = &usb_ld->usbdev->dev; - if (dev->parent) { - dev_dbg(&usbdev->dev, "if_usb Runtime PM Start!!\n"); - usb_enable_autosuspend(usb_ld->usbdev); - pm_runtime_allow(dev); - - if (pm_data->block_autosuspend) - pm_runtime_forbid(dev); - } - - enable_irq_wake(usb_ld->pdata->irq_host_wakeup); - - usb_ld->flow_suspend = 0; - /* Queue work if skbs were pending before a disconnect/probe */ - if (ld->sk_fmt_tx_q.qlen || ld->sk_raw_tx_q.qlen) - queue_delayed_work(ld->tx_wq, &ld->tx_delayed_work, 0); - - wake_unlock(&usb_ld->link_pm_data->boot_wake); - - usb_ld->if_usb_connected = 1; - usb_change_modem_state(usb_ld, STATE_ONLINE); - } else { - usb_change_modem_state(usb_ld, STATE_LOADER_DONE); - } - - edc_init(&usb_ld->urb_edc); - - return 0; - -out2: - usb_ld->dev_count--; - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) - usb_free_urbs(usb_ld, &usb_ld->devdata[i]); -out: - usb_set_intfdata(intf, NULL); - return err; -} - -irqreturn_t usb_resume_irq(int irq, void *data) -{ - int ret; - struct usb_link_device *usb_ld = data; - int hwup; - static int wake_status = -1; - struct device *dev; - - hwup = gpio_get_value(usb_ld->pdata->gpio_host_wakeup); - if (hwup == wake_status) { - mif_err("Received spurious wake irq: %d", hwup); - return IRQ_HANDLED; - } - wake_status = hwup; - - irq_set_irq_type(irq, hwup ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); - /* - * exynos BSP has problem when using level interrupt. - * If we change irq type from interrupt handler, - * we can get level interrupt twice. - * this is temporary solution until SYS.LSI resolve this problem. - */ - __raw_writel(eint_irq_to_bit(irq), S5P_EINT_PEND(EINT_REG_NR(irq))); - wake_lock_timeout(&usb_ld->gpiolock, 100); - - mif_err("< H-WUP %d\n", hwup); - - if (!link_pm_is_connected(usb_ld) && - !(!hwup && enable_autosuspend)) { - return IRQ_HANDLED; - } else { - enable_autosuspend = 0; - } - - if (hwup) { - dev = &usb_ld->usbdev->dev; - mif_info("runtime status=%d\n", - dev->power.runtime_status); - - /* if usb3503 was on, usb_if was resumed by probe */ - /* - if (has_hub(usb_ld) && - (dev->power.runtime_status == RPM_ACTIVE || - dev->power.runtime_status == RPM_RESUMING)) - return IRQ_HANDLED; - */ - - device_lock(dev); - if (dev->power.is_prepared || dev->power.is_suspended) { - pm_runtime_get_noresume(dev); - ret = 0; - } else { - ret = pm_runtime_get_sync(dev); - } - device_unlock(dev); - if (ret < 0) { - mif_err("pm_runtime_get fail (%d)\n", ret); - return IRQ_HANDLED; - } - } else { - if (usb_ld->resume_status == AP_INITIATED_RESUME) - wake_up(&usb_ld->l2_wait); - usb_ld->resume_status = CP_INITIATED_RESUME; - pm_runtime_mark_last_busy(&usb_ld->usbdev->dev); - pm_runtime_put_autosuspend(&usb_ld->usbdev->dev); - } - - return IRQ_HANDLED; -} - -static int if_usb_init(struct usb_link_device *usb_ld) -{ - int ret; - int i; - struct if_usb_devdata *pipe; - - /* give it to probe, or global variable needed */ - if_usb_ids[0].driver_info = (unsigned long)usb_ld; - - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) { - pipe = &usb_ld->devdata[i]; - pipe->format = i; - pipe->disconnected = 1; - init_usb_anchor(&pipe->urbs); - init_usb_anchor(&pipe->reading); - } - - init_waitqueue_head(&usb_ld->l2_wait); - init_usb_anchor(&usb_ld->deferred); - - ret = usb_register(&if_usb_driver); - if (ret) { - mif_err("usb_register_driver() fail : %d\n", ret); - return ret; - } - - return 0; -} - -struct link_device *usb_create_link_device(void *data) -{ - int ret; - struct modem_data *pdata; - struct platform_device *pdev = (struct platform_device *)data; - struct usb_link_device *usb_ld = NULL; - struct link_device *ld = NULL; - - pdata = pdev->dev.platform_data; - - usb_ld = kzalloc(sizeof(struct usb_link_device), GFP_KERNEL); - if (!usb_ld) - goto err; - - INIT_LIST_HEAD(&usb_ld->list_of_io_devices); - skb_queue_head_init(&usb_ld->ld.sk_fmt_tx_q); - skb_queue_head_init(&usb_ld->ld.sk_raw_tx_q); - spin_lock_init(&usb_ld->lock); - - ld = &usb_ld->ld; - usb_ld->pdata = pdata; - - ld->name = "usb"; - ld->attach = usb_attach_io_dev; - ld->init_comm = usb_init_communication; - ld->terminate_comm = usb_terminate_communication; - ld->send = usb_send; - ld->com_state = COM_NONE; - - /*ld->tx_wq = create_singlethread_workqueue("usb_tx_wq");*/ - ld->tx_wq = alloc_workqueue("usb_tx_wq", - WQ_HIGHPRI | WQ_UNBOUND | WQ_RESCUER, 1); - - if (!ld->tx_wq) { - mif_err("fail to create work Q.\n"); - goto err; - } - - usb_ld->pdata->irq_host_wakeup = gpio_to_irq(platform_get_irq(pdev, 1)); - wake_lock_init(&usb_ld->gpiolock, WAKE_LOCK_SUSPEND, - "modem_usb_gpio_wake"); - wake_lock_init(&usb_ld->susplock, WAKE_LOCK_SUSPEND, - "modem_usb_suspend_block"); - - INIT_DELAYED_WORK(&ld->tx_delayed_work, usb_tx_work); - INIT_DELAYED_WORK(&usb_ld->runtime_pm_work, runtime_pm_work); - /* - INIT_DELAYED_WORK(&usb_ld->post_resume_work, post_resume_work); - */ - INIT_DELAYED_WORK(&usb_ld->wait_enumeration, wait_enumeration_work); - INIT_WORK(&usb_ld->disconnect_work, if_usb_force_disconnect); - - /* create link pm device */ - ret = link_pm_init(usb_ld, data); - if (ret) - goto err; - - ret = if_usb_init(usb_ld); - if (ret) - goto err; - - return ld; -err: - if (ld && ld->tx_wq) - destroy_workqueue(ld->tx_wq); - - kfree(usb_ld); - - return NULL; -} - -static struct usb_driver if_usb_driver = { - .name = "if_usb_driver", - .probe = if_usb_probe, - .disconnect = if_usb_disconnect, - .id_table = if_usb_ids, - .suspend = if_usb_suspend, - .resume = if_usb_resume, - .reset_resume = if_usb_reset_resume, - .supports_autosuspend = 1, -}; - -static void __exit if_usb_exit(void) -{ - usb_deregister(&if_usb_driver); -} - - -/* lte specific functions */ - -static int lte_wake_resume(struct device *pdev) -{ - struct modem_data *pdata = pdev->platform_data; - int val; - - val = gpio_get_value(pdata->gpio_host_wakeup); - if (!val) { - mif_debug("> S-WUP 1\n"); - gpio_set_value(pdata->gpio_slave_wakeup, 1); - } - - return 0; -} - -static const struct dev_pm_ops lte_wake_pm_ops = { - .resume = lte_wake_resume, -}; - -static struct platform_driver lte_wake_driver = { - .driver = { - .name = "modem_lte_wake", - .pm = <e_wake_pm_ops, - }, -}; - -static int __init lte_wake_init(void) -{ - return platform_driver_register(<e_wake_driver); -} -module_init(lte_wake_init); diff --git a/drivers/misc/modem_if_na/modem_link_device_usb.h b/drivers/misc/modem_if_na/modem_link_device_usb.h deleted file mode 100644 index 0db83b1..0000000 --- a/drivers/misc/modem_if_na/modem_link_device_usb.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_LINK_DEVICE_USB_H__ -#define __MODEM_LINK_DEVICE_USB_H__ - -#include -#include - -#define IF_USB_DEVNUM_MAX 3 - -#define IF_USB_FMT_EP 0 -#define IF_USB_RAW_EP 1 -#define IF_USB_RFS_EP 2 - -#define AUTOSUSPEND_DELAY_MS 500 -#define HOST_WAKEUP_TIMEOUT_JIFFIES msecs_to_jiffies(500) -#define WAIT_ENUMURATION_TIMEOUT_JIFFIES msecs_to_jiffies(30000) -#define MAX_RETRY 3 - -enum RESUME_STATUS { - CP_INITIATED_RESUME, - AP_INITIATED_RESUME, -}; - -enum { - EDC_MAX_ERRORS = 5, - EDC_ERROR_TIMEFRAME = HZ, -}; - -struct edc { - unsigned long timestart; - u16 errorcount; -}; - -static inline void edc_init(struct edc *edc) -{ - edc->timestart = jiffies; -} - -static inline int edc_inc(struct edc *edc, u16 max_err, u16 timeframe) -{ - unsigned long now; - - now = jiffies; - if (now - edc->timestart > timeframe) { - edc->errorcount = 1; - edc->timestart = now; - } else if (++edc->errorcount > max_err) { - edc->errorcount = 0; - edc->timestart = now; - return 1; - } - return 0; -} - -struct if_usb_devdata { - struct usb_interface *data_intf; - unsigned int tx_pipe; - unsigned int rx_pipe; - u8 disconnected; - - int format; - struct usb_anchor urbs; - struct usb_anchor reading; - unsigned int rx_buf_size; -}; - -struct usb_link_device { - /*COMMON LINK DEVICE*/ - struct link_device ld; - - struct modem_data *pdata; - - /*USB SPECIFIC LINK DEVICE*/ - struct usb_device *usbdev; - struct if_usb_devdata devdata[IF_USB_DEVNUM_MAX]; - struct delayed_work runtime_pm_work; - struct delayed_work post_resume_work; - struct delayed_work wait_enumeration; - struct work_struct disconnect_work; - - struct wake_lock gpiolock; - struct wake_lock susplock; - - unsigned int dev_count; - unsigned int suspended; - atomic_t suspend_count; - enum RESUME_STATUS resume_status; - int if_usb_connected; - int flow_suspend; - int host_wake_timeout_flag; - - unsigned gpio_slave_wakeup; - unsigned gpio_host_wakeup; - unsigned gpio_host_active; - int irq_host_wakeup; - struct delayed_work dwork; - struct work_struct resume_work; - int cpcrash_flag; - wait_queue_head_t l2_wait; - - spinlock_t lock; - struct usb_anchor deferred; - - /* LINK PM DEVICE DATA */ - struct link_pm_data *link_pm_data; - - /*COMMON LINK DEVICE*/ - /* maybe -list of io devices for the link device to use */ - /* to find where to send incoming packets to */ - struct list_head list_of_io_devices; - - struct edc urb_edc; -}; -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_usb_link_device(linkdev) \ - container_of(linkdev, struct usb_link_device, ld) - -#define SET_SLAVE_WAKEUP(_pdata, _value) \ -do { \ - gpio_set_value(_pdata->gpio_slave_wakeup, _value); \ - mif_debug("> S-WUP %s\n", _value ? "1" : "0"); \ -} while (0) - -#define SET_HOST_ACTIVE(_pdata, _value) \ -do { \ - gpio_set_value(_pdata->gpio_host_active, _value); \ - mif_debug("> H-ACT %s\n", _value ? "1" : "0"); \ -} while (0) - -#define has_hub(usb_ld) ((usb_ld)->link_pm_data->has_usbhub) - -irqreturn_t usb_resume_irq(int irq, void *data); - -#endif diff --git a/drivers/misc/modem_if_na/modem_link_pm_usb.c b/drivers/misc/modem_if_na/modem_link_pm_usb.c deleted file mode 100644 index 4907de7..0000000 --- a/drivers/misc/modem_if_na/modem_link_pm_usb.c +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (C) 2012 Samsung Electronics. - * - * 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. - * - */ - -/* - * TODO (last updated Apr 13, 2012): - * - move usb hub feature to board file - * currently, some code was commented out by CONFIG_USBHUB_USB3503 - * - Both usb_ld and link_pm_data have same gpio member. - * we have to remove it from one of them and - * make helper function for gpio handling. - */ - -#define DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_link_pm_usb.h" - -bool link_pm_is_connected(struct usb_link_device *usb_ld) -{ -#ifdef CONFIG_USBHUB_USB3503 - if (has_hub(usb_ld)) { - if (usb_ld->link_pm_data->hub_status == HUB_STATE_RESUMMING - || usb_ld->link_pm_data->hub_init_lock) - return false; - - if (usb_ld->link_pm_data->hub_status == HUB_STATE_OFF) { - schedule_delayed_work( - &usb_ld->link_pm_data->link_pm_hub, 0); - return false; - } - } -#endif - if (!usb_ld->if_usb_connected) { - mif_err("if not connected\n"); - return false; - } - - return true; -} - -#ifdef CONFIG_USBHUB_USB3503 -static void link_pm_hub_work(struct work_struct *work) -{ - int err; - struct link_pm_data *pm_data = - container_of(work, struct link_pm_data, link_pm_hub.work); - - if (pm_data->hub_status == HUB_STATE_ACTIVE) - return; - - if (!pm_data->port_enable) { - mif_err("mif: hub power func not assinged\n"); - return; - } - wake_lock(&pm_data->hub_lock); - - /* If kernel if suspend, wait the ehci resume */ - if (pm_data->dpm_suspending) { - mif_info("dpm_suspending\n"); - schedule_delayed_work(&pm_data->link_pm_hub, - msecs_to_jiffies(500)); - goto exit; - } - - switch (pm_data->hub_status) { - case HUB_STATE_OFF: - pm_data->hub_status = HUB_STATE_RESUMMING; - mif_trace("hub off->on\n"); - - /* skip 1st time before first probe */ - if (pm_data->root_hub) - pm_runtime_get_sync(pm_data->root_hub); - err = pm_data->port_enable(2, 1); - if (err < 0) { - mif_err("hub on fail err=%d\n", err); - err = pm_data->port_enable(2, 0); - if (err < 0) - mif_err("hub off fail err=%d\n", err); - pm_data->hub_status = HUB_STATE_OFF; - if (pm_data->root_hub) - pm_runtime_put_sync(pm_data->root_hub); - goto exit; - } - /* resume root hub */ - schedule_delayed_work(&pm_data->link_pm_hub, - msecs_to_jiffies(100)); - break; - case HUB_STATE_RESUMMING: - if (pm_data->hub_on_retry_cnt++ > 50) { - pm_data->hub_on_retry_cnt = 0; - pm_data->hub_status = HUB_STATE_OFF; - if (pm_data->root_hub) - pm_runtime_put_sync(pm_data->root_hub); - } - mif_trace("hub resumming\n"); - schedule_delayed_work(&pm_data->link_pm_hub, - msecs_to_jiffies(200)); - break; - case HUB_STATE_PREACTIVE: - mif_trace("hub active\n"); - pm_data->hub_on_retry_cnt = 0; - wake_unlock(&pm_data->hub_lock); - pm_data->hub_status = HUB_STATE_ACTIVE; - complete(&pm_data->hub_active); - if (pm_data->root_hub) - pm_runtime_put_sync(pm_data->root_hub); - break; - } -exit: - return; -} -#endif - -static int link_pm_hub_standby(struct link_pm_data *pm_data) -{ - int err = 0; - -#ifdef CONFIG_USBHUB_USB3503 - mif_info("wait hub standby\n"); - - if (!pm_data->port_enable) { - mif_err("hub power func not assinged\n"); - return -ENODEV; - } - - err = pm_data->port_enable(2, 0); - if (err < 0) - mif_err("hub off fail err=%d\n", err); - - pm_data->hub_status = HUB_STATE_OFF; -#endif - return err; -} - -bool link_pm_set_active(struct usb_link_device *usb_ld) -{ - int ret; - struct link_pm_data *pm_data = usb_ld->link_pm_data; - - if (has_hub(usb_ld)) { - if (pm_data->hub_status != HUB_STATE_ACTIVE) { - INIT_COMPLETION(pm_data->hub_active); - SET_SLAVE_WAKEUP(usb_ld->pdata, 1); - ret = wait_for_completion_timeout(&pm_data->hub_active, - msecs_to_jiffies(2000)); - if (!ret) { /*timeout*/ - mif_err("hub on timeout - retry\n"); - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - queue_delayed_work(usb_ld->ld.tx_wq, - &usb_ld->ld.tx_delayed_work, 0); - return false; - } - } - } else { - /* TODO do something */ - } - return true; -} - -static long link_pm_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int value, err = 0; - struct task_struct *task = get_current(); - struct link_pm_data *pm_data = file->private_data; - struct usb_link_device *usb_ld = pm_data->usb_ld; - char taskname[TASK_COMM_LEN]; - - mif_info("cmd: 0x%08x\n", cmd); - - switch (cmd) { - case IOCTL_LINK_CONTROL_ACTIVE: - if (copy_from_user(&value, (const void __user *)arg, - sizeof(int))) - return -EFAULT; - gpio_set_value(pm_data->gpio_link_active, value); - break; - case IOCTL_LINK_GET_HOSTWAKE: - return !gpio_get_value(pm_data->gpio_link_hostwake); - case IOCTL_LINK_CONNECTED: - return pm_data->usb_ld->if_usb_connected; - case IOCTL_LINK_PORT_ON: /* hub only */ - /* ignore cp host wakeup irq, set the hub_init_lock when AP try - CP off and release hub_init_lock when CP boot done */ - pm_data->hub_init_lock = 0; - if (pm_data->root_hub) { - pm_runtime_resume(pm_data->root_hub); - pm_runtime_forbid(pm_data->root_hub->parent); - } - if (pm_data->port_enable) { - err = pm_data->port_enable(2, 1); - if (err < 0) { - mif_err("hub on fail err=%d\n", err); - goto exit; - } - pm_data->hub_status = HUB_STATE_RESUMMING; - } - break; - case IOCTL_LINK_PORT_OFF: /* hub only */ - err = link_pm_hub_standby(pm_data); - if (err < 0) { - mif_err("usb3503 active fail\n"); - goto exit; - } - pm_data->hub_init_lock = 1; - pm_data->hub_handshake_done = 0; - - break; - case IOCTL_LINK_BLOCK_AUTOSUSPEND: /* block autosuspend forever */ - mif_info("blocked autosuspend by `%s(%d)'\n", - get_task_comm(taskname, task), task->pid); - pm_data->block_autosuspend = true; - if (usb_ld->usbdev) - pm_runtime_forbid(&usb_ld->usbdev->dev); - break; - case IOCTL_LINK_ENABLE_AUTOSUSPEND: /* Enable autosuspend */ - mif_info("autosuspend enabled by `%s(%d)'\n", - get_task_comm(taskname, task), task->pid); - pm_data->block_autosuspend = false; - if (usb_ld->usbdev) - pm_runtime_allow(&usb_ld->usbdev->dev); - else { - mif_err("Enable autosuspend failed\n"); - err = -ENODEV; - } - break; - default: - break; - } -exit: - return err; -} - -static int link_pm_open(struct inode *inode, struct file *file) -{ - struct link_pm_data *pm_data = - (struct link_pm_data *)file->private_data; - file->private_data = (void *)pm_data; - return 0; -} - -static int link_pm_release(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - return 0; -} - -static const struct file_operations link_pm_fops = { - .owner = THIS_MODULE, - .open = link_pm_open, - .release = link_pm_release, - .unlocked_ioctl = link_pm_ioctl, -}; - -static int link_pm_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - struct link_pm_data *pm_data = - container_of(this, struct link_pm_data, pm_notifier); - - switch (event) { - case PM_SUSPEND_PREPARE: - pm_data->dpm_suspending = true; - link_pm_hub_standby(pm_data); - return NOTIFY_OK; - case PM_POST_SUSPEND: - pm_data->dpm_suspending = false; - return NOTIFY_OK; - } - return NOTIFY_DONE; -} - -int link_pm_init(struct usb_link_device *usb_ld, void *data) -{ - int err; - int irq; - struct platform_device *pdev = (struct platform_device *)data; - struct modem_data *pdata = - (struct modem_data *)pdev->dev.platform_data; - struct modemlink_pm_data *pm_pdata = pdata->link_pm_data; - struct link_pm_data *pm_data = - kzalloc(sizeof(struct link_pm_data), GFP_KERNEL); - if (!pm_data) { - mif_err("link_pm_data is NULL\n"); - return -ENOMEM; - } - /* get link pm data from modemcontrol's platform data */ - pm_data->gpio_link_active = pm_pdata->gpio_link_active; - pm_data->gpio_link_hostwake = pm_pdata->gpio_link_hostwake; - pm_data->gpio_link_slavewake = pm_pdata->gpio_link_slavewake; - pm_data->link_reconnect = pm_pdata->link_reconnect; - pm_data->port_enable = pm_pdata->port_enable; - pm_data->cpufreq_lock = pm_pdata->cpufreq_lock; - pm_data->cpufreq_unlock = pm_pdata->cpufreq_unlock; - pm_data->autosuspend_delay_ms = pm_pdata->autosuspend_delay_ms; - pm_data->block_autosuspend = false; - - pm_data->usb_ld = usb_ld; - pm_data->link_pm_active = false; - usb_ld->link_pm_data = pm_data; - - pm_data->miscdev.minor = MISC_DYNAMIC_MINOR; - pm_data->miscdev.name = "link_pm"; - pm_data->miscdev.fops = &link_pm_fops; - - err = misc_register(&pm_data->miscdev); - if (err < 0) { - mif_err("fail to register pm device(%d)\n", err); - goto err_misc_register; - } - - pm_data->hub_init_lock = 1; - irq = gpio_to_irq(usb_ld->pdata->gpio_host_wakeup); - err = request_threaded_irq(irq, NULL, usb_resume_irq, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, "modem_usb_wake", usb_ld); - if (err) { - mif_err("Failed to allocate an interrupt(%d)\n", irq); - goto err_request_irq; - } - enable_irq_wake(irq); - - pm_data->has_usbhub = pm_pdata->has_usbhub; - -#ifdef CONFIG_USBHUB_USB3503 - if (has_hub(usb_ld)) { - init_completion(&pm_data->hub_active); - pm_data->hub_status = HUB_STATE_OFF; - pm_pdata->p_hub_status = &pm_data->hub_status; - pm_data->hub_handshake_done = 0; - pm_data->root_hub = NULL; - wake_lock_init(&pm_data->hub_lock, WAKE_LOCK_SUSPEND, - "modem_hub_enum_lock"); - INIT_DELAYED_WORK(&pm_data->link_pm_hub, link_pm_hub_work); - } -#endif - - wake_lock_init(&pm_data->boot_wake, WAKE_LOCK_SUSPEND, "boot_usb"); - - pm_data->pm_notifier.notifier_call = link_pm_notifier_event; - register_pm_notifier(&pm_data->pm_notifier); - - return 0; - -err_request_irq: - misc_deregister(&pm_data->miscdev); -err_misc_register: - kfree(pm_data); - return err; -} diff --git a/drivers/misc/modem_if_na/modem_link_pm_usb.h b/drivers/misc/modem_if_na/modem_link_pm_usb.h deleted file mode 100644 index a4d4ea3..0000000 --- a/drivers/misc/modem_if_na/modem_link_pm_usb.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2012 Samsung Electronics. - * - * 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 __MODEM_LINK_PM_USB_H__ -#define __MODEM_LINK_PM_USB_H__ - -#include -#include "modem_prj.h" -#include "modem_link_device_usb.h" - -#define IOCTL_LINK_CONTROL_ENABLE _IO('o', 0x30) -#define IOCTL_LINK_CONTROL_ACTIVE _IO('o', 0x31) -#define IOCTL_LINK_GET_HOSTWAKE _IO('o', 0x32) -#define IOCTL_LINK_CONNECTED _IO('o', 0x33) -#define IOCTL_LINK_SET_BIAS_CLEAR _IO('o', 0x34) - -#define IOCTL_LINK_PORT_ON _IO('o', 0x35) -#define IOCTL_LINK_PORT_OFF _IO('o', 0x36) -#define IOCTL_LINK_BLOCK_AUTOSUSPEND _IO('o', 0x37) -#define IOCTL_LINK_ENABLE_AUTOSUSPEND _IO('o', 0x38) - -enum hub_status { - HUB_STATE_OFF, /* usb3503 0ff*/ - HUB_STATE_RESUMMING, /* usb3503 on, but enummerattion was not yet*/ - HUB_STATE_PREACTIVE, - HUB_STATE_ACTIVE, /* hub and CMC221 enumerate */ -}; - -struct link_pm_data { - struct miscdevice miscdev; - struct usb_link_device *usb_ld; - unsigned gpio_link_active; - unsigned gpio_link_hostwake; - unsigned gpio_link_slavewake; - int (*link_reconnect)(void); - int link_reconnect_cnt; - - struct workqueue_struct *wq; - struct completion active_done; -/*USB3503*/ - struct completion hub_active; - int hub_status; - bool has_usbhub; - /* ignore hub on by host wakeup irq before cp power on*/ - int hub_init_lock; - /* C1 stay disconnect status after send 'a', skip 'a' next enumeration*/ - int hub_handshake_done; - struct wake_lock hub_lock; - struct delayed_work link_pm_hub; - int hub_on_retry_cnt; - struct device *root_hub; - - struct delayed_work link_pm_work; - struct delayed_work link_pm_start; - struct delayed_work link_reconnect_work; - bool resume_requested; - bool link_pm_active; - - struct wake_lock l2_wake; - struct wake_lock boot_wake; - struct notifier_block pm_notifier; - bool dpm_suspending; - - int (*port_enable)(int, int); - - int (*cpufreq_lock)(void); - int (*cpufreq_unlock)(void); - - int autosuspend_delay_ms; /* if zero, the default value is used */ - bool block_autosuspend; -}; - -bool link_pm_set_active(struct usb_link_device *usb_ld); -bool link_pm_is_connected(struct usb_link_device *usb_ld); -int link_pm_init(struct usb_link_device *usb_ld, void *data); - -#endif diff --git a/drivers/misc/modem_if_na/modem_modemctl_device_cbp71.c b/drivers/misc/modem_if_na/modem_modemctl_device_cbp71.c deleted file mode 100644 index 17f493c..0000000 --- a/drivers/misc/modem_if_na/modem_modemctl_device_cbp71.c +++ /dev/null @@ -1,269 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_cbp7.1.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_dpram.h" - -#define PIF_TIMEOUT (180 * HZ) -#define DPRAM_INIT_TIMEOUT (15 * HZ) - - -static irqreturn_t phone_active_irq_handler(int irq, void *_mc) -{ - int phone_reset = 0; - int phone_active_value = 0; - int phone_state = 0; - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - if (!mc->gpio_cp_reset || !mc->gpio_phone_active) { - pr_err("MIF :<%s> no gpio data\n", __func__); - return IRQ_HANDLED; - } - phone_reset = gpio_get_value(mc->gpio_cp_reset); - phone_active_value = gpio_get_value(mc->gpio_phone_active); - pr_info("MIF : <%s>phone_active : %d\n", \ - __func__, phone_active_value); - if (phone_reset && phone_active_value) { - phone_state = STATE_ONLINE; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - } else if (phone_reset && !phone_active_value) { - if (mc->phone_state == STATE_ONLINE) { - phone_state = STATE_CRASH_EXIT; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, - phone_state); - } - } else { - phone_state = STATE_OFFLINE; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - } - - if (phone_active_value) - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_LOW); - else - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_HIGH); - - pr_info("MIF : <%s> phone_state=%d\n", \ - __func__, phone_state); - - return IRQ_HANDLED; -} -static int cbp71_on(struct modem_ctl *mc) -{ - - int ret; - - struct dpram_link_device *dpram_ld = - to_dpram_link_device(mc->iod->link); - - pr_err("MIF : cbp71_on()\n"); - - if (!mc->gpio_cp_off || !mc->gpio_cp_reset || !mc->gpio_cp_on) { - pr_err("MIF : <%s>no gpio data\n", __func__); - return -ENXIO; - } - gpio_set_value(mc->gpio_cp_on, 1); - mdelay(10); - gpio_set_value(mc->gpio_cp_reset, GPIO_LEVEL_LOW); - gpio_set_value(mc->gpio_cp_off, GPIO_LEVEL_LOW); - mdelay(600); - gpio_set_value(mc->gpio_cp_reset, GPIO_LEVEL_HIGH); - gpio_set_value(mc->gpio_cp_on, GPIO_LEVEL_HIGH); - - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - - /* Wait here until the PHONE is up. - * Waiting as the this called from IOCTL->UM thread */ - pr_debug("MIF : power control waiting for INT_MASK_CMD_PIF_INIT_DONE\n"); - - mc->clear_intr(); - - msleep(100); - - gpio_set_value(mc->gpio_pda_active, 1); - printk(KERN_INFO "MIF : PDA_ACTIVE sets high.\n"); - - ret = wait_for_completion_interruptible_timeout( - &dpram_ld->dpram_init_cmd, DPRAM_INIT_TIMEOUT); - if (!ret) { - /* ret will be 0 on timeout, < zero if interrupted */ - pr_warn("MIF : INIT_START cmd was not arrived.\n"); - pr_warn("init_cmd_wait_condition is 0 and wait timeout happend\n"); - return -ENXIO; - } - - ret = wait_for_completion_interruptible_timeout( - &dpram_ld->modem_pif_init_done, PIF_TIMEOUT); - if (!ret) { - pr_warn("MIF : PIF init failed\n"); - pr_warn("pif_init_wait_condition is 0 and wait timeout happend\n"); - return -ENXIO; - } - - pr_debug("MIF : complete cbp71_on\n"); - - mc->iod->modem_state_changed(mc->iod, STATE_ONLINE); - - return 0; -} - -static int cbp71_off(struct modem_ctl *mc) -{ - int phone_wait_cnt = 0; - pr_err("MIF : cbp71_off()\n"); - - if (!mc->gpio_cp_off || !mc->gpio_cp_reset || !mc->gpio_phone_active) { - pr_err("MIF : no gpio data\n"); - return -ENXIO; - } - - /* confirm phone off */ - while (1) { - if (gpio_get_value(mc->gpio_phone_active)) { - if (phone_wait_cnt > 5) { - pr_info("MIF:<%s> Try to Turn Phone Off(%d)\n", - __func__, - gpio_get_value(mc->gpio_phone_active)); - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_off, \ - 0); - } - if (phone_wait_cnt > 7) { - pr_err("MIF:<%s> PHONE OFF Failed\n", __func__); - break; - } - phone_wait_cnt++; - msleep(100); - } else { - pr_info("MIF:<%s> PHONE OFF Success\n", __func__); - break; - } - } - - /* set VIA off again */ - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_off, 0); - - mc->iod->modem_state_changed(mc->iod, STATE_OFFLINE); - - return 0; -} - -static int cbp71_reset(struct modem_ctl *mc) -{ - int ret = 0; - - pr_debug("MIF : cbp71_reset()\n"); - - ret = cbp71_off(mc); - if (ret) - return -ENXIO; - - msleep(100); - - ret = cbp71_on(mc); - if (ret) - return -ENXIO; - - return 0; -} - -static int cbp71_boot_on(struct modem_ctl *mc) -{ - pr_debug("MIF : cbp71_boot_on()\n"); - - if (!mc->gpio_cp_reset) { - pr_err("MIF : no gpio data\n"); - return -ENXIO; - } - gpio_set_value(mc->gpio_cp_reset, 0); - msleep(600); - gpio_set_value(mc->gpio_cp_reset, 1); - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - - return 0; -} - -static int cbp71_boot_off(struct modem_ctl *mc) -{ - pr_debug("MIF : cbp71_boot_off()\n"); - return 0; -} - -static void cbp71_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = cbp71_on; - mc->ops.modem_off = cbp71_off; - mc->ops.modem_reset = cbp71_reset; - mc->ops.modem_boot_on = cbp71_boot_on; - mc->ops.modem_boot_off = cbp71_boot_off; -} - -int cbp71_init_modemctl_device(struct modem_ctl *mc, - struct modem_data *pdata) -{ - int ret = 0; - unsigned long flag = 0; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_cp_off = pdata->gpio_cp_off; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_off = pdata->gpio_cp_off; - -#ifdef CONFIG_INTERNAL_MODEM_IF - mc->clear_intr = pdata->clear_intr; -#endif - mc->irq_phone_active = gpio_to_irq(mc->gpio_phone_active); - pr_err("MIF : <%s> PHONE_ACTIVE IRQ# = %d\n", - __func__, mc->irq_phone_active); - - cbp71_get_ops(mc); - flag = IRQF_TRIGGER_HIGH; - - ret = request_irq(mc->irq_phone_active, - phone_active_irq_handler, - flag, "phone_active", mc); - if (ret) { - pr_err("MIF : failed to irq_phone_active request_irq: %d\n" - , ret); - return ret; - } - - ret = enable_irq_wake(mc->irq_phone_active); - if (ret) { - pr_err("MIF :<%s> failed to enable_irq_wake:%d\n", - __func__, ret); - free_irq(mc->irq_phone_active, mc); - return ret; - } - return ret; -} diff --git a/drivers/misc/modem_if_na/modem_modemctl_device_cmc220.c b/drivers/misc/modem_if_na/modem_modemctl_device_cmc220.c deleted file mode 100644 index 48639b8..0000000 --- a/drivers/misc/modem_if_na/modem_modemctl_device_cmc220.c +++ /dev/null @@ -1,254 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_cmc220.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include - -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_usb.h" - -static int cmc220_on(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s()\n", __func__); - - if (!mc->gpio_cp_off || !mc->gpio_cp_on || !mc->gpio_cp_reset) { - pr_err("[MODEM_IF] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_on, 1); - msleep(300); - gpio_set_value(mc->gpio_cp_reset, 1); - msleep(100); - gpio_set_value(mc->gpio_cp_off, 0); - msleep(300); - mc->phone_state = STATE_BOOTING; - return 0; -} - -static int cmc220_off(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s()\n", __func__); - - if (!mc->gpio_cp_off || !mc->gpio_cp_on || !mc->gpio_cp_reset) { - pr_err("[MODEM_IF] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_on, 0); - msleep(100); - gpio_set_value(mc->gpio_cp_off, 1); - msleep(100); - gpio_set_value(mc->gpio_cp_reset, 0); - - mc->phone_state = STATE_OFFLINE; - - return 0; -} - -static int cmc220_force_crash_exit(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s: # %d\n", __func__, ++(mc->crash_cnt)); - - mc->phone_state = STATE_CRASH_EXIT;/* DUMP START */ - - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, mc->phone_state); - - return 0; -} - -static int cmc220_dump_reset(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s()\n", __func__); - - if (!mc->gpio_cp_reset) - return -ENXIO; - - gpio_set_value(mc->gpio_host_active, 0); - mc->cpcrash_flag = 1; - - gpio_set_value(mc->gpio_cp_reset, 0); - msleep(100); - gpio_set_value(mc->gpio_cp_reset, 1); - msleep(300); - - mc->phone_state = STATE_BOOTING; - - return 0; -} - -static int cmc220_reset(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s()\n", __func__); - - if (!mc->gpio_cp_reset) - return -ENXIO; - - if (cmc220_off(mc)) - return -ENXIO; - msleep(100); - if (cmc220_on(mc)) - return -ENXIO; - - mc->phone_state = STATE_BOOTING; - - return 0; -} - -static int cmc220_boot_on(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s()\n", __func__); - return 0; -} - -static int cmc220_boot_off(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s()\n", __func__); - return 0; -} - -static int cmc220_get_active(struct modem_ctl *mc) -{ - if (!mc->gpio_phone_active || !mc->gpio_cp_reset) - return -ENXIO; - - pr_debug("cp %d phone %d\n", - gpio_get_value(mc->gpio_cp_reset), - gpio_get_value(mc->gpio_phone_active)); - - if (gpio_get_value(mc->gpio_cp_reset)) - return gpio_get_value(mc->gpio_phone_active); - - return 0; -} - - -static void mc_work(struct work_struct *work_arg) -{ - - struct modem_ctl *mc = container_of(work_arg, struct modem_ctl, - dwork.work); - - int phone_active; - - phone_active = cmc220_get_active(mc); - if (phone_active < 0) { - pr_err("[MODEM_IF] gpio not initialized\n"); - return; - } - - switch (mc->phone_state) { - case STATE_CRASH_EXIT: - case STATE_BOOTING: - case STATE_LOADER_DONE: - if (phone_active) { - if (mc->cpcrash_flag) { - pr_info("[MODEM_IF] LTE DUMP END!!\n"); - mc->cpcrash_flag = 0; - } - } - break; - case STATE_ONLINE: - if (!phone_active) { - pr_info("[MODEM_IF] LTE CRASHED!! LTE DUMP START!!\n"); - mc->phone_state = STATE_CRASH_EXIT; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, - mc->phone_state); - } - break; - default: - mc->phone_state = STATE_OFFLINE; - pr_err("[MODEM_IF], phone_status changed to invalid!!\n"); - break; - } -} - - - -static irqreturn_t phone_active_irq_handler(int irq, void *_mc) -{ - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - schedule_delayed_work(&mc->dwork, 20); - - return IRQ_HANDLED; -} - -static void cmc220_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = cmc220_on; - mc->ops.modem_off = cmc220_off; - mc->ops.modem_reset = cmc220_reset; - mc->ops.modem_boot_on = cmc220_boot_on; - mc->ops.modem_boot_off = cmc220_boot_off; - mc->ops.modem_force_crash_exit = cmc220_force_crash_exit; - mc->ops.modem_dump_reset = cmc220_dump_reset; -} - -int cmc220_init_modemctl_device(struct modem_ctl *mc, - struct modem_data *pdata) -{ - int ret = 0; - struct platform_device *pdev; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_reset_req_n = pdata->gpio_reset_req_n; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel; - mc->gpio_cp_warm_reset = pdata->gpio_cp_warm_reset; - mc->gpio_cp_off = pdata->gpio_cp_off; - mc->gpio_slave_wakeup = pdata->gpio_slave_wakeup; - mc->gpio_host_active = pdata->gpio_host_active; - mc->gpio_host_wakeup = pdata->gpio_host_wakeup; - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = gpio_to_irq(mc->gpio_phone_active); - - cmc220_get_ops(mc); - - dev_set_drvdata(mc->dev, mc); - - INIT_DELAYED_WORK(&mc->dwork, mc_work); - - ret = request_irq(mc->irq_phone_active, phone_active_irq_handler, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "lte_phone_active", mc); - if (ret) { - pr_err("[MODEM_IF] Failed to allocate an interrupt(%d)\n", - mc->irq_phone_active); - goto irq_fail; - } - mc->irq[0] = mc->irq_phone_active; - enable_irq_wake(mc->irq_phone_active); - /*disable_irq(mc->irq_phone_active);*/ - - return ret; - -irq_fail: - kfree(mc); - return ret; -} diff --git a/drivers/misc/modem_if_na/modem_net_flowcontrol_device.c b/drivers/misc/modem_if_na/modem_net_flowcontrol_device.c deleted file mode 100644 index 6660079..0000000 --- a/drivers/misc/modem_if_na/modem_net_flowcontrol_device.c +++ /dev/null @@ -1,115 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_net_flowcontrol_device.c - * - * Copyright (C) 2011 Google, Inc. - * Copyright (C) 2011 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_prj.h" - - -#define NET_FLOWCONTROL_DEV_NAME_LEN 8 - -static int modem_net_flowcontrol_device_open( - struct inode *inode, struct file *filp) -{ - return 0; -} - -static int modem_net_flowcontrol_device_release( - struct inode *inode, struct file *filp) -{ - return 0; -} - -static long modem_net_flowcontrol_device_ioctl( - struct file *filp, unsigned int cmd, unsigned long arg) -{ - struct net *this_net; - struct net_device *ndev; - char dev_name[NET_FLOWCONTROL_DEV_NAME_LEN]; - u8 chan; - - if (copy_from_user(&chan, (void __user *)arg, sizeof(char))) - return -EFAULT; - - if (chan > 15) - return -ENODEV; - - snprintf(dev_name, NET_FLOWCONTROL_DEV_NAME_LEN, "rmnet%d", (int)chan); - this_net = get_net_ns_by_pid(current->pid); - ndev = __dev_get_by_name(this_net, dev_name); - if (ndev == NULL) { - pr_err("[MODEM_IF] %s: device = %s not exist\n", __func__, - dev_name); - return -ENODEV; - } - - switch (cmd) { - case IOCTL_MODEM_NET_SUSPEND: - netif_stop_queue(ndev); - pr_info("[MODEM_IF] NET SUSPEND(%s)\n", dev_name); - break; - case IOCTL_MODEM_NET_RESUME: - netif_wake_queue(ndev); - pr_info("[MODEM_IF] NET RESUME(%s)\n", dev_name); - break; - default: - return -EINVAL; - } - return 0; -} - -static const struct file_operations modem_net_flowcontrol_device_fops = { - .owner = THIS_MODULE, - .open = modem_net_flowcontrol_device_open, - .release = modem_net_flowcontrol_device_release, - .unlocked_ioctl = modem_net_flowcontrol_device_ioctl, -}; - -static int __init modem_net_flowcontrol_device_init(void) -{ - int ret = 0; - struct io_device *net_flowcontrol_dev; - - net_flowcontrol_dev = kzalloc(sizeof(struct io_device), GFP_KERNEL); - if (!net_flowcontrol_dev) { - pr_err("[MODEM_IF] net_flowcontrol_dev io device memory alloc fail\n"); - return -ENOMEM; - } - - net_flowcontrol_dev->miscdev.minor = MISC_DYNAMIC_MINOR; - net_flowcontrol_dev->miscdev.name = "modem_br"; - net_flowcontrol_dev->miscdev.fops = &modem_net_flowcontrol_device_fops; - - ret = misc_register(&net_flowcontrol_dev->miscdev); - if (ret) - pr_err("[MODEM_IF] failed to register misc br device : %s\n", - net_flowcontrol_dev->miscdev.name); - - return ret; -} - -module_init(modem_net_flowcontrol_device_init); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Samsung Modem IF Net Flowcontrol Driver"); diff --git a/drivers/misc/modem_if_na/modem_prj.h b/drivers/misc/modem_if_na/modem_prj.h deleted file mode 100644 index e5f27d8..0000000 --- a/drivers/misc/modem_if_na/modem_prj.h +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_PRJ_H__ -#define __MODEM_PRJ_H__ - -#include -#include -#include - - -#define MAX_LINK_DEVTYPE 3 -#define MAX_RAW_DEVS 32 -#define MAX_NUM_IO_DEV (MAX_RAW_DEVS + 4) - -#define IOCTL_MODEM_ON _IO('o', 0x19) -#define IOCTL_MODEM_OFF _IO('o', 0x20) -#define IOCTL_MODEM_RESET _IO('o', 0x21) -#define IOCTL_MODEM_BOOT_ON _IO('o', 0x22) -#define IOCTL_MODEM_BOOT_OFF _IO('o', 0x23) -#define IOCTL_MODEM_START _IO('o', 0x24) - -#define IOCTL_MODEM_SEND _IO('o', 0x25) -#define IOCTL_MODEM_RECV _IO('o', 0x26) - -#define IOCTL_MODEM_STATUS _IO('o', 0x27) -#define IOCTL_MODEM_GOTA_START _IO('o', 0x28) -#define IOCTL_MODEM_FW_UPDATE _IO('o', 0x29) - -#define IOCTL_MODEM_NET_SUSPEND _IO('o', 0x30) -#define IOCTL_MODEM_NET_RESUME _IO('o', 0x31) -#define IOCTL_MODEM_DUMP_START _IO('o', 0x32) -#define IOCTL_MODEM_DUMP_UPDATE _IO('o', 0x33) -#define IOCTL_MODEM_FORCE_CRASH_EXIT _IO('o', 0x34) -#define IOCTL_MODEM_DUMP_RESET _IO('o', 0x35) - -#define IPC_HEADER_MAX_SIZE 6 /* fmt 3, raw 6, rfs 6 */ - -#define PSD_DATA_CHID_BEGIN 0x2A -#define PSD_DATA_CHID_END 0x38 - -#define IP6VERSION 6 - -#define SOURCE_MAC_ADDR {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC} - -/* Does modem ctl structure will use state ? or status defined below ?*/ -/* Be careful!! below sequence shouldn't be changed*/ -enum modem_state { - STATE_OFFLINE, - __UNUSED__, - STATE_CRASH_EXIT, - STATE_BOOTING, - STATE_ONLINE, - STATE_NV_REBUILDING, - STATE_LOADER_DONE, -}; - -enum { - COM_NONE, - COM_ONLINE, - COM_HANDSHAKE, - COM_BOOT, - COM_CRASH, - COM_BOOT_EBL, -}; - -struct header_data { - char hdr[IPC_HEADER_MAX_SIZE]; - unsigned len; - unsigned flag_len; - char start; /*hdlc start header 0x7F*/ -}; - -/* buffer type for modem image */ -struct dpram_firmware { - char *firmware; - int size; - int is_delta; -}; - - -struct vnet { - struct io_device *iod; -}; - -struct io_device { - struct list_head list; - char *name; - - wait_queue_head_t wq; - - struct miscdevice miscdev; - struct net_device *ndev; - - /* ID and Format for channel on the link */ - unsigned id; - enum dev_format format; - enum modem_io io_typ; - enum modem_network net_typ; - - struct sk_buff_head sk_rx_q; - - /* work for each io device, when delayed work needed - * use this for private io device rx action - */ - struct delayed_work rx_work; - - /* for fragmentation data from link device */ - struct sk_buff *skb_recv; - struct header_data h_data; - - /* called from linkdevice when a packet arrives for this iodevice */ - int (*recv)(struct io_device *iod, const char *data, unsigned int len); - - /* inform the IO device that the modem is now online or offline or - * crashing or whatever... - */ - void (*modem_state_changed)(struct io_device *iod, enum modem_state); - - struct link_device *link; - struct modem_ctl *mc; - - void *private_data; -}; -#define to_io_device(misc) container_of(misc, struct io_device, miscdev) - -struct io_raw_devices { - struct io_device *raw_devices[MAX_RAW_DEVS]; - int num_of_raw_devs; -}; - -struct link_device { - char *name; - - struct sk_buff_head sk_fmt_tx_q; - struct sk_buff_head sk_raw_tx_q; - - struct workqueue_struct *tx_wq; - struct workqueue_struct *tx_raw_wq; - struct work_struct tx_work; - struct delayed_work tx_delayed_work; - - unsigned com_state; - - /* called during init to associate an io device with this link */ - int (*attach)(struct link_device *ld, struct io_device *iod); - - /* init communication - setting link driver */ - int (*init_comm)(struct link_device *ld, struct io_device *iod); - /* terminate communication */ - void (*terminate_comm)(struct link_device *ld, struct io_device *iod); - - /* called by an io_device when it has a packet to send over link - * - the io device is passed so the link device can look at id and - * format fields to determine how to route/format the packet - */ - int (*send)(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb); - - int (*gota_start)(struct link_device *ld, struct io_device *iod); - int (*dump_start)(struct link_device *ld, struct io_device *iod); - - int (*modem_update)( - struct link_device *ld, - struct io_device *iod, - unsigned long arg); - int (*dump_update)( - struct link_device *ld, - struct io_device *iod, - unsigned long arg); -}; - -struct modemctl_ops { - int (*modem_on) (struct modem_ctl *); - int (*modem_off) (struct modem_ctl *); - int (*modem_reset) (struct modem_ctl *); - int (*modem_boot_on) (struct modem_ctl *); - int (*modem_boot_off) (struct modem_ctl *); - int (*modem_force_crash_exit) (struct modem_ctl *); - int (*modem_dump_reset) (struct modem_ctl *); -}; - -struct modem_ctl { - struct device *dev; - char *name; - - int phone_state; - - unsigned gpio_cp_on; - unsigned gpio_reset_req_n; - unsigned gpio_cp_reset; - unsigned gpio_pda_active; - unsigned gpio_phone_active; - unsigned gpio_cp_dump_int; - unsigned gpio_flm_uart_sel; - unsigned gpio_cp_warm_reset; - unsigned gpio_cp_off; - - int irq_phone_active; - - struct work_struct work; - -#if defined(CONFIG_LTE_MODEM_CMC221) || defined(CONFIG_LTE_MODEM_CMC220) - const struct attribute_group *group; - unsigned gpio_slave_wakeup; - unsigned gpio_host_wakeup; - unsigned gpio_host_active; - int irq_host_wakeup; - struct delayed_work dwork; - struct work_struct resume_work; - int wakeup_flag; /*flag for CP boot GPIO sync flag*/ - int cpcrash_flag; - int crash_cnt; - struct completion *l2_done; - int irq[3]; -#endif /*CONFIG_LTE_MODEM_CMC221*/ - -#ifdef CONFIG_INTERNAL_MODEM_IF - void (*clear_intr)(void); -#endif - struct modemctl_ops ops; - struct io_device *iod; -}; - -int init_io_device(struct io_device *iod); - -#endif diff --git a/drivers/misc/modem_if_na/modem_utils.c b/drivers/misc/modem_if_na/modem_utils.c deleted file mode 100644 index 594b7b0..0000000 --- a/drivers/misc/modem_if_na/modem_utils.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_prj.h" -#include "modem_utils.h" - -#define CMD_SUSPEND ((unsigned short)(0x00CA)) -#define CMD_RESUME ((unsigned short)(0x00CB)) - -static char ip_flags[16]; -static char tcp_flags[32]; - - -/* dump2hex - * dump data to hex as fast as possible. - * the length of @buf must be greater than "@len * 3" - * it need 3 bytes per one data byte to print. - */ -static inline int dump2hex(char *buf, const char *data, size_t len) -{ - static const char *hex = "0123456789abcdef"; - char *dest = buf; - int i; - - for (i = 0; i < len; i++) { - *dest++ = hex[(data[i] >> 4) & 0xf]; - *dest++ = hex[data[i] & 0xf]; - *dest++ = ' '; - } - if (likely(len > 0)) - dest--; /* last space will be overwrited with null */ - - *dest = '\0'; - - return dest - buf; -} - -/* print buffer as hex string */ -int pr_buffer(const char *tag, const char *data, size_t data_len, - size_t max_len) -{ - size_t len = min(data_len, max_len); - unsigned char hexstr[len ? len * 3 : 1]; /* 1 <= sizeof <= max_len*3 */ - dump2hex(hexstr, data, len); - return printk(KERN_DEBUG "[MIF] %s(%u): %s%s\n", tag, data_len, hexstr, - len == data_len ? "" : " ..."); -} - -/* flow control CMD from CP, it use in serial devices */ -int link_rx_flowctl_cmd(struct link_device *ld, const char *data, size_t len) -{ - unsigned short *cmd, *end = (unsigned short *)(data + len); - struct io_device *iod = NULL, *multi_raw_iod; - int i; - - pr_debug("[MODEM_IF] flow control cmd: size=%d\n", len); - - multi_raw_iod = find_iodev(ld, IPC_MULTI_RAW); - if (!multi_raw_iod || !multi_raw_iod->private_data) { - pr_err("[MODEM_IF] %s: no multi raw device\n", __func__); - return -ENODEV; - } - - for (cmd = (unsigned short *)data; cmd < end; cmd++) { - switch (*cmd) { - case CMD_SUSPEND: - raw_devs_for_each(multi_raw_iod, i, iod) { - if (iod->io_typ == IODEV_NET && iod->ndev) - netif_stop_queue(iod->ndev); - } - ld->raw_tx_suspended = true; - pr_info("[MODEM_IF] flowctl CMD_SUSPEND(%04X)\n", *cmd); - break; - - case CMD_RESUME: - raw_devs_for_each(multi_raw_iod, i, iod) { - if (iod->io_typ == IODEV_NET && iod->ndev) - netif_wake_queue(iod->ndev); - } - ld->raw_tx_suspended = false; - complete_all(&ld->raw_tx_resumed_by_cp); - pr_info("[MODEM_IF] flowctl CMD_RESUME(%04X)\n", *cmd); - break; - - default: - pr_err("[MODEM_IF] flowctl BAD CMD: %04X\n", *cmd); - break; - } - } - - return 0; -} - -void mif_print_data(char *buf, int len) -{ - int words = len >> 4; - int residue = len - (words << 4); - int i; - char *b; - char last[80]; - char tb[8]; - - /* Make the last line, if ((len % 16) > 0) */ - if (residue > 0) { - memset(last, 0, sizeof(last)); - memset(tb, 0, sizeof(tb)); - b = buf + (words << 4); - - sprintf(last, "%04X: ", (words << 4)); - for (i = 0; i < residue; i++) { - sprintf(tb, "%02x ", b[i]); - strcat(last, tb); - if ((i & 0x3) == 0x3) { - sprintf(tb, " "); - strcat(last, tb); - } - } - } - - for (i = 0; i < words; i++) { - b = buf + (i << 4); - printk(KERN_ERR "%04X: " - "%02x %02x %02x %02x %02x %02x %02x %02x " - "%02x %02x %02x %02x %02x %02x %02x %02x\n", - (i << 4), - b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], - b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]); - } - - /* Print the last line */ - if (residue > 0) - printk(KERN_ERR "%s\n", last); -} - -void print_sipc4_hdlc_fmt_frame(const u8 *psrc) -{ - u8 *frm; /* HDLC Frame */ - struct fmt_hdr *hh; /* HDLC Header */ - struct sipc_fmt_hdr *fh; /* IPC Header */ - u16 hh_len = sizeof(struct fmt_hdr); - u16 fh_len = sizeof(struct sipc_fmt_hdr); - u8 *data; - int dlen; - - /* Actual HDLC header starts from after START flag (0x7F) */ - frm = (u8 *)(psrc + 1); - - /* Point HDLC header and IPC header */ - hh = (struct fmt_hdr *)(frm); - fh = (struct sipc_fmt_hdr *)(frm + hh_len); - - /* Point IPC data */ - data = frm + (hh_len + fh_len); - dlen = hh->len - (hh_len + fh_len); - - pr_err("--------------------HDLC & FMT HEADER----------------------\n"); - - pr_err("HDLC len = %d, HDLC control = 0x%02x\n", hh->len, hh->control); - - pr_err("(M)0x%02X, (S)0x%02X, (T)0x%02X, mseq:%d, aseq:%d, len:%d\n", - fh->main_cmd, fh->sub_cmd, fh->cmd_type, - fh->msg_seq, fh->ack_seq, fh->len); - - pr_err("-----------------------IPC FMT DATA------------------------\n"); - - if (dlen > 0) { - if (dlen > 64) - dlen = 64; - mif_print_data(data, dlen); - } - - pr_err("-----------------------------------------------------------\n"); -} - -void print_sipc4_fmt_frame(const u8 *psrc) -{ - struct sipc_fmt_hdr *fh = (struct sipc_fmt_hdr *)psrc; - u16 fh_len = sizeof(struct sipc_fmt_hdr); - u8 *data; - int dlen; - - /* Point IPC data */ - data = (u8 *)(psrc + fh_len); - dlen = fh->len - fh_len; - - pr_err("----------------------IPC FMT HEADER-----------------------\n"); - - pr_err("(M)0x%02X, (S)0x%02X, (T)0x%02X, mseq:%d, aseq:%d, len:%d\n", - fh->main_cmd, fh->sub_cmd, fh->cmd_type, - fh->msg_seq, fh->ack_seq, fh->len); - - pr_err("-----------------------IPC FMT DATA------------------------\n"); - - if (dlen > 0) - mif_print_data(data, dlen); - - pr_err("-----------------------------------------------------------\n"); -} - -static void print_tcp_header(u8 *pkt) -{ - int i; - struct tcphdr *tcph = (struct tcphdr *)pkt; - u8 *opt = pkt + TCP_HDR_SIZE; - unsigned opt_len = (tcph->doff << 2) - TCP_HDR_SIZE; - -/*------------------------------------------------------------------------- - - TCP Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Port | Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Sequence Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Acknowledgment Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Data | |C|E|U|A|P|R|S|F| | - | Offset| Rsvd |W|C|R|C|S|S|Y|I| Window | - | | |R|E|G|K|H|T|N|N| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Checksum | Urgent Pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options | Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - --------------------------------------------------------------------------*/ - - memset(tcp_flags, 0, sizeof(tcp_flags)); - if (tcph->cwr) - strcat(tcp_flags, "CWR "); - if (tcph->ece) - strcat(tcp_flags, "ECE "); - if (tcph->urg) - strcat(tcp_flags, "URG "); - if (tcph->ack) - strcat(tcp_flags, "ACK "); - if (tcph->psh) - strcat(tcp_flags, "PSH "); - if (tcph->rst) - strcat(tcp_flags, "RST "); - if (tcph->syn) - strcat(tcp_flags, "SYN "); - if (tcph->fin) - strcat(tcp_flags, "FIN "); - - pr_err("TCP:: Src Port = %u, Dst Port = %u\n", - ntohs(tcph->source), ntohs(tcph->dest)); - pr_err("TCP:: SEQ = 0x%08X(%u), ACK = 0x%08X(%u)\n", - ntohs(tcph->seq), ntohs(tcph->seq), - ntohs(tcph->ack_seq), ntohs(tcph->ack_seq)); - pr_err("TCP:: Flags = %s\n", tcp_flags); - pr_err("TCP:: Window = %u, Checksum = 0x%04X, Urg Pointer = %u\n", - ntohs(tcph->window), ntohs(tcph->check), ntohs(tcph->urg_ptr)); - - if (opt_len > 0) { - printk(KERN_ERR "TCP:: Options = "); - for (i = 0; i < opt_len; i++) - printk("%02X ", opt[i]); - printk("\n"); - } -} - -static void print_udp_header(u8 *pkt) -{ - struct udphdr *udph = (struct udphdr *)pkt; - -/*------------------------------------------------------------------------- - - UDP Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Port | Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Length | Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - --------------------------------------------------------------------------*/ - - pr_err("UDP:: Src Port = %u, Dst Prt = %u\n", - ntohs(udph->source), ntohs(udph->dest)); - pr_err("UDP:: Length = %u, Checksum = 0x%04X\n", - ntohs(udph->len), ntohs(udph->check)); - - if (ntohs(udph->dest) == 53) - pr_err("UDP:: DNS query!!!\n"); - - if (ntohs(udph->source) == 53) - pr_err("UDP:: DNS response!!!\n"); -} - -void print_ip4_packet(u8 *ip_pkt) -{ - struct iphdr *iph = (struct iphdr *)ip_pkt; - u8 *pkt = ip_pkt + (iph->ihl << 2); - u16 flags = (ntohs(iph->frag_off) & 0xE000); - u16 frag_off = (ntohs(iph->frag_off) & 0x1FFF); - - pr_err("-----------------------------------------------------------\n"); - -/*--------------------------------------------------------------------------- - - IPv4 Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |Version| IHL |Type of Service| Total Length | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Identification |C|D|M| Fragment Offset | - | |E|F|F| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Time to Live | Protocol | Header Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Address | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Destination Address | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options | Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - IHL - Header Length - Flags - Consist of 3 bits - The 1st bit is "Congestion" bit. - The 2nd bit is "Dont Fragment" bit. - The 3rd bit is "More Fragments" bit. - ----------------------------------------------------------------------------*/ - - memset(ip_flags, 0, sizeof(ip_flags)); - if (flags & IP_CE) - strcat(ip_flags, "CE "); - if (flags & IP_DF) - strcat(ip_flags, "DF "); - if (flags & IP_MF) - strcat(ip_flags, "MF "); - - pr_err("IP4:: Version = %u, Header Length = %u, TOS = %u, Length = %u\n", - iph->version, (iph->ihl << 2), iph->tos, ntohs(iph->tot_len)); - pr_err("IP4:: ID = %u, Fragment Offset = %u\n", - ntohs(iph->id), frag_off); - pr_err("IP4:: Flags = %s\n", ip_flags); - pr_err("IP4:: TTL = %u, Protocol = %u, Header Checksum = 0x%04X\n", - iph->ttl, iph->protocol, ntohs(iph->check)); - pr_err("IP4:: Src IP Addr = %u.%u.%u.%u, Dst IP Addr = %u.%u.%u.%u\n", - ip_pkt[12], ip_pkt[13], ip_pkt[14], ip_pkt[15], - ip_pkt[16], ip_pkt[17], ip_pkt[18], ip_pkt[19]); - - switch (iph->protocol) { - case 6: - /* TCP */ - print_tcp_header(pkt); - break; - - case 17: - /* UDP */ - print_udp_header(pkt); - break; - - default: - break; - } - - pr_err("-----------------------------------------------------------\n"); -} diff --git a/drivers/misc/modem_if_na/modem_utils.h b/drivers/misc/modem_if_na/modem_utils.h deleted file mode 100644 index 0c37e1b..0000000 --- a/drivers/misc/modem_if_na/modem_utils.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics. - * - * 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 __MODEM_UTILS_H__ -#define __MODEM_UTILS_H__ - -#define RAW_DEV(rdevs, i) (((struct io_raw_devices *)rdevs)->raw_devices[i]) - -/** - * raw_devs_for_each - iterate raw devices of multi raw device - * @iod: struct io_device *iod - * @index: int index - * @multiraw: struct io_device *multiraw - */ -#define raw_devs_for_each(multiraw, index, iod) \ - for (index = 0; iod = RAW_DEV(multiraw->private_data, index), \ - index < MAX_RAW_DEVS; index++) \ - if (iod) - -/** - * io_devs_for_each - iterate io devices of list_of_io_devices - * @iod: struct io_device *iod - * @ld: struct link_device *ld - */ -#define io_devs_for_each(iod, ld) \ - list_for_each_entry(iod, (ld)->list_of_io_devices, list) \ - if (iod->link_types & LINKTYPE((ld)->link_type)) - - -static inline struct io_device *find_iodev(struct link_device *ld, - enum dev_format format) -{ - struct io_device *iod; - - io_devs_for_each(iod, ld) { - if (iod->format == format) - return iod; - } - return NULL; -} - -/** countbits - count number of 1 bits as fastest way - * @n: number - */ -static inline unsigned int countbits(unsigned int n) -{ - unsigned int i; - for (i = 0; n != 0; i++) - n &= (n - 1); - return i; -} - -/* print buffer as hex string */ -int pr_buffer(const char *tag, const char *data, size_t data_len, - size_t max_len); - -/* print a sk_buff as hex string */ -#define pr_skb(tag, skb) \ - pr_buffer(tag, (char *)((skb)->data), (size_t)((skb)->len), (size_t)16) - -/* print a urb as hex string */ -#define pr_urb(tag, urb) \ - pr_buffer(tag, (char *)((urb)->transfer_buffer), \ - (size_t)((urb)->actual_length), (size_t)16) - -/* flow control CMD from CP, it use in serial devices */ -int link_rx_flowctl_cmd(struct link_device *ld, const char *data, size_t len); - -void mif_print_data(char *buf, int len); -void print_sipc4_hdlc_fmt_frame(const u8 *psrc); -void print_sipc4_fmt_frame(const u8 *psrc); - -/*--------------------------------------------------------------------------- - - IPv4 Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |Version| IHL |Type of Service| Total Length | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Identification |C|D|M| Fragment Offset | - | |E|F|F| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Time to Live | Protocol | Header Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Address | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Destination Address | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options | Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - IHL - Header Length - Flags - Consist of 3 bits - The 1st bit is "Congestion" bit. - The 2nd bit is "Dont Fragment" bit. - The 3rd bit is "More Fragments" bit. - ----------------------------------------------------------------------------*/ -#define IPV4_HDR_SIZE 20 - -/*------------------------------------------------------------------------- - - TCP Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Port | Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Sequence Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Acknowledgment Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Data | |C|E|U|A|P|R|S|F| | - | Offset| Rsvd |W|C|R|C|S|S|Y|I| Window | - | | |R|E|G|K|H|T|N|N| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Checksum | Urgent Pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options | Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - --------------------------------------------------------------------------*/ -#define TCP_HDR_SIZE 20 - -/*------------------------------------------------------------------------- - - UDP Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Port | Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Length | Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - --------------------------------------------------------------------------*/ -#define UDP_HDR_SIZE 8 - -void print_ip4_packet(u8 *ip_pkt); - -#endif/*__MODEM_UTILS_H__*/ diff --git a/drivers/misc/modem_if_na/modem_variation.h b/drivers/misc/modem_if_na/modem_variation.h deleted file mode 100644 index 1bf2d13..0000000 --- a/drivers/misc/modem_if_na/modem_variation.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_VARIATION_H__ -#define __MODEM_VARIATION_H__ - -#define DECLARE_MODEM_INIT(type) \ - int type ## _init_modemctl_device(struct modem_ctl *mc, \ - struct modem_data *pdata) -#define DECLARE_MODEM_INIT_DUMMY(type) \ - DECLARE_MODEM_INIT(type) { return 0; } - -#define DECLARE_LINK_INIT(type) \ - struct link_device *type ## _create_link_device( \ - struct platform_device *pdev) -#define DECLARE_LINK_INIT_DUMMY(type) \ - DECLARE_LINK_INIT(type) { return NULL; } - -#define MODEM_INIT_CALL(type) type ## _init_modemctl_device -#define LINK_INIT_CALL(type) type ## _create_link_device - -/* add declaration of modem & link type */ -/* modem device support */ -#ifdef CONFIG_UMTS_MODEM_XMM6260 -DECLARE_MODEM_INIT(xmm6260); -#else -DECLARE_MODEM_INIT_DUMMY(xmm6260) -#endif - -#ifdef CONFIG_LTE_MODEM_CMC221 -DECLARE_MODEM_INIT(cmc221); -#else -DECLARE_MODEM_INIT_DUMMY(cmc221) -#endif - -#ifdef CONFIG_CDMA_MODEM_CBP71 -DECLARE_MODEM_INIT(cbp71); -#else -DECLARE_MODEM_INIT_DUMMY(cbp71) -#endif - -#ifdef CONFIG_LTE_MODEM_CMC220 -DECLARE_MODEM_INIT(cmc220); -#else -DECLARE_MODEM_INIT_DUMMY(cmc220) -#endif -/* link device support */ -#ifdef CONFIG_UMTS_LINK_MIPI -DECLARE_LINK_INIT(mipi); -#else -DECLARE_LINK_INIT_DUMMY(mipi) -#endif - -#ifdef CONFIG_LINK_DEVICE_DPRAM -DECLARE_LINK_INIT(dpram); -#else -DECLARE_LINK_INIT_DUMMY(dpram) -#endif - -#ifdef CONFIG_LINK_DEVICE_USB -DECLARE_LINK_INIT(usb); -#else -DECLARE_LINK_INIT_DUMMY(usb) -#endif - -#ifdef CONFIG_UMTS_LINK_HSIC -DECLARE_LINK_INIT(hsic); -#else -DECLARE_LINK_INIT_DUMMY(hsic) -#endif - -#ifdef CONFIG_UMTS_LINK_SPI -DECLARE_LINK_INIT(spi); -#else -DECLARE_LINK_INIT_DUMMY(spi) -#endif - -typedef int (*modem_init_call)(struct modem_ctl *, struct modem_data *); -modem_init_call modem_init_func[] = { - MODEM_INIT_CALL(xmm6260), - MODEM_INIT_CALL(cbp71), - MODEM_INIT_CALL(cmc221), - MODEM_INIT_CALL(cmc220), -}; - -typedef struct link_device *(*link_init_call)(struct platform_device *); -link_init_call link_init_func[] = { - LINK_INIT_CALL(mipi), - LINK_INIT_CALL(dpram), - LINK_INIT_CALL(spi), - LINK_INIT_CALL(usb), - LINK_INIT_CALL(hsic), -}; - -static int call_modem_init_func(struct modem_ctl *mc, struct modem_data *pdata) -{ - if (modem_init_func[pdata->modem_type]) - return modem_init_func[pdata->modem_type](mc, pdata); - else - return -ENOTSUPP; -} - -static struct link_device *call_link_init_func(struct platform_device *pdev, - enum modem_link link_type) -{ - if (link_init_func[link_type]) - return link_init_func[link_type](pdev); - else - return NULL; -} - -#endif diff --git a/drivers/misc/modem_if_u1/Kconfig b/drivers/misc/modem_if_u1/Kconfig deleted file mode 100644 index 6a6eeab..0000000 --- a/drivers/misc/modem_if_u1/Kconfig +++ /dev/null @@ -1,104 +0,0 @@ -menuconfig SEC_MODEM - bool "Samsung Mobile Modem Interface" - default n - ---help--- - Samsung Modem Interface Driver. - -config UMTS_MODEM_XMM6260 - bool "modem chip : IMC XMM6260" - depends on SEC_MODEM - default n - -config UMTS_MODEM_XMM6262 - bool "modem chip : IMC XMM6262" - depends on SEC_MODEM - default n - -config CDMA_MODEM_CBP71 - bool "modem chip : VIA CBP7.1" - depends on SEC_MODEM - default n - -config CDMA_MODEM_CBP72 - bool "modem chip : VIA CBP7.2" - depends on SEC_MODEM - default n - -config LTE_MODEM_CMC221 - bool "modem chip : SEC CMC221" - depends on SEC_MODEM - default n - -config CDMA_MODEM_MDM6600 - bool "modem chip : QC MDM6600" - depends on SEC_MODEM - default n - -config TDSCDMA_MODEM_SPRD8803 - bool "modem chip : SPRD SC8803" - depends on SEC_MODEM - default n - -config GSM_MODEM_ESC6270 - bool "modem chip : QC ESC6270" - depends on SEC_MODEM - default n - -config LINK_DEVICE_MIPI - bool "modem driver link device MIPI-HSI" - depends on SEC_MODEM - default n - -config LINK_DEVICE_DPRAM - bool "modem driver link device DPRAM" - depends on SEC_MODEM - default n - -config LINK_DEVICE_PLD - bool "modem driver link device PLD" - depends on SEC_MODEM - default n -config LINK_DEVICE_USB - bool "modem driver link device USB" - depends on SEC_MODEM - default n - -config LINK_DEVICE_HSIC - bool "modem driver link device HSIC" - depends on SEC_MODEM - default n - -config LINK_DEVICE_C2C - bool "modem driver link device C2C" - depends on SEC_MODEM - default n - -config LINK_DEVICE_SPI - bool "modem driver link device SPI" - depends on SEC_MODEM - default n - -config WORKQUEUE_FRONT - bool "IPC: SPI workqueue front" - depends on SEC_MODEM - default n - -config IPC_CMC22x_OLD_RFS - bool "IPC: CMC22x ancient RFS" - depends on SEC_MODEM - default n - -config SIPC_VER_5 - bool "IPC: Samsung IPC 5.0" - depends on SEC_MODEM - default n - -config SIM_DETECT - bool "SIM_DETECT pin" - depends on SEC_MODEM - default n - -config SIM_SLOT_SWITCH - bool "SIM_SLOT_SWITCH" - depends on SEC_MODEM - default n diff --git a/drivers/misc/modem_if_u1/Makefile b/drivers/misc/modem_if_u1/Makefile deleted file mode 100644 index 5bd62ea..0000000 --- a/drivers/misc/modem_if_u1/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# Makefile of modem_if - -EXTRA_CFLAGS += -Idrivers/misc/modem_if - -obj-y += sipc5_modem.o sipc5_io_device.o -obj-y += sipc4_modem.o sipc4_io_device.o -obj-y += modem_net_flowcontrol_device.o modem_utils.o - -obj-$(CONFIG_UMTS_MODEM_XMM6260) += modem_modemctl_device_xmm6260.o -obj-$(CONFIG_UMTS_MODEM_XMM6262) += modem_modemctl_device_xmm6262.o -obj-$(CONFIG_CDMA_MODEM_CBP71) += modem_modemctl_device_cbp71.o -obj-$(CONFIG_CDMA_MODEM_CBP72) += modem_modemctl_device_cbp72.o -obj-$(CONFIG_LTE_MODEM_CMC221) += modem_modemctl_device_cmc221.o lte_modem_bootloader.o -obj-$(CONFIG_CDMA_MODEM_MDM6600) += modem_modemctl_device_mdm6600.o -obj-$(CONFIG_GSM_MODEM_ESC6270) += modem_modemctl_device_esc6270.o -obj-$(CONFIG_TDSCDMA_MODEM_SPRD8803) += modem_modemctl_device_sprd8803.o - -obj-$(CONFIG_LINK_DEVICE_MIPI) += modem_link_device_mipi.o -obj-$(CONFIG_LINK_DEVICE_DPRAM) += modem_link_device_dpram.o modem_link_device_dpram_ext_op.o -obj-$(CONFIG_LINK_DEVICE_PLD) += modem_link_device_pld.o modem_link_device_pld_ext_op.o -obj-$(CONFIG_LINK_DEVICE_USB) += modem_link_device_usb.o modem_link_pm_usb.o -obj-$(CONFIG_LINK_DEVICE_HSIC) += modem_link_device_hsic.o -obj-$(CONFIG_LINK_DEVICE_C2C) += modem_link_device_c2c.o -obj-$(CONFIG_LINK_DEVICE_SPI) += modem_link_device_spi.o - -obj-$(CONFIG_SIM_SLOT_SWITCH) += modem_sim_slot_switch.o diff --git a/drivers/misc/modem_if_u1/lte_modem_bootloader.c b/drivers/misc/modem_if_u1/lte_modem_bootloader.c deleted file mode 100644 index f259aae..0000000 --- a/drivers/misc/modem_if_u1/lte_modem_bootloader.c +++ /dev/null @@ -1,313 +0,0 @@ -/* Lte modem bootloader support for Samsung Tuna Board. - * - * Copyright (C) 2011 Google, Inc. - * Copyright (C) 2011 Samsung Electronics. - * - * 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. - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define LEN_XMIT_DELEY 100 - -#ifdef AIRPLAIN_MODE_TEST -int lte_airplain_mode; -#endif - -enum xmit_bootloader_status { - XMIT_BOOT_READY = 0, - XMIT_LOADER_READY, -}; - -struct lte_modem_bootloader { - struct spi_device *spi_dev; - struct miscdevice dev; - - struct mutex lock; - - unsigned int gpio_lte2ap_status; - enum xmit_bootloader_status xmit_status; -}; -#define to_loader(misc) container_of(misc, struct lte_modem_bootloader, dev); - -static inline -int spi_xmit(struct lte_modem_bootloader *loader, - const unsigned char val) -{ - unsigned char buf[1]; - int ret; - struct spi_message msg; - - struct spi_transfer xfer = { - .len = 1, - .tx_buf = buf, - }; - - buf[0] = val; - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - - ret = spi_sync(loader->spi_dev, &msg); - - if (ret < 0) - mif_err("error %d\n", ret); - - return ret; -} - -static -int bootloader_write(struct lte_modem_bootloader *loader, - const char *addr, const int len) -{ - int i; - int ret = 0; - unsigned char lenbuf[4]; - - if (loader->xmit_status == XMIT_LOADER_READY) { - memcpy(lenbuf, &len, ARRAY_SIZE(lenbuf)); - for (i = 0 ; i < ARRAY_SIZE(lenbuf) ; i++) { - ret = spi_xmit(loader, lenbuf[i]); - if (ret < 0) - return ret; - } - msleep(LEN_XMIT_DELEY); - } - - for (i = 0 ; i < len ; i++) { - ret = spi_xmit(loader, addr[i]); - if (ret < 0) - return ret; - } - - return 0; -} - - -static -int bootloader_open(struct inode *inode, struct file *flip) -{ - struct lte_modem_bootloader *loader = to_loader(flip->private_data); - flip->private_data = loader; - - return 0; -} - -static -long bootloader_ioctl(struct file *flip, - unsigned int cmd, unsigned long arg) -{ - int ret = 0; - int status; - struct lte_modem_bootloader_param param; - struct lte_modem_bootloader *loader = flip->private_data; - - mutex_lock(&loader->lock); - switch (cmd) { - case IOCTL_LTE_MODEM_XMIT_BOOT: - - ret = copy_from_user(¶m, (const void __user *)arg, - sizeof(param)); - if (ret) { - mif_err("can not copy userdata\n"); - ret = -EFAULT; - goto exit_err; - } - - dev_info(&loader->spi_dev->dev, - "IOCTL_LTE_MODEM_XMIT_BOOT - bin size: %d\n", - param.len); - - ret = bootloader_write(loader, param.buf, param.len); - if (ret < 0) - mif_err("failed to xmit boot bin\n"); - else { - if (loader->xmit_status == XMIT_BOOT_READY) - loader->xmit_status = XMIT_LOADER_READY; - else - loader->xmit_status = XMIT_BOOT_READY; - } - - break; - case IOCTL_LTE_MODEM_LTE2AP_STATUS: - status = gpio_get_value(loader->gpio_lte2ap_status); - mif_debug("LTE2AP status :%d\n", status); - ret = copy_to_user((unsigned int *)arg, &status, - sizeof(status)); - - break; -#ifdef AIRPLAIN_MODE_TEST - case IOCTL_LTE_MODEM_AIRPLAIN_ON: - lte_airplain_mode = 1; - mif_info("IOCTL_LTE_MODEM LPM_ON\n"); - break; - case IOCTL_LTE_MODEM_AIRPLAIN_OFF: - mif_info("IOCTL_LTE_MODEM LPM_OFF\n"); - lte_airplain_mode = 0; - break; -#endif - default: - mif_err("ioctl cmd error\n"); - ret = -ENOIOCTLCMD; - - break; - } - mutex_unlock(&loader->lock); - -exit_err: - return ret; -} - -static const struct file_operations lte_modem_bootloader_fops = { - .owner = THIS_MODULE, - .open = bootloader_open, - .unlocked_ioctl = bootloader_ioctl, -}; - -static -int bootloader_gpio_setup(struct lte_modem_bootloader *loader) -{ - if (!loader->gpio_lte2ap_status) - return -EINVAL; - - gpio_request(loader->gpio_lte2ap_status, "GPIO_LTE2AP_STATUS"); - gpio_direction_input(loader->gpio_lte2ap_status); - - return 0; -} - -static -int __devinit lte_modem_bootloader_probe(struct spi_device *spi) -{ - int ret; - - struct lte_modem_bootloader *loader; - struct lte_modem_bootloader_platform_data *pdata; - - loader = kzalloc(sizeof(*loader), GFP_KERNEL); - if (!loader) { - mif_err("failed to allocate for lte_modem_bootloader\n"); - ret = -ENOMEM; - goto err_alloc; - } - mutex_init(&loader->lock); - - spi->bits_per_word = 8; - - if (spi_setup(spi)) { - mif_err("failed to setup spi for lte_modem_bootloader\n"); - ret = -EINVAL; - goto err_setup; - } - - loader->spi_dev = spi; - - if (!spi->dev.platform_data) { - mif_err("failed to get platform data for lte_modem_bootloader\n"); - ret = -EINVAL; - goto err_setup; - } - pdata = (struct lte_modem_bootloader_platform_data *) - spi->dev.platform_data; - loader->gpio_lte2ap_status = pdata->gpio_lte2ap_status; - - ret = bootloader_gpio_setup(loader); - if (ret) { - mif_err("failed to set gpio for lte_modem_boot_loader\n"); - goto err_setup; - } - - loader->gpio_lte2ap_status = pdata->gpio_lte2ap_status; - loader->xmit_status = XMIT_BOOT_READY; - - spi_set_drvdata(spi, loader); - - loader->dev.minor = MISC_DYNAMIC_MINOR; - loader->dev.name = "lte_spi"; - loader->dev.fops = <e_modem_bootloader_fops; - ret = misc_register(&loader->dev); - if (ret) { - mif_err("failed to register misc dev for lte_modem_bootloader\n"); - goto err_setup; - } - mif_info("lte_modem_bootloader successfully probed\n"); -#ifdef AIRPLAIN_MODE_TEST - lte_airplain_mode = 0; -#endif - return 0; - -err_setup: - mutex_destroy(&loader->lock); - kfree(loader); - -err_alloc: - - return ret; -} - -static -int __devexit lte_modem_bootloader_remove(struct spi_device *spi) -{ - struct lte_modem_bootloader *loader = spi_get_drvdata(spi); - - misc_deregister(&loader->dev); - mutex_destroy(&loader->lock); - kfree(loader); - - return 0; -} - -static -struct spi_driver lte_modem_bootloader_driver = { - .driver = { - .name = "lte_modem_spi", - .bus = &spi_bus_type, - .owner = THIS_MODULE, - }, - .probe = lte_modem_bootloader_probe, - .remove = __devexit_p(lte_modem_bootloader_remove), -}; - -static -int __init lte_modem_bootloader_init(void) -{ - return spi_register_driver(<e_modem_bootloader_driver); -} - -static -void __exit lte_modem_bootloader_exit(void) -{ - spi_unregister_driver(<e_modem_bootloader_driver); -} - -module_init(lte_modem_bootloader_init); -module_exit(lte_modem_bootloader_exit); - -MODULE_DESCRIPTION("LTE Modem Bootloader driver"); -MODULE_LICENSE("GPL"); diff --git a/drivers/misc/modem_if_u1/modem_link_device_c2c.c b/drivers/misc/modem_if_u1/modem_link_device_c2c.c deleted file mode 100644 index acbaadf..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_c2c.c +++ /dev/null @@ -1,61 +0,0 @@ -/* /linux/drivers/new_modem_if/link_dev_c2c.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "modem_prj.h" -#include "modem_link_device_c2c.h" - -struct link_device *c2c_create_link_device(struct platform_device *pdev) -{ - struct c2c_link_device *dpld; - struct link_device *ld; - struct modem_data *pdata; - - pdata = pdev->dev.platform_data; - - dpld = kzalloc(sizeof(struct c2c_link_device), GFP_KERNEL); - if (!dpld) { - mif_err("dpld == NULL\n"); - return NULL; - } - - wake_lock_init(&dpld->c2c_wake_lock, WAKE_LOCK_SUSPEND, "c2c_wakelock"); - wake_lock(&dpld->c2c_wake_lock); - - ld = &dpld->ld; - dpld->pdata = pdata; - - ld->name = "c2c"; - - mif_info("%s is created!!!\n", dpld->ld.name); - - return ld; -} diff --git a/drivers/misc/modem_if_u1/modem_link_device_c2c.h b/drivers/misc/modem_if_u1/modem_link_device_c2c.h deleted file mode 100644 index 7ec9aa6..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_c2c.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ -#include - -#ifndef __MODEM_LINK_DEVICE_C2C_H__ -#define __MODEM_LINK_DEVICE_C2C_H__ - -#define DPRAM_ERR_MSG_LEN 128 -#define DPRAM_ERR_DEVICE "c2cerr" - -#define MAX_IDX 2 - -#define DPRAM_BASE_PTR 0x4000000 - -#define DPRAM_START_ADDRESS 0 -#define DPRAM_MAGIC_CODE_ADDRESS DPRAM_START_ADDRESS -#define DPRAM_GOTA_MAGIC_CODE_SIZE 0x4 -#define DPRAM_PDA2PHONE_FORMATTED_START_ADDRESS \ - (DPRAM_START_ADDRESS + DPRAM_GOTA_MAGIC_CODE_SIZE) -#define BSP_DPRAM_BASE_SIZE 0x1ff8 -#define DPRAM_END_OF_ADDRESS (BSP_DPRAM_BASE_SIZE - 1) -#define DPRAM_INTERRUPT_SIZE 0x2 -#define DPRAM_PDA2PHONE_INTERRUPT_ADDRESS \ - (DPRAM_START_ADDRESS + BSP_DPRAM_BASE_SIZE - DPRAM_INTERRUPT_SIZE*2) -#define DPRAM_PHONE2PDA_INTERRUPT_ADDRESS \ - (DPRAM_START_ADDRESS + BSP_DPRAM_BASE_SIZE) -#define DPRAM_BUFFER_SIZE \ - (DPRAM_PHONE2PDA_INTERRUPT_ADDRESS -\ - DPRAM_PDA2PHONE_FORMATTED_START_ADDRESS) -#define DPRAM_INDEX_SIZE 0x2 - -#define MAGIC_DMDL 0x4445444C -#define MAGIC_UMDL 0x4445444D - -#define DPRAM_PACKET_DATA_SIZE 0x3f00 -#define DPRAM_PACKET_HEADER_SIZE 0x7 - -#define INT_GOTA_MASK_VALID 0xA000 -#define INT_DPRAM_DUMP_MASK_VALID 0xA000 -#define MASK_CMD_RECEIVE_READY_NOTIFICATION 0xA100 -#define MASK_CMD_DOWNLOAD_START_REQUEST 0xA200 -#define MASK_CMD_DOWNLOAD_START_RESPONSE 0xA301 -#define MASK_CMD_IMAGE_SEND_REQUEST 0xA400 -#define MASK_CMD_IMAGE_SEND_RESPONSE 0xA500 -#define MASK_CMD_SEND_DONE_REQUEST 0xA600 -#define MASK_CMD_SEND_DONE_RESPONSE 0xA701 -#define MASK_CMD_STATUS_UPDATE_NOTIFICATION 0xA800 -#define MASK_CMD_UPDATE_DONE_NOTIFICATION 0xA900 -#define MASK_CMD_EFS_CLEAR_RESPONSE 0xAB00 -#define MASK_CMD_ALARM_BOOT_OK 0xAC00 -#define MASK_CMD_ALARM_BOOT_FAIL 0xAD00 - -#define WRITEIMG_HEADER_SIZE 8 -#define WRITEIMG_TAIL_SIZE 4 -#define WRITEIMG_BODY_SIZE \ - (DPRAM_BUFFER_SIZE - WRITEIMG_HEADER_SIZE - WRITEIMG_TAIL_SIZE) - -#define DPDN_DEFAULT_WRITE_LEN WRITEIMG_BODY_SIZE -#define CMD_DL_START_REQ 0x9200 -#define CMD_IMG_SEND_REQ 0x9400 -#define CMD_DL_SEND_DONE_REQ 0x9600 - -#define CMD_UL_START_REQ 0x9200 -#define CMD_UL_START_READY 0x9400 -#define CMD_UL_SEND_RESP 0x9601 -#define CMD_UL_SEND_DONE_RESP 0x9801 -#define CMD_UL_SEND_REQ 0xA500 -#define CMD_UL_START_RESPONSE 0xA301 -#define CMD_UL_SEND_DONE_REQ 0xA700 -#define CMD_RECEIVE_READY_NOTIFICATION 0xA100 - -#define MASK_CMD_RESULT_FAIL 0x0002 -#define MASK_CMD_RESULT_SUCCESS 0x0001 - -#define START_INDEX 0x007F -#define END_INDEX 0x007E - -#define CMD_IMG_SEND_REQ 0x9400 - -#define CRC_TAB_SIZE 256 -#define CRC_16_L_SEED 0xFFFF - -struct c2c_device { - /* DPRAM memory addresses */ - u16 *in_head_addr; - u16 *in_tail_addr; - u8 *in_buff_addr; - unsigned long in_buff_size; - - u16 *out_head_addr; - u16 *out_tail_addr; - u8 *out_buff_addr; - unsigned long out_buff_size; - - unsigned long in_head_saved; - unsigned long in_tail_saved; - unsigned long out_head_saved; - unsigned long out_tail_saved; - - u16 mask_req_ack; - u16 mask_res_ack; - u16 mask_send; -}; - -struct memory_region { - u8 *control; - u8 *fmt_out; - u8 *raw_out; - u8 *fmt_in; - u8 *raw_in; - u8 *mbx; -}; - -struct UldDataHeader { - u8 bop; - u16 total_frame; - u16 curr_frame; - u16 len; -}; - -struct c2c_link_device { - struct link_device ld; - - struct modem_data *pdata; - - /*only c2c*/ - struct wake_lock c2c_wake_lock; - atomic_t raw_txq_req_ack_rcvd; - atomic_t fmt_txq_req_ack_rcvd; - u8 net_stop_flag; - int phone_sync; - u8 phone_status; - - struct work_struct xmit_work_struct; - - struct workqueue_struct *gota_wq; - struct work_struct gota_cmd_work; - - struct c2c_device dev_map[MAX_IDX]; - - struct wake_lock dumplock; - - u8 c2c_read_data[131072]; - - int c2c_init_cmd_wait_condition; - wait_queue_head_t c2c_init_cmd_wait_q; - - int modem_pif_init_wait_condition; - wait_queue_head_t modem_pif_init_done_wait_q; - - struct completion gota_download_start_complete; - - int gota_send_done_cmd_wait_condition; - wait_queue_head_t gota_send_done_cmd_wait_q; - - int gota_update_done_cmd_wait_condition; - wait_queue_head_t gota_update_done_cmd_wait_q; - - int upload_send_req_wait_condition; - wait_queue_head_t upload_send_req_wait_q; - - int upload_send_done_wait_condition; - wait_queue_head_t upload_send_done_wait_q; - - int upload_start_req_wait_condition; - wait_queue_head_t upload_start_req_wait_q; - - int upload_packet_start_condition; - wait_queue_head_t upload_packet_start_wait_q; - - u16 gota_irq_handler_cmd; - - u16 c2c_dump_handler_cmd; - - int dump_region_number; - - unsigned int is_c2c_err ; - - int c2c_dump_start; - int gota_start; - - char c2c_err_buf[DPRAM_ERR_MSG_LEN]; - - struct fasync_struct *c2c_err_async_q; - - void (*clear_interrupt)(struct c2c_link_device *); - - struct memory_region m_region; - - unsigned long fmt_out_buff_size; - unsigned long raw_out_buff_size; - unsigned long fmt_in_buff_size; - unsigned long raw_in_buff_size; - - struct delayed_work delayed_tx; - struct sk_buff *delayed_skb; - u8 delayed_count; -}; - -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_c2c_link_device(linkdev) \ - container_of(linkdev, struct c2c_link_device, ld) - -#endif diff --git a/drivers/misc/modem_if_u1/modem_link_device_dpram.c b/drivers/misc/modem_if_u1/modem_link_device_dpram.c deleted file mode 100644 index 8b99669..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_dpram.c +++ /dev/null @@ -1,2657 +0,0 @@ -/* - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_prj.h" -#include "modem_link_device_dpram.h" -#include "modem_utils.h" - -static void handle_cp_crash(struct dpram_link_device *dpld); -static void trigger_force_cp_crash(struct dpram_link_device *dpld); - -/** - * set_circ_pointer - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * @dir: direction of communication (TX or RX) - * @ptr: type of the queue pointer (HEAD or TAIL) - * @addr: address of the queue pointer - * @val: value to be written to the queue pointer - * - * Writes a value to a pointer in a circular queue with verification - */ -static inline void set_circ_pointer(struct dpram_link_device *dpld, int id, - int dir, int ptr, void __iomem *addr, u16 val) -{ - struct link_device *ld = &dpld->ld; - int cnt = 0; - u16 saved = 0; - - iowrite16(val, addr); - - while (1) { - /* Check the value written to the address */ - saved = ioread16(addr); - if (likely(saved == val)) - break; - - cnt++; - mif_err("%s: ERR! %s_%s.%s saved(%d) != val(%d), count %d\n", - ld->name, get_dev_name(id), circ_dir(dir), - circ_ptr(ptr), saved, val, cnt); - if (cnt >= MAX_RETRY_CNT) { - trigger_force_cp_crash(dpld); - break; - } - - udelay(100); - - /* Write the value again */ - iowrite16(val, addr); - } -} - -/** - * register_isr - * @irq: IRQ number for a DPRAM interrupt - * @isr: function pointer to an interrupt service routine - * @flags: set of interrupt flags - * @name: name of the interrupt - * @dpld: pointer to an instance of dpram_link_device structure - * - * Registers the ISR for the IRQ number - */ -static int register_isr(unsigned int irq, irqreturn_t (*isr)(int, void*), - unsigned long flags, const char *name, - struct dpram_link_device *dpld) -{ - int ret; - - ret = request_irq(irq, isr, flags, name, dpld); - if (ret) { - mif_info("%s: ERR! request_irq fail (err %d)\n", name, ret); - return ret; - } - - ret = enable_irq_wake(irq); - if (ret) - mif_info("%s: ERR! enable_irq_wake fail (err %d)\n", name, ret); - - mif_info("%s (#%d) handler registered\n", name, irq); - - return 0; -} - -/** - * clear_intr - * @dpld: pointer to an instance of dpram_link_device structure - * - * Clears the CP-to-AP interrupt register in a DPRAM - */ -static inline void clear_intr(struct dpram_link_device *dpld) -{ - if (likely(dpld->need_intr_clear)) - dpld->ext_op->clear_intr(dpld); -} - -/** - * recv_intr - * @dpld: pointer to an instance of dpram_link_device structure - * - * Returns the value of the CP-to-AP interrupt register in a DPRAM - */ -static inline u16 recv_intr(struct dpram_link_device *dpld) -{ - return ioread16(dpld->mbx2ap); -} - -/** - * send_intr - * @dpld: pointer to an instance of dpram_link_device structure - * @mask: value to be written to the AP-to-CP interrupt register in a DPRAM - */ -static inline void send_intr(struct dpram_link_device *dpld, u16 mask) -{ - iowrite16(mask, dpld->mbx2cp); -} - -/** - * get_magic - * @dpld: pointer to an instance of dpram_link_device structure - * - * Returns the value of the "magic code" field in a DPRAM - */ -static inline u16 get_magic(struct dpram_link_device *dpld) -{ - return ioread16(dpld->magic); -} - -/** - * set_magic - * @dpld: pointer to an instance of dpram_link_device structure - * @val: value to be written to the "magic code" field in a DPRAM - */ -static inline void set_magic(struct dpram_link_device *dpld, u16 val) -{ - iowrite16(val, dpld->magic); -} - -/** - * get_access - * @dpld: pointer to an instance of dpram_link_device structure - * - * Returns the value of the "access enable" field in a DPRAM - */ -static inline u16 get_access(struct dpram_link_device *dpld) -{ - return ioread16(dpld->access); -} - -/** - * set_access - * @dpld: pointer to an instance of dpram_link_device structure - * @val: value to be written to the "access enable" field in a DPRAM - */ -static inline void set_access(struct dpram_link_device *dpld, u16 val) -{ - iowrite16(val, dpld->access); -} - -/** - * get_tx_head - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the value of a head (in) pointer in a TX queue - */ -static inline u32 get_tx_head(struct dpram_link_device *dpld, int id) -{ - return ioread16(dpld->dev[id]->txq.head); -} - -/** - * get_tx_tail - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the value of a tail (out) pointer in a TX queue - * - * It is useless for an AP to read a tail pointer in a TX queue twice to verify - * whether or not the value in the pointer is valid, because it can already have - * been updated by a CP after the first access from the AP. - */ -static inline u32 get_tx_tail(struct dpram_link_device *dpld, int id) -{ - return ioread16(dpld->dev[id]->txq.tail); -} - -/** - * set_tx_head - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * @in: value to be written to the head pointer in a TXQ - */ -static inline void set_tx_head(struct dpram_link_device *dpld, int id, u32 in) -{ - set_circ_pointer(dpld, id, TX, HEAD, dpld->dev[id]->txq.head, in); -} - -/** - * set_tx_tail - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * @out: value to be written to the tail pointer in a TXQ - */ -static inline void set_tx_tail(struct dpram_link_device *dpld, int id, u32 out) -{ - set_circ_pointer(dpld, id, TX, TAIL, dpld->dev[id]->txq.tail, out); -} - -/** - * get_tx_buff - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the start address of the buffer in a TXQ - */ -static inline u8 *get_tx_buff(struct dpram_link_device *dpld, int id) -{ - return dpld->dev[id]->txq.buff; -} - -/** - * get_tx_buff_size - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the size of the buffer in a TXQ - */ -static inline u32 get_tx_buff_size(struct dpram_link_device *dpld, int id) -{ - return dpld->dev[id]->txq.size; -} - -/** - * get_rx_head - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the value of a head (in) pointer in an RX queue - * - * It is useless for an AP to read a head pointer in an RX queue twice to verify - * whether or not the value in the pointer is valid, because it can already have - * been updated by a CP after the first access from the AP. - */ -static inline u32 get_rx_head(struct dpram_link_device *dpld, int id) -{ - return ioread16(dpld->dev[id]->rxq.head); -} - -/** - * get_rx_tail - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the value of a tail (in) pointer in an RX queue - */ -static inline u32 get_rx_tail(struct dpram_link_device *dpld, int id) -{ - return ioread16(dpld->dev[id]->rxq.tail); -} - -/** - * set_rx_head - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * @in: value to be written to the head pointer in an RXQ - */ -static inline void set_rx_head(struct dpram_link_device *dpld, int id, u32 in) -{ - set_circ_pointer(dpld, id, TX, HEAD, dpld->dev[id]->rxq.head, in); -} - -/** - * set_rx_tail - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * @out: value to be written to the tail pointer in an RXQ - */ -static inline void set_rx_tail(struct dpram_link_device *dpld, int id, u32 out) -{ - set_circ_pointer(dpld, id, TX, TAIL, dpld->dev[id]->rxq.tail, out); -} - -/** - * get_rx_buff - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the start address of the buffer in an RXQ - */ -static inline u8 *get_rx_buff(struct dpram_link_device *dpld, int id) -{ - return dpld->dev[id]->rxq.buff; -} - -/** - * get_rx_buff_size - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the size of the buffer in an RXQ - */ -static inline u32 get_rx_buff_size(struct dpram_link_device *dpld, int id) -{ - return dpld->dev[id]->rxq.size; -} - -/** - * get_mask_req_ack - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the REQ_ACK mask value for the IPC device - */ -static inline u16 get_mask_req_ack(struct dpram_link_device *dpld, int id) -{ - return dpld->dev[id]->mask_req_ack; -} - -/** - * get_mask_res_ack - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the RES_ACK mask value for the IPC device - */ -static inline u16 get_mask_res_ack(struct dpram_link_device *dpld, int id) -{ - return dpld->dev[id]->mask_res_ack; -} - -/** - * get_mask_send - * @dpld: pointer to an instance of dpram_link_device structure - * @id: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns the SEND mask value for the IPC device - */ -static inline u16 get_mask_send(struct dpram_link_device *dpld, int id) -{ - return dpld->dev[id]->mask_send; -} - -/** - * set_dpram_map - * @dpld: pointer to an instance of dpram_link_device structure - * @map: pointer to an instance of mif_irq_map structure - * - * Sets variables in an mif_irq_map instance as current DPRAM status for IPC - * logging. - */ -static void set_dpram_map(struct dpram_link_device *dpld, - struct mif_irq_map *map) -{ - map->magic = get_magic(dpld); - map->access = get_access(dpld); - - map->fmt_tx_in = get_tx_head(dpld, IPC_FMT); - map->fmt_tx_out = get_tx_tail(dpld, IPC_FMT); - map->fmt_rx_in = get_rx_head(dpld, IPC_FMT); - map->fmt_rx_out = get_rx_tail(dpld, IPC_FMT); - map->raw_tx_in = get_tx_head(dpld, IPC_RAW); - map->raw_tx_out = get_tx_tail(dpld, IPC_RAW); - map->raw_rx_in = get_rx_head(dpld, IPC_RAW); - map->raw_rx_out = get_rx_tail(dpld, IPC_RAW); - - map->cp2ap = recv_intr(dpld); -} - -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP -/** - * log_dpram_status - * @dpld: pointer to an instance of dpram_link_device structure - * @str: pointer to a string that will be printed with a DPRAM status log - * - * Prints current DPRAM status with a string to a kernel log. - */ -static inline void log_dpram_status(struct dpram_link_device *dpld, char *str) -{ - struct utc_time utc; - - get_utc_time(&utc); - - pr_info("%s: %s: %s: [%02d:%02d:%02d.%03d] " - "ACC{%X %d} FMT{TI:%u TO:%u RI:%u RO:%u} " - "RAW{TI:%u TO:%u RI:%u RO:%u} INTR{0x%X}\n", - MIF_TAG, dpld->ld.mc->name, str, - utc.hour, utc.min, utc.sec, utc.msec, - get_magic(dpld), get_access(dpld), - get_tx_head(dpld, IPC_FMT), get_tx_tail(dpld, IPC_FMT), - get_rx_head(dpld, IPC_FMT), get_rx_tail(dpld, IPC_FMT), - get_tx_head(dpld, IPC_RAW), get_tx_tail(dpld, IPC_RAW), - get_rx_head(dpld, IPC_RAW), get_rx_tail(dpld, IPC_RAW), - recv_intr(dpld)); -} - -/** - * save_dpram_dump_work - * @work: pointer to an instance of work_struct structure - * - * Performs actual file operation for saving a DPRAM dump. - */ -static void save_dpram_dump_work(struct work_struct *work) -{ - struct dpram_link_device *dpld; - struct link_device *ld; - struct trace_queue *trq; - struct trace_data *trd; - struct file *fp; - struct timespec *ts; - u8 *dump; - int rcvd; - char *path; - struct utc_time utc; - - dpld = container_of(work, struct dpram_link_device, dump_dwork.work); - ld = &dpld->ld; - trq = &dpld->dump_list; - path = dpld->dump_path; - - while (1) { - trd = trq_get_data_slot(trq); - if (!trd) - break; - - ts = &trd->ts; - dump = trd->data; - rcvd = trd->size; - - ts2utc(ts, &utc); - snprintf(path, MIF_MAX_PATH_LEN, - "%s/%s_dump_%d%02d%02d-%02d%02d%02d", - MIF_LOG_DIR, ld->name, utc.year, utc.mon, utc.day, - utc.hour, utc.min, utc.sec); - - fp = mif_open_file(path); - if (fp) { - mif_save_file(fp, dump, rcvd); - mif_close_file(fp); - } else { - mif_err("%s: ERR! %s open fail\n", ld->name, path); - mif_print_dump(dump, rcvd, 16); - } - - kfree(dump); - } -} - -/** - * save_dpram_dump - * @dpld: pointer to an instance of dpram_link_device structure - * - * Saves a current DPRAM dump. - * - * Actual file operation (save) will be performed by save_dpram_dump_work() that - * is invoked by a delayed work. - */ -static void save_dpram_dump(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - struct trace_data *trd; - u8 *buff; - struct timespec ts; - - buff = kzalloc(dpld->size, GFP_ATOMIC); - if (!buff) { - mif_err("%s: ERR! kzalloc fail\n", ld->name); - return; - } - - getnstimeofday(&ts); - - memcpy(buff, dpld->base, dpld->size); - - trd = trq_get_free_slot(&dpld->dump_list); - if (!trd) { - mif_err("%s: ERR! trq_get_free_slot fail\n", ld->name); - mif_print_dump(buff, dpld->size, 16); - kfree(buff); - return; - } - - memcpy(&trd->ts, &ts, sizeof(struct timespec)); - trd->data = buff; - trd->size = dpld->size; - - queue_delayed_work(system_nrt_wq, &dpld->dump_dwork, 0); -} - -/** - * pr_trace - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * @ts: pointer to an instance of timespec structure - * @buff: start address of a buffer into which RX IPC messages were copied - * @rcvd: size of data in the buffer - * - * Prints IPC messages in a local memory buffer to a kernel log. - */ -static void pr_trace(struct dpram_link_device *dpld, int dev, - struct timespec *ts, u8 *buff, u32 rcvd) -{ - struct link_device *ld = &dpld->ld; - struct utc_time utc; - - ts2utc(ts, &utc); - - pr_info("%s: [%d-%02d-%02d %02d:%02d:%02d.%03d] %s trace (%s)\n", - MIF_TAG, utc.year, utc.mon, utc.day, utc.hour, utc.min, utc.sec, - utc.msec, get_dev_name(dev), ld->name); - - mif_print_dump(buff, rcvd, 4); - - return; -} - -/** - * print_ipc_trace - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * @stat: pointer to an instance of dpram_circ_status structure - * - * Prints IPC messages currently in an RX circular queue to a kernel log. - */ -static void print_ipc_trace(struct dpram_link_device *dpld, int dev, - struct dpram_circ_status *stat) -{ - u8 *buff = dpld->buff; - struct timespec ts; - - getnstimeofday(&ts); - - /* Copy IPC messages from a DPRAM RXQ to a local buffer */ - memset(buff, 0, dpld->size); - circ_read(buff, stat->buff, stat->qsize, stat->out, stat->size); - - /* Print IPC messages in the local buffer to a kernel log */ - pr_trace(dpld, dev, &ts, buff, stat->size); -} - -/** - * save_ipc_trace_work - * @work: pointer to an instance of work_struct structure - * - * Performs actual file operation for saving RX IPC trace. - */ -static void save_ipc_trace_work(struct work_struct *work) -{ - struct dpram_link_device *dpld; - struct link_device *ld; - struct trace_queue *trq; - struct trace_data *trd; - struct file *fp; - struct timespec *ts; - int dev; - u8 *dump; - int rcvd; - u8 *buff; - char *path; - struct utc_time utc; - - dpld = container_of(work, struct dpram_link_device, trace_dwork.work); - ld = &dpld->ld; - trq = &dpld->trace_list; - path = dpld->trace_path; - - buff = kzalloc(dpld->size << 3, GFP_KERNEL); - if (!buff) { - while (1) { - trd = trq_get_data_slot(trq); - if (!trd) - break; - - ts = &trd->ts; - dev = trd->dev; - dump = trd->data; - rcvd = trd->size; - pr_trace(dpld, dev, ts, dump, rcvd); - - kfree(dump); - } - return; - } - - while (1) { - trd = trq_get_data_slot(trq); - if (!trd) - break; - - ts = &trd->ts; - dev = trd->dev; - dump = trd->data; - rcvd = trd->size; - - ts2utc(ts, &utc); - snprintf(path, MIF_MAX_PATH_LEN, - "%s/%s_%s_%d%02d%02d-%02d%02d%02d", - MIF_LOG_DIR, ld->name, get_dev_name(dev), - utc.year, utc.mon, utc.day, utc.hour, utc.min, utc.sec); - - fp = mif_open_file(path); - if (fp) { - int len; - - snprintf(buff, MIF_MAX_PATH_LEN, - "[%d-%02d-%02d %02d:%02d:%02d.%03d]\n", - utc.year, utc.mon, utc.day, utc.hour, utc.min, - utc.sec, utc.msec); - len = strlen(buff); - mif_dump2format4(dump, rcvd, (buff + len), NULL); - strcat(buff, "\n"); - len = strlen(buff); - - mif_save_file(fp, buff, len); - - memset(buff, 0, len); - mif_close_file(fp); - } else { - mif_err("%s: %s open fail\n", ld->name, path); - pr_trace(dpld, dev, ts, dump, rcvd); - } - - kfree(dump); - } - - kfree(buff); -} - -/** - * save_ipc_trace - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * @stat: pointer to an instance of dpram_circ_status structure - * - * Saves IPC messages currently in an RX circular queue. - * - * Actual file operation (save) will be performed by save_ipc_trace_work() that - * is invoked by a delayed work. - */ -static void save_ipc_trace(struct dpram_link_device *dpld, int dev, - struct dpram_circ_status *stat) -{ - struct link_device *ld = &dpld->ld; - struct trace_data *trd; - u8 *buff; - struct timespec ts; - - buff = kzalloc(stat->size, GFP_ATOMIC); - if (!buff) { - mif_err("%s: %s: ERR! kzalloc fail\n", - ld->name, get_dev_name(dev)); - print_ipc_trace(dpld, dev, stat); - return; - } - - getnstimeofday(&ts); - - circ_read(buff, stat->buff, stat->qsize, stat->out, stat->size); - - trd = trq_get_free_slot(&dpld->trace_list); - if (!trd) { - mif_err("%s: %s: ERR! trq_get_free_slot fail\n", - ld->name, get_dev_name(dev)); - pr_trace(dpld, dev, &ts, buff, stat->size); - kfree(buff); - return; - } - - memcpy(&trd->ts, &ts, sizeof(struct timespec)); - trd->dev = dev; - trd->data = buff; - trd->size = stat->size; - - queue_delayed_work(system_nrt_wq, &dpld->trace_dwork, 0); -} -#endif - -/** - * check_magic_access - * @dpld: pointer to an instance of dpram_link_device structure - * - * Returns 0 if the "magic code" and "access enable" values are valid, otherwise - * returns -EACCES. - */ -static int check_magic_access(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - int i; - u16 magic = get_magic(dpld); - u16 access = get_access(dpld); - - /* Returns 0 if the "magic code" and "access enable" are valid */ - if (likely(magic == DPRAM_MAGIC_CODE && access == 1)) - return 0; - - /* Retry up to 100 times with 100 us delay per each retry */ - for (i = 1; i <= 100; i++) { - mif_info("%s: magic:%X access:%X -> retry:%d\n", - ld->name, magic, access, i); - udelay(100); - - magic = get_magic(dpld); - access = get_access(dpld); - if (likely(magic == DPRAM_MAGIC_CODE && access == 1)) - return 0; - } - - mif_info("%s: !CRISIS! magic:%X access:%X\n", ld->name, magic, access); - return -EACCES; -} - -/** - * ipc_active - * @dpld: pointer to an instance of dpram_link_device structure - * - * Returns whether or not IPC via the dpram_link_device instance is possible. - */ -static bool ipc_active(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - - /* Check DPRAM mode */ - if (ld->mode != LINK_MODE_IPC) { - mif_err("%s: ERR! <%pf> ld->mode != LINK_MODE_IPC\n", - ld->name, __builtin_return_address(0)); - return false; - } - - /* Check "magic code" and "access enable" values */ - if (check_magic_access(dpld) < 0) { - mif_err("%s: ERR! <%pf> check_magic_access fail\n", - ld->name, __builtin_return_address(0)); - return false; - } - - return true; -} - -/** - * dpram_can_sleep - * @dpld: pointer to an instance of dpram_link_device structure - * - * Returns tha value of the "need_wake_up" variable in a dpram_link_device - * instance that is set in dpram_create_link_device(). - */ -static inline bool dpram_can_sleep(struct dpram_link_device *dpld) -{ - return dpld->need_wake_up; -} - -/** - * dpram_wake_up - * @dpld: pointer to an instance of dpram_link_device structure - * - * Wakes up a DPRAM if it can sleep and increases the "accessing" counter in the - * dpram_link_device instance. - * - * CAUTION!!! dpram_allow_sleep() MUST be invoked after dpram_wake_up() success - * to decrease the "accessing" counter. - */ -static int dpram_wake_up(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - - if (unlikely(!dpram_can_sleep(dpld))) - return 0; - - if (dpld->ext_op->wakeup(dpld) < 0) { - mif_err("%s: ERR! <%pf> wakeup fail, once\n", - ld->name, __builtin_return_address(0)); - - dpld->ext_op->sleep(dpld); - - udelay(10); - - if (dpld->ext_op->wakeup(dpld) < 0) { - mif_err("%s: ERR! <%pf> wakeup fail, twice\n", - ld->name, __builtin_return_address(0)); - return -EACCES; - } - } - - atomic_inc(&dpld->accessing); - return 0; -} - -/** - * dpram_allow_sleep - * @dpld: pointer to an instance of dpram_link_device structure - * - * Decreases the "accessing" counter in the dpram_link_device instance if it can - * sleep and allows the DPRAM to sleep only if the value of "accessing" counter - * is less than or equal to 0. - * - * MUST be invoked after dpram_wake_up() success to decrease the "accessing" - * counter. - */ -static void dpram_allow_sleep(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - - if (unlikely(!dpram_can_sleep(dpld))) - return; - - if (atomic_dec_return(&dpld->accessing) <= 0) { - dpld->ext_op->sleep(dpld); - atomic_set(&dpld->accessing, 0); - mif_debug("%s: DPRAM sleep possible\n", ld->name); - } -} - -/** - * handle_no_cp_crash_ack - * @arg: pointer to an instance of dpram_link_device structure - * - * Invokes handle_cp_crash() to enter the CRASH_EXIT state if there was no - * CRASH_ACK from a CP in FORCE_CRASH_ACK_TIMEOUT. - */ -static void handle_no_cp_crash_ack(unsigned long arg) -{ - struct dpram_link_device *dpld = (struct dpram_link_device *)arg; - struct link_device *ld = &dpld->ld; - - mif_err("%s: ERR! No CRASH_EXIT ACK from CP\n", ld->mc->name); - - if (!wake_lock_active(&dpld->wlock)) - wake_lock(&dpld->wlock); - - handle_cp_crash(dpld); -} - -/** - * trigger_force_cp_crash - * @dpld: pointer to an instance of dpram_link_device structure - * - * Triggers an enforced CP crash. - */ -static void trigger_force_cp_crash(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - - if (ld->mode == LINK_MODE_ULOAD) { - mif_err("%s: CP crash is already in progress\n", ld->mc->name); - return; - } - - disable_irq_nosync(dpld->irq); - - ld->mode = LINK_MODE_ULOAD; - mif_info("%s: called by %pf\n", ld->name, __builtin_return_address(0)); - - dpram_wake_up(dpld); -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - /* Take a DPRAM dump */ - save_dpram_dump(dpld); -#endif - - enable_irq(dpld->irq); - - /* Send CRASH_EXIT command to a CP */ - send_intr(dpld, INT_CMD(INT_CMD_CRASH_EXIT)); - - /* If there is no CRASH_ACK from a CP in FORCE_CRASH_ACK_TIMEOUT, - handle_no_cp_crash_ack() will be executed. */ - mif_add_timer(&dpld->crash_ack_timer, FORCE_CRASH_ACK_TIMEOUT, - handle_no_cp_crash_ack, (unsigned long)dpld); - - return; -} - -/** - * ext_command_handler - * @dpld: pointer to an instance of dpram_link_device structure - * @cmd: extended DPRAM command from a CP - * - * Processes an extended command from a CP - */ -static void ext_command_handler(struct dpram_link_device *dpld, u16 cmd) -{ - struct link_device *ld = &dpld->ld; - u16 resp; - - switch (EXT_CMD_MASK(cmd)) { - case EXT_CMD_SET_SPEED_LOW: - if (dpld->dpctl->setup_speed) { - dpld->dpctl->setup_speed(DPRAM_SPEED_LOW); - resp = INT_EXT_CMD(EXT_CMD_SET_SPEED_LOW); - send_intr(dpld, resp); - } - break; - - case EXT_CMD_SET_SPEED_MID: - if (dpld->dpctl->setup_speed) { - dpld->dpctl->setup_speed(DPRAM_SPEED_MID); - resp = INT_EXT_CMD(EXT_CMD_SET_SPEED_MID); - send_intr(dpld, resp); - } - break; - - case EXT_CMD_SET_SPEED_HIGH: - if (dpld->dpctl->setup_speed) { - dpld->dpctl->setup_speed(DPRAM_SPEED_HIGH); - resp = INT_EXT_CMD(EXT_CMD_SET_SPEED_HIGH); - send_intr(dpld, resp); - } - break; - - default: - mif_info("%s: unknown command 0x%04X\n", ld->name, cmd); - break; - } -} - -/** - * udl_command_handler - * @dpld: pointer to an instance of dpram_link_device structure - * @cmd: DPRAM upload/download command from a CP - * - * Processes a command for upload/download from a CP - */ -static void udl_command_handler(struct dpram_link_device *dpld, u16 cmd) -{ - struct link_device *ld = &dpld->ld; - - if (cmd & UDL_RESULT_FAIL) { - mif_info("%s: ERR! Command failed: %04x\n", ld->name, cmd); - return; - } - - switch (UDL_CMD_MASK(cmd)) { - case UDL_CMD_RECV_READY: - mif_debug("%s: Send CP-->AP RECEIVE_READY\n", ld->name); - send_intr(dpld, CMD_IMG_START_REQ); - break; - default: - complete_all(&dpld->udl_cmd_complete); - } -} - -/** - * cmd_req_active_handler - * @dpld: pointer to an instance of dpram_link_device structure - * - * Handles the REQ_ACTIVE command from a CP. - */ -static void cmd_req_active_handler(struct dpram_link_device *dpld) -{ - send_intr(dpld, INT_CMD(INT_CMD_RES_ACTIVE)); -} - -/** - * cmd_crash_reset_handler - * @dpld: pointer to an instance of dpram_link_device structure - * - * Handles the CRASH_RESET command from a CP. - */ -static void cmd_crash_reset_handler(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - struct io_device *iod = NULL; - int i; - - ld->mode = LINK_MODE_ULOAD; - - if (!wake_lock_active(&dpld->wlock)) - wake_lock(&dpld->wlock); - - /* Stop network interfaces */ - mif_netif_stop(ld); - - /* Purge the skb_txq in every IPC device (IPC_FMT, IPC_RAW, etc.) */ - for (i = 0; i < ld->max_ipc_dev; i++) - skb_queue_purge(ld->skb_txq[i]); - - mif_err("%s: Recv 0xC7 (CRASH_RESET)\n", ld->name); - - /* Change the modem state to STATE_CRASH_RESET for the FMT IO device */ - iod = link_get_iod_with_format(ld, IPC_FMT); - iod->modem_state_changed(iod, STATE_CRASH_RESET); - - /* Change the modem state to STATE_CRASH_RESET for the BOOT IO device */ - iod = link_get_iod_with_format(ld, IPC_BOOT); - iod->modem_state_changed(iod, STATE_CRASH_RESET); -} - -/** - * handle_cp_crash - * @dpld: pointer to an instance of dpram_link_device structure - * - * Actual handler for the CRASH_EXIT command from a CP. - */ -static void handle_cp_crash(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - struct io_device *iod; - int i; - - /* Stop network interfaces */ - mif_netif_stop(ld); - - /* Purge the skb_txq in every IPC device (IPC_FMT, IPC_RAW, etc.) */ - for (i = 0; i < ld->max_ipc_dev; i++) - skb_queue_purge(ld->skb_txq[i]); - - /* Change the modem state to STATE_CRASH_EXIT for the FMT IO device */ - iod = link_get_iod_with_format(ld, IPC_FMT); - iod->modem_state_changed(iod, STATE_CRASH_EXIT); - - /* Change the modem state to STATE_CRASH_EXIT for the BOOT IO device */ - iod = link_get_iod_with_format(ld, IPC_BOOT); - iod->modem_state_changed(iod, STATE_CRASH_EXIT); -} - -/** - * cmd_crash_exit_handler - * @dpld: pointer to an instance of dpram_link_device structure - * - * Handles the CRASH_EXIT command from a CP. - */ -static void cmd_crash_exit_handler(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - - ld->mode = LINK_MODE_ULOAD; - - if (!wake_lock_active(&dpld->wlock)) - wake_lock(&dpld->wlock); - - del_timer(&dpld->crash_ack_timer); - - dpram_wake_up(dpld); -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - save_dpram_dump(dpld); -#endif - - if (dpld->ext_op && dpld->ext_op->crash_log) - dpld->ext_op->crash_log(dpld); - - mif_err("%s: Recv 0xC9 (CRASH_EXIT)\n", ld->name); - - handle_cp_crash(dpld); -} - -/** - * init_dpram_ipc - * @dpld: pointer to an instance of dpram_link_device structure - * - * Initializes IPC via DPRAM. - */ -static int init_dpram_ipc(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - int i; - - if (ld->mode == LINK_MODE_IPC && - get_magic(dpld) == DPRAM_MAGIC_CODE && - get_access(dpld) == 1) - mif_info("%s: IPC already initialized\n", ld->name); - - /* Clear pointers in every circular queue */ - for (i = 0; i < ld->max_ipc_dev; i++) { - set_tx_head(dpld, i, 0); - set_tx_tail(dpld, i, 0); - set_rx_head(dpld, i, 0); - set_rx_tail(dpld, i, 0); - } - - /* Initialize variables for efficient TX/RX processing */ - for (i = 0; i < ld->max_ipc_dev; i++) - dpld->iod[i] = link_get_iod_with_format(ld, i); - dpld->iod[IPC_RAW] = link_get_iod_with_format(ld, IPC_MULTI_RAW); - - if (dpld->iod[IPC_RAW]->recv_skb) - dpld->rx_with_skb = true; - - for (i = 0; i < ld->max_ipc_dev; i++) { - spin_lock_init(&dpld->tx_lock[i]); - atomic_set(&dpld->res_required[i], 0); - } - - /* Enable IPC */ - if (wake_lock_active(&dpld->wlock)) - wake_unlock(&dpld->wlock); - - atomic_set(&dpld->accessing, 0); - - set_magic(dpld, DPRAM_MAGIC_CODE); - set_access(dpld, 1); - if (get_magic(dpld) != DPRAM_MAGIC_CODE || get_access(dpld) != 1) - return -EACCES; - - ld->mode = LINK_MODE_IPC; - - return 0; -} - -/** - * cmd_phone_start_handler - * @dpld: pointer to an instance of dpram_link_device structure - * - * Handles the PHONE_START command from a CP. - */ -static void cmd_phone_start_handler(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - struct io_device *iod = NULL; - - mif_info("%s: Recv 0xC8 (CP_START)\n", ld->name); - - init_dpram_ipc(dpld); - - iod = link_get_iod_with_format(ld, IPC_FMT); - if (!iod) { - mif_info("%s: ERR! no iod\n", ld->name); - return; - } - - if (dpld->ext_op && dpld->ext_op->cp_start_handler) - dpld->ext_op->cp_start_handler(dpld); - - if (ld->mc->phone_state != STATE_ONLINE) { - mif_info("%s: phone_state: %d -> ONLINE\n", - ld->name, ld->mc->phone_state); - iod->modem_state_changed(iod, STATE_ONLINE); - } - - mif_info("%s: Send 0xC2 (INIT_END)\n", ld->name); - send_intr(dpld, INT_CMD(INT_CMD_INIT_END)); -} - -/** - * command_handler: processes a DPRAM command from a CP - * @dpld: pointer to an instance of dpram_link_device structure - * @cmd: DPRAM command from a CP - */ -static void command_handler(struct dpram_link_device *dpld, u16 cmd) -{ - struct link_device *ld = &dpld->ld; - - switch (INT_CMD_MASK(cmd)) { - case INT_CMD_REQ_ACTIVE: - cmd_req_active_handler(dpld); - break; - - case INT_CMD_CRASH_RESET: - dpld->init_status = DPRAM_INIT_STATE_NONE; - cmd_crash_reset_handler(dpld); - break; - - case INT_CMD_CRASH_EXIT: - dpld->init_status = DPRAM_INIT_STATE_NONE; - cmd_crash_exit_handler(dpld); - break; - - case INT_CMD_PHONE_START: - dpld->init_status = DPRAM_INIT_STATE_READY; - cmd_phone_start_handler(dpld); - complete_all(&dpld->dpram_init_cmd); - break; - - case INT_CMD_NV_REBUILDING: - mif_info("%s: NV_REBUILDING\n", ld->name); - break; - - case INT_CMD_PIF_INIT_DONE: - complete_all(&dpld->modem_pif_init_done); - break; - - case INT_CMD_SILENT_NV_REBUILDING: - mif_info("%s: SILENT_NV_REBUILDING\n", ld->name); - break; - - case INT_CMD_NORMAL_PWR_OFF: - /*ToDo:*/ - /*kernel_sec_set_cp_ack()*/; - break; - - case INT_CMD_REQ_TIME_SYNC: - case INT_CMD_CP_DEEP_SLEEP: - case INT_CMD_EMER_DOWN: - break; - - default: - mif_info("%s: unknown command 0x%04X\n", ld->name, cmd); - } -} - -/** - * ipc_rx_task - * @data: pointer to an instance of dpram_link_device structure - * - * Invokes the recv method in the io_device instance to perform receiving IPC - * messages from each mif_rxb. - */ -static void ipc_rx_task(unsigned long data) -{ - struct dpram_link_device *dpld = (struct dpram_link_device *)data; - struct link_device *ld = &dpld->ld; - struct io_device *iod; - struct mif_rxb *rxb; - int qlen; - int i; - - for (i = 0; i < ld->max_ipc_dev; i++) { - iod = dpld->iod[i]; - qlen = rxbq_size(&dpld->rxbq[i]); - while (qlen > 0) { - rxb = rxbq_get_data_rxb(&dpld->rxbq[i]); - iod->recv(iod, ld, rxb->data, rxb->len); - rxb_clear(rxb); - qlen--; - } - } -} - -/** - * get_rxq_rcvd - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * OUT @stat: pointer to an instance of dpram_circ_status structure - * - * Stores {start address of the buffer in a RXQ, size of the buffer, in & out - * pointer values, size of received data} into the 'stat' instance. - * - * Returns the size of received data in the buffer or an error code. - */ -static int get_rxq_rcvd(struct dpram_link_device *dpld, int dev, - struct dpram_circ_status *stat) -{ - struct link_device *ld = &dpld->ld; - int cnt = 0; - u32 qsize; - u32 head; - u32 tail; - int rcvd; - - while (1) { - qsize = get_rx_buff_size(dpld, dev); - head = get_rx_head(dpld, dev); - tail = get_rx_tail(dpld, dev); - rcvd = circ_get_usage(qsize, head, tail); - - mif_debug("%s: %s_RXQ qsize[%u] in[%u] out[%u] rcvd[%u]\n", - ld->name, get_dev_name(dev), qsize, head, tail, rcvd); - - if (circ_valid(qsize, head, tail)) - break; - - cnt++; - mif_err("%s: ERR! <%pf> " - "%s_RXQ invalid (qsize:%d in:%d out:%d rcvd:%d), " - "count %d\n", - ld->name, __builtin_return_address(0), - get_dev_name(dev), qsize, head, tail, rcvd, cnt); - if (cnt >= MAX_RETRY_CNT) { - rcvd = -EIO; - break; - } - - udelay(100); - } - - stat->buff = get_rx_buff(dpld, dev); - stat->qsize = qsize; - stat->in = head; - stat->out = tail; - stat->size = rcvd; - - return rcvd; -} - -/** - * recv_ipc_with_rxb: receives IPC messages from an RXQ with mif_rxb - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns - * ret < 0 : error - * ret == 0 : no data - * ret > 0 : valid data - * - * Requires a bottom half (e.g. ipc_rx_task) that will invoke the recv method in - * the io_device instance. - */ -static int recv_ipc_with_rxb(struct dpram_link_device *dpld, int dev) -{ - struct link_device *ld = &dpld->ld; - struct mif_rxb *rxb; - struct dpram_circ_status stat; - int rcvd; - u8 *dst; - struct mif_irq_map map; - - rcvd = get_rxq_rcvd(dpld, dev, &stat); - if (unlikely(rcvd <= 0)) { -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - if (rcvd < 0) - trigger_force_cp_crash(dpld); -#endif - goto exit; - } - - if (dev == IPC_FMT) { -#if 0 - log_dpram_status(dpld, "CP2MIF"); -#endif - set_dpram_map(dpld, &map); - mif_irq_log(ld->mc->msd, map, "ipc_recv", sizeof("ipc_recv")); - } - - /* Allocate an rxb */ - rxb = rxbq_get_free_rxb(&dpld->rxbq[dev]); - if (!rxb) { - mif_info("%s: ERR! %s rxbq_get_free_rxb fail\n", - ld->name, get_dev_name(dev)); - rcvd = -ENOMEM; - goto exit; - } - - /* Read data from the RXQ */ - dst = rxb_put(rxb, stat.size); - circ_read(dst, stat.buff, stat.qsize, stat.out, stat.size); - -exit: - /* Update tail (out) pointer to empty out the RXQ */ - set_rx_tail(dpld, dev, stat.in); - - return rcvd; -} - -/** - * recv_ipc_with_skb: receives SIPC5 messages from an RXQ with skb - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Returns - * ret < 0 : error - * ret == 0 : no data - * ret > 0 : valid data - * - * Requires a recv_skb method in the io_device instance, so this function must - * be used for only SIPC5. - */ -static int recv_ipc_with_skb(struct dpram_link_device *dpld, int dev) -{ - struct link_device *ld = &dpld->ld; - struct io_device *iod = dpld->iod[dev]; - struct sk_buff *skb; - /** - * variables for the status of the circular queue - */ - u8 __iomem *src; - struct dpram_circ_status stat; - /** - * variables for RX processing - */ - int qsize; /* size of the queue */ - int rcvd; /* size of data in the RXQ or error */ - int rest; /* size of the rest data */ - int idx; /* index to the start of current frame */ - u8 *frm; /* pointer to current frame */ - u8 *dst; /* pointer to the destination buffer */ - int len; /* length of current frame */ - int tot; /* total length including padding data */ - /** - * variables for debug logging - */ - struct mif_irq_map map; - - /* Get data size in the RXQ and in/out pointer values */ - rcvd = get_rxq_rcvd(dpld, dev, &stat); - if (unlikely(rcvd <= 0)) { -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - if (rcvd < 0) - trigger_force_cp_crash(dpld); -#endif - goto exit; - } - - /* Take a log for debugging */ - if (dev == IPC_FMT) { -#if 0 - log_dpram_status(dpld, "CP2MIF"); -#endif - set_dpram_map(dpld, &map); - mif_irq_log(ld->mc->msd, map, "ipc_recv", sizeof("ipc_recv")); - } - - src = stat.buff; - qsize = stat.qsize; - rest = stat.size; - idx = stat.out; - - while (rest > 0) { - /* Calculate the start of an SIPC5 frame */ - frm = src + idx; - - /* Check the SIPC5 frame */ - len = sipc5_check_frame_in_dev(ld, dev, frm, rest); - if (len <= 0) { -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - log_dpram_status(dpld, "CP2MIF"); - save_ipc_trace(dpld, dev, &stat); - trigger_force_cp_crash(dpld); -#endif - rcvd = -EBADMSG; - goto exit; - } - - /* Calculate total length of the frame (data + padding) */ - tot = len + sipc5_calc_padding_size(len); - - /* Allocate an skb */ - skb = dev_alloc_skb(tot); - if (!skb) { - mif_err("%s: ERR! %s dev_alloc_skb fail\n", - ld->name, get_dev_name(dev)); - rcvd = -ENOMEM; - goto exit; - } - - /* Read the frame from the RXQ */ - dst = skb_put(skb, tot); - circ_read(dst, src, qsize, idx, tot); - -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - /* Take a log for debugging */ - if (unlikely(dev == IPC_FMT)) { - char str[MIF_MAX_STR_LEN]; - snprintf(str, MIF_MAX_STR_LEN, "%s: CP2MIF", - ld->mc->name); - pr_ipc(str, skb->data, (skb->len > 20 ? 20 : skb->len)); - } -#endif - -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - /* Verify data copied to the skb */ - if (ld->aligned && memcmp16_to_io(frm, dst, 4)) { - mif_err("%s: memcmp16_to_io fail\n", ld->name); - trigger_force_cp_crash(dpld); - rcvd = -EIO; - goto exit; - } -#endif - - /* Remove padding in the skb */ - skb_trim(skb, len); - - /* Pass the frame to the corresponding IO device */ - iod->recv_skb(iod, ld, skb); - - /* Calculate new idx value */ - rest -= tot; - idx += tot; - if (idx >= qsize) - idx -= qsize; - } - -exit: - /* Update tail (out) pointer to empty out the RXQ */ - set_rx_tail(dpld, dev, stat.in); - - return rcvd; -} - -/** - * recv_ipc_msg: receives IPC messages from every RXQ - * @dpld: pointer to an instance of dpram_link_device structure - * @intr: interrupt value from a CP - * - * 1) Receives all IPC message frames currently in every DPRAM RXQ. - * 2) Sends RES_ACK responses if there are REQ_ACK requests from a CP. - * 3) Completes all threads waiting for the corresponding RES_ACK from a CP if - * there is any RES_ACK response. - */ -static void recv_ipc_msg(struct dpram_link_device *dpld, u16 intr) -{ - struct link_device *ld = &dpld->ld; - int i = 0; - int ret = 0; - u16 mask = 0; - - if (!ipc_active(dpld)) - return; - - /* Read data from DPRAM */ - for (i = 0; i < ld->max_ipc_dev; i++) { - if (dpld->rx_with_skb) - ret = recv_ipc_with_skb(dpld, i); - else - ret = recv_ipc_with_rxb(dpld, i); - - /* Check and process REQ_ACK (at this time, in == out) */ - if (intr & get_mask_req_ack(dpld, i)) { - mif_debug("%s: send %s_RES_ACK\n", - ld->name, get_dev_name(i)); - mask |= get_mask_res_ack(dpld, i); - } - } - - if (!dpld->rx_with_skb) { - /* Schedule soft IRQ for RX */ - tasklet_hi_schedule(&dpld->rx_tsk); - } - - if (mask) { - send_intr(dpld, INT_NON_CMD(mask)); - mif_debug("%s: send intr 0x%04X\n", ld->name, mask); - } - - if (intr && INT_MASK_RES_ACK_SET) { - if (intr && INT_MASK_RES_ACK_R) - complete_all(&dpld->req_ack_cmpl[IPC_RAW]); - else if (intr && INT_MASK_RES_ACK_F) - complete_all(&dpld->req_ack_cmpl[IPC_FMT]); - else - complete_all(&dpld->req_ack_cmpl[IPC_RFS]); - } -} - -/** - * cmd_msg_handler: processes a DPRAM command or receives IPC messages - * @dpld: pointer to an instance of dpram_link_device structure - * @intr: interrupt value from a CP - * - * Invokes command_handler for a DPRAM command or recv_ipc_msg for IPC messages. - */ -static inline void cmd_msg_handler(struct dpram_link_device *dpld, u16 intr) -{ - if (unlikely(INT_CMD_VALID(intr))) - command_handler(dpld, intr); - else - recv_ipc_msg(dpld, intr); -} - -/** - * intr_handler: processes an interrupt from a CP - * @dpld: pointer to an instance of dpram_link_device structure - * @intr: interrupt value from a CP - * - * Call flow for normal interrupt handling: - * cmd_msg_handler -> command_handler -> cmd_xxx_handler - * cmd_msg_handler -> recv_ipc_msg -> recv_ipc_with_skb/recv_ipc_with_rxb ... - */ -static inline void intr_handler(struct dpram_link_device *dpld, u16 intr) -{ - char *name = dpld->ld.name; - - if (unlikely(intr == INT_POWERSAFE_FAIL)) { - mif_info("%s: intr == INT_POWERSAFE_FAIL\n", name); - return; - } - - if (unlikely(EXT_UDL_CMD(intr))) { - if (likely(EXT_INT_VALID(intr))) { - if (UDL_CMD_VALID(intr)) - udl_command_handler(dpld, intr); - else if (EXT_CMD_VALID(intr)) - ext_command_handler(dpld, intr); - else - mif_info("%s: ERR! invalid intr 0x%04X\n", - name, intr); - } else { - mif_info("%s: ERR! invalid intr 0x%04X\n", name, intr); - } - - return; - } - - if (likely(INT_VALID(intr))) - cmd_msg_handler(dpld, intr); - else - mif_info("%s: ERR! invalid intr 0x%04X\n", name, intr); -} - -/** - * ap_idpram_irq_handler: interrupt handler for an internal DPRAM in an AP - * @irq: IRQ number - * @data: pointer to a data - * - * 1) Reads the interrupt value - * 2) Performs interrupt handling - */ -static irqreturn_t ap_idpram_irq_handler(int irq, void *data) -{ - struct dpram_link_device *dpld = (struct dpram_link_device *)data; - struct link_device *ld = (struct link_device *)&dpld->ld; - u16 int2ap = recv_intr(dpld); - - if (unlikely(ld->mode == LINK_MODE_OFFLINE)) - return IRQ_HANDLED; - - intr_handler(dpld, int2ap); - - return IRQ_HANDLED; -} - -/** - * cp_idpram_irq_handler: interrupt handler for an internal DPRAM in a CP - * @irq: IRQ number - * @data: pointer to a data - * - * 1) Wakes up the DPRAM - * 2) Reads the interrupt value - * 3) Performs interrupt handling - * 4) Clears the interrupt port (port = memory or register) - * 5) Allows the DPRAM to sleep - */ -static irqreturn_t cp_idpram_irq_handler(int irq, void *data) -{ - struct dpram_link_device *dpld = (struct dpram_link_device *)data; - struct link_device *ld = (struct link_device *)&dpld->ld; - u16 int2ap; - - if (unlikely(ld->mode == LINK_MODE_OFFLINE)) - return IRQ_HANDLED; - - if (dpram_wake_up(dpld) < 0) { - trigger_force_cp_crash(dpld); - return IRQ_HANDLED; - } - - int2ap = recv_intr(dpld); - - intr_handler(dpld, int2ap); - - clear_intr(dpld); - - dpram_allow_sleep(dpld); - - return IRQ_HANDLED; -} - -/** - * ext_dpram_irq_handler: interrupt handler for a normal external DPRAM - * @irq: IRQ number - * @data: pointer to a data - * - * 1) Reads the interrupt value - * 2) Performs interrupt handling - */ -static irqreturn_t ext_dpram_irq_handler(int irq, void *data) -{ - struct dpram_link_device *dpld = (struct dpram_link_device *)data; - struct link_device *ld = (struct link_device *)&dpld->ld; - u16 int2ap = recv_intr(dpld); - - if (unlikely(ld->mode == LINK_MODE_OFFLINE)) - return IRQ_HANDLED; - - intr_handler(dpld, int2ap); - - return IRQ_HANDLED; -} - -/** - * get_txq_space - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * OUT @stat: pointer to an instance of dpram_circ_status structure - * - * Stores {start address of the buffer in a TXQ, size of the buffer, in & out - * pointer values, size of free space} into the 'stat' instance. - * - * Returns the size of free space in the buffer or an error code. - */ -static int get_txq_space(struct dpram_link_device *dpld, int dev, - struct dpram_circ_status *stat) -{ - struct link_device *ld = &dpld->ld; - int cnt = 0; - u32 qsize; - u32 head; - u32 tail; - int space; - - while (1) { - qsize = get_tx_buff_size(dpld, dev); - head = get_tx_head(dpld, dev); - tail = get_tx_tail(dpld, dev); - space = circ_get_space(qsize, head, tail); - - mif_debug("%s: %s_TXQ qsize[%u] in[%u] out[%u] space[%u]\n", - ld->name, get_dev_name(dev), qsize, head, tail, space); - - if (circ_valid(qsize, head, tail)) - break; - - cnt++; - mif_err("%s: ERR! <%pf> " - "%s_TXQ invalid (qsize:%d in:%d out:%d space:%d), " - "count %d\n", - ld->name, __builtin_return_address(0), - get_dev_name(dev), qsize, head, tail, space, cnt); - if (cnt >= MAX_RETRY_CNT) { - space = -EIO; - break; - } - - udelay(100); - } - - stat->buff = get_tx_buff(dpld, dev); - stat->qsize = qsize; - stat->in = head; - stat->out = tail; - stat->size = space; - - return space; -} - -/** - * write_ipc_to_txq - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * @stat: pointer to an instance of dpram_circ_status structure - * @skb: pointer to an instance of sk_buff structure - * - * Must be invoked only when there is enough space in the TXQ. - */ -static void write_ipc_to_txq(struct dpram_link_device *dpld, int dev, - struct dpram_circ_status *stat, struct sk_buff *skb) -{ - struct link_device *ld = &dpld->ld; - u8 __iomem *buff = stat->buff; - u32 qsize = stat->qsize; - u32 in = stat->in; - u8 *src = skb->data; - u32 len = skb->len; - u32 inp; - struct mif_irq_map map; - - /* Write data to the TXQ */ - circ_write(buff, src, qsize, in, len); - - /* Update new head (in) pointer */ - inp = in + len; - if (inp >= qsize) - inp -= qsize; - set_tx_head(dpld, dev, inp); - - /* Take a log for debugging */ - if (dev == IPC_FMT) { -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - char tag[MIF_MAX_STR_LEN]; - snprintf(tag, MIF_MAX_STR_LEN, "%s: MIF2CP", ld->mc->name); - pr_ipc(tag, src, (len > 20 ? 20 : len)); -#if 0 - log_dpram_status(dpld, "MIF2CP"); -#endif -#endif - set_dpram_map(dpld, &map); - mif_irq_log(ld->mc->msd, map, "ipc_write", sizeof("ipc_write")); - mif_ipc_log(MIF_IPC_AP2CP, ld->mc->msd, skb->data, skb->len); - } - -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - /* Verify data written to the TXQ */ - if (ld->aligned && memcmp16_to_io((buff + in), src, 4)) { - mif_err("%s: memcmp16_to_io fail\n", ld->name); - trigger_force_cp_crash(dpld); - } -#endif -} - -/** - * xmit_ipc_msg - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * Tries to transmit IPC messages in the skb_txq of @dev as many as possible. - * - * Returns total length of IPC messages transmitted or an error code. - */ -static int xmit_ipc_msg(struct dpram_link_device *dpld, int dev) -{ - struct link_device *ld = &dpld->ld; - struct sk_buff_head *txq = ld->skb_txq[dev]; - struct sk_buff *skb; - unsigned long flags; - struct dpram_circ_status stat; - int space; - int copied = 0; - - /* Acquire the spin lock for a TXQ */ - spin_lock_irqsave(&dpld->tx_lock[dev], flags); - - while (1) { - /* Get the size of free space in the TXQ */ - space = get_txq_space(dpld, dev, &stat); - if (unlikely(space < 0)) { -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - /* Trigger a enforced CP crash */ - trigger_force_cp_crash(dpld); -#endif - /* Empty out the TXQ */ - set_tx_head(dpld, dev, stat.out); - copied = -EIO; - break; - } - - skb = skb_dequeue(txq); - if (unlikely(!skb)) - break; - - /* Check the free space size comparing with skb->len */ - if (unlikely(space < skb->len)) { - atomic_set(&dpld->res_required[dev], 1); - /* Take the skb back to the skb_txq */ - skb_queue_head(txq, skb); - mif_info("%s: %s qsize[%u] " - "in[%u] out[%u] free[%u] < len[%u]\n", - ld->name, get_dev_name(dev), stat.qsize, - stat.in, stat.out, space, skb->len); - copied = -ENOSPC; - break; - } - - /* TX only when there is enough space in the TXQ */ - write_ipc_to_txq(dpld, dev, &stat, skb); - copied += skb->len; - dev_kfree_skb_any(skb); - } - - /* Release the spin lock */ - spin_unlock_irqrestore(&dpld->tx_lock[dev], flags); - - return copied; -} - -/** - * wait_for_res_ack - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * 1) Sends an REQ_ACK interrupt for @dev to CP. - * 2) Waits for the corresponding RES_ACK for @dev from CP. - * - * Returns the return value from wait_for_completion_interruptible_timeout(). - */ -static int wait_for_res_ack(struct dpram_link_device *dpld, int dev) -{ - struct link_device *ld = &dpld->ld; - struct completion *cmpl = &dpld->req_ack_cmpl[dev]; - unsigned long timeout = RES_ACK_WAIT_TIMEOUT; - int ret; - u16 mask; - - mask = get_mask_req_ack(dpld, dev); - mif_info("%s: send %s_REQ_ACK\n", ld->name, get_dev_name(dev)); - send_intr(dpld, INT_NON_CMD(mask)); - - ret = wait_for_completion_interruptible_timeout(cmpl, timeout); - /* ret == 0 on timeout, ret < 0 if interrupted */ - if (ret == 0) { - mif_info("%s: TIMEOUT! no %s_RES_ACK\n", - ld->name, get_dev_name(dev)); - } else if (ret < 0) { - mif_info("%s: %s: interrupted (ret %d)\n", - ld->name, get_dev_name(dev), ret); - } - - return ret; -} - -/** - * process_res_ack - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * - * 1) Tries to transmit IPC messages in the skb_txq by invoking xmit_ipc_msg() - * function. - * 2) Sends an interrupt to CP if there is no error from xmit_ipc_msg(). - * 3) Restarts DPRAM flow control if xmit_ipc_msg() returns -ENOSPC. - * - * Returns the return value from xmit_ipc_msg(). - */ -static int process_res_ack(struct dpram_link_device *dpld, int dev) -{ - struct link_device *ld = &dpld->ld; - int ret; - u16 mask; - - mif_info("%s: recv %s_RES_ACK\n", ld->name, get_dev_name(dev)); -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - log_dpram_status(dpld, "LATEST"); -#endif - - ret = xmit_ipc_msg(dpld, dev); - if (ret > 0) { - mask = get_mask_send(dpld, dev); - send_intr(dpld, INT_NON_CMD(mask)); - atomic_set(&dpld->res_required[dev], 0); -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - mif_info("%s: xmit_ipc_msg done (%d bytes)\n", ld->name, ret); -#endif - goto exit; - } - - if (ret == 0) { - mif_info("%s: %s skb_txq empty\n", ld->name, get_dev_name(dev)); - atomic_set(&dpld->res_required[dev], 0); - goto exit; - } - - /* At this point, ret < 0 */ - if (ret == -ENOSPC) { - /* - ** dpld->res_required[dev] is set in xmit_ipc_msg() - */ - mif_info("%s: xmit_ipc_msg fail (err -ENOSPC)\n", ld->name); - queue_delayed_work(ld->tx_wq, ld->tx_dwork[dev], 0); - } else { - mif_err("%s: ERR! xmit_ipc_msg fail (err %d)\n", - ld->name, ret); - } - -exit: - return ret; -} - -/** - * fmt_tx_work: performs TX for FMT IPC device under DPRAM flow control - * @work: pointer to an instance of the work_struct structure - * - * 1) Starts waiting for RES_ACK of FMT IPC device. - * 2) Returns immediately if the wait is interrupted. - * 3) Restarts DPRAM flow control if there is a timeout from the wait. - * 4) Otherwise, it performs processing RES_ACK for FMT IPC device. - */ -static void fmt_tx_work(struct work_struct *work) -{ - struct link_device *ld; - struct dpram_link_device *dpld; - unsigned long delay = REQ_ACK_DELAY; - int ret; - - ld = container_of(work, struct link_device, fmt_tx_dwork.work); - dpld = to_dpram_link_device(ld); - - ret = wait_for_res_ack(dpld, IPC_FMT); - /* ret == 0 on timeout, ret < 0 if interrupted */ - if (ret < 0) - return; - else if (ret == 0) - queue_delayed_work(ld->tx_wq, ld->tx_dwork[IPC_FMT], delay); - else - process_res_ack(dpld, IPC_FMT); -} - -/** - * raw_tx_work: performs TX for RAW IPC device under DPRAM flow control. - * @work: pointer to an instance of the work_struct structure - * - * 1) Starts waiting for RES_ACK of RAW IPC device. - * 2) Returns immediately if the wait is interrupted. - * 3) Restarts DPRAM flow control if there is a timeout from the wait. - * 4) Otherwise, it performs processing RES_ACK for RAW IPC device. - */ -static void raw_tx_work(struct work_struct *work) -{ - struct link_device *ld; - struct dpram_link_device *dpld; - unsigned long delay = REQ_ACK_DELAY; - int ret; - - ld = container_of(work, struct link_device, raw_tx_dwork.work); - dpld = to_dpram_link_device(ld); - - ret = wait_for_res_ack(dpld, IPC_RAW); - /* ret == 0 on timeout, ret < 0 if interrupted */ - if (ret < 0) - return; - - if (ret == 0) { - queue_delayed_work(ld->tx_wq, ld->tx_dwork[IPC_RAW], delay); - return; - } - - ret = process_res_ack(dpld, IPC_RAW); - if (ret > 0) - mif_netif_wake(ld); -} - -/** - * rfs_tx_work: performs TX for RFS IPC device under DPRAM flow control - * @work: pointer to an instance of the work_struct structure - * - * 1) Starts waiting for RES_ACK of RFS IPC device. - * 2) Returns immediately if the wait is interrupted. - * 3) Restarts DPRAM flow control if there is a timeout from the wait. - * 4) Otherwise, it performs processing RES_ACK for RFS IPC device. - */ -static void rfs_tx_work(struct work_struct *work) -{ - struct link_device *ld; - struct dpram_link_device *dpld; - unsigned long delay = REQ_ACK_DELAY; - int ret; - - ld = container_of(work, struct link_device, rfs_tx_dwork.work); - dpld = to_dpram_link_device(ld); - - ret = wait_for_res_ack(dpld, IPC_RFS); - /* ret == 0 on timeout, ret < 0 if interrupted */ - if (ret < 0) - return; - else if (ret == 0) - queue_delayed_work(ld->tx_wq, ld->tx_dwork[IPC_RFS], delay); - else - process_res_ack(dpld, IPC_RFS); -} - -/** - * dpram_send_ipc - * @dpld: pointer to an instance of dpram_link_device structure - * @dev: IPC device (IPC_FMT, IPC_RAW, etc.) - * @iod: pointer to an instance of the io_device structure - * @skb: pointer to an skb that will be transmitted - * - * 1) Enqueues an skb to the skb_txq for @dev in the link device instance. - * 2) Tries to transmit IPC messages in the skb_txq by invoking xmit_ipc_msg() - * function. - * 3) Sends an interrupt to CP if there is no error from xmit_ipc_msg(). - * 4) Starts DPRAM flow control if xmit_ipc_msg() returns -ENOSPC. - */ -static void dpram_send_ipc(struct dpram_link_device *dpld, int dev, - struct io_device *iod, struct sk_buff *skb) -{ - struct link_device *ld = &dpld->ld; - struct sk_buff_head *txq = ld->skb_txq[dev]; - int ret; - u16 mask; - - if (unlikely(txq->qlen >= MAX_SKB_TXQ_DEPTH)) { - mif_err("%s: %s txq->qlen %d >= %d\n", ld->name, - get_dev_name(dev), txq->qlen, MAX_SKB_TXQ_DEPTH); - if (iod->io_typ == IODEV_NET || iod->format == IPC_MULTI_RAW) { - dev_kfree_skb_any(skb); - return; - } - } - - skb_queue_tail(txq, skb); - - if (dpram_wake_up(dpld) < 0) { - trigger_force_cp_crash(dpld); - return; - } - - if (!ipc_active(dpld)) { - mif_info("%s: IPC is NOT active\n", ld->name); - goto exit; - } - - if (atomic_read(&dpld->res_required[dev]) > 0) { - mif_info("%s: %s_TXQ is full\n", ld->name, get_dev_name(dev)); - goto exit; - } - - ret = xmit_ipc_msg(dpld, dev); - if (likely(ret > 0)) { - mask = get_mask_send(dpld, dev); - send_intr(dpld, INT_NON_CMD(mask)); - goto exit; - } - - if (ret == 0) { - mif_info("%s: %s skb_txq empty\n", ld->name, get_dev_name(dev)); - goto exit; - } - - /* At this point, ret < 0 */ - if (ret == -ENOSPC) { - /* - ** dpld->res_required[dev] is set in xmit_ipc_msg() - */ - if (dev == IPC_RAW) - mif_netif_stop(ld); - mif_info("%s->%s: xmit_ipc_msg fail (err -ENOSPC)\n", - iod->name, ld->name); - queue_delayed_work(ld->tx_wq, ld->tx_dwork[dev], 0); - } else { - mif_err("%s->%s: ERR! xmit_ipc_msg fail (err %d)\n", - iod->name, ld->name, ret); - } - -exit: - dpram_allow_sleep(dpld); -} - -static int dpram_send_cp_binary(struct link_device *ld, struct sk_buff *skb) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - - if (dpld->ext_op && dpld->ext_op->download_binary) - return dpld->ext_op->download_binary(dpld, skb); - else - return -ENODEV; -} - -/** - * dpram_send - * @ld: pointer to an instance of the link_device structure - * @iod: pointer to an instance of the io_device structure - * @skb: pointer to an skb that will be transmitted - * - * Returns the length of data transmitted or an error code. - * - * Normal call flow for an IPC message: - * dpram_send_ipc -> xmit_ipc_msg -> write_ipc_to_txq - * - * Call flow on congestion in a DPRAM IPC TXQ: - * dpram_send_ipc -> xmit_ipc_msg ,,, queue_delayed_work - * => xxx_tx_work -> wait_for_res_ack - * => recv_ipc_msg - * => process_res_ack -> xmit_ipc_msg (,,, queue_delayed_work ...) - */ -static int dpram_send(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - int dev = iod->format; - int len = skb->len; - - switch (dev) { - case IPC_FMT: - case IPC_RAW: - case IPC_RFS: - if (likely(ld->mode == LINK_MODE_IPC)) { - dpram_send_ipc(dpld, dev, iod, skb); - } else { - mif_info("%s: ld->mode != LINK_MODE_IPC\n", ld->name); - dev_kfree_skb_any(skb); - } - return len; - - case IPC_BOOT: - return dpram_send_cp_binary(ld, skb); - - default: - mif_info("%s: ERR! no TXQ for %s\n", ld->name, iod->name); - dev_kfree_skb_any(skb); - return -ENODEV; - } -} - -static int dpram_force_dump(struct link_device *ld, struct io_device *iod) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - trigger_force_cp_crash(dpld); - return 0; -} - -static int dpram_dump_start(struct link_device *ld, struct io_device *iod) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - - if (dpld->ext_op && dpld->ext_op->dump_start) - return dpld->ext_op->dump_start(dpld); - else - return -ENODEV; -} - -static int dpram_dump_update(struct link_device *ld, struct io_device *iod, - unsigned long arg) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - - if (dpld->ext_op && dpld->ext_op->dump_update) - return dpld->ext_op->dump_update(dpld, (void *)arg); - else - return -ENODEV; -} - -static int dpram_ioctl(struct link_device *ld, struct io_device *iod, - unsigned int cmd, unsigned long arg) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - int err = 0; - - mif_info("%s: cmd 0x%08X\n", ld->name, cmd); - - switch (cmd) { - case IOCTL_DPRAM_INIT_STATUS: - mif_debug("%s: get dpram init status\n", ld->name); - return dpld->init_status; - - default: - if (dpld->ext_ioctl) { - err = dpld->ext_ioctl(dpld, iod, cmd, arg); - } else { - mif_err("%s: ERR! invalid cmd 0x%08X\n", ld->name, cmd); - err = -EINVAL; - } - - break; - } - - return err; -} - -static void dpram_dump_memory(struct link_device *ld, char *buff) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - dpram_wake_up(dpld); - memcpy(buff, dpld->base, dpld->size); - dpram_allow_sleep(dpld); -} - -static void dpram_remap_std_16k_region(struct dpram_link_device *dpld) -{ - struct dpram_ipc_16k_map *dpram_map; - struct dpram_ipc_device *dev; - - dpram_map = (struct dpram_ipc_16k_map *)dpld->base; - - /* "magic code" and "access enable" fields */ - dpld->ipc_map.magic = (u16 __iomem *)&dpram_map->magic; - dpld->ipc_map.access = (u16 __iomem *)&dpram_map->access; - - /* FMT */ - dev = &dpld->ipc_map.dev[IPC_FMT]; - - strcpy(dev->name, "FMT"); - dev->id = IPC_FMT; - - dev->txq.head = (u16 __iomem *)&dpram_map->fmt_tx_head; - dev->txq.tail = (u16 __iomem *)&dpram_map->fmt_tx_tail; - dev->txq.buff = (u8 __iomem *)&dpram_map->fmt_tx_buff[0]; - dev->txq.size = DP_16K_FMT_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&dpram_map->fmt_rx_head; - dev->rxq.tail = (u16 __iomem *)&dpram_map->fmt_rx_tail; - dev->rxq.buff = (u8 __iomem *)&dpram_map->fmt_rx_buff[0]; - dev->rxq.size = DP_16K_FMT_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_F; - dev->mask_res_ack = INT_MASK_RES_ACK_F; - dev->mask_send = INT_MASK_SEND_F; - - /* RAW */ - dev = &dpld->ipc_map.dev[IPC_RAW]; - - strcpy(dev->name, "RAW"); - dev->id = IPC_RAW; - - dev->txq.head = (u16 __iomem *)&dpram_map->raw_tx_head; - dev->txq.tail = (u16 __iomem *)&dpram_map->raw_tx_tail; - dev->txq.buff = (u8 __iomem *)&dpram_map->raw_tx_buff[0]; - dev->txq.size = DP_16K_RAW_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&dpram_map->raw_rx_head; - dev->rxq.tail = (u16 __iomem *)&dpram_map->raw_rx_tail; - dev->rxq.buff = (u8 __iomem *)&dpram_map->raw_rx_buff[0]; - dev->rxq.size = DP_16K_RAW_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_R; - dev->mask_res_ack = INT_MASK_RES_ACK_R; - dev->mask_send = INT_MASK_SEND_R; - - /* interrupt ports */ - dpld->ipc_map.mbx_cp2ap = (u16 __iomem *)&dpram_map->mbx_cp2ap; - dpld->ipc_map.mbx_ap2cp = (u16 __iomem *)&dpram_map->mbx_ap2cp; -} - -static int dpram_table_init(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - u8 __iomem *dp_base; - int i; - - if (!dpld->base) { - mif_err("%s: ERR! dpld->base == NULL\n", ld->name); - return -EINVAL; - } - dp_base = dpld->base; - - /* Map for booting */ - if (dpld->ext_op && dpld->ext_op->init_boot_map) { - dpld->ext_op->init_boot_map(dpld); - } else { - dpld->bt_map.magic = (u32 *)(dp_base); - dpld->bt_map.buff = (u8 *)(dp_base + DP_BOOT_BUFF_OFFSET); - dpld->bt_map.size = dpld->size - 8; - } - - /* Map for download (FOTA, UDL, etc.) */ - if (dpld->ext_op && dpld->ext_op->init_dl_map) { - dpld->ext_op->init_dl_map(dpld); - } else { - dpld->dl_map.magic = (u32 *)(dp_base); - dpld->dl_map.buff = (u8 *)(dp_base + DP_DLOAD_BUFF_OFFSET); - } - - /* Map for upload mode */ - if (dpld->ext_op && dpld->ext_op->init_ul_map) { - dpld->ext_op->init_ul_map(dpld); - } else { - dpld->ul_map.magic = (u32 *)(dp_base); - dpld->ul_map.buff = (u8 *)(dp_base + DP_ULOAD_BUFF_OFFSET); - } - - /* Map for IPC */ - if (dpld->ext_op && dpld->ext_op->init_ipc_map) { - dpld->ext_op->init_ipc_map(dpld); - } else if (dpld->dpctl->ipc_map) { - memcpy(&dpld->ipc_map, dpld->dpctl->ipc_map, - sizeof(struct dpram_ipc_map)); - } else { - if (dpld->size == DPRAM_SIZE_16KB) - dpram_remap_std_16k_region(dpld); - else - return -EINVAL; - } - - dpld->magic = dpld->ipc_map.magic; - dpld->access = dpld->ipc_map.access; - for (i = 0; i < ld->max_ipc_dev; i++) - dpld->dev[i] = &dpld->ipc_map.dev[i]; - dpld->mbx2ap = dpld->ipc_map.mbx_cp2ap; - dpld->mbx2cp = dpld->ipc_map.mbx_ap2cp; - - return 0; -} - -static void dpram_setup_common_op(struct dpram_link_device *dpld) -{ - dpld->recv_intr = recv_intr; - dpld->send_intr = send_intr; - dpld->get_magic = get_magic; - dpld->set_magic = set_magic; - dpld->get_access = get_access; - dpld->set_access = set_access; - dpld->get_tx_head = get_tx_head; - dpld->get_tx_tail = get_tx_tail; - dpld->set_tx_head = set_tx_head; - dpld->set_tx_tail = set_tx_tail; - dpld->get_tx_buff = get_tx_buff; - dpld->get_tx_buff_size = get_tx_buff_size; - dpld->get_rx_head = get_rx_head; - dpld->get_rx_tail = get_rx_tail; - dpld->set_rx_head = set_rx_head; - dpld->set_rx_tail = set_rx_tail; - dpld->get_rx_buff = get_rx_buff; - dpld->get_rx_buff_size = get_rx_buff_size; - dpld->get_mask_req_ack = get_mask_req_ack; - dpld->get_mask_res_ack = get_mask_res_ack; - dpld->get_mask_send = get_mask_send; - dpld->ipc_rx_handler = cmd_msg_handler; -} - -static int dpram_link_init(struct link_device *ld, struct io_device *iod) -{ - return 0; -} - -static void dpram_link_terminate(struct link_device *ld, struct io_device *iod) -{ - if (iod->format == IPC_FMT && ld->mode == LINK_MODE_IPC) { - if (!atomic_read(&iod->opened)) { - ld->mode = LINK_MODE_OFFLINE; - mif_err("%s: %s: link mode is changed: IPC->OFFLINE\n", - iod->name, ld->name); - } - } - - return; -} - -struct link_device *dpram_create_link_device(struct platform_device *pdev) -{ - struct dpram_link_device *dpld = NULL; - struct link_device *ld = NULL; - struct modem_data *modem = NULL; - struct modemlink_dpram_control *dpctl = NULL; - struct resource *res = NULL; - resource_size_t res_size; - unsigned long task_data; - int ret = 0; - int i = 0; - int bsize; - int qsize; - - /* - ** Alloc an instance of dpram_link_device structure - */ - dpld = kzalloc(sizeof(struct dpram_link_device), GFP_KERNEL); - if (!dpld) { - mif_err("ERR! kzalloc dpld fail\n"); - goto err; - } - ld = &dpld->ld; - - /* - ** Get the modem (platform) data - */ - modem = (struct modem_data *)pdev->dev.platform_data; - if (!modem) { - mif_err("ERR! modem == NULL\n"); - goto err; - } - mif_info("modem = %s\n", modem->name); - mif_info("link device = %s\n", modem->link_name); - - /* - ** Retrieve modem data and DPRAM control data from the modem data - */ - ld->mdm_data = modem; - ld->name = modem->link_name; - ld->ipc_version = modem->ipc_version; - - if (!modem->dpram_ctl) { - mif_err("ERR! modem->dpram_ctl == NULL\n"); - goto err; - } - dpctl = modem->dpram_ctl; - - dpld->dpctl = dpctl; - dpld->type = dpctl->dp_type; - - if (ld->ipc_version < SIPC_VER_50) { - if (!dpctl->max_ipc_dev) { - mif_err("%s: ERR! no max_ipc_dev\n", ld->name); - goto err; - } - - ld->aligned = dpctl->aligned; - ld->max_ipc_dev = dpctl->max_ipc_dev; - } else { - ld->aligned = 1; - ld->max_ipc_dev = MAX_SIPC5_DEV; - } - - /* - ** Set attributes as a link device - */ - ld->init_comm = dpram_link_init; - ld->terminate_comm = dpram_link_terminate; - ld->send = dpram_send; - ld->force_dump = dpram_force_dump; - ld->dump_start = dpram_dump_start; - ld->dump_update = dpram_dump_update; - ld->ioctl = dpram_ioctl; - - INIT_LIST_HEAD(&ld->list); - - skb_queue_head_init(&ld->sk_fmt_tx_q); - skb_queue_head_init(&ld->sk_raw_tx_q); - skb_queue_head_init(&ld->sk_rfs_tx_q); - ld->skb_txq[IPC_FMT] = &ld->sk_fmt_tx_q; - ld->skb_txq[IPC_RAW] = &ld->sk_raw_tx_q; - ld->skb_txq[IPC_RFS] = &ld->sk_rfs_tx_q; - - /* - ** Set up function pointers - */ - dpram_setup_common_op(dpld); - dpld->dpram_dump = dpram_dump_memory; - dpld->ext_op = dpram_get_ext_op(modem->modem_type); - if (dpld->ext_op && dpld->ext_op->ioctl) - dpld->ext_ioctl = dpld->ext_op->ioctl; - if (dpld->ext_op && dpld->ext_op->wakeup && dpld->ext_op->sleep) - dpld->need_wake_up = true; - if (dpld->ext_op && dpld->ext_op->clear_intr) - dpld->need_intr_clear = true; - - /* - ** Retrieve DPRAM resource - */ - if (!dpctl->dp_base) { - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, - STR_DPRAM_BASE); - if (!res) { - mif_err("%s: ERR! no DPRAM resource\n", ld->name); - goto err; - } - res_size = resource_size(res); - - dpctl->dp_base = ioremap_nocache(res->start, res_size); - if (!dpctl->dp_base) { - mif_err("%s: ERR! ioremap_nocache for BASE fail\n", - ld->name); - goto err; - } - dpctl->dp_size = res_size; - } - dpld->base = dpctl->dp_base; - dpld->size = dpctl->dp_size; - - mif_info("%s: type %d, aligned %d, base 0x%08X, size %d\n", - ld->name, dpld->type, ld->aligned, (int)dpld->base, dpld->size); - - /* - ** Retrieve DPRAM SFR resource if exists - */ - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, - STR_DPRAM_SFR_BASE); - if (res) { - res_size = resource_size(res); - dpld->sfr_base = ioremap_nocache(res->start, res_size); - if (!dpld->sfr_base) { - mif_err("%s: ERR! ioremap_nocache for SFR fail\n", - ld->name); - goto err; - } - } - - /* Initialize DPRAM map (physical map -> logical map) */ - ret = dpram_table_init(dpld); - if (ret < 0) { - mif_err("%s: ERR! dpram_table_init fail (err %d)\n", - ld->name, ret); - goto err; - } - - /* Disable IPC */ - if (!dpctl->disabled) { - set_magic(dpld, 0); - set_access(dpld, 0); - } - dpld->init_status = DPRAM_INIT_STATE_NONE; - - /* Initialize locks, completions, and bottom halves */ - snprintf(dpld->wlock_name, MIF_MAX_NAME_LEN, "%s_wlock", ld->name); - wake_lock_init(&dpld->wlock, WAKE_LOCK_SUSPEND, dpld->wlock_name); - - init_completion(&dpld->dpram_init_cmd); - init_completion(&dpld->modem_pif_init_done); - init_completion(&dpld->udl_start_complete); - init_completion(&dpld->udl_cmd_complete); - init_completion(&dpld->crash_start_complete); - init_completion(&dpld->crash_recv_done); - for (i = 0; i < ld->max_ipc_dev; i++) - init_completion(&dpld->req_ack_cmpl[i]); - - task_data = (unsigned long)dpld; - tasklet_init(&dpld->rx_tsk, ipc_rx_task, task_data); - - ld->tx_wq = create_singlethread_workqueue("dpram_tx_wq"); - if (!ld->tx_wq) { - mif_err("%s: ERR! fail to create tx_wq\n", ld->name); - goto err; - } - INIT_DELAYED_WORK(&ld->fmt_tx_dwork, fmt_tx_work); - INIT_DELAYED_WORK(&ld->raw_tx_dwork, raw_tx_work); - INIT_DELAYED_WORK(&ld->rfs_tx_dwork, rfs_tx_work); - ld->tx_dwork[IPC_FMT] = &ld->fmt_tx_dwork; - ld->tx_dwork[IPC_RAW] = &ld->raw_tx_dwork; - ld->tx_dwork[IPC_RFS] = &ld->rfs_tx_dwork; - -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - INIT_DELAYED_WORK(&dpld->dump_dwork, save_dpram_dump_work); - INIT_DELAYED_WORK(&dpld->trace_dwork, save_ipc_trace_work); - spin_lock_init(&dpld->dump_list.lock); - spin_lock_init(&dpld->trace_list.lock); -#endif - - /* Prepare RXB queue */ - qsize = DPRAM_MAX_RXBQ_SIZE; - for (i = 0; i < ld->max_ipc_dev; i++) { - bsize = rxbq_get_page_size(get_rx_buff_size(dpld, i)); - dpld->rxbq[i].size = qsize; - dpld->rxbq[i].in = 0; - dpld->rxbq[i].out = 0; - dpld->rxbq[i].rxb = rxbq_create_pool(bsize, qsize); - if (!dpld->rxbq[i].rxb) { - mif_err("%s: ERR! %s rxbq_create_pool fail\n", - ld->name, get_dev_name(i)); - goto err; - } - mif_info("%s: %s rxbq_pool created (bsize:%d, qsize:%d)\n", - ld->name, get_dev_name(i), bsize, qsize); - } - - /* Prepare a multi-purpose miscellaneous buffer */ - dpld->buff = kzalloc(dpld->size, GFP_KERNEL); - if (!dpld->buff) { - mif_err("%s: ERR! kzalloc dpld->buff fail\n", ld->name); - goto err; - } - - /* - ** Retrieve DPRAM IRQ GPIO#, IRQ#, and IRQ flags - */ - dpld->gpio_dpram_int = modem->gpio_dpram_int; - - if (dpctl->dpram_irq) { - dpld->irq = dpctl->dpram_irq; - } else { - dpld->irq = platform_get_irq_byname(pdev, STR_DPRAM_IRQ); - if (dpld->irq < 0) { - mif_err("%s: ERR! no DPRAM IRQ resource\n", ld->name); - goto err; - } - } - - if (dpctl->dpram_irq_flags) - dpld->irq_flags = dpctl->dpram_irq_flags; - else - dpld->irq_flags = (IRQF_NO_SUSPEND | IRQF_TRIGGER_LOW); - - /* - ** Register DPRAM interrupt handler - */ - snprintf(dpld->irq_name, MIF_MAX_NAME_LEN, "%s_irq", ld->name); - if (dpld->ext_op && dpld->ext_op->irq_handler) - dpld->irq_handler = dpld->ext_op->irq_handler; - else if (dpld->type == CP_IDPRAM) - dpld->irq_handler = cp_idpram_irq_handler; - else if (dpld->type == AP_IDPRAM) - dpld->irq_handler = ap_idpram_irq_handler; - else - dpld->irq_handler = ext_dpram_irq_handler; - - ret = register_isr(dpld->irq, dpld->irq_handler, dpld->irq_flags, - dpld->irq_name, dpld); - if (ret) - goto err; - - return ld; - -err: - if (dpld) { - if (dpld->buff) - kfree(dpld->buff); - kfree(dpld); - } - - return NULL; -} - diff --git a/drivers/misc/modem_if_u1/modem_link_device_dpram.h b/drivers/misc/modem_if_u1/modem_link_device_dpram.h deleted file mode 100644 index 1f986c9..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_dpram.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_LINK_DEVICE_DPRAM_H__ -#define __MODEM_LINK_DEVICE_DPRAM_H__ - -#include "modem_link_device_memory.h" - -/* - magic_code + - access_enable + - fmt_tx_head + fmt_tx_tail + fmt_tx_buff + - raw_tx_head + raw_tx_tail + raw_tx_buff + - fmt_rx_head + fmt_rx_tail + fmt_rx_buff + - raw_rx_head + raw_rx_tail + raw_rx_buff + - mbx_cp2ap + - mbx_ap2cp - = 2 + - 2 + - 2 + 2 + 1336 + - 2 + 2 + 4564 + - 2 + 2 + 1336 + - 2 + 2 + 9124 + - 2 + - 2 - = 16384 -*/ -#define DP_16K_FMT_TX_BUFF_SZ 1336 -#define DP_16K_RAW_TX_BUFF_SZ 4564 -#define DP_16K_FMT_RX_BUFF_SZ 1336 -#define DP_16K_RAW_RX_BUFF_SZ 9124 - -struct dpram_ipc_16k_map { - u16 magic; - u16 access; - - u16 fmt_tx_head; - u16 fmt_tx_tail; - u8 fmt_tx_buff[DP_16K_FMT_TX_BUFF_SZ]; - - u16 raw_tx_head; - u16 raw_tx_tail; - u8 raw_tx_buff[DP_16K_RAW_TX_BUFF_SZ]; - - u16 fmt_rx_head; - u16 fmt_rx_tail; - u8 fmt_rx_buff[DP_16K_FMT_RX_BUFF_SZ]; - - u16 raw_rx_head; - u16 raw_rx_tail; - u8 raw_rx_buff[DP_16K_RAW_RX_BUFF_SZ]; - - u16 mbx_cp2ap; - u16 mbx_ap2cp; -}; - -struct dpram_sfr { - u16 __iomem *int2cp; - u16 __iomem *int2ap; - u16 __iomem *clr_int2ap; - u16 __iomem *reset; - u16 __iomem *msg2cp; - u16 __iomem *msg2ap; -}; - -struct dpram_ext_op; - -struct dpram_link_device { - struct link_device ld; - - /* DPRAM address and size */ - enum dpram_type type; /* DPRAM type */ - u8 __iomem *base; /* Virtual address of DPRAM */ - u32 size; /* DPRAM size */ - - /* Whether or not this DPRAM can go asleep */ - bool need_wake_up; - - /* Whether or not this DPRAM needs interrupt clearing */ - bool need_intr_clear; - - /* DPRAM SFR */ - u8 __iomem *sfr_base; /* Virtual address of SFR */ - struct dpram_sfr sfr; - - /* DPRAM IRQ GPIO# */ - unsigned gpio_dpram_int; - - /* DPRAM IRQ from CP */ - int irq; - unsigned long irq_flags; - char irq_name[MIF_MAX_NAME_LEN]; - - /* Link to DPRAM control functions dependent on each platform */ - struct modemlink_dpram_control *dpctl; - - /* Physical configuration -> logical configuration */ - union { - struct dpram_boot_map bt_map; - struct qc_dpram_boot_map qc_bt_map; - }; - - struct dpram_dload_map dl_map; - struct dpram_uload_map ul_map; - - /* IPC device map */ - struct dpram_ipc_map ipc_map; - - /* Pointers (aliases) to IPC device map */ - u16 __iomem *magic; - u16 __iomem *access; - struct dpram_ipc_device *dev[MAX_IPC_DEV]; - u16 __iomem *mbx2ap; - u16 __iomem *mbx2cp; - - /* Wakelock for DPRAM device */ - struct wake_lock wlock; - char wlock_name[MIF_MAX_NAME_LEN]; - - /* For booting */ - unsigned boot_start_complete; - struct completion dpram_init_cmd; - struct completion modem_pif_init_done; - - /* For UDL */ - struct tasklet_struct ul_tsk; - struct tasklet_struct dl_tsk; - struct completion udl_start_complete; - struct completion udl_cmd_complete; - struct dpram_udl_check udl_check; - struct dpram_udl_param udl_param; - - /* For CP crash dump */ - struct timer_list crash_ack_timer; - struct completion crash_start_complete; - struct completion crash_recv_done; - struct timer_list crash_timer; - int crash_rcvd; /* Count of CP crash dump packets received */ - - /* For locking TX process */ - spinlock_t tx_lock[MAX_IPC_DEV]; - - /* For TX under DPRAM flow control */ - struct completion req_ack_cmpl[MAX_IPC_DEV]; - - /* For efficient RX process */ - struct tasklet_struct rx_tsk; - struct mif_rxb_queue rxbq[MAX_IPC_DEV]; - struct io_device *iod[MAX_IPC_DEV]; - bool rx_with_skb; - - /* For retransmission after buffer full state */ - atomic_t res_required[MAX_IPC_DEV]; - - /* For wake-up/sleep control */ - atomic_t accessing; - - /* Multi-purpose miscellaneous buffer */ - u8 *buff; - - /* DPRAM IPC initialization status */ - int init_status; - - /* Alias to device-specific IOCTL function */ - int (*ext_ioctl)(struct dpram_link_device *dpld, struct io_device *iod, - unsigned int cmd, unsigned long arg); - - /* Alias to DPRAM IRQ handler */ - irqreturn_t (*irq_handler)(int irq, void *data); - - /* For DPRAM dump */ - void (*dpram_dump)(struct link_device *ld, char *buff); -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - char dump_path[MIF_MAX_PATH_LEN]; - char trace_path[MIF_MAX_PATH_LEN]; - struct trace_queue dump_list; - struct trace_queue trace_list; - struct delayed_work dump_dwork; - struct delayed_work trace_dwork; -#endif - - /* Common operations for each DPRAM */ - u16 (*recv_intr)(struct dpram_link_device *dpld); - void (*send_intr)(struct dpram_link_device *dpld, u16 mask); - u16 (*get_magic)(struct dpram_link_device *dpld); - void (*set_magic)(struct dpram_link_device *dpld, u16 value); - u16 (*get_access)(struct dpram_link_device *dpld); - void (*set_access)(struct dpram_link_device *dpld, u16 value); - u32 (*get_tx_head)(struct dpram_link_device *dpld, int id); - u32 (*get_tx_tail)(struct dpram_link_device *dpld, int id); - void (*set_tx_head)(struct dpram_link_device *dpld, int id, u32 head); - void (*set_tx_tail)(struct dpram_link_device *dpld, int id, u32 tail); - u8 *(*get_tx_buff)(struct dpram_link_device *dpld, int id); - u32 (*get_tx_buff_size)(struct dpram_link_device *dpld, int id); - u32 (*get_rx_head)(struct dpram_link_device *dpld, int id); - u32 (*get_rx_tail)(struct dpram_link_device *dpld, int id); - void (*set_rx_head)(struct dpram_link_device *dpld, int id, u32 head); - void (*set_rx_tail)(struct dpram_link_device *dpld, int id, u32 tail); - u8 *(*get_rx_buff)(struct dpram_link_device *dpld, int id); - u32 (*get_rx_buff_size)(struct dpram_link_device *dpld, int id); - u16 (*get_mask_req_ack)(struct dpram_link_device *dpld, int id); - u16 (*get_mask_res_ack)(struct dpram_link_device *dpld, int id); - u16 (*get_mask_send)(struct dpram_link_device *dpld, int id); - void (*ipc_rx_handler)(struct dpram_link_device *dpld, u16 int2ap); - - /* Extended operations for various modems */ - struct dpram_ext_op *ext_op; -}; - -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_dpram_link_device(linkdev) \ - container_of(linkdev, struct dpram_link_device, ld) - -struct dpram_ext_op { - int exist; - - void (*init_boot_map)(struct dpram_link_device *dpld); - void (*init_dl_map)(struct dpram_link_device *dpld); - void (*init_ul_map)(struct dpram_link_device *dpld); - void (*init_ipc_map)(struct dpram_link_device *dpld); - - int (*download_binary)(struct dpram_link_device *dpld, - struct sk_buff *skb); - - void (*cp_start_handler)(struct dpram_link_device *dpld); - - void (*crash_log)(struct dpram_link_device *dpld); - int (*dump_start)(struct dpram_link_device *dpld); - int (*dump_update)(struct dpram_link_device *dpld, void *arg); - - int (*ioctl)(struct dpram_link_device *dpld, struct io_device *iod, - unsigned int cmd, unsigned long arg); - - irqreturn_t (*irq_handler)(int irq, void *data); - void (*clear_intr)(struct dpram_link_device *dpld); - - int (*wakeup)(struct dpram_link_device *dpld); - void (*sleep)(struct dpram_link_device *dpld); -}; - -struct dpram_ext_op *dpram_get_ext_op(enum modem_t modem); - -#endif diff --git a/drivers/misc/modem_if_u1/modem_link_device_dpram_ext_op.c b/drivers/misc/modem_if_u1/modem_link_device_dpram_ext_op.c deleted file mode 100644 index b67063b..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_dpram_ext_op.c +++ /dev/null @@ -1,1309 +0,0 @@ -/* - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_prj.h" -#include "modem_link_device_dpram.h" -#include "modem_utils.h" - -#if defined(CONFIG_LTE_MODEM_CMC221) -/* -** For host (flashless) booting via DPRAM -*/ -#define CMC22x_AP_BOOT_DOWN_DONE 0x54329876 -#define CMC22x_CP_REQ_MAIN_BIN 0xA5A5A5A5 -#define CMC22x_CP_REQ_NV_DATA 0x5A5A5A5A -#define CMC22x_CP_DUMP_MAGIC 0xDEADDEAD - -#define CMC22x_HOST_DOWN_START 0x1234 -#define CMC22x_HOST_DOWN_END 0x4321 -#define CMC22x_REG_NV_DOWN_END 0xABCD -#define CMC22x_CAL_NV_DOWN_END 0xDCBA - -#define CMC22x_1ST_BUFF_READY 0xAAAA -#define CMC22x_2ND_BUFF_READY 0xBBBB -#define CMC22x_1ST_BUFF_FULL 0x1111 -#define CMC22x_2ND_BUFF_FULL 0x2222 - -#define CMC22x_CP_RECV_NV_END 0x8888 -#define CMC22x_CP_CAL_OK 0x4F4B -#define CMC22x_CP_CAL_BAD 0x4552 -#define CMC22x_CP_DUMP_END 0xFADE - -#define CMC22x_DUMP_BUFF_SIZE 8192 /* 8 KB */ -#endif - -#if defined(CONFIG_CDMA_MODEM_CBP72) -static void cbp72_init_boot_map(struct dpram_link_device *dpld) -{ - struct dpram_boot_map *bt_map = &dpld->bt_map; - - bt_map->magic = (u32 *)dpld->base; - bt_map->buff = (u8 *)(dpld->base + DP_BOOT_BUFF_OFFSET); - bt_map->size = dpld->size - 4; -} - -static void cbp72_init_dl_map(struct dpram_link_device *dpld) -{ - dpld->dl_map.magic = (u32 *)dpld->base; - dpld->dl_map.buff = (u8 *)(dpld->base + DP_DLOAD_BUFF_OFFSET); -} - -static int _cbp72_edpram_wait_resp(struct dpram_link_device *dpld, u32 resp) -{ - struct link_device *ld = &dpld->ld; - int ret; - int int2cp; - - ret = wait_for_completion_interruptible_timeout( - &dpld->udl_cmd_complete, UDL_TIMEOUT); - if (!ret) { - mif_info("%s: ERR! No UDL_CMD_RESP!!!\n", ld->name); - return -ENXIO; - } - - int2cp = dpld->recv_intr(dpld); - mif_debug("%s: int2cp = 0x%x\n", ld->name, int2cp); - if (resp == int2cp || int2cp == 0xA700) - return int2cp; - else - return -EINVAL; -} - -static int _cbp72_edpram_download_bin(struct dpram_link_device *dpld, - struct sk_buff *skb) -{ - struct link_device *ld = &dpld->ld; - struct dpram_boot_frame *bf = (struct dpram_boot_frame *)skb->data; - u8 __iomem *buff = dpld->bt_map.buff; - int err = 0; - - if (bf->len > dpld->bt_map.size) { - mif_info("%s: ERR! Out of DPRAM boundary\n", ld->name); - err = -EINVAL; - goto exit; - } - - if (bf->len) - memcpy(buff, bf->data, bf->len); - - init_completion(&dpld->udl_cmd_complete); - - if (bf->req) - dpld->send_intr(dpld, (u16)bf->req); - - if (bf->resp) { - err = _cbp72_edpram_wait_resp(dpld, bf->resp); - if (err < 0) { - mif_info("%s: ERR! wait_response fail (%d)\n", - ld->name, err); - goto exit; - } else if (err == bf->resp) { - err = skb->len; - } - } - -exit: - dev_kfree_skb_any(skb); - return err; -} - -static int cbp72_download_binary(struct dpram_link_device *dpld, - struct sk_buff *skb) -{ - if (dpld->type == EXT_DPRAM) - return _cbp72_edpram_download_bin(dpld, skb); - else - return -ENODEV; -} - -static int cbp72_dump_start(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - u8 *dest = dpld->ul_map.buff; - int ret; - - ld->mode = LINK_MODE_ULOAD; - - ret = del_timer(&dpld->crash_timer); - wake_lock(&dpld->wlock); - - iowrite32(DP_MAGIC_UMDL, dpld->ul_map.magic); - - iowrite8((u8)START_FLAG, dest + 0); - iowrite8((u8)0x1, dest + 1); - iowrite8((u8)0x1, dest + 2); - iowrite8((u8)0x0, dest + 3); - iowrite8((u8)END_FLAG, dest + 4); - - init_completion(&dpld->crash_start_complete); - - return 0; -} - -static int _cbp72_edpram_upload(struct dpram_link_device *dpld, - struct dpram_dump_arg *dump, unsigned char __user *target) -{ - struct link_device *ld = &dpld->ld; - struct ul_header header; - u8 *dest = NULL; - u8 *buff = NULL; - u16 plen = 0; - int err = 0; - int ret = 0; - int buff_size = 0; - - mif_debug("\n"); - - init_completion(&dpld->udl_cmd_complete); - - mif_debug("%s: req %x, resp %x", ld->name, dump->req, dump->resp); - - if (dump->req) - dpld->send_intr(dpld, (u16)dump->req); - - if (dump->resp) { - err = _cbp72_edpram_wait_resp(dpld, dump->resp); - if (err < 0) { - mif_info("%s: ERR! wait_response fail (%d)\n", - ld->name, err); - goto exit; - } - } - - if (dump->cmd) - return err; - - dest = (u8 *)dpld->ul_map.buff; - - header.bop = *(u8 *)(dest); - header.total_frame = *(u16 *)(dest + 1); - header.curr_frame = *(u16 *)(dest + 3); - header.len = *(u16 *)(dest + 5); - - mif_debug("%s: total frame:%d, current frame:%d, data len:%d\n", - ld->name, header.total_frame, header.curr_frame, header.len); - - plen = min_t(u16, header.len, DP_DEFAULT_DUMP_LEN); - - buff = vmalloc(DP_DEFAULT_DUMP_LEN); - if (!buff) { - err = -ENOMEM; - goto exit; - } - - memcpy(buff, dest + sizeof(struct ul_header), plen); - ret = copy_to_user(dump->buff, buff, plen); - if (ret < 0) { - mif_info("%s: ERR! dump copy_to_user fail\n", ld->name); - err = -EIO; - goto exit; - } - buff_size = plen; - - ret = copy_to_user(target + 4, &buff_size, sizeof(int)); - if (ret < 0) { - mif_info("%s: ERR! size copy_to_user fail\n", ld->name); - err = -EIO; - goto exit; - } - - vfree(buff); - return err; - -exit: - if (buff) - vfree(buff); - iowrite32(0, dpld->ul_map.magic); - wake_unlock(&dpld->wlock); - return err; -} - -static int cbp72_dump_update(struct dpram_link_device *dpld, void *arg) -{ - struct link_device *ld = &dpld->ld; - struct dpram_dump_arg dump; - int ret; - - ret = copy_from_user(&dump, (void __user *)arg, sizeof(dump)); - if (ret < 0) { - mif_info("%s: ERR! copy_from_user fail\n", ld->name); - return ret; - } - - return _cbp72_edpram_upload(dpld, &dump, (unsigned char __user *)arg); -} - -static int cbp72_set_dl_magic(struct link_device *ld, struct io_device *iod) -{ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - - ld->mode = LINK_MODE_DLOAD; - - iowrite32(DP_MAGIC_DMDL, dpld->dl_map.magic); - - return 0; -} - -static int cbp72_ioctl(struct dpram_link_device *dpld, struct io_device *iod, - unsigned int cmd, unsigned long arg) -{ - struct link_device *ld = &dpld->ld; - int err = 0; - - switch (cmd) { - case IOCTL_MODEM_DL_START: - err = cbp72_set_dl_magic(ld, iod); - if (err < 0) - mif_err("%s: ERR! set_dl_magic fail\n", ld->name); - break; - - default: - mif_err("%s: ERR! invalid cmd 0x%08X\n", ld->name, cmd); - err = -EINVAL; - break; - } - - return err; -} -#endif - -#if defined(CONFIG_LTE_MODEM_CMC221) -/* For CMC221 SFR for IDPRAM */ -#define CMC_INT2CP_REG 0x10 /* Interrupt to CP */ -#define CMC_INT2AP_REG 0x50 -#define CMC_CLR_INT_REG 0x28 /* Clear Interrupt to AP */ -#define CMC_RESET_REG 0x3C -#define CMC_PUT_REG 0x40 /* AP->CP reg for hostbooting */ -#define CMC_GET_REG 0x50 /* CP->AP reg for hostbooting */ - -static void cmc221_init_boot_map(struct dpram_link_device *dpld) -{ - struct dpram_boot_map *bt_map = &dpld->bt_map; - - bt_map->buff = dpld->base; - bt_map->size = dpld->size; - bt_map->req = (u32 *)(dpld->base + DP_BOOT_REQ_OFFSET); - bt_map->resp = (u32 *)(dpld->base + DP_BOOT_RESP_OFFSET); -} - -static void cmc221_init_dl_map(struct dpram_link_device *dpld) -{ - dpld->dl_map.magic = (u32 *)dpld->base; - dpld->dl_map.buff = (u8 *)dpld->base; -} - -static void cmc221_init_ul_map(struct dpram_link_device *dpld) -{ - dpld->ul_map.magic = (u32 *)dpld->base; - dpld->ul_map.buff = (u8 *)dpld->base; -} - -static void cmc221_init_ipc_map(struct dpram_link_device *dpld) -{ - struct dpram_ipc_16k_map *dpram_map; - struct dpram_ipc_device *dev; - u8 __iomem *sfr_base = dpld->sfr_base; - - dpram_map = (struct dpram_ipc_16k_map *)dpld->base; - - /* Magic code and access enable fields */ - dpld->ipc_map.magic = (u16 __iomem *)&dpram_map->magic; - dpld->ipc_map.access = (u16 __iomem *)&dpram_map->access; - - /* FMT */ - dev = &dpld->ipc_map.dev[IPC_FMT]; - - strcpy(dev->name, "FMT"); - dev->id = IPC_FMT; - - dev->txq.head = (u16 __iomem *)&dpram_map->fmt_tx_head; - dev->txq.tail = (u16 __iomem *)&dpram_map->fmt_tx_tail; - dev->txq.buff = (u8 __iomem *)&dpram_map->fmt_tx_buff[0]; - dev->txq.size = DP_16K_FMT_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&dpram_map->fmt_rx_head; - dev->rxq.tail = (u16 __iomem *)&dpram_map->fmt_rx_tail; - dev->rxq.buff = (u8 __iomem *)&dpram_map->fmt_rx_buff[0]; - dev->rxq.size = DP_16K_FMT_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_F; - dev->mask_res_ack = INT_MASK_RES_ACK_F; - dev->mask_send = INT_MASK_SEND_F; - - /* RAW */ - dev = &dpld->ipc_map.dev[IPC_RAW]; - - strcpy(dev->name, "RAW"); - dev->id = IPC_RAW; - - dev->txq.head = (u16 __iomem *)&dpram_map->raw_tx_head; - dev->txq.tail = (u16 __iomem *)&dpram_map->raw_tx_tail; - dev->txq.buff = (u8 __iomem *)&dpram_map->raw_tx_buff[0]; - dev->txq.size = DP_16K_RAW_TX_BUFF_SZ; - - dev->rxq.head = (u16 __iomem *)&dpram_map->raw_rx_head; - dev->rxq.tail = (u16 __iomem *)&dpram_map->raw_rx_tail; - dev->rxq.buff = (u8 __iomem *)&dpram_map->raw_rx_buff[0]; - dev->rxq.size = DP_16K_RAW_RX_BUFF_SZ; - - dev->mask_req_ack = INT_MASK_REQ_ACK_R; - dev->mask_res_ack = INT_MASK_RES_ACK_R; - dev->mask_send = INT_MASK_SEND_R; - - /* SFR */ - dpld->sfr.int2cp = (u16 __iomem *)(sfr_base + CMC_INT2CP_REG); - dpld->sfr.int2ap = (u16 __iomem *)(sfr_base + CMC_INT2AP_REG); - dpld->sfr.clr_int2ap = (u16 __iomem *)(sfr_base + CMC_CLR_INT_REG); - dpld->sfr.reset = (u16 __iomem *)(sfr_base + CMC_RESET_REG); - dpld->sfr.msg2cp = (u16 __iomem *)(sfr_base + CMC_PUT_REG); - dpld->sfr.msg2ap = (u16 __iomem *)(sfr_base + CMC_GET_REG); - - /* Interrupt ports */ - dpld->ipc_map.mbx_cp2ap = dpld->sfr.int2ap; - dpld->ipc_map.mbx_ap2cp = dpld->sfr.int2cp; -} - -static inline void cmc221_idpram_reset(struct dpram_link_device *dpld) -{ - iowrite16(1, dpld->sfr.reset); -} - -static inline u16 cmc221_idpram_recv_msg(struct dpram_link_device *dpld) -{ - return ioread16(dpld->sfr.msg2ap); -} - -static inline void cmc221_idpram_send_msg(struct dpram_link_device *dpld, - u16 msg) -{ - iowrite16(msg, dpld->sfr.msg2cp); -} - -static int _cmc221_idpram_wait_resp(struct dpram_link_device *dpld, u32 resp) -{ - struct link_device *ld = &dpld->ld; - int count = 50000; - u32 rcvd = 0; - - if (resp == CMC22x_CP_REQ_NV_DATA) { - while (1) { - rcvd = ioread32(dpld->bt_map.resp); - if (rcvd == resp) - break; - - rcvd = cmc221_idpram_recv_msg(dpld); - if (rcvd == 0x9999) { - mif_info("%s: Invalid resp 0x%04X\n", - ld->name, rcvd); - panic("CP Crash ... BAD CRC in CP"); - } - - if (count-- < 0) { - mif_info("%s: Invalid resp 0x%08X\n", - ld->name, rcvd); - return -EAGAIN; - } - - udelay(100); - } - } else { - while (1) { - rcvd = cmc221_idpram_recv_msg(dpld); - - if (rcvd == resp) - break; - - if (resp == CMC22x_CP_RECV_NV_END && - rcvd == CMC22x_CP_CAL_BAD) { - mif_info("%s: CMC22x_CP_CAL_BAD\n", ld->name); - break; - } - - if (count-- < 0) { - mif_info("%s: Invalid resp 0x%04X\n", - ld->name, rcvd); - return -EAGAIN; - } - - udelay(100); - } - } - - return rcvd; -} - -static int _cmc221_idpram_send_boot(struct dpram_link_device *dpld, void *arg) -{ - struct link_device *ld = &dpld->ld; - u8 __iomem *bt_buff = dpld->bt_map.buff; - struct dpram_boot_img cp_img; - u8 *img_buff = NULL; - int err = 0; - int cnt = 0; - - ld->mode = LINK_MODE_BOOT; - - dpld->dpctl->setup_speed(DPRAM_SPEED_LOW); - - /* Test memory... After testing, memory is cleared. */ - if (mif_test_dpram(ld->name, bt_buff, dpld->bt_map.size) < 0) { - mif_info("%s: ERR! mif_test_dpram fail!\n", ld->name); - ld->mode = LINK_MODE_OFFLINE; - return -EIO; - } - - memset(&cp_img, 0, sizeof(struct dpram_boot_img)); - - /* Get information about the boot image */ - err = copy_from_user(&cp_img, arg, sizeof(cp_img)); - mif_info("%s: CP image addr = 0x%08X, size = %d\n", - ld->name, (int)cp_img.addr, cp_img.size); - - /* Alloc a buffer for the boot image */ - img_buff = kzalloc(dpld->bt_map.size, GFP_KERNEL); - if (!img_buff) { - mif_info("%s: ERR! kzalloc fail\n", ld->name); - ld->mode = LINK_MODE_OFFLINE; - return -ENOMEM; - } - - /* Copy boot image from the user space to the image buffer */ - err = copy_from_user(img_buff, cp_img.addr, cp_img.size); - - /* Copy boot image to DPRAM and verify it */ - memcpy(bt_buff, img_buff, cp_img.size); - if (memcmp16_to_io(bt_buff, img_buff, cp_img.size)) { - mif_info("%s: ERR! Boot may be broken!!!\n", ld->name); - goto err; - } - - cmc221_idpram_reset(dpld); - usleep_range(1000, 2000); - - if (cp_img.mode == HOST_BOOT_MODE_NORMAL) { - mif_info("%s: HOST_BOOT_MODE_NORMAL\n", ld->name); - mif_info("%s: Send req 0x%08X\n", ld->name, cp_img.req); - iowrite32(cp_img.req, dpld->bt_map.req); - - /* Wait for cp_img.resp for up to 2 seconds */ - mif_info("%s: Wait resp 0x%08X\n", ld->name, cp_img.resp); - while (ioread32(dpld->bt_map.resp) != cp_img.resp) { - cnt++; - usleep_range(1000, 2000); - - if (cnt > 1000) { - mif_info("%s: ERR! Invalid resp 0x%08X\n", - ld->name, ioread32(dpld->bt_map.resp)); - goto err; - } - } - } else { - mif_info("%s: HOST_BOOT_MODE_DUMP\n", ld->name); - } - - kfree(img_buff); - - mif_info("%s: Send BOOT done\n", ld->name); - - dpld->dpctl->setup_speed(DPRAM_SPEED_HIGH); - - return 0; - -err: - ld->mode = LINK_MODE_OFFLINE; - kfree(img_buff); - - mif_info("%s: ERR! Boot send fail!!!\n", ld->name); - return -EIO; -} - -static int cmc221_download_boot(struct dpram_link_device *dpld, void *arg) -{ - if (dpld->type == CP_IDPRAM) - return _cmc221_idpram_send_boot(dpld, arg); - else - return -ENODEV; -} - -static int _cmc221_idpram_download_bin(struct dpram_link_device *dpld, - struct sk_buff *skb) -{ - int err = 0; - int ret = 0; - struct link_device *ld = &dpld->ld; - struct dpram_boot_frame *bf = (struct dpram_boot_frame *)skb->data; - u8 __iomem *buff = (dpld->bt_map.buff + bf->offset); - - if ((bf->offset + bf->len) > dpld->bt_map.size) { - mif_info("%s: ERR! Out of DPRAM boundary\n", ld->name); - err = -EINVAL; - goto exit; - } - - if (bf->len) - memcpy(buff, bf->data, bf->len); - - if (bf->req) - cmc221_idpram_send_msg(dpld, (u16)bf->req); - - if (bf->resp) { - err = _cmc221_idpram_wait_resp(dpld, bf->resp); - if (err < 0) - mif_info("%s: ERR! wait_response fail (err %d)\n", - ld->name, err); - } - - if (bf->req == CMC22x_CAL_NV_DOWN_END) - mif_info("%s: CMC22x_CAL_NV_DOWN_END\n", ld->name); - -exit: - if (err < 0) - ret = err; - else - ret = skb->len; - - dev_kfree_skb_any(skb); - - return ret; -} - -static int cmc221_download_binary(struct dpram_link_device *dpld, - struct sk_buff *skb) -{ - if (dpld->type == CP_IDPRAM) - return _cmc221_idpram_download_bin(dpld, skb); - else - return -ENODEV; -} - -static int cmc221_dump_start(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - int ret; - - ld->mode = LINK_MODE_ULOAD; - - ret = del_timer(&dpld->crash_timer); - wake_lock(&dpld->wlock); - - dpld->crash_rcvd = 0; - iowrite32(CMC22x_CP_DUMP_MAGIC, dpld->ul_map.magic); - - init_completion(&dpld->crash_start_complete); - - return 0; -} - -static void _cmc221_idpram_wait_dump(unsigned long arg) -{ - struct dpram_link_device *dpld = (struct dpram_link_device *)arg; - u16 msg; - - msg = cmc221_idpram_recv_msg(dpld); - if (msg == CMC22x_CP_DUMP_END) { - complete_all(&dpld->crash_recv_done); - return; - } - - if (((dpld->crash_rcvd & 0x1) == 0) && (msg == CMC22x_1ST_BUFF_FULL)) { - complete_all(&dpld->crash_recv_done); - return; - } - - if (((dpld->crash_rcvd & 0x1) == 1) && (msg == CMC22x_2ND_BUFF_FULL)) { - complete_all(&dpld->crash_recv_done); - return; - } - - mif_add_timer(&dpld->crash_timer, DUMP_WAIT_TIMEOUT, - _cmc221_idpram_wait_dump, (unsigned long)dpld); -} - -static int _cmc221_idpram_upload(struct dpram_link_device *dpld, - struct dpram_dump_arg *dumparg) -{ - struct link_device *ld = &dpld->ld; - int ret; - u8 __iomem *src; - int buff_size = CMC22x_DUMP_BUFF_SIZE; - - if ((dpld->crash_rcvd & 0x1) == 0) - cmc221_idpram_send_msg(dpld, CMC22x_1ST_BUFF_READY); - else - cmc221_idpram_send_msg(dpld, CMC22x_2ND_BUFF_READY); - - init_completion(&dpld->crash_recv_done); - - mif_add_timer(&dpld->crash_timer, DUMP_WAIT_TIMEOUT, - _cmc221_idpram_wait_dump, (unsigned long)dpld); - - ret = wait_for_completion_interruptible_timeout( - &dpld->crash_recv_done, DUMP_TIMEOUT); - if (!ret) { - mif_info("%s: ERR! CP didn't send dump data!!!\n", ld->name); - goto err_out; - } - - if (cmc221_idpram_recv_msg(dpld) == CMC22x_CP_DUMP_END) { - mif_info("%s: CMC22x_CP_DUMP_END\n", ld->name); - return 0; - } - - if ((dpld->crash_rcvd & 0x1) == 0) - src = dpld->ul_map.buff; - else - src = dpld->ul_map.buff + CMC22x_DUMP_BUFF_SIZE; - - memcpy(dpld->buff, src, buff_size); - - ret = copy_to_user(dumparg->buff, dpld->buff, buff_size); - if (ret < 0) { - mif_info("%s: ERR! copy_to_user fail\n", ld->name); - goto err_out; - } - - dpld->crash_rcvd++; - return buff_size; - -err_out: - return -EIO; -} - -static int cmc221_dump_update(struct dpram_link_device *dpld, void *arg) -{ - struct link_device *ld = &dpld->ld; - struct dpram_dump_arg dump; - int ret; - - ret = copy_from_user(&dump, (void __user *)arg, sizeof(dump)); - if (ret < 0) { - mif_info("%s: ERR! copy_from_user fail\n", ld->name); - return ret; - } - - return _cmc221_idpram_upload(dpld, &dump); -} - -static int cmc221_ioctl(struct dpram_link_device *dpld, struct io_device *iod, - unsigned int cmd, unsigned long arg) -{ - struct link_device *ld = &dpld->ld; - int err = 0; - - switch (cmd) { - case IOCTL_DPRAM_SEND_BOOT: - err = cmc221_download_boot(dpld, (void *)arg); - if (err < 0) - mif_info("%s: ERR! download_boot fail\n", ld->name); - break; - - default: - mif_err("%s: ERR! invalid cmd 0x%08X\n", ld->name, cmd); - err = -EINVAL; - break; - } - - return err; -} - -static void cmc221_idpram_clr_int2ap(struct dpram_link_device *dpld) -{ - iowrite16(0xFFFF, dpld->sfr.clr_int2ap); -} - -static int cmc221_idpram_wakeup(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - struct modem_data *mdm_data = ld->mdm_data; - int cnt = 0; - - gpio_set_value(mdm_data->gpio_dpram_wakeup, 1); - - while (!gpio_get_value(mdm_data->gpio_dpram_status)) { - if (cnt++ > 10) { - if (in_irq()) - mif_err("ERR! gpio_dpram_status == 0 in IRQ\n"); - else - mif_err("ERR! gpio_dpram_status == 0\n"); - return -EACCES; - } - - mif_info("gpio_dpram_status == 0 (cnt %d)\n", cnt); - if (in_interrupt()) - udelay(1000); - else - usleep_range(1000, 2000); - } - - return 0; -} - -static void cmc221_idpram_sleep(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - gpio_set_value(ld->mdm_data->gpio_dpram_wakeup, 0); -} -#endif - -#if defined(CONFIG_CDMA_MODEM_MDM6600) || defined(CONFIG_GSM_MODEM_ESC6270) -enum qc_dload_tag { - QC_DLOAD_TAG_NONE = 0, - QC_DLOAD_TAG_BIN, - QC_DLOAD_TAG_NV, - QC_DLOAD_TAG_MAX -}; - -static void qc_dload_task(unsigned long data); - -static void qc_init_boot_map(struct dpram_link_device *dpld) -{ - struct qc_dpram_boot_map *qbt_map = &dpld->qc_bt_map; - struct modemlink_dpram_control *dpctl = dpld->dpctl; - - qbt_map->buff = dpld->base; - qbt_map->frame_size = (u16 *)(dpld->base + dpctl->boot_size_offset); - qbt_map->tag = (u16 *)(dpld->base + dpctl->boot_tag_offset); - qbt_map->count = (u16 *)(dpld->base + dpctl->boot_count_offset); - - tasklet_init(&dpld->dl_tsk, qc_dload_task, (unsigned long)dpld); -} - -static int qc_prepare_download(struct dpram_link_device *dpld) -{ - int retval = 0; - int count = 0; - - while (1) { - if (dpld->udl_check.copy_start) { - dpld->udl_check.copy_start = 0; - break; - } - - usleep_range(10000, 11000); - - count++; - if (count > 300) { - mif_err("ERR! count %d\n", count); - return -1; - } - } - - return retval; -} - -static void _qc_do_download(struct dpram_link_device *dpld, - struct dpram_udl_param *param) -{ - struct qc_dpram_boot_map *qbt_map = &dpld->qc_bt_map; - - if (param->size <= dpld->dpctl->max_boot_frame_size) { - memcpy(qbt_map->buff, param->addr, param->size); - iowrite16(param->size, qbt_map->frame_size); - iowrite16(param->tag, qbt_map->tag); - iowrite16(param->count, qbt_map->count); - dpld->send_intr(dpld, 0xDB12); - } else { - mif_info("param->size %d\n", param->size); - } -} - -static int _qc_download(struct dpram_link_device *dpld, void *arg, - enum qc_dload_tag tag) -{ - int retval = 0; - int count = 0; - int cnt_limit; - unsigned char *img; - struct dpram_udl_param param; - - retval = copy_from_user((void *)¶m, (void *)arg, sizeof(param)); - if (retval < 0) { - mif_err("ERR! copy_from_user fail\n"); - return -1; - } - - img = vmalloc(param.size); - if (!img) { - mif_err("ERR! vmalloc fail\n"); - return -1; - } - memset(img, 0, param.size); - memcpy(img, param.addr, param.size); - - dpld->udl_check.total_size = param.size; - dpld->udl_check.rest_size = param.size; - dpld->udl_check.send_size = 0; - dpld->udl_check.copy_complete = 0; - - dpld->udl_param.addr = img; - dpld->udl_param.size = dpld->dpctl->max_boot_frame_size; - if (tag == QC_DLOAD_TAG_NV) - dpld->udl_param.count = 1; - else - dpld->udl_param.count = param.count; - dpld->udl_param.tag = tag; - - if (dpld->udl_check.rest_size < dpld->dpctl->max_boot_frame_size) - dpld->udl_param.size = dpld->udl_check.rest_size; - - /* Download image (binary or NV) */ - _qc_do_download(dpld, &dpld->udl_param); - - /* Wait for completion - */ - if (tag == QC_DLOAD_TAG_NV) - cnt_limit = 200; - else - cnt_limit = 1000; - - while (1) { - if (dpld->udl_check.copy_complete) { - dpld->udl_check.copy_complete = 0; - retval = 0; - break; - } - - usleep_range(10000, 11000); - - count++; - if (count > cnt_limit) { - dpld->udl_check.total_size = 0; - dpld->udl_check.rest_size = 0; - mif_err("ERR! count %d\n", count); - retval = -1; - break; - } - } - - vfree(img); - - return retval; -} - -static int qc_download_binary(struct dpram_link_device *dpld, void *arg) -{ - return _qc_download(dpld, arg, QC_DLOAD_TAG_BIN); -} - -static int qc_download_nv(struct dpram_link_device *dpld, void *arg) -{ - return _qc_download(dpld, arg, QC_DLOAD_TAG_NV); -} - -static void qc_dload_task(unsigned long data) -{ - struct dpram_link_device *dpld = (struct dpram_link_device *)data; - - dpld->udl_check.send_size += dpld->udl_param.size; - dpld->udl_check.rest_size -= dpld->udl_param.size; - - dpld->udl_param.addr += dpld->udl_param.size; - - if (dpld->udl_check.send_size >= dpld->udl_check.total_size) { - dpld->udl_check.copy_complete = 1; - dpld->udl_param.tag = 0; - return; - } - - if (dpld->udl_check.rest_size < dpld->dpctl->max_boot_frame_size) - dpld->udl_param.size = dpld->udl_check.rest_size; - - dpld->udl_param.count += 1; - - _qc_do_download(dpld, &dpld->udl_param); -} - -static void qc_dload_cmd_handler(struct dpram_link_device *dpld, u16 cmd) -{ - switch (cmd) { - case 0x1234: - dpld->udl_check.copy_start = 1; - break; - - case 0xDBAB: - if (dpld->udl_check.total_size) - tasklet_schedule(&dpld->dl_tsk); - break; - - case 0xABCD: - dpld->udl_check.boot_complete = 1; - break; - - default: - mif_err("ERR! unknown command 0x%04X\n", cmd); - } -} - -static int qc_boot_start(struct dpram_link_device *dpld) -{ - u16 mask = 0; - int count = 0; - - /* Send interrupt -> '0x4567' */ - mask = 0x4567; - dpld->send_intr(dpld, mask); - - while (1) { - if (dpld->udl_check.boot_complete) { - dpld->udl_check.boot_complete = 0; - break; - } - - usleep_range(10000, 11000); - - count++; - if (count > 200) { - mif_err("ERR! count %d\n", count); - return -1; - } - } - - return 0; -} - -static int qc_boot_post_process(struct dpram_link_device *dpld) -{ - int count = 0; - - while (1) { - if (dpld->boot_start_complete) { - dpld->boot_start_complete = 0; - break; - } - - usleep_range(10000, 11000); - - count++; - if (count > 200) { - mif_err("ERR! count %d\n", count); - return -1; - } - } - - return 0; -} - -static void qc_start_handler(struct dpram_link_device *dpld) -{ - /* - * INT_MASK_VALID | INT_MASK_CMD | INT_MASK_CP_AIRPLANE_BOOT | - * INT_MASK_CP_AP_ANDROID | INT_MASK_CMD_INIT_END - */ - u16 mask = (0x0080 | 0x0040 | 0x1000 | 0x0100 | 0x0002); - - dpld->boot_start_complete = 1; - - /* Send INIT_END code to CP */ - mif_info("send 0x%04X (INIT_END)\n", mask); - - dpld->send_intr(dpld, mask); -} - -static void qc_crash_log(struct dpram_link_device *dpld) -{ - struct link_device *ld = &dpld->ld; - static unsigned char buf[151]; - u8 __iomem *data = NULL; - - data = dpld->get_rx_buff(dpld, IPC_FMT); - memcpy(buf, data, (sizeof(buf) - 1)); - - mif_info("PHONE ERR MSG\t| %s Crash\n", ld->mdm_data->name); - mif_info("PHONE ERR MSG\t| %s\n", buf); -} - -static int _qc_data_upload(struct dpram_link_device *dpld, - struct dpram_udl_param *param) -{ - struct qc_dpram_boot_map *qbt_map = &dpld->qc_bt_map; - int retval = 0; - u16 intval = 0; - int count = 0; - - while (1) { - if (!gpio_get_value(dpld->gpio_dpram_int)) { - intval = dpld->recv_intr(dpld); - if (intval == 0xDBAB) { - break; - } else { - mif_err("intr 0x%08x\n", intval); - return -1; - } - } - - usleep_range(1000, 2000); - - count++; - if (count > 200) { - mif_err("<%s:%d>\n", __func__, __LINE__); - return -1; - } - } - - param->size = ioread16(qbt_map->frame_size); - memcpy(param->addr, qbt_map->buff, param->size); - param->tag = ioread16(qbt_map->tag); - param->count = ioread16(qbt_map->count); - - dpld->send_intr(dpld, 0xDB12); - - return retval; -} - -static int qc_uload_step1(struct dpram_link_device *dpld) -{ - int retval = 0; - int count = 0; - u16 intval = 0; - u16 mask = 0; - - mif_info("+---------------------------------------------+\n"); - mif_info("| UPLOAD PHONE SDRAM |\n"); - mif_info("+---------------------------------------------+\n"); - - while (1) { - if (!gpio_get_value(dpld->gpio_dpram_int)) { - intval = dpld->recv_intr(dpld); - mif_info("intr 0x%04x\n", intval); - if (intval == 0x1234) { - break; - } else { - mif_info("ERR! invalid intr\n"); - return -1; - } - } - - usleep_range(1000, 2000); - - count++; - if (count > 200) { - intval = dpld->recv_intr(dpld); - mif_info("count %d, intr 0x%04x\n", count, intval); - if (intval == 0x1234) - break; - return -1; - } - } - - mask = 0xDEAD; - dpld->send_intr(dpld, mask); - - return retval; -} - -static int qc_uload_step2(struct dpram_link_device *dpld, void *arg) -{ - int retval = 0; - struct dpram_udl_param param; - - retval = copy_from_user((void *)¶m, (void *)arg, sizeof(param)); - if (retval < 0) { - mif_err("ERR! copy_from_user fail (err %d)\n", retval); - return -1; - } - - retval = _qc_data_upload(dpld, ¶m); - if (retval < 0) { - mif_err("ERR! _qc_data_upload fail (err %d)\n", retval); - return -1; - } - - if (!(param.count % 500)) - mif_info("param->count = %d\n", param.count); - - if (param.tag == 4) { - enable_irq(dpld->irq); - mif_info("param->tag = %d\n", param.tag); - } - - retval = copy_to_user((unsigned long *)arg, ¶m, sizeof(param)); - if (retval < 0) { - mif_err("ERR! copy_to_user fail (err %d)\n", retval); - return -1; - } - - return retval; -} - -static int qc_ioctl(struct dpram_link_device *dpld, struct io_device *iod, - unsigned int cmd, unsigned long arg) -{ - struct link_device *ld = &dpld->ld; - int err = 0; - - switch (cmd) { - case IOCTL_DPRAM_PHONE_POWON: - err = qc_prepare_download(dpld); - if (err < 0) - mif_info("%s: ERR! prepare_download fail\n", ld->name); - break; - - case IOCTL_DPRAM_PHONEIMG_LOAD: - err = qc_download_binary(dpld, (void *)arg); - if (err < 0) - mif_info("%s: ERR! download_binary fail\n", ld->name); - break; - - case IOCTL_DPRAM_NVDATA_LOAD: - err = qc_download_nv(dpld, (void *)arg); - if (err < 0) - mif_info("%s: ERR! download_nv fail\n", ld->name); - break; - - case IOCTL_DPRAM_PHONE_BOOTSTART: - err = qc_boot_start(dpld); - if (err < 0) { - mif_info("%s: ERR! boot_start fail\n", ld->name); - break; - } - - err = qc_boot_post_process(dpld); - if (err < 0) - mif_info("%s: ERR! boot_post_process fail\n", ld->name); - - break; - - case IOCTL_DPRAM_PHONE_UPLOAD_STEP1: - disable_irq_nosync(dpld->irq); - err = qc_uload_step1(dpld); - if (err < 0) { - enable_irq(dpld->irq); - mif_info("%s: ERR! upload_step1 fail\n", ld->name); - } - break; - - case IOCTL_DPRAM_PHONE_UPLOAD_STEP2: - err = qc_uload_step2(dpld, (void *)arg); - if (err < 0) { - enable_irq(dpld->irq); - mif_info("%s: ERR! upload_step2 fail\n", ld->name); - } - break; - - default: - mif_err("%s: ERR! invalid cmd 0x%08X\n", ld->name, cmd); - err = -EINVAL; - break; - } - - return err; -} - -static irqreturn_t qc_dpram_irq_handler(int irq, void *data) -{ - struct dpram_link_device *dpld = (struct dpram_link_device *)data; - struct link_device *ld = (struct link_device *)&dpld->ld; - u16 int2ap = 0; - - if (unlikely(ld->mode == LINK_MODE_OFFLINE)) - return IRQ_HANDLED; - - int2ap = dpld->recv_intr(dpld); - - if (int2ap == INT_POWERSAFE_FAIL) { - mif_info("%s: int2ap == INT_POWERSAFE_FAIL\n", ld->name); - goto exit; - } - - if (int2ap == 0x1234 || int2ap == 0xDBAB || int2ap == 0xABCD) { - qc_dload_cmd_handler(dpld, int2ap); - goto exit; - } else if (int2ap == 0x4321 || int2ap == 0x5432) { - mif_err("%s: ERR! CP err cmd (err %d)\n", __func__, int2ap); - goto exit; - } - - if (likely(INT_VALID(int2ap))) - dpld->ipc_rx_handler(dpld, int2ap); - else - mif_info("%s: ERR! invalid intr 0x%04X\n", ld->name, int2ap); - -exit: - return IRQ_HANDLED; -} -#endif - -static struct dpram_ext_op ext_op_set[] = { -#ifdef CONFIG_CDMA_MODEM_CBP72 - [VIA_CBP72] = { - .exist = 1, - .init_boot_map = cbp72_init_boot_map, - .init_dl_map = cbp72_init_dl_map, - .download_binary = cbp72_download_binary, - .dump_start = cbp72_dump_start, - .dump_update = cbp72_dump_update, - .ioctl = cbp72_ioctl, - }, -#endif -#ifdef CONFIG_LTE_MODEM_CMC221 - [SEC_CMC221] = { - .exist = 1, - .init_boot_map = cmc221_init_boot_map, - .init_dl_map = cmc221_init_dl_map, - .init_ul_map = cmc221_init_ul_map, - .init_ipc_map = cmc221_init_ipc_map, - .download_binary = cmc221_download_binary, - .dump_start = cmc221_dump_start, - .dump_update = cmc221_dump_update, - .ioctl = cmc221_ioctl, - .clear_intr = cmc221_idpram_clr_int2ap, - .wakeup = cmc221_idpram_wakeup, - .sleep = cmc221_idpram_sleep, - }, -#endif -#if defined(CONFIG_CDMA_MODEM_MDM6600) - [QC_MDM6600] = { - .exist = 1, - .init_boot_map = qc_init_boot_map, - .cp_start_handler = qc_start_handler, - .crash_log = qc_crash_log, - .ioctl = qc_ioctl, - .irq_handler = qc_dpram_irq_handler, - }, -#endif -#if defined(CONFIG_GSM_MODEM_ESC6270) - [QC_ESC6270] = { - .exist = 1, - .init_boot_map = qc_init_boot_map, - .cp_start_handler = qc_start_handler, - .crash_log = qc_crash_log, - .ioctl = qc_ioctl, - .irq_handler = qc_dpram_irq_handler, - }, -#endif -}; - -struct dpram_ext_op *dpram_get_ext_op(enum modem_t modem) -{ - if (ext_op_set[modem].exist) - return &ext_op_set[modem]; - else - return NULL; -} - diff --git a/drivers/misc/modem_if_u1/modem_link_device_hsic.c b/drivers/misc/modem_if_u1/modem_link_device_hsic.c deleted file mode 100644 index 955c620..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_hsic.c +++ /dev/null @@ -1,1604 +0,0 @@ -/* /linux/drivers/new_modem_if/link_dev_usb.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_hsic.h" -#include "modem_utils.h" - -static struct modem_ctl *if_usb_get_modemctl(struct link_pm_data *pm_data); -static int link_pm_runtime_get_active(struct link_pm_data *pm_data); -static int usb_tx_urb_with_skb(struct usb_device *usbdev, struct sk_buff *skb, - struct if_usb_devdata *pipe_data); -#ifdef FOR_TEGRA -#define ehci_vendor_txfilltuning tegra_ehci_txfilltuning -#else -#define ehci_vendor_txfilltuning() -#endif -static void usb_rx_complete(struct urb *urb); - -static int start_ipc(struct link_device *ld, struct io_device *iod) -{ - struct sk_buff *skb; - char data[1] = {'a'}; - int err; - struct usb_link_device *usb_ld = to_usb_link_device(ld); - struct link_pm_data *pm_data = usb_ld->link_pm_data; - struct device *dev = &usb_ld->usbdev->dev; - struct if_usb_devdata *pipe_data = &usb_ld->devdata[IF_USB_FMT_EP]; - - if (!usb_ld->if_usb_connected) { - mif_err("HSIC not connected, skip start ipc\n"); - err = -ENODEV; - goto exit; - } - -retry: - if (ld->mc->phone_state != STATE_ONLINE) { - mif_err("MODEM is not online, skip start ipc\n"); - err = -ENODEV; - goto exit; - } - - /* check usb runtime pm first */ - if (dev->power.runtime_status != RPM_ACTIVE) { - if (!pm_data->resume_requested) { - mif_debug("QW PM\n"); - INIT_COMPLETION(pm_data->active_done); - queue_delayed_work(pm_data->wq, - &pm_data->link_pm_work, 0); - } - mif_debug("Wait pm\n"); - err = wait_for_completion_timeout(&pm_data->active_done, - msecs_to_jiffies(500)); - /* timeout or -ERESTARTSYS */ - if (err <= 0) - goto retry; - } - - pm_runtime_get_sync(dev); - - mif_err("send 'a'\n"); - - skb = alloc_skb(16, GFP_ATOMIC); - if (unlikely(!skb)) { - pm_runtime_put(dev); - return -ENOMEM; - } - memcpy(skb_put(skb, 1), data, 1); - skbpriv(skb)->iod = iod; - skbpriv(skb)->ld = ld; - - if (!usb_ld->if_usb_connected || !usb_ld->usbdev) - return -ENODEV; - - usb_mark_last_busy(usb_ld->usbdev); - err = usb_tx_urb_with_skb(usb_ld->usbdev, skb, pipe_data); - if (err < 0) { - mif_err("usb_tx_urb fail\n"); - dev_kfree_skb_any(skb); - } - - pm_runtime_put(dev); -exit: - return err; -} - -static void stop_ipc(struct link_device *ld) -{ - ld->com_state = COM_NONE; -} - -static int usb_init_communication(struct link_device *ld, - struct io_device *iod) -{ - struct task_struct *task = get_current(); - char str[TASK_COMM_LEN]; - - mif_info("%d:%s\n", task->pid, get_task_comm(str, task)); - - /* Send IPC Start ASCII 'a' */ - if (iod->id == 0x1) - return start_ipc(ld, iod); - - return 0; -} - -static void usb_terminate_communication(struct link_device *ld, - struct io_device *iod) -{ - if (iod->id != 0x1 || iod->format != IPC_FMT) - return; - - if (iod->mc->phone_state == STATE_CRASH_RESET || - iod->mc->phone_state == STATE_CRASH_EXIT) - stop_ipc(ld); -} - -static int usb_rx_submit(struct usb_link_device *usb_ld, - struct if_usb_devdata *pipe_data, - gfp_t gfp_flags) -{ - int ret; - struct urb *urb; - - if (pipe_data->disconnected) - return -ENOENT; - - ehci_vendor_txfilltuning(); - - urb = pipe_data->urb; - - urb->transfer_flags = 0; - usb_fill_bulk_urb(urb, pipe_data->usbdev, - pipe_data->rx_pipe, pipe_data->rx_buf, - pipe_data->rx_buf_size, usb_rx_complete, - (void *)pipe_data); - - if (pipe_data->disconnected) - return -ENOENT; - - usb_mark_last_busy(usb_ld->usbdev); - ret = usb_submit_urb(urb, gfp_flags); - if (ret) - mif_err("submit urb fail with ret (%d)\n", ret); - - return ret; -} - -static void usb_rx_retry_work(struct work_struct *work) -{ - int ret = 0; - struct usb_link_device *usb_ld = - container_of(work, struct usb_link_device, rx_retry_work.work); - struct urb *urb = usb_ld->retry_urb; - struct if_usb_devdata *pipe_data = urb->context; - struct io_device *iod; - int iod_format; - - if (!usb_ld->if_usb_connected || !usb_ld->usbdev) - return; - - if (usb_ld->usbdev) - usb_mark_last_busy(usb_ld->usbdev); - switch (pipe_data->format) { - case IF_USB_FMT_EP: - if (usb_ld->if_usb_is_main) { - pr_urb("IPC-RX, retry", urb); - iod_format = IPC_FMT; - } else { - iod_format = IPC_BOOT; - } - break; - case IF_USB_RAW_EP: - iod_format = IPC_MULTI_RAW; - break; - case IF_USB_RFS_EP: - iod_format = IPC_RFS; - pr_urb("RFS-RX, retry", urb); - break; - case IF_USB_CMD_EP: - iod_format = IPC_CMD; - break; - default: - iod_format = -1; - break; - } - - iod = link_get_iod_with_format(&usb_ld->ld, iod_format); - if (iod) { - ret = iod->recv(iod, &usb_ld->ld, (char *)urb->transfer_buffer, - urb->actual_length); - if (ret == -ENOMEM) { - /* TODO: check the retry count */ - /* retry the delay work after 20ms and resubit*/ - mif_err("ENOMEM, +retry 20ms\n"); - if (usb_ld->usbdev) - usb_mark_last_busy(usb_ld->usbdev); - usb_ld->retry_urb = urb; - if (usb_ld->rx_retry_cnt++ < 10) - queue_delayed_work(usb_ld->ld.tx_wq, - &usb_ld->rx_retry_work, 10); - return; - } - if (ret < 0) - mif_err("io device recv error (%d)\n", ret); - usb_ld->rx_retry_cnt = 0; - } - - if (usb_ld->usbdev) - usb_mark_last_busy(usb_ld->usbdev); - usb_rx_submit(usb_ld, pipe_data, GFP_ATOMIC); -} - - -static void usb_rx_complete(struct urb *urb) -{ - struct if_usb_devdata *pipe_data = urb->context; - struct usb_link_device *usb_ld = pipe_data->usb_ld; - struct io_device *iod; - int iod_format; - int ret; - - if (usb_ld->usbdev) - usb_mark_last_busy(usb_ld->usbdev); - - switch (urb->status) { - case -ENOENT: - /* case for 'link pm suspended but rx data had remained' */ - mif_debug("urb->status = -ENOENT\n"); - case 0: - if (!urb->actual_length) { - mif_debug("urb has zero length!\n"); - goto rx_submit; - } - - usb_ld->link_pm_data->rx_cnt++; - /* call iod recv */ - /* how we can distinguish boot ch with fmt ch ?? */ - switch (pipe_data->format) { - case IF_USB_FMT_EP: - if (usb_ld->if_usb_is_main) { - pr_urb("IPC-RX", urb); - iod_format = IPC_FMT; - } else { - iod_format = IPC_BOOT; - } - break; - case IF_USB_RAW_EP: - iod_format = IPC_MULTI_RAW; - break; - case IF_USB_RFS_EP: - iod_format = IPC_RFS; - break; - case IF_USB_CMD_EP: - iod_format = IPC_CMD; - break; - default: - iod_format = -1; - break; - } - - /* flow control CMD by CP, not use io device */ - if (unlikely(iod_format == IPC_CMD)) { - ret = link_rx_flowctl_cmd(&usb_ld->ld, - (char *)urb->transfer_buffer, - urb->actual_length); - if (ret < 0) - mif_err("no multi raw device (%d)\n", ret); - goto rx_submit; - } - - iod = link_get_iod_with_format(&usb_ld->ld, iod_format); - if (iod) { - ret = iod->recv(iod, - &usb_ld->ld, - (char *)urb->transfer_buffer, - urb->actual_length); - if (ret == -ENOMEM) { - /* retry the delay work and resubit*/ - mif_err("ENOMEM, retry\n"); - if (usb_ld->usbdev) - usb_mark_last_busy(usb_ld->usbdev); - usb_ld->retry_urb = urb; - queue_delayed_work(usb_ld->ld.tx_wq, - &usb_ld->rx_retry_work, 0); - return; - } - if (ret < 0) - mif_err("io device recv error (%d)\n", ret); - } -rx_submit: - if (urb->status == 0) { - if (usb_ld->usbdev) - usb_mark_last_busy(usb_ld->usbdev); - usb_rx_submit(usb_ld, pipe_data, GFP_ATOMIC); - } - break; - default: - mif_err("urb err status = %d\n", urb->status); - break; - } -} - -static int usb_send(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb) -{ - struct sk_buff_head *txq; - size_t tx_size; - struct usb_link_device *usb_ld = to_usb_link_device(ld); - struct link_pm_data *pm_data = usb_ld->link_pm_data; - - switch (iod->format) { - case IPC_RAW: - txq = &ld->sk_raw_tx_q; - - if (unlikely(ld->raw_tx_suspended)) { - /* Unlike misc_write, vnet_xmit is in interrupt. - * Despite call netif_stop_queue on CMD_SUSPEND, - * packets can be reached here. - */ - if (in_irq()) { - mif_err("raw tx is suspended, " - "drop packet. size=%d", - skb->len); - return -EBUSY; - } - - mif_err("wait RESUME CMD...\n"); - INIT_COMPLETION(ld->raw_tx_resumed_by_cp); - wait_for_completion(&ld->raw_tx_resumed_by_cp); - mif_err("resumed done.\n"); - } - break; - case IPC_BOOT: - case IPC_FMT: - case IPC_RFS: - default: - txq = &ld->sk_fmt_tx_q; - break; - } - /* store the tx size before run the tx_delayed_work*/ - tx_size = skb->len; - - /* drop packet, when link is not online */ - if (ld->com_state == COM_BOOT && iod->format != IPC_BOOT) { - mif_err("%s: drop packet, size=%d, com_state=%d\n", - iod->name, skb->len, ld->com_state); - dev_kfree_skb_any(skb); - return 0; - } - - /* en queue skb data */ - skb_queue_tail(txq, skb); - /* Hold wake_lock for getting schedule the tx_work */ - wake_lock(&pm_data->tx_async_wake); - - if (!work_pending(&ld->tx_delayed_work.work)) - queue_delayed_work(ld->tx_wq, &ld->tx_delayed_work, 0); - - return tx_size; -} - -static void usb_tx_complete(struct urb *urb) -{ - struct sk_buff *skb = urb->context; - struct io_device *iod = skbpriv(skb)->iod; - struct link_device *ld = skbpriv(skb)->ld; - struct usb_link_device *usb_ld = to_usb_link_device(ld); - - switch (urb->status) { - case 0: - break; - case -ENOENT: - case -ECONNRESET: - case -ESHUTDOWN: - default: - if (iod->format != IPC_BOOT) - mif_info("TX error (%d)\n", urb->status); - } - - dev_kfree_skb_any(skb); - if (urb->dev && usb_ld->if_usb_connected) - usb_mark_last_busy(urb->dev); - usb_free_urb(urb); -} - -/* Even if usb_tx_urb_with_skb is failed, does not release the skb to retry */ -static int usb_tx_urb_with_skb(struct usb_device *usbdev, struct sk_buff *skb, - struct if_usb_devdata *pipe_data) -{ - int ret; - struct urb *urb; - - if (pipe_data->disconnected) - return -ENOENT; - - urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - mif_err("alloc urb error\n"); - return -ENOMEM; - } - - urb->transfer_flags = URB_ZERO_PACKET; - usb_fill_bulk_urb(urb, pipe_data->usbdev, pipe_data->tx_pipe, skb->data, - skb->len, usb_tx_complete, (void *)skb); - - usb_mark_last_busy(usbdev); - ret = usb_submit_urb(urb, GFP_KERNEL); - if (ret < 0) { - mif_err("usb_submit_urb with ret(%d)\n", ret); - usb_free_urb(urb); - return ret; - } - return 0; -} - - -static int _usb_tx_work(struct sk_buff *skb) -{ - struct sk_buff_head *txq; - struct io_device *iod = skbpriv(skb)->iod; - struct link_device *ld = skbpriv(skb)->ld; - struct usb_link_device *usb_ld = to_usb_link_device(ld); - struct if_usb_devdata *pipe_data; - - switch (iod->format) { - case IPC_BOOT: - case IPC_FMT: - /* boot device uses same intf with fmt*/ - pipe_data = &usb_ld->devdata[IF_USB_FMT_EP]; - txq = &ld->sk_fmt_tx_q; - break; - case IPC_RAW: - pipe_data = &usb_ld->devdata[IF_USB_RAW_EP]; - txq = &ld->sk_raw_tx_q; - break; - case IPC_RFS: - pipe_data = &usb_ld->devdata[IF_USB_RFS_EP]; - txq = &ld->sk_fmt_tx_q; - break; - default: - /* wrong packet, drop it */ - pipe_data = NULL; - txq = NULL; - break; - } - - if (!pipe_data) - return -ENOENT; - - if (iod->format == IPC_FMT && usb_ld->if_usb_is_main) - pr_skb("IPC-TX", skb); - - if (iod->format == IPC_RAW) - mif_debug("TX[RAW]\n"); - - return usb_tx_urb_with_skb(usb_ld->usbdev, skb, pipe_data); -} - - -static void usb_tx_work(struct work_struct *work) -{ - int ret = 0; - struct link_device *ld = - container_of(work, struct link_device, tx_delayed_work.work); - struct usb_link_device *usb_ld = to_usb_link_device(ld); - struct sk_buff *skb; - struct link_pm_data *pm_data = usb_ld->link_pm_data; - - if (!usb_ld->usbdev) { - mif_info("usbdev is invalid\n"); - return; - } - - pm_data->tx_cnt++; - - while (ld->sk_fmt_tx_q.qlen || ld->sk_raw_tx_q.qlen) { - /* request and check usb runtime pm first */ - ret = link_pm_runtime_get_active(pm_data); - if (ret < 0) { - if (ret == -ENODEV) { - mif_err("link not avail, retry reconnect.\n"); - goto exit; - } - goto retry_tx_work; - } - - /* If AP try to tx when interface disconnect->reconnect probe, - * usbdev was created but one of interface channel device are - * probing, _usb_tx_work return to -ENOENT then runtime usage - * count allways positive and never enter to L2 - */ - if (!usb_ld->if_usb_connected) { - mif_info("link is available, but if was not readey\n"); - goto retry_tx_work; - } - pm_runtime_get_sync(&usb_ld->usbdev->dev); - - ret = 0; - /* send skb from fmt_txq and raw_txq,*/ - /* one by one for fair flow control */ - skb = skb_dequeue(&ld->sk_fmt_tx_q); - if (skb) - ret = _usb_tx_work(skb); - - if (ret) { - mif_err("usb_tx_urb_with_skb for fmt_q %d\n", ret); - skb_queue_head(&ld->sk_fmt_tx_q, skb); - - if (ret == -ENODEV || ret == -ENOENT) - goto exit; - - /* tx fail and usbdev alived, retry tx work */ - pm_runtime_put(&usb_ld->usbdev->dev); - goto retry_tx_work; - } - - skb = skb_dequeue(&ld->sk_raw_tx_q); - if (skb) - ret = _usb_tx_work(skb); - - if (ret) { - mif_err("usb_tx_urb_with_skb for raw_q %d\n", ret); - skb_queue_head(&ld->sk_raw_tx_q, skb); - - if (ret == -ENODEV || ret == -ENOENT) - goto exit; - - pm_runtime_put(&usb_ld->usbdev->dev); - goto retry_tx_work; - } - - pm_runtime_put(&usb_ld->usbdev->dev); - } - wake_unlock(&pm_data->tx_async_wake); -exit: - return; - -retry_tx_work: - queue_delayed_work(ld->tx_wq, &ld->tx_delayed_work, - msecs_to_jiffies(20)); - return; -} - -/* -#ifdef CONFIG_LINK_PM -*/ - -static int link_pm_runtime_get_active(struct link_pm_data *pm_data) -{ - int ret; - struct usb_link_device *usb_ld = pm_data->usb_ld; - struct device *dev = &usb_ld->usbdev->dev; - - if (!usb_ld->if_usb_connected || usb_ld->ld.com_state == COM_NONE) - return -ENODEV; - - if (pm_data->dpm_suspending) { - mif_err("Kernel in suspending try get_active later\n"); - /* during dpm_suspending.. - * if AP get tx data, wake up. */ - wake_lock(&pm_data->l2_wake); - return -EAGAIN; - } - - if (dev->power.runtime_status == RPM_ACTIVE) { - pm_data->resume_retry_cnt = 0; - return 0; - } - - if (!pm_data->resume_requested) { - mif_debug("QW PM\n"); - queue_delayed_work(pm_data->wq, &pm_data->link_pm_work, 0); - } - mif_debug("Wait pm\n"); - INIT_COMPLETION(pm_data->active_done); - ret = wait_for_completion_timeout(&pm_data->active_done, - msecs_to_jiffies(500)); - - /* If usb link was disconnected while waiting ACTIVE State, usb device - * was removed, usb_ld->usbdev->dev is invalid and below - * dev->power.runtime_status is also invalid address. - * It will be occured LPA L3 -> AP iniated L0 -> disconnect -> link - * timeout - */ - if (!usb_ld->if_usb_connected || usb_ld->ld.com_state == COM_NONE) { - mif_info("link disconnected after timed-out\n"); - return -ENODEV; - } - - if (dev->power.runtime_status != RPM_ACTIVE) { - mif_info("link_active (%d) retry\n", - dev->power.runtime_status); - return -EAGAIN; - } - mif_debug("link_active success(%d)\n", ret); - return 0; -} - -static void link_pm_runtime_start(struct work_struct *work) -{ - struct link_pm_data *pm_data = - container_of(work, struct link_pm_data, link_pm_start.work); - struct usb_device *usbdev = pm_data->usb_ld->usbdev; - struct device *dev, *hdev; - struct link_device *ld = &pm_data->usb_ld->ld; - - if (!pm_data->usb_ld->if_usb_connected - || pm_data->usb_ld->ld.com_state == COM_NONE) { - mif_debug("disconnect status, ignore\n"); - return; - } - - dev = &pm_data->usb_ld->usbdev->dev; - - /* wait interface driver resumming */ - if (dev->power.runtime_status == RPM_SUSPENDED) { - mif_info("suspended yet, delayed work\n"); - queue_delayed_work(pm_data->wq, &pm_data->link_pm_start, - msecs_to_jiffies(20)); - return; - } - - if (pm_data->usb_ld->usbdev && dev->parent) { - mif_info("rpm_status: %d\n", - dev->power.runtime_status); - pm_runtime_set_autosuspend_delay(dev, 200); - hdev = usbdev->bus->root_hub->dev.parent; - mif_info("EHCI runtime %s, %s\n", dev_driver_string(hdev), - dev_name(hdev)); - pm_runtime_allow(dev); - pm_runtime_allow(hdev);/*ehci*/ - pm_data->link_pm_active = true; - pm_data->resume_requested = false; - pm_data->link_reconnect_cnt = 5; - pm_data->resume_retry_cnt = 0; - - /* retry prvious link tx q */ - queue_delayed_work(ld->tx_wq, &ld->tx_delayed_work, 0); - } -} - -static void link_pm_force_cp_dump(struct link_pm_data *pm_data) -{ - struct modem_ctl *mc = if_usb_get_modemctl(pm_data); - - mif_err("Set modem crash ap_dump_int by %pF\n", - __builtin_return_address(0)); - - if (mc->gpio_ap_dump_int) { - if (gpio_get_value(mc->gpio_ap_dump_int)) { - gpio_set_value(mc->gpio_ap_dump_int, 0); - msleep(20); - } - gpio_set_value(mc->gpio_ap_dump_int, 1); - msleep(20); - mif_err("AP_DUMP_INT(%d)\n", - gpio_get_value(mc->gpio_ap_dump_int)); - gpio_set_value(mc->gpio_ap_dump_int, 0); - } -} - -static void link_pm_change_modem_state(struct link_pm_data *pm_data, - enum modem_state state) -{ - struct modem_ctl *mc = if_usb_get_modemctl(pm_data); - - if (!mc->iod || pm_data->usb_ld->ld.com_state != COM_ONLINE) - return; - - mif_err("set modem state %d by %pF\n", state, - __builtin_return_address(0)); - mc->iod->modem_state_changed(mc->iod, state); - mc->bootd->modem_state_changed(mc->bootd, state); -} - -static void link_pm_reconnect_work(struct work_struct *work) -{ - struct link_pm_data *pm_data = - container_of(work, struct link_pm_data, - link_reconnect_work.work); - struct modem_ctl *mc = if_usb_get_modemctl(pm_data); - - if (!mc || pm_data->usb_ld->if_usb_connected) - return; - - if (pm_data->usb_ld->ld.com_state != COM_ONLINE) - return; - - if (pm_data->link_reconnect_cnt--) { - if (mc->phone_state == STATE_ONLINE && - !pm_data->link_reconnect()) - /* try reconnect and check */ - schedule_delayed_work(&pm_data->link_reconnect_work, - msecs_to_jiffies(500)); - else /* under cp crash or reset, just return */ - return; - } else { - /* try to recover cp */ - mif_err("recover connection: silent reset\n"); - link_pm_change_modem_state(pm_data, STATE_CRASH_RESET); - } -} - -static inline int link_pm_slave_wake(struct link_pm_data *pm_data) -{ - int spin = 20; - - /* when slave device is in sleep, wake up slave cpu first */ - if (gpio_get_value(pm_data->gpio_link_hostwake) - != HOSTWAKE_TRIGLEVEL) { - if (gpio_get_value(pm_data->gpio_link_slavewake)) { - gpio_set_value(pm_data->gpio_link_slavewake, 0); - mif_info("gpio [SWK] set [0]\n"); - mdelay(5); - } - gpio_set_value(pm_data->gpio_link_slavewake, 1); - mif_info("gpio [SWK] set [1]\n"); - mdelay(5); - - /* wait host wake signal*/ - while (spin-- && gpio_get_value(pm_data->gpio_link_hostwake) != - HOSTWAKE_TRIGLEVEL) - mdelay(5); - } - return spin; -} - -static void link_pm_runtime_work(struct work_struct *work) -{ - int ret; - struct link_pm_data *pm_data = - container_of(work, struct link_pm_data, link_pm_work.work); - struct device *dev = &pm_data->usb_ld->usbdev->dev; - - if (!pm_data->usb_ld->if_usb_connected || pm_data->dpm_suspending) - return; - - if (pm_data->usb_ld->ld.com_state == COM_NONE) - return; - - mif_debug("for dev 0x%p : current %d\n", dev, - dev->power.runtime_status); - - switch (dev->power.runtime_status) { - case RPM_ACTIVE: - pm_data->resume_retry_cnt = 0; - pm_data->resume_requested = false; - complete(&pm_data->active_done); - - return; - case RPM_SUSPENDED: - if (pm_data->resume_requested) - break; - pm_data->resume_requested = true; - wake_lock(&pm_data->rpm_wake); - ret = link_pm_slave_wake(pm_data); - if (ret < 0) { - mif_err("slave wake fail\n"); - wake_unlock(&pm_data->rpm_wake); - break; - } - - if (!pm_data->usb_ld->if_usb_connected) { - wake_unlock(&pm_data->rpm_wake); - return; - } - - ret = pm_runtime_resume(dev); - if (ret < 0) { - mif_err("resume error(%d)\n", ret); - if (!pm_data->usb_ld->if_usb_connected) { - wake_unlock(&pm_data->rpm_wake); - return; - } - /* force to go runtime idle before retry resume */ - if (dev->power.timer_expires == 0 && - !dev->power.request_pending) { - mif_debug("run time idle\n"); - pm_runtime_idle(dev); - } - } - wake_unlock(&pm_data->rpm_wake); - break; - case RPM_SUSPENDING: - /* Checking the usb_runtime_suspend running time.*/ - mif_info("rpm_states=%d", dev->power.runtime_status); - msleep(20); - break; - default: - break; - } - pm_data->resume_requested = false; - - /* check until runtime_status goes to active */ - /* attemp 10 times, or re-establish modem-link */ - /* if pm_runtime_resume run properly, rpm status must be in ACTIVE */ - if (dev->power.runtime_status == RPM_ACTIVE) { - pm_data->resume_retry_cnt = 0; - complete(&pm_data->active_done); - } else if (pm_data->resume_retry_cnt++ > 10) { - mif_err("runtime_status(%d), retry_cnt(%d)\n", - dev->power.runtime_status, pm_data->resume_retry_cnt); - link_pm_change_modem_state(pm_data, STATE_CRASH_RESET); - } else - queue_delayed_work(pm_data->wq, &pm_data->link_pm_work, - msecs_to_jiffies(20)); -} - -static irqreturn_t link_pm_irq_handler(int irq, void *data) -{ - int value; - struct link_pm_data *pm_data = data; - -#if defined(CONFIG_SLP) - pm_wakeup_event(pm_data->miscdev.this_device, 0); -#endif - - if (!pm_data->link_pm_active) - return IRQ_HANDLED; - - /* host wake up HIGH */ - /* - resume usb runtime pm start - */ - /* host wake up LOW */ - /* - slave usb enumeration end, - host can send usb packet after - runtime pm status changes to ACTIVE - */ - value = gpio_get_value(pm_data->gpio_link_hostwake); - mif_info("gpio [HWK] get [%d]\n", value); - - /* - * igonore host wakeup interrupt at suspending kernel - */ - if (pm_data->dpm_suspending) { - mif_info("ignore request by suspending\n"); - /* Ignore HWK but AP got to L2 by suspending fail */ - wake_lock(&pm_data->l2_wake); - return IRQ_HANDLED; - } - - if (value == HOSTWAKE_TRIGLEVEL) { - /* move to slave wake function */ - /* runtime pm goes to active */ - /* - if (gpio_get_value(pm_data->gpio_link_active)) { - mif_err("gpio [H ACTV : %d] set 1\n", - gpio_get_value(pm_data->gpio_link_active)); - gpio_set_value(pm_data->gpio_link_active, 1); - } - */ - queue_delayed_work(pm_data->wq, &pm_data->link_pm_work, 0); - } else { - /* notification of enumeration process from slave device - * But it does not mean whole connection is in resume, so do not - * notify resume completion here. - - if (pm_data->link_pm_active && !pm_data->active_done.done) - complete(&pm_data->active_done); - */ - /* clear slave cpu wake up pin */ - gpio_set_value(pm_data->gpio_link_slavewake, 0); - mif_debug("gpio [SWK] set [0]\n"); - } - return IRQ_HANDLED; -} - -static long link_pm_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int value; - struct link_pm_data *pm_data = file->private_data; - struct modem_ctl *mc = if_usb_get_modemctl(pm_data); - - mif_info("%x\n", cmd); - - switch (cmd) { - case IOCTL_LINK_CONTROL_ENABLE: - if (copy_from_user(&value, (const void __user *)arg, - sizeof(int))) - return -EFAULT; - if (pm_data->link_ldo_enable) - pm_data->link_ldo_enable(!!value); - if (pm_data->gpio_link_enable) - gpio_set_value(pm_data->gpio_link_enable, value); - break; - case IOCTL_LINK_CONTROL_ACTIVE: - if (copy_from_user(&value, (const void __user *)arg, - sizeof(int))) - return -EFAULT; - gpio_set_value(pm_data->gpio_link_active, value); - break; - case IOCTL_LINK_GET_HOSTWAKE: - return !gpio_get_value(pm_data->gpio_link_hostwake); - case IOCTL_LINK_CONNECTED: - return pm_data->usb_ld->if_usb_connected; - case IOCTL_LINK_SET_BIAS_CLEAR: - if (copy_from_user(&value, (const void __user *)arg, - sizeof(int))) - return -EFAULT; - if (value) { - gpio_direction_output(pm_data->gpio_link_slavewake, 0); - gpio_direction_output(pm_data->gpio_link_hostwake, 0); - } else { - gpio_direction_output(pm_data->gpio_link_slavewake, 0); - gpio_direction_input(pm_data->gpio_link_hostwake); - irq_set_irq_type(pm_data->irq_link_hostwake, - IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING); - } - case IOCTL_LINK_GET_PHONEACTIVE: - return gpio_get_value(mc->gpio_phone_active); - default: - break; - } - - return 0; -} - -static int link_pm_open(struct inode *inode, struct file *file) -{ - struct link_pm_data *pm_data = - (struct link_pm_data *)file->private_data; - file->private_data = (void *)pm_data; - return 0; -} - -static int link_pm_release(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - return 0; -} - -static const struct file_operations link_pm_fops = { - .owner = THIS_MODULE, - .open = link_pm_open, - .release = link_pm_release, - .unlocked_ioctl = link_pm_ioctl, -}; - -static int link_pm_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - struct link_pm_data *pm_data = - container_of(this, struct link_pm_data, pm_notifier); -#ifdef CONFIG_UMTS_MODEM_XMM6262 - struct modem_ctl *mc = if_usb_get_modemctl(pm_data); -#endif - - switch (event) { - case PM_SUSPEND_PREPARE: -#ifdef CONFIG_HIBERNATION - case PM_HIBERNATION_PREPARE: - case PM_RESTORE_PREPARE: -#endif - pm_data->dpm_suspending = true; -#ifdef CONFIG_UMTS_MODEM_XMM6262 - /* set PDA Active High if previous state was LPA */ - if (!gpio_get_value(pm_data->gpio_link_active)) { - mif_info("PDA active High to LPA suspend spot\n"); - gpio_set_value(mc->gpio_pda_active, 1); - } -#endif - mif_debug("dpm suspending set to true\n"); - return NOTIFY_OK; - case PM_POST_SUSPEND: -#ifdef CONFIG_HIBERNATION - case PM_POST_HIBERNATION: - case PM_POST_RESTORE: -#endif - pm_data->dpm_suspending = false; - if (gpio_get_value(pm_data->gpio_link_hostwake) - == HOSTWAKE_TRIGLEVEL) { - queue_delayed_work(pm_data->wq, &pm_data->link_pm_work, - 0); - mif_info("post resume\n"); - } -#ifdef CONFIG_UMTS_MODEM_XMM6262 - /* LPA to Kernel suspend and User Freezing task fail resume, - restore to LPA GPIO states. */ - if (!gpio_get_value(pm_data->gpio_link_active)) { - mif_info("PDA active low to LPA GPIO state\n"); - gpio_set_value(mc->gpio_pda_active, 0); - } -#endif - mif_debug("dpm suspending set to false\n"); - return NOTIFY_OK; - } - return NOTIFY_DONE; -} - -static struct modem_ctl *if_usb_get_modemctl(struct link_pm_data *pm_data) -{ - struct io_device *iod; - - iod = link_get_iod_with_format(&pm_data->usb_ld->ld, IPC_FMT); - if (!iod) { - mif_err("no iodevice for modem control\n"); - return NULL; - } - - return iod->mc; -} - -static int if_usb_suspend(struct usb_interface *intf, pm_message_t message) -{ - struct if_usb_devdata *devdata = usb_get_intfdata(intf); - struct link_pm_data *pm_data = devdata->usb_ld->link_pm_data; - if (!devdata->disconnected && devdata->state == STATE_RESUMED) { - usb_kill_urb(devdata->urb); - devdata->state = STATE_SUSPENDED; - } - - devdata->usb_ld->suspended++; - - if (devdata->usb_ld->suspended == LINKPM_DEV_NUM) { - mif_debug("[if_usb_suspended]\n"); - wake_lock_timeout(&pm_data->l2_wake, msecs_to_jiffies(50)); -#ifdef CONFIG_SLP - pm_wakeup_event(pm_data->miscdev.this_device, - msecs_to_jiffies(20)); -#endif - /* XMM6262 Host wakeup toggle recovery */ - if (!pm_data->rx_cnt && !pm_data->tx_cnt) { - if (pm_data->ipc_debug_cnt++ > 10) { - mif_err("No TX/RX after resume 10times\n"); - link_pm_change_modem_state(pm_data, - STATE_CRASH_RESET); - } - } else { - pm_data->ipc_debug_cnt = 0; - pm_data->rx_cnt = 0; - pm_data->tx_cnt = 0; - } - } - return 0; -} - -static int if_usb_resume(struct usb_interface *intf) -{ - int ret; - struct if_usb_devdata *devdata = usb_get_intfdata(intf); - struct link_pm_data *pm_data = devdata->usb_ld->link_pm_data; - - if (!devdata->disconnected && devdata->state == STATE_SUSPENDED) { - ret = usb_rx_submit(devdata->usb_ld, devdata, GFP_ATOMIC); - if (ret < 0) { - mif_err("usb_rx_submit error with (%d)\n", ret); - return ret; - } - devdata->state = STATE_RESUMED; - } - - /* For debugging - nomal case, never reach below... */ - if (pm_data->resume_retry_cnt > 5) { - mif_err("retry_cnt=%d, rpm_status=%d", - pm_data->resume_retry_cnt, - devdata->usb_ld->usbdev->dev.power.runtime_status); - pm_data->resume_retry_cnt = 0; - } - - devdata->usb_ld->suspended--; - if (!devdata->usb_ld->suspended) { - mif_debug("[if_usb_resumed]\n"); - wake_lock(&pm_data->l2_wake); - } - - return 0; -} - -static int if_usb_reset_resume(struct usb_interface *intf) -{ - int ret; - struct if_usb_devdata *devdata = usb_get_intfdata(intf); - struct link_pm_data *pm_data = devdata->usb_ld->link_pm_data; - - ret = if_usb_resume(intf); - pm_data->ipc_debug_cnt = 0; - /* - * for runtime suspend, kick runtime pm at L3 -> L0 reset resume - */ - if (!devdata->usb_ld->suspended) - queue_delayed_work(pm_data->wq, &pm_data->link_pm_start, 0); - return ret; -} - -static void if_usb_disconnect(struct usb_interface *intf) -{ - struct if_usb_devdata *devdata = usb_get_intfdata(intf); - struct link_pm_data *pm_data = devdata->usb_ld->link_pm_data; - struct device *dev, *hdev; - struct link_device *ld = &devdata->usb_ld->ld; - - mif_info("\n"); - - if (devdata->disconnected) - return; - - devdata->usb_ld->if_usb_connected = 0; - - usb_driver_release_interface(to_usb_driver(intf->dev.driver), intf); - - usb_kill_urb(devdata->urb); - - hdev = devdata->usbdev->bus->root_hub->dev.parent; - pm_runtime_forbid(hdev); /*ehci*/ - - mif_info("put dev 0x%p\n", devdata->usbdev); - usb_put_dev(devdata->usbdev); - - devdata->data_intf = NULL; - devdata->usbdev = NULL; - /* if possible, merge below 2 variables */ - devdata->disconnected = 1; - devdata->state = STATE_SUSPENDED; - pm_data->ipc_debug_cnt = 0; - - devdata->usb_ld->suspended = 0; - wake_lock(&pm_data->boot_wake); - - usb_set_intfdata(intf, NULL); - - /* cancel runtime start delayed works */ - cancel_delayed_work_sync(&pm_data->link_pm_start); - cancel_delayed_work_sync(&ld->tx_delayed_work); - - /* if reconnect function exist , try reconnect without reset modem - * reconnect function checks modem is under crash or not, so we don't - * need check crash state here. reconnect work checks and determine - * further works - */ - if (!pm_data->link_reconnect) - return; - - if (devdata->usb_ld->ld.com_state != COM_ONLINE) { - cancel_delayed_work(&pm_data->link_reconnect_work); - return; - } else { - if (pm_data->ehci_reg_dump) - pm_data->ehci_reg_dump(hdev); - schedule_delayed_work(&pm_data->link_reconnect_work, - msecs_to_jiffies(500)); - } - return; -} - -static int if_usb_set_pipe(struct usb_link_device *usb_ld, - const struct usb_host_interface *desc, int pipe) -{ - if (pipe < 0 || pipe >= IF_USB_DEVNUM_MAX) { - mif_err("undefined endpoint, exceed max\n"); - return -EINVAL; - } - - mif_info("set %d\n", pipe); - - if ((usb_pipein(desc->endpoint[0].desc.bEndpointAddress)) && - (usb_pipeout(desc->endpoint[1].desc.bEndpointAddress))) { - usb_ld->devdata[pipe].rx_pipe = usb_rcvbulkpipe(usb_ld->usbdev, - desc->endpoint[0].desc.bEndpointAddress); - usb_ld->devdata[pipe].tx_pipe = usb_sndbulkpipe(usb_ld->usbdev, - desc->endpoint[1].desc.bEndpointAddress); - } else if ((usb_pipeout(desc->endpoint[0].desc.bEndpointAddress)) && - (usb_pipein(desc->endpoint[1].desc.bEndpointAddress))) { - usb_ld->devdata[pipe].rx_pipe = usb_rcvbulkpipe(usb_ld->usbdev, - desc->endpoint[1].desc.bEndpointAddress); - usb_ld->devdata[pipe].tx_pipe = usb_sndbulkpipe(usb_ld->usbdev, - desc->endpoint[0].desc.bEndpointAddress); - } else { - mif_err("undefined endpoint\n"); - return -EINVAL; - } - - return 0; -} - -static int __devinit if_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ - int err; - int pipe; - const struct usb_cdc_union_desc *union_hdr; - const struct usb_host_interface *data_desc; - unsigned char *buf = intf->altsetting->extra; - int buflen = intf->altsetting->extralen; - struct usb_interface *data_intf; - struct usb_device *usbdev = interface_to_usbdev(intf); - struct usb_driver *usbdrv = to_usb_driver(intf->dev.driver); - struct usb_id_info *info = (struct usb_id_info *)id->driver_info; - struct usb_link_device *usb_ld = info->usb_ld; - - mif_info("usbdev = 0x%p\n", usbdev); - - pr_debug("%s: Class=%d, SubClass=%d, Protocol=%d\n", __func__, - intf->altsetting->desc.bInterfaceClass, - intf->altsetting->desc.bInterfaceSubClass, - intf->altsetting->desc.bInterfaceProtocol); - - /* if usb disconnected, AP try to reconnect 5 times. - * but because if_sub_connected is configured - * at the end of if_usb_probe, there was a chance - * that swk will be called again during enumeration. - * so.. cancel reconnect work_queue in this case. */ - if (usb_ld->ld.com_state == COM_ONLINE) - cancel_delayed_work(&usb_ld->link_pm_data->link_reconnect_work); - - usb_ld->usbdev = usbdev; - pm_runtime_forbid(&usbdev->dev); - usb_ld->link_pm_data->link_pm_active = false; - usb_ld->link_pm_data->dpm_suspending = false; - usb_ld->link_pm_data->ipc_debug_cnt = 0; - usb_ld->if_usb_is_main = (info->intf_id != BOOT_DOWN); - - union_hdr = NULL; - /* for WMC-ACM compatibility, WMC-ACM use an end-point for control msg*/ - if (intf->altsetting->desc.bInterfaceSubClass != USB_CDC_SUBCLASS_ACM) { - mif_err("ignore Non ACM end-point\n"); - return -EINVAL; - } - - if (!buflen) { - if (intf->cur_altsetting->endpoint->extralen && - intf->cur_altsetting->endpoint->extra) { - buflen = intf->cur_altsetting->endpoint->extralen; - buf = intf->cur_altsetting->endpoint->extra; - } else { - mif_err("Zero len descriptor reference\n"); - return -EINVAL; - } - } - - while (buflen > 0) { - if (buf[1] == USB_DT_CS_INTERFACE) { - switch (buf[2]) { - case USB_CDC_UNION_TYPE: - if (union_hdr) - break; - union_hdr = (struct usb_cdc_union_desc *)buf; - break; - default: - break; - } - } - buf += buf[0]; - buflen -= buf[0]; - } - - if (!union_hdr) { - mif_err("USB CDC is not union type\n"); - return -EINVAL; - } - - data_intf = usb_ifnum_to_if(usbdev, union_hdr->bSlaveInterface0); - if (!data_intf) { - mif_err("data_inferface is NULL\n"); - return -ENODEV; - } - - data_desc = data_intf->altsetting; - if (!data_desc) { - mif_err("data_desc is NULL\n"); - return -ENODEV; - } - - switch (info->intf_id) { - case BOOT_DOWN: - pipe = IF_USB_BOOT_EP; - usb_ld->ld.com_state = COM_BOOT; - /* purge previous boot fmt/raw tx q - clear all tx q*/ - skb_queue_purge(&usb_ld->ld.sk_fmt_tx_q); - skb_queue_purge(&usb_ld->ld.sk_raw_tx_q); - break; - case IPC_CHANNEL: - pipe = intf->altsetting->desc.bInterfaceNumber / 2; - usb_ld->ld.com_state = COM_ONLINE; - break; - default: - pipe = -1; - break; - } - - if (if_usb_set_pipe(usb_ld, data_desc, pipe) < 0) - return -EINVAL; - - usb_ld->devdata[pipe].usbdev = usb_get_dev(usbdev); - mif_info("devdata usbdev = 0x%p\n", - usb_ld->devdata[pipe].usbdev); - usb_ld->devdata[pipe].usb_ld = usb_ld; - usb_ld->devdata[pipe].data_intf = data_intf; - usb_ld->devdata[pipe].format = pipe; - usb_ld->devdata[pipe].disconnected = 0; - usb_ld->devdata[pipe].state = STATE_RESUMED; - - usb_ld->suspended = 0; - - err = usb_driver_claim_interface(usbdrv, data_intf, - (void *)&usb_ld->devdata[pipe]); - if (err < 0) { - mif_err("usb_driver_claim() failed\n"); - return err; - } - - pm_suspend_ignore_children(&usbdev->dev, true); - - usb_set_intfdata(intf, (void *)&usb_ld->devdata[pipe]); - - /* rx start for this endpoint */ - usb_rx_submit(usb_ld, &usb_ld->devdata[pipe], GFP_KERNEL); - - if (info->intf_id == IPC_CHANNEL && - !work_pending(&usb_ld->link_pm_data->link_pm_start.work)) { - queue_delayed_work(usb_ld->link_pm_data->wq, - &usb_ld->link_pm_data->link_pm_start, - msecs_to_jiffies(500)); - wake_lock(&usb_ld->link_pm_data->l2_wake); - wake_unlock(&usb_ld->link_pm_data->boot_wake); - } - - /* HSIC main comm channel has been established */ - if (pipe == IF_USB_CMD_EP) - link_pm_change_modem_state(usb_ld->link_pm_data, STATE_ONLINE); - - if (pipe == IF_USB_CMD_EP || info->intf_id == BOOT_DOWN) - usb_ld->if_usb_connected = 1; - - mif_info("successfully done\n"); - - return 0; -} - -static void if_usb_free_pipe_data(struct usb_link_device *usb_ld) -{ - int i; - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) { - kfree(usb_ld->devdata[i].rx_buf); - usb_kill_urb(usb_ld->devdata[i].urb); - } -} - -static struct usb_id_info hsic_boot_down_info = { - .intf_id = BOOT_DOWN, -}; -static struct usb_id_info hsic_channel_info = { - .intf_id = IPC_CHANNEL, -}; - -static struct usb_device_id if_usb_ids[] = { - {USB_DEVICE_AND_INTERFACE_INFO(IMC_BOOT_VID, IMC_BOOT_PID, - USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, USB_CDC_PROTO_NONE), - .driver_info = (unsigned long)&hsic_boot_down_info,}, - {USB_DEVICE_AND_INTERFACE_INFO(IMC_MAIN_VID, IMC_MAIN_PID, - USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, 1), - .driver_info = (unsigned long)&hsic_channel_info,}, - {USB_DEVICE(STE_BOOT_VID, STE_BOOT_PID), - .driver_info = (unsigned long)&hsic_boot_down_info,}, - {USB_DEVICE(STE_MAIN_VID, STE_MAIN_PID), - .driver_info = (unsigned long)&hsic_channel_info,}, - {} -}; -MODULE_DEVICE_TABLE(usb, if_usb_ids); - -static struct usb_driver if_usb_driver = { - .name = "cdc_modem", - .probe = if_usb_probe, - .disconnect = if_usb_disconnect, - .id_table = if_usb_ids, - .suspend = if_usb_suspend, - .resume = if_usb_resume, - .reset_resume = if_usb_reset_resume, - .supports_autosuspend = 1, -}; - -static int if_usb_init(struct link_device *ld) -{ - int ret; - int i; - struct usb_link_device *usb_ld = to_usb_link_device(ld); - struct if_usb_devdata *pipe_data; - struct usb_id_info *id_info; - - /* to connect usb link device with usb interface driver */ - for (i = 0; i < ARRAY_SIZE(if_usb_ids); i++) { - id_info = (struct usb_id_info *)if_usb_ids[i].driver_info; - if (id_info) - id_info->usb_ld = usb_ld; - } - - ret = usb_register(&if_usb_driver); - if (ret) { - mif_err("usb_register_driver() fail : %d\n", ret); - return ret; - } - - /* allocate rx buffer for usb receive */ - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) { - pipe_data = &usb_ld->devdata[i]; - pipe_data->format = i; - pipe_data->rx_buf_size = 16 * 1024; - - pipe_data->rx_buf = kmalloc(pipe_data->rx_buf_size, - GFP_DMA | GFP_KERNEL); - if (!pipe_data->rx_buf) { - if_usb_free_pipe_data(usb_ld); - ret = -ENOMEM; - break; - } - - pipe_data->urb = usb_alloc_urb(0, GFP_KERNEL); - if (!pipe_data->urb) { - mif_err("alloc urb fail\n"); - if_usb_free_pipe_data(usb_ld); - return -ENOMEM; - } - } - - mif_info("if_usb_init() done : %d, usb_ld (0x%p)\n", - ret, usb_ld); - return ret; -} - -static int usb_link_pm_init(struct usb_link_device *usb_ld, void *data) -{ - int r; - struct platform_device *pdev = (struct platform_device *)data; - struct modem_data *pdata = - (struct modem_data *)pdev->dev.platform_data; - struct modemlink_pm_data *pm_pdata; - struct link_pm_data *pm_data = - kzalloc(sizeof(struct link_pm_data), GFP_KERNEL); - - if (!pdata || !pdata->link_pm_data) { - mif_err("platform data is NULL\n"); - return -EINVAL; - } - pm_pdata = pdata->link_pm_data; - - if (!pm_data) { - mif_err("link_pm_data is NULL\n"); - return -ENOMEM; - } - - /* get link pm data from modemcontrol's platform data */ - pm_data->gpio_link_active = pm_pdata->gpio_link_active; - pm_data->gpio_link_enable = pm_pdata->gpio_link_enable; - pm_data->gpio_link_hostwake = pm_pdata->gpio_link_hostwake; - pm_data->gpio_link_slavewake = pm_pdata->gpio_link_slavewake; - pm_data->irq_link_hostwake = gpio_to_irq(pm_data->gpio_link_hostwake); - pm_data->link_ldo_enable = pm_pdata->link_ldo_enable; - pm_data->link_reconnect = pm_pdata->link_reconnect; - pm_data->ehci_reg_dump = pm_pdata->ehci_reg_dump; - - pm_data->usb_ld = usb_ld; - pm_data->link_pm_active = false; - pm_data->ipc_debug_cnt = 0; - usb_ld->link_pm_data = pm_data; - - pm_data->miscdev.minor = MISC_DYNAMIC_MINOR; - pm_data->miscdev.name = "link_pm"; - pm_data->miscdev.fops = &link_pm_fops; - - r = misc_register(&pm_data->miscdev); - if (r < 0) { - mif_err("fail to register pm device(%d)\n", r); - goto err_misc_register; - } - - r = request_irq(pm_data->irq_link_hostwake, link_pm_irq_handler, - IRQF_NO_SUSPEND | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, - "hostwake", (void *)pm_data); - if (r) { - mif_err("fail to request irq(%d)\n", r); - goto err_request_irq; - } - - r = enable_irq_wake(pm_data->irq_link_hostwake); - if (r) { - mif_err("failed to enable_irq_wake:%d\n", r); - goto err_set_wake_irq; - } - - /* create work queue & init work for runtime pm */ - pm_data->wq = create_singlethread_workqueue("linkpmd"); - if (!pm_data->wq) { - mif_err("fail to create wq\n"); - goto err_create_wq; - } - - pm_data->pm_notifier.notifier_call = link_pm_notifier_event; - register_pm_notifier(&pm_data->pm_notifier); - - init_completion(&pm_data->active_done); - INIT_DELAYED_WORK(&pm_data->link_pm_work, link_pm_runtime_work); - INIT_DELAYED_WORK(&pm_data->link_pm_start, link_pm_runtime_start); - INIT_DELAYED_WORK(&pm_data->link_reconnect_work, - link_pm_reconnect_work); - wake_lock_init(&pm_data->l2_wake, WAKE_LOCK_SUSPEND, "l2_hsic"); - wake_lock_init(&pm_data->boot_wake, WAKE_LOCK_SUSPEND, "boot_hsic"); - wake_lock_init(&pm_data->rpm_wake, WAKE_LOCK_SUSPEND, "rpm_hsic"); - wake_lock_init(&pm_data->tx_async_wake, WAKE_LOCK_SUSPEND, "tx_hsic"); - -#if defined(CONFIG_SLP) - device_init_wakeup(pm_data->miscdev.this_device, true); -#endif - - return 0; - -err_create_wq: - disable_irq_wake(pm_data->irq_link_hostwake); -err_set_wake_irq: - free_irq(pm_data->irq_link_hostwake, (void *)pm_data); -err_request_irq: - misc_deregister(&pm_data->miscdev); -err_misc_register: - kfree(pm_data); - return r; -} - -struct link_device *hsic_create_link_device(void *data) -{ - int ret; - struct usb_link_device *usb_ld; - struct link_device *ld; - - usb_ld = kzalloc(sizeof(struct usb_link_device), GFP_KERNEL); - if (!usb_ld) - return NULL; - - INIT_LIST_HEAD(&usb_ld->ld.list); - skb_queue_head_init(&usb_ld->ld.sk_fmt_tx_q); - skb_queue_head_init(&usb_ld->ld.sk_raw_tx_q); - - ld = &usb_ld->ld; - - ld->name = "usb"; - ld->init_comm = usb_init_communication; - ld->terminate_comm = usb_terminate_communication; - ld->send = usb_send; - ld->com_state = COM_NONE; - ld->raw_tx_suspended = false; - init_completion(&ld->raw_tx_resumed_by_cp); - - ld->tx_wq = create_singlethread_workqueue("usb_tx_wq"); - if (!ld->tx_wq) { - mif_err("fail to create work Q.\n"); - goto err; - } - - INIT_DELAYED_WORK(&ld->tx_delayed_work, usb_tx_work); - INIT_DELAYED_WORK(&usb_ld->rx_retry_work, usb_rx_retry_work); - usb_ld->rx_retry_cnt = 0; - - /* create link pm device */ - ret = usb_link_pm_init(usb_ld, data); - if (ret) - goto err; - - ret = if_usb_init(ld); - if (ret) - goto err; - - mif_info("%s : create_link_device DONE\n", usb_ld->ld.name); - return (void *)ld; -err: - kfree(usb_ld); - return NULL; -} - -static void __exit if_usb_exit(void) -{ - usb_deregister(&if_usb_driver); -} diff --git a/drivers/misc/modem_if_u1/modem_link_device_hsic.h b/drivers/misc/modem_if_u1/modem_link_device_hsic.h deleted file mode 100644 index 604b067..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_hsic.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_LINK_DEVICE_USB_H__ -#define __MODEM_LINK_DEVICE_USB_H__ - - -enum { - IF_USB_BOOT_EP = 0, - IF_USB_FMT_EP = 0, - IF_USB_RAW_EP, - IF_USB_RFS_EP, - IF_USB_CMD_EP, - IF_USB_DEVNUM_MAX, -}; - -/* each pipe has 2 ep for in/out */ -#define LINKPM_DEV_NUM (IF_USB_DEVNUM_MAX * 2) -/******************/ -/* xmm6260 specific */ - -#define IOCTL_LINK_CONTROL_ENABLE _IO('o', 0x30) -#define IOCTL_LINK_CONTROL_ACTIVE _IO('o', 0x31) -#define IOCTL_LINK_GET_HOSTWAKE _IO('o', 0x32) -#define IOCTL_LINK_CONNECTED _IO('o', 0x33) -#define IOCTL_LINK_SET_BIAS_CLEAR _IO('o', 0x34) -#define IOCTL_LINK_GET_PHONEACTIVE _IO('o', 0x35) - -/* VID,PID for IMC - XMM6260, XMM6262*/ -#define IMC_BOOT_VID 0x058b -#define IMC_BOOT_PID 0x0041 -#define IMC_MAIN_VID 0x1519 -#define IMC_MAIN_PID 0x0020 -/* VID,PID for STE - M7400 */ -#define STE_BOOT_VID 0x04cc -#define STE_BOOT_PID 0x7400 -#define STE_MAIN_VID 0x04cc -#define STE_MAIN_PID 0x2333 - -enum { - BOOT_DOWN = 0, - IPC_CHANNEL -}; - -enum ch_state { - STATE_SUSPENDED, - STATE_RESUMED, -}; - -#define HOSTWAKE_TRIGLEVEL 0 -/******************/ - -struct link_pm_info { - struct usb_link_device *usb_ld; -}; - -struct usb_id_info { - int intf_id; - struct usb_link_device *usb_ld; -}; - -struct link_pm_data { - struct miscdevice miscdev; - struct usb_link_device *usb_ld; - unsigned irq_link_hostwake; - int (*link_ldo_enable)(bool); - unsigned gpio_link_enable; - unsigned gpio_link_active; - unsigned gpio_link_hostwake; - unsigned gpio_link_slavewake; - int (*link_reconnect)(void); - int link_reconnect_cnt; - - struct workqueue_struct *wq; - struct completion active_done; - struct delayed_work link_pm_work; - struct delayed_work link_pm_start; - struct delayed_work link_reconnect_work; - bool resume_requested; - bool link_pm_active; - int resume_retry_cnt; - - struct wake_lock l2_wake; - struct wake_lock boot_wake; - struct wake_lock rpm_wake; - struct wake_lock tx_async_wake; - struct notifier_block pm_notifier; - bool dpm_suspending; - - /* Host wakeup toggle debugging */ - unsigned ipc_debug_cnt; - unsigned long tx_cnt; - unsigned long rx_cnt; - - void (*ehci_reg_dump)(struct device *); -}; - -struct if_usb_devdata { - struct usb_interface *data_intf; - struct usb_link_device *usb_ld; - struct usb_device *usbdev; - unsigned int tx_pipe; - unsigned int rx_pipe; - u8 disconnected; - - int format; - struct urb *urb; - void *rx_buf; - unsigned int rx_buf_size; - enum ch_state state; -}; - -struct usb_link_device { - /*COMMON LINK DEVICE*/ - struct link_device ld; - - /*USB SPECIFIC LINK DEVICE*/ - struct usb_device *usbdev; - struct if_usb_devdata devdata[IF_USB_DEVNUM_MAX]; - unsigned int dev_count; - unsigned int suspended; - int if_usb_connected; - - bool if_usb_is_main; /* boot,down(false) or main(true) */ - - /* LINK PM DEVICE DATA */ - struct link_pm_data *link_pm_data; - - /*RX retry work by -ENOMEM*/ - struct delayed_work rx_retry_work; - struct urb *retry_urb; - unsigned rx_retry_cnt; -}; -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_usb_link_device(linkdev) \ - container_of(linkdev, struct usb_link_device, ld) - - -#ifdef FOR_TEGRA -extern void tegra_ehci_txfilltuning(void); -#endif - -#endif diff --git a/drivers/misc/modem_if_u1/modem_link_device_memory.h b/drivers/misc/modem_if_u1/modem_link_device_memory.h deleted file mode 100644 index 2e83f0b..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_memory.h +++ /dev/null @@ -1,552 +0,0 @@ -/* - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_LINK_DEVICE_MEMORY_H__ -#define __MODEM_LINK_DEVICE_MEMORY_H__ - -#include -#include -#include -#include -#include - -#include "modem_prj.h" - -#define DPRAM_MAGIC_CODE 0xAA - -/* interrupt masks.*/ -#define INT_MASK_VALID 0x0080 -#define INT_MASK_CMD 0x0040 -#define INT_VALID(x) ((x) & INT_MASK_VALID) -#define INT_CMD_VALID(x) ((x) & INT_MASK_CMD) -#define INT_NON_CMD(x) (INT_MASK_VALID | (x)) -#define INT_CMD(x) (INT_MASK_VALID | INT_MASK_CMD | (x)) - -#define EXT_UDL_MASK 0xF000 -#define EXT_UDL_CMD(x) ((x) & EXT_UDL_MASK) -#define EXT_INT_VALID_MASK 0x8000 -#define EXT_CMD_VALID_MASK 0x4000 -#define UDL_CMD_VALID_MASK 0x2000 -#define EXT_INT_VALID(x) ((x) & EXT_INT_VALID_MASK) -#define EXT_CMD_VALID(x) ((x) & EXT_CMD_VALID_MASK) -#define UDL_CMD_VALID(x) ((x) & UDL_CMD_VALID_MASK) -#define INT_EXT_CMD(x) (EXT_INT_VALID_MASK | EXT_CMD_VALID_MASK | (x)) - -#define EXT_CMD_MASK(x) ((x) & 0x0FFF) -#define EXT_CMD_SET_SPEED_LOW 0x0011 -#define EXT_CMD_SET_SPEED_MID 0x0012 -#define EXT_CMD_SET_SPEED_HIGH 0x0013 - -#define UDL_RESULT_SUCCESS 0x1 -#define UDL_RESULT_FAIL 0x2 - -#define UDL_CMD_MASK(x) (((x) >> 8) & 0xF) -#define UDL_CMD_RECV_READY 0x1 -#define UDL_CMD_DL_START_REQ 0x2 -#define UDL_CMD_DL_START_RESP 0x3 -#define UDL_CMD_IMAGE_SEND_REQ 0x4 -#define UDL_CMD_SEND_DONE_RESP 0x5 -#define UDL_CMD_SEND_DONE_REQ 0x6 -#define UDL_CMD_UPDATE_DONE 0x7 -#define UDL_CMD_STATUS_UPDATE 0x8 -#define UDL_CMD_IMAGE_SEND_RESP 0x9 -#define UDL_CMD_EFS_CLEAR_RESP 0xB -#define UDL_CMD_ALARM_BOOT_OK 0xC -#define UDL_CMD_ALARM_BOOT_FAIL 0xD - -#define CMD_IMG_START_REQ 0x9200 -#define CMD_IMG_SEND_REQ 0x9400 -#define CMD_DL_SEND_DONE_REQ 0x9600 -#define CMD_UL_RECV_RESP 0x9601 -#define CMD_UL_RECV_DONE_RESP 0x9801 - -/* special interrupt cmd indicating modem boot failure. */ -#define INT_POWERSAFE_FAIL 0xDEAD - -#define INT_MASK_REQ_ACK_F 0x0020 -#define INT_MASK_REQ_ACK_R 0x0010 -#define INT_MASK_RES_ACK_F 0x0008 -#define INT_MASK_RES_ACK_R 0x0004 -#define INT_MASK_SEND_F 0x0002 -#define INT_MASK_SEND_R 0x0001 - -#define INT_MASK_REQ_ACK_RFS 0x0400 /* Request RES_ACK_RFS */ -#define INT_MASK_RES_ACK_RFS 0x0200 /* Response of REQ_ACK_RFS */ -#define INT_MASK_SEND_RFS 0x0100 /* Indicate sending RFS data */ - -#define INT_MASK_RES_ACK_SET \ - (INT_MASK_RES_ACK_F | INT_MASK_RES_ACK_R | INT_MASK_RES_ACK_RFS) - -#define INT_MASK_SEND_SET \ - (INT_MASK_SEND_F | INT_MASK_SEND_R | INT_MASK_SEND_RFS) - -#define INT_CMD_MASK(x) ((x) & 0xF) -#define INT_CMD_INIT_START 0x1 -#define INT_CMD_INIT_END 0x2 -#define INT_CMD_REQ_ACTIVE 0x3 -#define INT_CMD_RES_ACTIVE 0x4 -#define INT_CMD_REQ_TIME_SYNC 0x5 -#define INT_CMD_CRASH_RESET 0x7 -#define INT_CMD_PHONE_START 0x8 -#define INT_CMD_ERR_DISPLAY 0x9 -#define INT_CMD_CRASH_EXIT 0x9 -#define INT_CMD_CP_DEEP_SLEEP 0xA -#define INT_CMD_NV_REBUILDING 0xB -#define INT_CMD_EMER_DOWN 0xC -#define INT_CMD_PIF_INIT_DONE 0xD -#define INT_CMD_SILENT_NV_REBUILDING 0xE -#define INT_CMD_NORMAL_PWR_OFF 0xF - -#define START_FLAG 0x7F -#define END_FLAG 0x7E - -#define DP_MAGIC_DMDL 0x4445444C -#define DP_MAGIC_UMDL 0x4445444D -#define DP_DPRAM_SIZE 0x4000 -#define DP_DEFAULT_WRITE_LEN 8168 -#define DP_DEFAULT_DUMP_LEN 16128 -#define DP_DUMP_HEADER_SIZE 7 - -#define UDL_TIMEOUT (50 * HZ) -#define UDL_SEND_TIMEOUT (200 * HZ) -#define FORCE_CRASH_ACK_TIMEOUT (5 * HZ) -#define DUMP_TIMEOUT (30 * HZ) -#define DUMP_START_TIMEOUT (100 * HZ) -#define DUMP_WAIT_TIMEOUT (HZ >> 10) /* 1/1024 second */ -#define RES_ACK_WAIT_TIMEOUT (HZ >> 8) /* 1/256 second */ -#define REQ_ACK_DELAY (HZ >> 7) /* 1/128 second */ - -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP -#define MAX_RETRY_CNT 1 -#else -#define MAX_RETRY_CNT 3 -#endif - -#define MAX_SKB_TXQ_DEPTH 1024 - -enum host_boot_mode { - HOST_BOOT_MODE_NORMAL, - HOST_BOOT_MODE_DUMP, -}; - -enum dpram_init_status { - DPRAM_INIT_STATE_NONE, - DPRAM_INIT_STATE_READY, -}; - -enum circ_dir_type { - TX, - RX, -}; - -enum circ_ptr_type { - HEAD, - TAIL, -}; - -struct dpram_boot_img { - char *addr; - int size; - enum host_boot_mode mode; - unsigned req; - unsigned resp; -}; - -#define MAX_PAYLOAD_SIZE 0x2000 -struct dpram_boot_frame { - unsigned req; /* AP->CP request */ - unsigned resp; /* response expected by AP */ - ssize_t len; /* data size in the buffer */ - unsigned offset; /* offset to write into DPRAM */ - char data[MAX_PAYLOAD_SIZE]; -}; - -/* buffer type for modem image */ -struct dpram_dump_arg { - char *buff; /* pointer to the buffer */ - int buff_size; /* buffer size */ - unsigned req; /* AP->CP request */ - unsigned resp; /* CP->AP response */ - bool cmd; /* AP->CP command */ -}; - -struct dpram_boot_map { - u32 __iomem *magic; - u8 __iomem *buff; - u32 __iomem *req; - u32 __iomem *resp; - u32 size; -}; - -struct qc_dpram_boot_map { - u8 __iomem *buff; - u16 __iomem *frame_size; - u16 __iomem *tag; - u16 __iomem *count; -}; - -struct dpram_dload_map { - u32 __iomem *magic; - u8 __iomem *buff; -}; - -struct dpram_uload_map { - u32 __iomem *magic; - u8 __iomem *buff; -}; - -struct ul_header { - u8 bop; - u16 total_frame; - u16 curr_frame; - u16 len; -} __packed; - -struct dpram_udl_param { - unsigned char *addr; - unsigned int size; - unsigned int count; - unsigned int tag; -}; - -struct dpram_udl_check { - unsigned int total_size; - unsigned int rest_size; - unsigned int send_size; - unsigned int copy_start; - unsigned int copy_complete; - unsigned int boot_complete; -}; - -struct dpram_circ_status { - u8 *buff; - unsigned int qsize; /* the size of a circular buffer */ - unsigned int in; - unsigned int out; - int size; /* the size of free space or received data */ -}; - -#define DP_BOOT_BUFF_OFFSET 4 -#define DP_DLOAD_BUFF_OFFSET 4 -#define DP_ULOAD_BUFF_OFFSET 4 -#define DP_BOOT_REQ_OFFSET 0 -#define DP_BOOT_RESP_OFFSET 8 - -static inline bool circ_valid(u32 qsize, u32 in, u32 out) -{ - if (in >= qsize) - return false; - - if (out >= qsize) - return false; - - return true; -} - -static inline int circ_get_space(int qsize, int in, int out) -{ - return (in < out) ? (out - in - 1) : (qsize + out - in - 1); -} - -static inline int circ_get_usage(int qsize, int in, int out) -{ - return (in >= out) ? (in - out) : (qsize - out + in); -} - -/** - * circ_read - * @dst: start address of the destination buffer - * @src: start address of the buffer in a circular queue - * @qsize: size of the circular queue - * @out: offset to read - * @len: length of data to be read - * - * Should be invoked after checking data length - */ -static inline void circ_read(u8 *dst, u8 __iomem *src, u32 qsize, u32 out, - u32 len) -{ - unsigned len1; - - if ((out + len) <= qsize) { - /* ----- (out) (in) ----- */ - /* ----- 7f 00 00 7e ----- */ - memcpy(dst, (src + out), len); - } else { - /* (in) ----------- (out) */ - /* 00 7e ----------- 7f 00 */ - - /* 1) data start (out) ~ buffer end */ - len1 = qsize - out; - memcpy(dst, (src + out), len1); - - /* 2) buffer start ~ data end (in?) */ - memcpy((dst + len1), src, (len - len1)); - } -} - -/** - * circ_write - * @dst: pointer to the start of the circular queue - * @src: pointer to the source - * @qsize: size of the circular queue - * @in: offset to write - * @len: length of data to be written - * - * Should be invoked after checking free space - */ -static inline void circ_write(u8 __iomem *dst, u8 *src, u32 qsize, u32 in, - u32 len) -{ - u32 space; - - if ((in + len) < qsize) { - /* (in) ----------- (out) */ - /* 00 7e ----------- 7f 00 */ - memcpy((dst + in), src, len); - } else { - /* ----- (out) (in) ----- */ - /* ----- 7f 00 00 7e ----- */ - - /* 1) space start (in) ~ buffer end */ - space = qsize - in; - memcpy((dst + in), src, ((len > space) ? space : len)); - - /* 2) buffer start ~ data end */ - if (len > space) - memcpy(dst, (src + space), (len - space)); - } -} - -/** - * circ_dir - * @dir: communication direction (enum circ_dir_type) - * - * Returns the direction of a circular queue - * - */ -static const inline char *circ_dir(enum circ_dir_type dir) -{ - if (dir == TX) - return "TXQ"; - else - return "RXQ"; -} - -/** - * circ_ptr - * @ptr: circular queue pointer (enum circ_ptr_type) - * - * Returns the name of a circular queue pointer - * - */ -static const inline char *circ_ptr(enum circ_ptr_type ptr) -{ - if (ptr == HEAD) - return "head"; - else - return "tail"; -} - -#if 1 -#define DPRAM_MAX_RXBQ_SIZE 256 - -struct mif_rxb { - u8 *buff; - unsigned size; - - u8 *data; - unsigned len; -}; - -struct mif_rxb_queue { - int size; - int in; - int out; - struct mif_rxb *rxb; -}; - -/* -** RXB (DPRAM RX buffer) functions -*/ -static inline struct mif_rxb *rxbq_create_pool(unsigned size, int count) -{ - struct mif_rxb *rxb; - u8 *buff; - int i; - - rxb = kzalloc(sizeof(struct mif_rxb) * count, GFP_KERNEL); - if (!rxb) { - mif_info("ERR! kzalloc rxb fail\n"); - return NULL; - } - - buff = kzalloc((size * count), GFP_KERNEL|GFP_DMA); - if (!buff) { - mif_info("ERR! kzalloc buff fail\n"); - kfree(rxb); - return NULL; - } - - for (i = 0; i < count; i++) { - rxb[i].buff = buff; - rxb[i].size = size; - buff += size; - } - - return rxb; -} - -static inline unsigned rxbq_get_page_size(unsigned len) -{ - return ((len + PAGE_SIZE - 1) >> PAGE_SHIFT) << PAGE_SHIFT; -} - -static inline bool rxbq_empty(struct mif_rxb_queue *rxbq) -{ - return (rxbq->in == rxbq->out) ? true : false; -} - -static inline int rxbq_free_size(struct mif_rxb_queue *rxbq) -{ - int in = rxbq->in; - int out = rxbq->out; - int qsize = rxbq->size; - return (in < out) ? (out - in - 1) : (qsize + out - in - 1); -} - -static inline struct mif_rxb *rxbq_get_free_rxb(struct mif_rxb_queue *rxbq) -{ - struct mif_rxb *rxb = NULL; - - if (likely(rxbq_free_size(rxbq) > 0)) { - rxb = &rxbq->rxb[rxbq->in]; - rxbq->in++; - if (rxbq->in >= rxbq->size) - rxbq->in -= rxbq->size; - rxb->data = rxb->buff; - } - - return rxb; -} - -static inline int rxbq_size(struct mif_rxb_queue *rxbq) -{ - int in = rxbq->in; - int out = rxbq->out; - int qsize = rxbq->size; - return (in >= out) ? (in - out) : (qsize - out + in); -} - -static inline struct mif_rxb *rxbq_get_data_rxb(struct mif_rxb_queue *rxbq) -{ - struct mif_rxb *rxb = NULL; - - if (likely(!rxbq_empty(rxbq))) { - rxb = &rxbq->rxb[rxbq->out]; - rxbq->out++; - if (rxbq->out >= rxbq->size) - rxbq->out -= rxbq->size; - } - - return rxb; -} - -static inline u8 *rxb_put(struct mif_rxb *rxb, unsigned len) -{ - rxb->len = len; - return rxb->data; -} - -static inline void rxb_clear(struct mif_rxb *rxb) -{ - rxb->data = NULL; - rxb->len = 0; -} -#endif - -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP -#define MAX_TRACE_SIZE 1024 - -struct trace_data { - struct timespec ts; - enum dev_format dev; - u8 *data; - int size; -}; - -struct trace_queue { - spinlock_t lock; - int in; - int out; - struct trace_data trd[MAX_TRACE_SIZE]; -}; - -static inline struct trace_data *trq_get_free_slot(struct trace_queue *trq) -{ - int in = trq->in; - int out = trq->out; - int qsize = MAX_TRACE_SIZE; - struct trace_data *trd = NULL; - unsigned long int flags; - - spin_lock_irqsave(&trq->lock, flags); - - if (circ_get_space(qsize, in, out) < 1) { - spin_unlock_irqrestore(&trq->lock, flags); - return NULL; - } - - trd = &trq->trd[in]; - - in++; - if (in == qsize) - trq->in = 0; - else - trq->in = in; - - spin_unlock_irqrestore(&trq->lock, flags); - - return trd; -} - -static inline struct trace_data *trq_get_data_slot(struct trace_queue *trq) -{ - int in = trq->in; - int out = trq->out; - int qsize = MAX_TRACE_SIZE; - struct trace_data *trd = NULL; - unsigned long int flags; - - spin_lock_irqsave(&trq->lock, flags); - - if (circ_get_usage(qsize, in, out) < 1) { - spin_unlock_irqrestore(&trq->lock, flags); - return NULL; - } - - trd = &trq->trd[out]; - - out++; - if (out == qsize) - trq->out = 0; - else - trq->out = out; - - spin_unlock_irqrestore(&trq->lock, flags); - - return trd; -} -#endif - -#endif diff --git a/drivers/misc/modem_if_u1/modem_link_device_mipi.c b/drivers/misc/modem_if_u1/modem_link_device_mipi.c deleted file mode 100644 index f2804e9..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_mipi.c +++ /dev/null @@ -1,1418 +0,0 @@ -/* /linux/drivers/new_modem_if/link_dev_mipi.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_mipi.h" -#include "modem_utils.h" - -static int mipi_hsi_init_communication(struct link_device *ld, - struct io_device *iod) -{ - struct mipi_link_device *mipi_ld = to_mipi_link_device(ld); - - switch (iod->format) { - case IPC_FMT: - return hsi_init_handshake(mipi_ld, HSI_INIT_MODE_NORMAL); - - case IPC_BOOT: - return hsi_init_handshake(mipi_ld, - HSI_INIT_MODE_FLASHLESS_BOOT); - - case IPC_RAMDUMP: - return hsi_init_handshake(mipi_ld, - HSI_INIT_MODE_CP_RAMDUMP); - - case IPC_RFS: - case IPC_RAW: - default: - return 0; - } -} - -static void mipi_hsi_terminate_communication( - struct link_device *ld, struct io_device *iod) -{ - struct mipi_link_device *mipi_ld = to_mipi_link_device(ld); - - switch (iod->format) { - case IPC_BOOT: - if (&mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].opened) - if_hsi_close_channel(&mipi_ld->hsi_channles[ - HSI_FLASHLESS_CHANNEL]); - break; - - case IPC_RAMDUMP: - if (&mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].opened) - if_hsi_close_channel(&mipi_ld->hsi_channles[ - HSI_CP_RAMDUMP_CHANNEL]); - break; - - case IPC_FMT: - case IPC_RFS: - case IPC_RAW: - default: - break; - } -} - -static int mipi_hsi_send(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb) -{ - int ret; - struct mipi_link_device *mipi_ld = to_mipi_link_device(ld); - - struct sk_buff_head *txq; - - switch (iod->format) { - case IPC_RAW: - txq = &ld->sk_raw_tx_q; - break; - - case IPC_RAMDUMP: - ret = if_hsi_write(&mipi_ld->hsi_channles[ - HSI_CP_RAMDUMP_CHANNEL], - (u32 *)skb->data, skb->len); - if (ret < 0) { - mif_err("[MIPI-HSI] write fail : %d\n", ret); - dev_kfree_skb_any(skb); - return ret; - } else - mif_debug("[MIPI-HSI] write Done\n"); - dev_kfree_skb_any(skb); - return ret; - - case IPC_BOOT: - ret = if_hsi_write(&mipi_ld->hsi_channles[ - HSI_FLASHLESS_CHANNEL], - (u32 *)skb->data, skb->len); - if (ret < 0) { - mif_err("[MIPI-HSI] write fail : %d\n", ret); - dev_kfree_skb_any(skb); - return ret; - } else - mif_debug("[MIPI-HSI] write Done\n"); - dev_kfree_skb_any(skb); - return ret; - - case IPC_FMT: - case IPC_RFS: - default: - txq = &ld->sk_fmt_tx_q; - break; - } - - /* save io device */ - skbpriv(skb)->iod = iod; - /* en queue skb data */ - skb_queue_tail(txq, skb); - - queue_work(ld->tx_wq, &ld->tx_work); - return skb->len; -} - -static void mipi_hsi_tx_work(struct work_struct *work) -{ - int ret; - struct link_device *ld = container_of(work, struct link_device, - tx_work); - struct mipi_link_device *mipi_ld = to_mipi_link_device(ld); - struct io_device *iod; - struct sk_buff *fmt_skb; - struct sk_buff *raw_skb; - int send_channel = 0; - - while (ld->sk_fmt_tx_q.qlen || ld->sk_raw_tx_q.qlen) { - mif_debug("[MIPI-HSI] fmt qlen : %d, raw qlen:%d\n", - ld->sk_fmt_tx_q.qlen, ld->sk_raw_tx_q.qlen); - - fmt_skb = skb_dequeue(&ld->sk_fmt_tx_q); - if (fmt_skb) { - iod = skbpriv(fmt_skb)->iod; - - mif_debug("[MIPI-HSI] dequeue. fmt qlen : %d\n", - ld->sk_fmt_tx_q.qlen); - - if (ld->com_state != COM_ONLINE) { - mif_err("[MIPI-HSI] CP not ready\n"); - skb_queue_head(&ld->sk_fmt_tx_q, fmt_skb); - return; - } - - switch (iod->format) { - case IPC_FMT: - send_channel = HSI_FMT_CHANNEL; - break; - - case IPC_RFS: - send_channel = HSI_RFS_CHANNEL; - break; - - case IPC_BOOT: - send_channel = HSI_FLASHLESS_CHANNEL; - break; - - case IPC_RAMDUMP: - send_channel = HSI_CP_RAMDUMP_CHANNEL; - break; - - default: - break; - } - ret = if_hsi_protocol_send(mipi_ld, send_channel, - (u32 *)fmt_skb->data, fmt_skb->len); - if (ret < 0) { - /* TODO: Re Enqueue */ - mif_err("[MIPI-HSI] write fail : %d\n", ret); - } else - mif_debug("[MIPI-HSI] write Done\n"); - - dev_kfree_skb_any(fmt_skb); - } - - raw_skb = skb_dequeue(&ld->sk_raw_tx_q); - if (raw_skb) { - if (ld->com_state != COM_ONLINE) { - mif_err("[MIPI-HSI] RAW CP not ready\n"); - skb_queue_head(&ld->sk_raw_tx_q, raw_skb); - return; - } - - mif_debug("[MIPI-HSI] dequeue. raw qlen:%d\n", - ld->sk_raw_tx_q.qlen); - - ret = if_hsi_protocol_send(mipi_ld, HSI_RAW_CHANNEL, - (u32 *)raw_skb->data, raw_skb->len); - if (ret < 0) { - /* TODO: Re Enqueue */ - mif_err("[MIPI-HSI] write fail : %d\n", ret); - } else - mif_debug("[MIPI-HSI] write Done\n"); - - dev_kfree_skb_any(raw_skb); - } - } -} - -static int __devinit if_hsi_probe(struct hsi_device *dev); -static struct hsi_device_driver if_hsi_driver = { - .ctrl_mask = ANY_HSI_CONTROLLER, - .probe = if_hsi_probe, - .driver = { - .name = "if_hsi_driver" - }, -}; - -static int if_hsi_set_wakeline(struct if_hsi_channel *channel, - unsigned int state) -{ - int ret; - - spin_lock_bh(&channel->acwake_lock); - if (channel->acwake == state) { - spin_unlock_bh(&channel->acwake_lock); - return 0; - } - - ret = hsi_ioctl(channel->dev, state ? - HSI_IOCTL_ACWAKE_UP : HSI_IOCTL_ACWAKE_DOWN, NULL); - if (ret) { - mif_err("[MIPI-HSI] ACWAKE(%d) setting fail : %d\n", state, - ret); - /* duplicate operation */ - if (ret == -EPERM) - channel->acwake = state; - spin_unlock_bh(&channel->acwake_lock); - return ret; - } - - channel->acwake = state; - spin_unlock_bh(&channel->acwake_lock); - - mif_debug("[MIPI-HSI] ACWAKE_%d(%d)\n", channel->channel_id, state); - return 0; -} - -static void if_hsi_acwake_down_func(unsigned long data) -{ - int i; - struct if_hsi_channel *channel; - struct mipi_link_device *mipi_ld = (struct mipi_link_device *)data; - - mif_debug("[MIPI-HSI]\n"); - - for (i = 0; i < HSI_NUM_OF_USE_CHANNELS; i++) { - channel = &mipi_ld->hsi_channles[i]; - - if ((channel->send_step == STEP_IDLE) && - (channel->recv_step == STEP_IDLE)) { - if_hsi_set_wakeline(channel, 0); - } else { - mod_timer(&mipi_ld->hsi_acwake_down_timer, jiffies + - HSI_ACWAKE_DOWN_TIMEOUT); - mif_debug("[MIPI-HSI] mod_timer done(%d)\n", - HSI_ACWAKE_DOWN_TIMEOUT); - return; - } - } -} - -static int if_hsi_open_channel(struct if_hsi_channel *channel) -{ - int ret; - - if (channel->opened) { - mif_debug("[MIPI-HSI] channel %d is already opened\n", - channel->channel_id); - return 0; - } - - ret = hsi_open(channel->dev); - if (ret) { - mif_err("[MIPI-HSI] hsi_open fail : %d\n", ret); - return ret; - } - channel->opened = 1; - - channel->send_step = STEP_IDLE; - channel->recv_step = STEP_IDLE; - - mif_debug("[MIPI-HSI] hsi_open Done : %d\n", channel->channel_id); - return 0; -} - -static int if_hsi_close_channel(struct if_hsi_channel *channel) -{ - unsigned long int flags; - - if (!channel->opened) { - mif_debug("[MIPI-HSI] channel %d is already closed\n", - channel->channel_id); - return 0; - } - - if_hsi_set_wakeline(channel, 0); - hsi_write_cancel(channel->dev); - hsi_read_cancel(channel->dev); - - spin_lock_irqsave(&channel->tx_state_lock, flags); - channel->tx_state &= ~HSI_CHANNEL_TX_STATE_WRITING; - spin_unlock_irqrestore(&channel->tx_state_lock, flags); - spin_lock_irqsave(&channel->rx_state_lock, flags); - channel->rx_state &= ~HSI_CHANNEL_RX_STATE_READING; - spin_unlock_irqrestore(&channel->rx_state_lock, flags); - - hsi_close(channel->dev); - channel->opened = 0; - - channel->send_step = STEP_CLOSED; - channel->recv_step = STEP_CLOSED; - - mif_debug("[MIPI-HSI] hsi_close Done : %d\n", channel->channel_id); - return 0; -} - -static void mipi_hsi_start_work(struct work_struct *work) -{ - int ret; - u32 start_cmd = 0xC2; - struct mipi_link_device *mipi_ld = - container_of(work, struct mipi_link_device, - start_work.work); - - ret = if_hsi_protocol_send(mipi_ld, HSI_CMD_CHANNEL, &start_cmd, 1); - if (ret < 0) { - /* TODO: Re Enqueue */ - mif_err("[MIPI-HSI] First write fail : %d\n", ret); - } else { - mif_debug("[MIPI-HSI] First write Done : %d\n", ret); - mipi_ld->ld.com_state = COM_ONLINE; - } -} - -static int hsi_init_handshake(struct mipi_link_device *mipi_ld, int mode) -{ - int ret; - int i; - struct hst_ctx tx_config; - struct hsr_ctx rx_config; - - switch (mode) { - case HSI_INIT_MODE_NORMAL: - if (timer_pending(&mipi_ld->hsi_acwake_down_timer)) - del_timer(&mipi_ld->hsi_acwake_down_timer); - - for (i = 0; i < HSI_NUM_OF_USE_CHANNELS; i++) { - if (mipi_ld->hsi_channles[i].opened) { - hsi_write_cancel(mipi_ld->hsi_channles[i].dev); - hsi_read_cancel(mipi_ld->hsi_channles[i].dev); - } else { - ret = if_hsi_open_channel( - &mipi_ld->hsi_channles[i]); - if (ret) - return ret; - } - - hsi_ioctl(mipi_ld->hsi_channles[i].dev, - HSI_IOCTL_GET_TX, &tx_config); - tx_config.mode = 2; - tx_config.divisor = 0; /* Speed : 96MHz */ - tx_config.channels = HSI_MAX_CHANNELS; - hsi_ioctl(mipi_ld->hsi_channles[i].dev, - HSI_IOCTL_SET_TX, &tx_config); - - hsi_ioctl(mipi_ld->hsi_channles[i].dev, - HSI_IOCTL_GET_RX, &rx_config); - rx_config.mode = 2; - rx_config.divisor = 0; /* Speed : 96MHz */ - rx_config.channels = HSI_MAX_CHANNELS; - hsi_ioctl(mipi_ld->hsi_channles[i].dev, - HSI_IOCTL_SET_RX, &rx_config); - mif_debug("[MIPI-HSI] Set TX/RX MIPI-HSI\n"); - - hsi_ioctl(mipi_ld->hsi_channles[i].dev, - HSI_IOCTL_SET_ACREADY_NORMAL, NULL); - mif_debug("[MIPI-HSI] ACREADY_NORMAL\n"); - } - - if (mipi_ld->ld.com_state != COM_ONLINE) - mipi_ld->ld.com_state = COM_HANDSHAKE; - - ret = hsi_read(mipi_ld->hsi_channles[HSI_CONTROL_CHANNEL].dev, - mipi_ld->hsi_channles[HSI_CONTROL_CHANNEL].rx_data, - 1); - if (ret) - mif_err("[MIPI-HSI] hsi_read fail : %d\n", ret); - - if (mipi_ld->ld.com_state != COM_ONLINE) - schedule_delayed_work(&mipi_ld->start_work, 3 * HZ); - - mif_debug("[MIPI-HSI] hsi_init_handshake Done : MODE_NORMAL\n"); - return 0; - - case HSI_INIT_MODE_FLASHLESS_BOOT: - mipi_ld->ld.com_state = COM_BOOT; - - if (mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].opened) { - hsi_write_cancel(mipi_ld->hsi_channles[ - HSI_FLASHLESS_CHANNEL].dev); - hsi_read_cancel(mipi_ld->hsi_channles[ - HSI_FLASHLESS_CHANNEL].dev); - } else { - ret = if_hsi_open_channel( - &mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL]); - if (ret) - return ret; - } - - hsi_ioctl(mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].dev, - HSI_IOCTL_GET_TX, &tx_config); - tx_config.mode = 2; - tx_config.divisor = 0; /* Speed : 96MHz */ - tx_config.channels = 1; - hsi_ioctl(mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].dev, - HSI_IOCTL_SET_TX, &tx_config); - - hsi_ioctl(mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].dev, - HSI_IOCTL_GET_RX, &rx_config); - rx_config.mode = 2; - rx_config.divisor = 0; /* Speed : 96MHz */ - rx_config.channels = 1; - hsi_ioctl(mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].dev, - HSI_IOCTL_SET_RX, &rx_config); - mif_debug("[MIPI-HSI] Set TX/RX MIPI-HSI\n"); - - if (!wake_lock_active(&mipi_ld->wlock)) { - wake_lock(&mipi_ld->wlock); - mif_debug("[MIPI-HSI] wake_lock\n"); - } - - if_hsi_set_wakeline( - &mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL], 1); - - ret = hsi_read(mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].dev, - mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].rx_data, - HSI_FLASHBOOT_ACK_LEN / 4); - if (ret) - mif_err("[MIPI-HSI] hsi_read fail : %d\n", ret); - - hsi_ioctl(mipi_ld->hsi_channles[HSI_FLASHLESS_CHANNEL].dev, - HSI_IOCTL_SET_ACREADY_NORMAL, NULL); - - mif_debug("[MIPI-HSI] hsi_init_handshake Done : FLASHLESS_BOOT\n"); - return 0; - - case HSI_INIT_MODE_CP_RAMDUMP: - mipi_ld->ld.com_state = COM_CRASH; - - if (mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].opened) { - hsi_write_cancel(mipi_ld->hsi_channles[ - HSI_CP_RAMDUMP_CHANNEL].dev); - hsi_read_cancel(mipi_ld->hsi_channles[ - HSI_CP_RAMDUMP_CHANNEL].dev); - } else { - ret = if_hsi_open_channel( - &mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL]); - if (ret) - return ret; - } - - hsi_ioctl(mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].dev, - HSI_IOCTL_GET_TX, &tx_config); - tx_config.mode = 2; - tx_config.divisor = 0; /* Speed : 96MHz */ - tx_config.channels = 1; - hsi_ioctl(mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].dev, - HSI_IOCTL_SET_TX, &tx_config); - - hsi_ioctl(mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].dev, - HSI_IOCTL_GET_RX, &rx_config); - rx_config.mode = 2; - rx_config.divisor = 0; /* Speed : 96MHz */ - rx_config.channels = 1; - hsi_ioctl(mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].dev, - HSI_IOCTL_SET_RX, &rx_config); - mif_debug("[MIPI-HSI] Set TX/RX MIPI-HSI\n"); - - if (!wake_lock_active(&mipi_ld->wlock)) { - wake_lock(&mipi_ld->wlock); - mif_debug("[MIPI-HSI] wake_lock\n"); - } - - if_hsi_set_wakeline( - &mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL], 1); - - ret = hsi_read( - mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].dev, - mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].rx_data, - DUMP_ERR_INFO_SIZE); - if (ret) - mif_err("[MIPI-HSI] hsi_read fail : %d\n", ret); - - hsi_ioctl(mipi_ld->hsi_channles[HSI_CP_RAMDUMP_CHANNEL].dev, - HSI_IOCTL_SET_ACREADY_NORMAL, NULL); - - mif_debug("[MIPI-HSI] hsi_init_handshake Done : RAMDUMP\n"); - return 0; - - default: - return -EINVAL; - } -} - -static u32 if_hsi_create_cmd(u32 cmd_type, int ch, void *arg) -{ - u32 cmd = 0; - unsigned int size = 0; - - switch (cmd_type) { - case HSI_LL_MSG_BREAK: - return 0; - - case HSI_LL_MSG_CONN_CLOSED: - cmd = ((HSI_LL_MSG_CONN_CLOSED & 0x0000000F) << 28) - |((ch & 0x000000FF) << 24); - return cmd; - - case HSI_LL_MSG_ACK: - size = *(unsigned int *)arg; - - cmd = ((HSI_LL_MSG_ACK & 0x0000000F) << 28) - |((ch & 0x000000FF) << 24) | ((size & 0x00FFFFFF)); - return cmd; - - case HSI_LL_MSG_NAK: - cmd = ((HSI_LL_MSG_NAK & 0x0000000F) << 28) - |((ch & 0x000000FF) << 24); - return cmd; - - case HSI_LL_MSG_OPEN_CONN_OCTET: - size = *(unsigned int *)arg; - - cmd = ((HSI_LL_MSG_OPEN_CONN_OCTET & 0x0000000F) - << 28) | ((ch & 0x000000FF) << 24) - | ((size & 0x00FFFFFF)); - return cmd; - - case HSI_LL_MSG_OPEN_CONN: - case HSI_LL_MSG_CONF_RATE: - case HSI_LL_MSG_CANCEL_CONN: - case HSI_LL_MSG_CONN_READY: - case HSI_LL_MSG_ECHO: - case HSI_LL_MSG_INFO_REQ: - case HSI_LL_MSG_INFO: - case HSI_LL_MSG_CONFIGURE: - case HSI_LL_MSG_ALLOCATE_CH: - case HSI_LL_MSG_RELEASE_CH: - case HSI_LL_MSG_INVALID: - default: - mif_err("[MIPI-HSI] ERROR... CMD Not supported : %08x\n", - cmd_type); - return -EINVAL; - } -} - -static void if_hsi_cmd_work(struct work_struct *work) -{ - int ret; - unsigned long int flags; - struct mipi_link_device *mipi_ld = - container_of(work, struct mipi_link_device, cmd_work); - struct if_hsi_channel *channel = - &mipi_ld->hsi_channles[HSI_CONTROL_CHANNEL]; - struct if_hsi_command *hsi_cmd; - - mif_debug("[MIPI-HSI] cmd_work\n"); - - do { - spin_lock_irqsave(&mipi_ld->list_cmd_lock, flags); - if (!list_empty(&mipi_ld->list_of_hsi_cmd)) { - hsi_cmd = list_entry(mipi_ld->list_of_hsi_cmd.next, - struct if_hsi_command, list); - list_del(&hsi_cmd->list); - spin_unlock_irqrestore(&mipi_ld->list_cmd_lock, flags); - - channel->send_step = STEP_TX; - if_hsi_set_wakeline(channel, 1); - mod_timer(&mipi_ld->hsi_acwake_down_timer, jiffies + - HSI_ACWAKE_DOWN_TIMEOUT); - } else { - spin_unlock_irqrestore(&mipi_ld->list_cmd_lock, flags); - channel->send_step = STEP_IDLE; - break; - } - mif_debug("[MIPI-HSI] take command : %08x\n", hsi_cmd->command); - - ret = if_hsi_write(channel, &hsi_cmd->command, 4); - if (ret < 0) { - mif_err("[MIPI-HSI] write command fail : %d\n", ret); - if_hsi_set_wakeline(channel, 0); - channel->send_step = STEP_IDLE; - return; - } - mif_debug("[MIPI-HSI] SEND CMD : %08x\n", hsi_cmd->command); - - kfree(hsi_cmd); - } while (true); -} - -static int if_hsi_send_command(struct mipi_link_device *mipi_ld, - u32 cmd_type, int ch, u32 param) -{ - unsigned long int flags; - struct if_hsi_command *hsi_cmd; - - hsi_cmd = kmalloc(sizeof(struct if_hsi_command), GFP_ATOMIC); - if (!hsi_cmd) { - mif_err("[MIPI-HSI] hsi_cmd kmalloc fail\n"); - return -ENOMEM; - } - INIT_LIST_HEAD(&hsi_cmd->list); - - hsi_cmd->command = if_hsi_create_cmd(cmd_type, ch, ¶m); - mif_debug("[MIPI-HSI] made command : %08x\n", hsi_cmd->command); - - spin_lock_irqsave(&mipi_ld->list_cmd_lock, flags); - list_add_tail(&hsi_cmd->list, &mipi_ld->list_of_hsi_cmd); - spin_unlock_irqrestore(&mipi_ld->list_cmd_lock, flags); - - mif_debug("[MIPI-HSI] queue_work : cmd_work\n"); - queue_work(mipi_ld->mipi_wq, &mipi_ld->cmd_work); - - return 0; -} - -static int if_hsi_decode_cmd(u32 *cmd_data, u32 *cmd, u32 *ch, - u32 *param) -{ - u32 data = *cmd_data; - u8 lrc_cal, lrc_act; - u8 val1, val2, val3; - - *cmd = ((data & 0xF0000000) >> 28); - switch (*cmd) { - case HSI_LL_MSG_BREAK: - mif_err("[MIPI-HSI] Command MSG_BREAK Received\n"); - return -1; - - case HSI_LL_MSG_OPEN_CONN: - *ch = ((data & 0x0F000000) >> 24); - *param = ((data & 0x00FFFF00) >> 8); - val1 = ((data & 0xFF000000) >> 24); - val2 = ((data & 0x00FF0000) >> 16); - val3 = ((data & 0x0000FF00) >> 8); - lrc_act = (data & 0x000000FF); - lrc_cal = val1 ^ val2 ^ val3; - - if (lrc_cal != lrc_act) { - mif_err("[MIPI-HSI] CAL is broken\n"); - return -1; - } - return 0; - - case HSI_LL_MSG_CONN_READY: - case HSI_LL_MSG_CONN_CLOSED: - case HSI_LL_MSG_CANCEL_CONN: - case HSI_LL_MSG_NAK: - *ch = ((data & 0x0F000000) >> 24); - return 0; - - case HSI_LL_MSG_ACK: - *ch = ((data & 0x0F000000) >> 24); - *param = (data & 0x00FFFFFF); - return 0; - - case HSI_LL_MSG_CONF_RATE: - *ch = ((data & 0x0F000000) >> 24); - *param = ((data & 0x0F000000) >> 24); - return 0; - - case HSI_LL_MSG_OPEN_CONN_OCTET: - *ch = ((data & 0x0F000000) >> 24); - *param = (data & 0x00FFFFFF); - return 0; - - case HSI_LL_MSG_ECHO: - case HSI_LL_MSG_INFO_REQ: - case HSI_LL_MSG_INFO: - case HSI_LL_MSG_CONFIGURE: - case HSI_LL_MSG_ALLOCATE_CH: - case HSI_LL_MSG_RELEASE_CH: - case HSI_LL_MSG_INVALID: - default: - mif_err("[MIPI-HSI] Invalid command received : %08x\n", *cmd); - *cmd = HSI_LL_MSG_INVALID; - *ch = HSI_LL_INVALID_CHANNEL; - return -1; - } - return 0; -} - -static int if_hsi_rx_cmd_handle(struct mipi_link_device *mipi_ld, u32 cmd, - u32 ch, u32 param) -{ - int ret; - struct if_hsi_channel *channel = &mipi_ld->hsi_channles[ch]; - - mif_debug("[MIPI-HSI] if_hsi_rx_cmd_handle cmd=0x%x, ch=%d, param=%d\n", - cmd, ch, param); - - switch (cmd) { - case HSI_LL_MSG_OPEN_CONN_OCTET: - switch (channel->recv_step) { - case STEP_IDLE: - channel->recv_step = STEP_TO_ACK; - - if (!wake_lock_active(&mipi_ld->wlock)) { - wake_lock(&mipi_ld->wlock); - mif_debug("[MIPI-HSI] wake_lock\n"); - } - - if_hsi_set_wakeline(channel, 1); - mod_timer(&mipi_ld->hsi_acwake_down_timer, jiffies + - HSI_ACWAKE_DOWN_TIMEOUT); - mif_debug("[MIPI-HSI] mod_timer done(%d)\n", - HSI_ACWAKE_DOWN_TIMEOUT); - - ret = if_hsi_send_command(mipi_ld, HSI_LL_MSG_ACK, ch, - param); - if (ret) { - mif_err("[MIPI-HSI] if_hsi_send_command fail : %d\n", - ret); - return ret; - } - - channel->packet_size = param; - channel->recv_step = STEP_RX; - if (param % 4) - param += (4 - (param % 4)); - channel->rx_count = param; - ret = hsi_read(channel->dev, channel->rx_data, - channel->rx_count / 4); - if (ret) { - mif_err("[MIPI-HSI] hsi_read fail : %d\n", ret); - return ret; - } - return 0; - - case STEP_NOT_READY: - ret = if_hsi_send_command(mipi_ld, HSI_LL_MSG_NAK, ch, - param); - if (ret) { - mif_err("[MIPI-HSI] if_hsi_send_command fail : %d\n", - ret); - return ret; - } - return 0; - - default: - mif_err("[MIPI-HSI] wrong state : %08x, recv_step : %d\n", - cmd, channel->recv_step); - return -1; - } - - case HSI_LL_MSG_ACK: - case HSI_LL_MSG_NAK: - switch (channel->send_step) { - case STEP_WAIT_FOR_ACK: - case STEP_SEND_OPEN_CONN: - if (cmd == HSI_LL_MSG_ACK) { - channel->send_step = STEP_TX; - channel->got_nack = 0; - mif_debug("[MIPI-HSI] got ack\n"); - } else { - channel->send_step = STEP_WAIT_FOR_ACK; - channel->got_nack = 1; - mif_debug("[MIPI-HSI] got nack\n"); - } - - up(&channel->ack_done_sem); - return 0; - - default: - mif_err("[MIPI-HSI] wrong state : %08x\n", cmd); - return -1; - } - - case HSI_LL_MSG_CONN_CLOSED: - switch (channel->send_step) { - case STEP_TX: - case STEP_WAIT_FOR_CONN_CLOSED: - mif_debug("[MIPI-HSI] got close\n"); - - channel->send_step = STEP_IDLE; - up(&channel->close_conn_done_sem); - return 0; - - default: - mif_err("[MIPI-HSI] wrong state : %08x\n", cmd); - return -1; - } - - case HSI_LL_MSG_OPEN_CONN: - case HSI_LL_MSG_ECHO: - case HSI_LL_MSG_CANCEL_CONN: - case HSI_LL_MSG_CONF_RATE: - default: - mif_err("[MIPI-HSI] ERROR... CMD Not supported : %08x\n", cmd); - return -EINVAL; - } -} - -static int if_hsi_protocol_send(struct mipi_link_device *mipi_ld, int ch, - u32 *data, unsigned int len) -{ - int ret; - int retry_count = 0; - int ack_timeout_cnt = 0; - struct io_device *iod; - struct if_hsi_channel *channel = &mipi_ld->hsi_channles[ch]; - - if (channel->send_step != STEP_IDLE) { - mif_err("[MIPI-HSI] send step is not IDLE : %d\n", - channel->send_step); - return -EBUSY; - } - channel->send_step = STEP_SEND_OPEN_CONN; - - if (!wake_lock_active(&mipi_ld->wlock)) { - wake_lock(&mipi_ld->wlock); - mif_debug("[MIPI-HSI] wake_lock\n"); - } - - if_hsi_set_wakeline(channel, 1); - mod_timer(&mipi_ld->hsi_acwake_down_timer, jiffies + - HSI_ACWAKE_DOWN_TIMEOUT); - mif_debug("[MIPI-HSI] mod_timer done(%d)\n", - HSI_ACWAKE_DOWN_TIMEOUT); - -retry_send: - - ret = if_hsi_send_command(mipi_ld, HSI_LL_MSG_OPEN_CONN_OCTET, ch, - len); - if (ret) { - mif_err("[MIPI-HSI] if_hsi_send_command fail : %d\n", ret); - if_hsi_set_wakeline(channel, 0); - channel->send_step = STEP_IDLE; - return -1; - } - - channel->send_step = STEP_WAIT_FOR_ACK; - - if (down_timeout(&channel->ack_done_sem, HSI_ACK_DONE_TIMEOUT) < 0) { - mif_err("[MIPI-HSI] ch=%d, ack_done timeout\n", - channel->channel_id); - - if_hsi_set_wakeline(channel, 0); - - if (mipi_ld->ld.com_state == COM_ONLINE) { - ack_timeout_cnt++; - if (ack_timeout_cnt < 10) { - if_hsi_set_wakeline(channel, 1); - mif_err("[MIPI-HSI] ch=%d, retry send open. cnt : %d\n", - channel->channel_id, ack_timeout_cnt); - goto retry_send; - } - - /* try to recover cp */ - iod = link_get_iod_with_format(&mipi_ld->ld, IPC_FMT); - if (iod) - iod->modem_state_changed(iod, - STATE_CRASH_RESET); - } - - channel->send_step = STEP_IDLE; - return -ETIMEDOUT; - } - mif_debug("[MIPI-HSI] ch=%d, got ack_done=%d\n", channel->channel_id, - channel->got_nack); - - if (channel->got_nack && (retry_count < 10)) { - mif_debug("[MIPI-HSI] ch=%d, got nack=%d retry=%d\n", - channel->channel_id, channel->got_nack, - retry_count); - retry_count++; - msleep_interruptible(1); - goto retry_send; - } - retry_count = 0; - - channel->send_step = STEP_TX; - - ret = if_hsi_write(channel, data, len); - if (ret < 0) { - mif_err("[MIPI-HSI] if_hsi_write fail : %d\n", ret); - if_hsi_set_wakeline(channel, 0); - channel->send_step = STEP_IDLE; - return ret; - } - mif_debug("[MIPI-HSI] SEND DATA : %08x(%d)\n", *data, len); - - mif_debug("%08x %08x %08x %08x %08x %08x %08x %08x\n", - *channel->tx_data, *(channel->tx_data + 1), - *(channel->tx_data + 2), *(channel->tx_data + 3), - *(channel->tx_data + 4), *(channel->tx_data + 5), - *(channel->tx_data + 6), *(channel->tx_data + 7)); - - channel->send_step = STEP_WAIT_FOR_CONN_CLOSED; - if (down_timeout(&channel->close_conn_done_sem, - HSI_CLOSE_CONN_DONE_TIMEOUT) < 0) { - mif_err("[MIPI-HSI] ch=%d, close conn timeout\n", - channel->channel_id); - if_hsi_set_wakeline(channel, 0); - channel->send_step = STEP_IDLE; - return -ETIMEDOUT; - } - mif_debug("[MIPI-HSI] ch=%d, got close_conn_done\n", - channel->channel_id); - - channel->send_step = STEP_IDLE; - - mif_debug("[MIPI-HSI] write protocol Done : %d\n", channel->tx_count); - return channel->tx_count; -} - -static int if_hsi_write(struct if_hsi_channel *channel, u32 *data, - unsigned int size) -{ - int ret; - unsigned long int flags; - - spin_lock_irqsave(&channel->tx_state_lock, flags); - if (channel->tx_state & HSI_CHANNEL_TX_STATE_WRITING) { - spin_unlock_irqrestore(&channel->tx_state_lock, flags); - return -EBUSY; - } - channel->tx_state |= HSI_CHANNEL_TX_STATE_WRITING; - spin_unlock_irqrestore(&channel->tx_state_lock, flags); - - channel->tx_data = data; - if (size % 4) - size += (4 - (size % 4)); - channel->tx_count = size; - - mif_debug("[MIPI-HSI] submit write data : 0x%x(%d)\n", - *(u32 *)channel->tx_data, channel->tx_count); - ret = hsi_write(channel->dev, channel->tx_data, channel->tx_count / 4); - if (ret) { - mif_err("[MIPI-HSI] ch=%d, hsi_write fail : %d\n", - channel->channel_id, ret); - - spin_lock_irqsave(&channel->tx_state_lock, flags); - channel->tx_state &= ~HSI_CHANNEL_TX_STATE_WRITING; - spin_unlock_irqrestore(&channel->tx_state_lock, flags); - - return ret; - } - - if (down_timeout(&channel->write_done_sem, - HSI_WRITE_DONE_TIMEOUT) < 0) { - mif_err("[MIPI-HSI] ch=%d, hsi_write_done timeout : %d\n", - channel->channel_id, size); - - mif_err("[MIPI-HSI] data : %08x %08x %08x %08x %08x ...\n", - *channel->tx_data, *(channel->tx_data + 1), - *(channel->tx_data + 2), *(channel->tx_data + 3), - *(channel->tx_data + 4)); - - hsi_write_cancel(channel->dev); - - spin_lock_irqsave(&channel->tx_state_lock, flags); - channel->tx_state &= ~HSI_CHANNEL_TX_STATE_WRITING; - spin_unlock_irqrestore(&channel->tx_state_lock, flags); - - return -ETIMEDOUT; - } - - if (channel->tx_count != size) - mif_err("[MIPI-HSI] ch:%d,write_done fail,write_size:%d,origin_size:%d\n", - channel->channel_id, channel->tx_count, size); - - mif_debug("[MIPI-HSI] len:%d, id:%d, data : %08x %08x %08x %08x %08x ...\n", - channel->tx_count, channel->channel_id, *channel->tx_data, - *(channel->tx_data + 1), *(channel->tx_data + 2), - *(channel->tx_data + 3), *(channel->tx_data + 4)); - - return channel->tx_count; -} - -static void if_hsi_write_done(struct hsi_device *dev, unsigned int size) -{ - unsigned long int flags; - struct mipi_link_device *mipi_ld = - (struct mipi_link_device *)if_hsi_driver.priv_data; - struct if_hsi_channel *channel = &mipi_ld->hsi_channles[dev->n_ch]; - - mif_debug("[MIPI-HSI] got write data : 0x%x(%d)\n", - *(u32 *)channel->tx_data, size); - - spin_lock_irqsave(&channel->tx_state_lock, flags); - channel->tx_state &= ~HSI_CHANNEL_TX_STATE_WRITING; - spin_unlock_irqrestore(&channel->tx_state_lock, flags); - - mif_debug("%08x %08x %08x %08x %08x %08x %08x %08x\n", - *channel->tx_data, *(channel->tx_data + 1), - *(channel->tx_data + 2), *(channel->tx_data + 3), - *(channel->tx_data + 4), *(channel->tx_data + 5), - *(channel->tx_data + 6), *(channel->tx_data + 7)); - - channel->tx_count = 4 * size; - up(&channel->write_done_sem); -} - -static void if_hsi_read_done(struct hsi_device *dev, unsigned int size) -{ - int ret; - unsigned long int flags; - u32 cmd = 0, ch = 0, param = 0; - struct mipi_link_device *mipi_ld = - (struct mipi_link_device *)if_hsi_driver.priv_data; - struct if_hsi_channel *channel = &mipi_ld->hsi_channles[dev->n_ch]; - struct io_device *iod; - enum dev_format format_type = 0; - - mif_debug("[MIPI-HSI] got read data : 0x%x(%d)\n", - *(u32 *)channel->rx_data, size); - - spin_lock_irqsave(&channel->rx_state_lock, flags); - channel->rx_state &= ~HSI_CHANNEL_RX_STATE_READING; - spin_unlock_irqrestore(&channel->rx_state_lock, flags); - - channel->rx_count = 4 * size; - - switch (channel->channel_id) { - case HSI_CONTROL_CHANNEL: - switch (mipi_ld->ld.com_state) { - case COM_HANDSHAKE: - case COM_ONLINE: - mif_debug("[MIPI-HSI] RECV CMD : %08x\n", - *channel->rx_data); - - if (channel->rx_count != 4) { - mif_err("[MIPI-HSI] wrong command len : %d\n", - channel->rx_count); - return; - } - - ret = if_hsi_decode_cmd(channel->rx_data, &cmd, &ch, - ¶m); - if (ret) - mif_err("[MIPI-HSI] decode_cmd fail=%d, " - "cmd=%x\n", ret, cmd); - else { - mif_debug("[MIPI-HSI] decode_cmd : %08x\n", - cmd); - ret = if_hsi_rx_cmd_handle(mipi_ld, cmd, ch, - param); - if (ret) - mif_err("[MIPI-HSI] handle cmd " - "cmd=%x\n", cmd); - } - - ret = hsi_read(channel->dev, channel->rx_data, 1); - if (ret) - mif_err("[MIPI-HSI] hsi_read fail : %d\n", ret); - - return; - - case COM_BOOT: - mif_debug("[MIPI-HSI] receive data : 0x%x(%d)\n", - *channel->rx_data, channel->rx_count); - - iod = link_get_iod_with_format(&mipi_ld->ld, IPC_BOOT); - if (iod) { - channel->packet_size = *channel->rx_data; - mif_debug("[MIPI-HSI] flashless packet size : " - "%d\n", channel->packet_size); - - ret = iod->recv(iod, - &mipi_ld->ld, - (char *)channel->rx_data + 4, - HSI_FLASHBOOT_ACK_LEN - 4); - if (ret < 0) - mif_err("[MIPI-HSI] recv call " - "fail : %d\n", ret); - } - - ret = hsi_read(channel->dev, channel->rx_data, - HSI_FLASHBOOT_ACK_LEN / 4); - if (ret) - mif_err("[MIPI-HSI] hsi_read fail : %d\n", ret); - return; - - case COM_CRASH: - mif_debug("[MIPI-HSI] receive data : 0x%x(%d)\n", - *channel->rx_data, channel->rx_count); - - iod = link_get_iod_with_format(&mipi_ld->ld, - IPC_RAMDUMP); - if (iod) { - channel->packet_size = *channel->rx_data; - mif_debug("[MIPI-HSI] ramdump packet size : " - "%d\n", channel->packet_size); - - ret = iod->recv(iod, - &mipi_ld->ld, - (char *)channel->rx_data + 4, - channel->packet_size); - if (ret < 0) - mif_err("[MIPI-HSI] recv call " - "fail : %d\n", ret); - } - - ret = hsi_read(channel->dev, channel->rx_data, - DUMP_PACKET_SIZE); - if (ret) - mif_err("[MIPI-HSI] hsi_read fail : %d\n", ret); - return; - - case COM_NONE: - default: - mif_err("[MIPI-HSI] receive data in wrong state : 0x%x(%d)\n", - *channel->rx_data, channel->rx_count); - return; - } - break; - - case HSI_FMT_CHANNEL: - mif_debug("[MIPI-HSI] iodevice format : IPC_FMT\n"); - format_type = IPC_FMT; - break; - case HSI_RAW_CHANNEL: - mif_debug("[MIPI-HSI] iodevice format : IPC_MULTI_RAW\n"); - format_type = IPC_MULTI_RAW; - break; - case HSI_RFS_CHANNEL: - mif_debug("[MIPI-HSI] iodevice format : IPC_RFS\n"); - format_type = IPC_RFS; - break; - - case HSI_CMD_CHANNEL: - mif_debug("[MIPI-HSI] receive command data : 0x%x\n", - *channel->rx_data); - - ch = channel->channel_id; - param = 0; - ret = if_hsi_send_command(mipi_ld, HSI_LL_MSG_CONN_CLOSED, - ch, param); - if (ret) - mif_err("[MIPI-HSI] send_cmd fail=%d\n", ret); - - channel->recv_step = STEP_IDLE; - return; - - default: - return; - } - - iod = link_get_iod_with_format(&mipi_ld->ld, format_type); - if (iod) { - mif_debug("[MIPI-HSI] iodevice format : %d\n", iod->format); - - channel->recv_step = STEP_NOT_READY; - - mif_debug("[MIPI-HSI] RECV DATA : %08x(%d)-%d\n", - *channel->rx_data, channel->packet_size, - iod->format); - - mif_debug("%08x %08x %08x %08x %08x %08x %08x %08x\n", - *channel->rx_data, *(channel->rx_data + 1), - *(channel->rx_data + 2), *(channel->rx_data + 3), - *(channel->rx_data + 4), *(channel->rx_data + 5), - *(channel->rx_data + 6), *(channel->rx_data + 7)); - - ret = iod->recv(iod, &mipi_ld->ld, - (char *)channel->rx_data, channel->packet_size); - if (ret < 0) - mif_err("[MIPI-HSI] recv call fail : %d\n", ret); - - ch = channel->channel_id; - param = 0; - ret = if_hsi_send_command(mipi_ld, - HSI_LL_MSG_CONN_CLOSED, ch, param); - if (ret) - mif_err("[MIPI-HSI] send_cmd fail=%d\n", ret); - - channel->recv_step = STEP_IDLE; - } -} - -static void if_hsi_port_event(struct hsi_device *dev, unsigned int event, - void *arg) -{ - int acwake_level = 1; - struct mipi_link_device *mipi_ld = - (struct mipi_link_device *)if_hsi_driver.priv_data; - - switch (event) { - case HSI_EVENT_BREAK_DETECTED: - mif_err("[MIPI-HSI] HSI_EVENT_BREAK_DETECTED\n"); - return; - - case HSI_EVENT_HSR_DATAAVAILABLE: - mif_err("[MIPI-HSI] HSI_EVENT_HSR_DATAAVAILABLE\n"); - return; - - case HSI_EVENT_CAWAKE_UP: - if (dev->n_ch == HSI_CONTROL_CHANNEL) { - if (!wake_lock_active(&mipi_ld->wlock)) { - wake_lock(&mipi_ld->wlock); - mif_debug("[MIPI-HSI] wake_lock\n"); - } - mif_debug("[MIPI-HSI] CAWAKE_%d(1)\n", dev->n_ch); - } - return; - - case HSI_EVENT_CAWAKE_DOWN: - if (dev->n_ch == HSI_CONTROL_CHANNEL) - mif_debug("[MIPI-HSI] CAWAKE_%d(0)\n", dev->n_ch); - - if ((dev->n_ch == HSI_CONTROL_CHANNEL) && - mipi_ld->hsi_channles[HSI_CONTROL_CHANNEL].opened) { - hsi_ioctl( - mipi_ld->hsi_channles[HSI_CONTROL_CHANNEL].dev, - HSI_IOCTL_GET_ACWAKE, &acwake_level); - - mif_debug("[MIPI-HSI] GET_ACWAKE. Ch : %d, level : %d\n", - dev->n_ch, acwake_level); - - if (!acwake_level) { - wake_unlock(&mipi_ld->wlock); - mif_debug("[MIPI-HSI] wake_unlock\n"); - } - } - return; - - case HSI_EVENT_ERROR: - mif_err("[MIPI-HSI] HSI_EVENT_ERROR\n"); - return; - - default: - mif_err("[MIPI-HSI] Unknown Event : %d\n", event); - return; - } -} - -static int __devinit if_hsi_probe(struct hsi_device *dev) -{ - int port = 0; - unsigned long *address; - struct mipi_link_device *mipi_ld = - (struct mipi_link_device *)if_hsi_driver.priv_data; - - for (port = 0; port < HSI_MAX_PORTS; port++) { - if (if_hsi_driver.ch_mask[port]) - break; - } - address = (unsigned long *)&if_hsi_driver.ch_mask[port]; - - if (test_bit(dev->n_ch, address) && (dev->n_p == port)) { - /* Register callback func */ - hsi_set_write_cb(dev, if_hsi_write_done); - hsi_set_read_cb(dev, if_hsi_read_done); - hsi_set_port_event_cb(dev, if_hsi_port_event); - - /* Init device data */ - mipi_ld->hsi_channles[dev->n_ch].dev = dev; - mipi_ld->hsi_channles[dev->n_ch].tx_count = 0; - mipi_ld->hsi_channles[dev->n_ch].rx_count = 0; - mipi_ld->hsi_channles[dev->n_ch].tx_state = 0; - mipi_ld->hsi_channles[dev->n_ch].rx_state = 0; - mipi_ld->hsi_channles[dev->n_ch].packet_size = 0; - mipi_ld->hsi_channles[dev->n_ch].acwake = 0; - mipi_ld->hsi_channles[dev->n_ch].send_step = STEP_UNDEF; - mipi_ld->hsi_channles[dev->n_ch].recv_step = STEP_UNDEF; - spin_lock_init(&mipi_ld->hsi_channles[dev->n_ch].tx_state_lock); - spin_lock_init(&mipi_ld->hsi_channles[dev->n_ch].rx_state_lock); - spin_lock_init(&mipi_ld->hsi_channles[dev->n_ch].acwake_lock); - sema_init(&mipi_ld->hsi_channles[dev->n_ch].write_done_sem, - 0); - sema_init(&mipi_ld->hsi_channles[dev->n_ch].ack_done_sem, - 0); - sema_init(&mipi_ld->hsi_channles[dev->n_ch].close_conn_done_sem, - 0); - } - - mif_debug("[MIPI-HSI] if_hsi_probe() done. ch : %d\n", dev->n_ch); - return 0; -} - -static int if_hsi_init(struct link_device *ld) -{ - int ret; - int i = 0; - struct mipi_link_device *mipi_ld = to_mipi_link_device(ld); - - for (i = 0; i < HSI_MAX_PORTS; i++) - if_hsi_driver.ch_mask[i] = 0; - - for (i = 0; i < HSI_MAX_CHANNELS; i++) { - mipi_ld->hsi_channles[i].dev = NULL; - mipi_ld->hsi_channles[i].opened = 0; - mipi_ld->hsi_channles[i].channel_id = i; - } - if_hsi_driver.ch_mask[0] = CHANNEL_MASK; - - /* TODO - need to get priv data (request to TI) */ - if_hsi_driver.priv_data = (void *)mipi_ld; - ret = hsi_register_driver(&if_hsi_driver); - if (ret) { - mif_err("[MIPI-HSI] hsi_register_driver() fail : %d\n", ret); - return ret; - } - - mipi_ld->mipi_wq = create_singlethread_workqueue("mipi_cmd_wq"); - if (!mipi_ld->mipi_wq) { - mif_err("[MIPI-HSI] fail to create work Q.\n"); - return -ENOMEM; - } - INIT_WORK(&mipi_ld->cmd_work, if_hsi_cmd_work); - INIT_DELAYED_WORK(&mipi_ld->start_work, mipi_hsi_start_work); - - setup_timer(&mipi_ld->hsi_acwake_down_timer, if_hsi_acwake_down_func, - (unsigned long)mipi_ld); - - /* TODO - allocate rx buff */ - mipi_ld->hsi_channles[HSI_CONTROL_CHANNEL].rx_data = - kmalloc(64 * 1024, GFP_DMA | GFP_ATOMIC); - if (!mipi_ld->hsi_channles[HSI_CONTROL_CHANNEL].rx_data) { - mif_err("[MIPI-HSI] alloc HSI_CONTROL_CHANNEL rx_data fail\n"); - return -ENOMEM; - } - mipi_ld->hsi_channles[HSI_FMT_CHANNEL].rx_data = - kmalloc(256 * 1024, GFP_DMA | GFP_ATOMIC); - if (!mipi_ld->hsi_channles[HSI_FMT_CHANNEL].rx_data) { - mif_err("[MIPI-HSI] alloc HSI_FMT_CHANNEL rx_data fail\n"); - return -ENOMEM; - } - mipi_ld->hsi_channles[HSI_RAW_CHANNEL].rx_data = - kmalloc(256 * 1024, GFP_DMA | GFP_ATOMIC); - if (!mipi_ld->hsi_channles[HSI_RAW_CHANNEL].rx_data) { - mif_err("[MIPI-HSI] alloc HSI_RAW_CHANNEL rx_data fail\n"); - return -ENOMEM; - } - mipi_ld->hsi_channles[HSI_RFS_CHANNEL].rx_data = - kmalloc(256 * 1024, GFP_DMA | GFP_ATOMIC); - if (!mipi_ld->hsi_channles[HSI_RFS_CHANNEL].rx_data) { - mif_err("[MIPI-HSI] alloc HSI_RFS_CHANNEL rx_data fail\n"); - return -ENOMEM; - } - mipi_ld->hsi_channles[HSI_CMD_CHANNEL].rx_data = - kmalloc(256 * 1024, GFP_DMA | GFP_ATOMIC); - if (!mipi_ld->hsi_channles[HSI_CMD_CHANNEL].rx_data) { - mif_err("[MIPI-HSI] alloc HSI_CMD_CHANNEL rx_data fail\n"); - return -ENOMEM; - } - - return 0; -} - -struct link_device *mipi_create_link_device(struct platform_device *pdev) -{ - int ret; - struct mipi_link_device *mipi_ld; - struct link_device *ld; - - /* for dpram int */ - /* struct modem_data *pdata = pdev->dev.platform_data; */ - - mipi_ld = kzalloc(sizeof(struct mipi_link_device), GFP_KERNEL); - if (!mipi_ld) - return NULL; - - INIT_LIST_HEAD(&mipi_ld->list_of_hsi_cmd); - spin_lock_init(&mipi_ld->list_cmd_lock); - skb_queue_head_init(&mipi_ld->ld.sk_fmt_tx_q); - skb_queue_head_init(&mipi_ld->ld.sk_raw_tx_q); - - wake_lock_init(&mipi_ld->wlock, WAKE_LOCK_SUSPEND, "mipi_link"); - - ld = &mipi_ld->ld; - - ld->name = "mipi_hsi"; - ld->init_comm = mipi_hsi_init_communication; - ld->terminate_comm = mipi_hsi_terminate_communication; - ld->send = mipi_hsi_send; - ld->com_state = COM_NONE; - - /* for dpram int */ - /* ld->irq = gpio_to_irq(pdata->gpio); s*/ - - ld->tx_wq = create_singlethread_workqueue("mipi_tx_wq"); - if (!ld->tx_wq) { - mif_err("[MIPI-HSI] fail to create work Q.\n"); - return NULL; - } - INIT_WORK(&ld->tx_work, mipi_hsi_tx_work); - - ret = if_hsi_init(ld); - if (ret) - return NULL; - - return ld; -} diff --git a/drivers/misc/modem_if_u1/modem_link_device_mipi.h b/drivers/misc/modem_if_u1/modem_link_device_mipi.h deleted file mode 100644 index 8ca4968..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_mipi.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_LINK_DEVICE_MIPI_H__ -#define __MODEM_LINK_DEVICE_MIPI_H__ - - -#define HSI_MAX_CHANNELS 16 -#define CHANNEL_MASK 0xFF - -#define HSI_CHANNEL_TX_STATE_UNAVAIL (1 << 0) -#define HSI_CHANNEL_TX_STATE_WRITING (1 << 1) -#define HSI_CHANNEL_RX_STATE_UNAVAIL (1 << 0) -#define HSI_CHANNEL_RX_STATE_READING (1 << 1) - -#define HSI_WRITE_DONE_TIMEOUT (HZ) -#define HSI_READ_DONE_TIMEOUT (HZ) -#define HSI_ACK_DONE_TIMEOUT (HZ) -#define HSI_CLOSE_CONN_DONE_TIMEOUT (HZ) -#define HSI_ACWAKE_DOWN_TIMEOUT (HZ / 2) - -#define HSI_CONTROL_CHANNEL 0 -#define HSI_FLASHLESS_CHANNEL 0 -#define HSI_CP_RAMDUMP_CHANNEL 0 -#define HSI_FMT_CHANNEL 1 -#define HSI_RAW_CHANNEL 2 -#define HSI_RFS_CHANNEL 3 -#define HSI_CMD_CHANNEL 4 -#define HSI_NUM_OF_USE_CHANNELS 5 - -#define HSI_LL_INVALID_CHANNEL 0xFF - -#define HSI_FLASHBOOT_ACK_LEN 16 -#define DUMP_PACKET_SIZE 12289 /* 48K + 4 length, word unit */ -#define DUMP_ERR_INFO_SIZE 39 /* 150 bytes + 4 length , word unit */ - -enum { - HSI_LL_MSG_BREAK, /* 0x0 */ - HSI_LL_MSG_ECHO, - HSI_LL_MSG_INFO_REQ, - HSI_LL_MSG_INFO, - HSI_LL_MSG_CONFIGURE, - HSI_LL_MSG_ALLOCATE_CH, - HSI_LL_MSG_RELEASE_CH, - HSI_LL_MSG_OPEN_CONN, - HSI_LL_MSG_CONN_READY, - HSI_LL_MSG_CONN_CLOSED, /* 0x9 */ - HSI_LL_MSG_CANCEL_CONN, - HSI_LL_MSG_ACK, /* 0xB */ - HSI_LL_MSG_NAK, /* 0xC */ - HSI_LL_MSG_CONF_RATE, - HSI_LL_MSG_OPEN_CONN_OCTET, /* 0xE */ - HSI_LL_MSG_INVALID = 0xFF, -}; - -enum { - STEP_UNDEF, - STEP_CLOSED, - STEP_NOT_READY, - STEP_IDLE, - STEP_ERROR, - STEP_SEND_OPEN_CONN, - STEP_SEND_ACK, - STEP_WAIT_FOR_ACK, - STEP_TO_ACK, - STEP_SEND_NACK, - STEP_GET_NACK, - STEP_SEND_CONN_READY, - STEP_WAIT_FOR_CONN_READY, - STEP_SEND_CONF_RATE, - STEP_WAIT_FOR_CONF_ACK, - STEP_TX, - STEP_RX, - STEP_SEND_CONN_CLOSED, - STEP_WAIT_FOR_CONN_CLOSED, - STEP_SEND_BREAK, -}; - - -struct if_hsi_channel { - struct hsi_device *dev; - unsigned int channel_id; - - u32 *tx_data; - unsigned int tx_count; - u32 *rx_data; - unsigned int rx_count; - unsigned int packet_size; - - unsigned int tx_state; - unsigned int rx_state; - spinlock_t tx_state_lock; - spinlock_t rx_state_lock; - - unsigned int send_step; - unsigned int recv_step; - - unsigned int got_nack; - unsigned int acwake; - spinlock_t acwake_lock; - - struct semaphore write_done_sem; - struct semaphore ack_done_sem; - struct semaphore close_conn_done_sem; - - unsigned int opened; -}; - -struct if_hsi_command { - u32 command; - struct list_head list; -}; - -struct mipi_link_device { - struct link_device ld; - - /* mipi specific link data */ - struct if_hsi_channel hsi_channles[HSI_MAX_CHANNELS]; - struct list_head list_of_hsi_cmd; - spinlock_t list_cmd_lock; - - struct workqueue_struct *mipi_wq; - struct work_struct cmd_work; - struct delayed_work start_work; - - struct wake_lock wlock; - struct timer_list hsi_acwake_down_timer; -}; -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_mipi_link_device(linkdev) \ - container_of(linkdev, struct mipi_link_device, ld) - - -enum { - HSI_INIT_MODE_NORMAL, - HSI_INIT_MODE_FLASHLESS_BOOT, - HSI_INIT_MODE_CP_RAMDUMP, -}; -static int hsi_init_handshake(struct mipi_link_device *mipi_ld, int mode); -static int if_hsi_write(struct if_hsi_channel *channel, u32 *data, - unsigned int size); -static int if_hsi_protocol_send(struct mipi_link_device *mipi_ld, int ch, - u32 *data, unsigned int len); -static int if_hsi_close_channel(struct if_hsi_channel *channel); - -#endif diff --git a/drivers/misc/modem_if_u1/modem_link_device_pld.c b/drivers/misc/modem_if_u1/modem_link_device_pld.c deleted file mode 100644 index 68a91c1..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_pld.c +++ /dev/null @@ -1,1627 +0,0 @@ -/* - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_prj.h" -#include "modem_link_device_pld.h" -#include "modem_utils.h" - - -/* -** Function prototypes for basic DPRAM operations -*/ -static inline void clear_intr(struct pld_link_device *pld); -static inline u16 recv_intr(struct pld_link_device *pld); -static inline void send_intr(struct pld_link_device *pld, u16 mask); - -static inline u16 get_magic(struct pld_link_device *pld); -static inline void set_magic(struct pld_link_device *pld, u16 val); -static inline u16 get_access(struct pld_link_device *pld); -static inline void set_access(struct pld_link_device *pld, u16 val); - -static inline u32 get_tx_head(struct pld_link_device *pld, int id); -static inline u32 get_tx_tail(struct pld_link_device *pld, int id); -static inline void set_tx_head(struct pld_link_device *pld, int id, u32 in); -static inline void set_tx_tail(struct pld_link_device *pld, int id, u32 out); -static inline u8 *get_tx_buff(struct pld_link_device *pld, int id); -static inline u32 get_tx_buff_size(struct pld_link_device *pld, int id); - -static inline u32 get_rx_head(struct pld_link_device *pld, int id); -static inline u32 get_rx_tail(struct pld_link_device *pld, int id); -static inline void set_rx_head(struct pld_link_device *pld, int id, u32 in); -static inline void set_rx_tail(struct pld_link_device *pld, int id, u32 out); -static inline u8 *get_rx_buff(struct pld_link_device *pld, int id); -static inline u32 get_rx_buff_size(struct pld_link_device *pld, int id); - -static inline u16 get_mask_req_ack(struct pld_link_device *pld, int id); -static inline u16 get_mask_res_ack(struct pld_link_device *pld, int id); -static inline u16 get_mask_send(struct pld_link_device *pld, int id); - -static void handle_cp_crash(struct pld_link_device *pld); -static int trigger_force_cp_crash(struct pld_link_device *pld); - -/* -** Functions for debugging -*/ -static void set_dpram_map(struct pld_link_device *pld, - struct mif_irq_map *map) -{ - map->magic = get_magic(pld); - map->access = get_access(pld); - - map->fmt_tx_in = get_tx_head(pld, IPC_FMT); - map->fmt_tx_out = get_tx_tail(pld, IPC_FMT); - map->fmt_rx_in = get_rx_head(pld, IPC_FMT); - map->fmt_rx_out = get_rx_tail(pld, IPC_FMT); - map->raw_tx_in = get_tx_head(pld, IPC_RAW); - map->raw_tx_out = get_tx_tail(pld, IPC_RAW); - map->raw_rx_in = get_rx_head(pld, IPC_RAW); - map->raw_rx_out = get_rx_tail(pld, IPC_RAW); - - map->cp2ap = recv_intr(pld); -} - -/* -** DPRAM operations -*/ -static int pld_register_isr(unsigned irq, irqreturn_t (*isr)(int, void*), - unsigned long flag, const char *name, - struct pld_link_device *pld) -{ - int ret = 0; - - ret = request_irq(irq, isr, flag, name, pld); - if (ret) { - mif_info("%s: ERR! request_irq fail (err %d)\n", name, ret); - return ret; - } - - ret = enable_irq_wake(irq); - if (ret) - mif_info("%s: ERR! enable_irq_wake fail (err %d)\n", name, ret); - - mif_info("%s (#%d) handler registered\n", name, irq); - - return 0; -} - -static inline void clear_intr(struct pld_link_device *pld) -{ - if (pld->ext_op && pld->ext_op->clear_intr) - pld->ext_op->clear_intr(pld); -} - -static inline u16 recv_intr(struct pld_link_device *pld) -{ - u16 val1 = 0, val2 = 0, cnt = 3; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&pld->mbx2ap[0]), - pld->address_buffer); - val1 = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&pld->mbx2ap[0]), - pld->address_buffer); - val2 = ioread16(pld->base); - - if (likely(val1 == val2)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - } - - mif_err("ERR: intr1(%d) != intr1(%d)\n", val1, val2); - - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - - return val1; -} - -static inline void send_intr(struct pld_link_device *pld, u16 mask) -{ - int cnt = 3; - u32 val = 0; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - iowrite16(PLD_ADDR_MASK(&pld->mbx2cp[0]), - pld->address_buffer); - iowrite16((u16)mask, pld->base); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&pld->mbx2cp[0]), - pld->address_buffer); - val = ioread16(pld->base); - - if (likely(val == mask)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; - } - - mif_err("ERR: intr1(%d) != intr2(%d)\n", val, mask); - udelay(100); - - /* Write head value again */ - iowrite16(PLD_ADDR_MASK(&pld->mbx2cp[0]), - pld->address_buffer); - iowrite16((u16)mask, pld->base); - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - - return; -} - -static inline u16 get_magic(struct pld_link_device *pld) -{ - u16 val1 = 0, val2 = 0, cnt = 3; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&pld->magic_ap2cp[0]), - pld->address_buffer); - val1 = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&pld->magic_ap2cp[0]), - pld->address_buffer); - val2 = ioread16(pld->base); - - if (likely(val1 == val2)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - } - - mif_err("ERR: txq.head(%d) != in(%d)\n", val1, val2); - udelay(100); - - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - -} - -static inline void set_magic(struct pld_link_device *pld, u16 in) -{ - int cnt = 3; - u32 val = 0; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - iowrite16(PLD_ADDR_MASK(&pld->magic_ap2cp[0]), - pld->address_buffer); - iowrite16((u16)in, pld->base); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&pld->magic_ap2cp[0]), - pld->address_buffer); - val = ioread16(pld->base); - - if (likely(val == in)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; - } - - mif_err("ERR: magic1(%d) != magic2(%d)\n", val, in); - udelay(100); - - /* Write head value again */ - iowrite16(PLD_ADDR_MASK(&pld->magic_ap2cp[0]), - pld->address_buffer); - iowrite16((u16)in, pld->base); - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; -} - -static inline u16 get_access(struct pld_link_device *pld) -{ - u16 val1 = 0, val2 = 0, cnt = 3; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&pld->access_ap2cp[0]), - pld->address_buffer); - val1 = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&pld->access_ap2cp[0]), - pld->address_buffer); - val2 = ioread16(pld->base); - - if (likely(val1 == val2)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - } - - mif_err("ERR: access1(%d) != access2(%d)\n", val1, val2); - udelay(100); - - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - -} - -static inline void set_access(struct pld_link_device *pld, u16 in) -{ - int cnt = 3; - u32 val = 0; - unsigned long int flags; - - iowrite16(PLD_ADDR_MASK(&pld->access_ap2cp[0]), - pld->address_buffer); - iowrite16((u16)in, pld->base); - - spin_lock_irqsave(&pld->pld_lock, flags); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&pld->access_ap2cp[0]), - pld->address_buffer); - val = ioread16(pld->base); - - if (likely(val == in)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; - } - - mif_err("ERR: access(%d) != access(%d)\n", val, in); - udelay(100); - - /* Write head value again */ - iowrite16(PLD_ADDR_MASK(&pld->access_ap2cp[0]), - pld->address_buffer); - iowrite16((u16)in, pld->base); - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; -} - -static inline u32 get_tx_head(struct pld_link_device *pld, int id) -{ - u16 val1 = 0, val2 = 0, cnt = 3; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->txq.head)[0]), - pld->address_buffer); - val1 = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->txq.head)[0]), - pld->address_buffer); - val2 = ioread16(pld->base); - - if (likely(val1 == val2)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - } - - mif_err("ERR: %s txq.head(%d) != in(%d)\n", - get_dev_name(id), val1, val2); - udelay(100); - - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; -} - -static inline u32 get_tx_tail(struct pld_link_device *pld, int id) -{ - u16 val1 = 0, val2 = 0, cnt = 3; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->txq.tail)[0]), - pld->address_buffer); - val1 = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->txq.tail)[0]), - pld->address_buffer); - val2 = ioread16(pld->base); - - if (likely(val1 == val2)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - } - - mif_err("ERR: %s txq.tail(%d) != in(%d)\n", - get_dev_name(id), val1, val2); - udelay(100); - - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; -} - -static inline void set_tx_head(struct pld_link_device *pld, int id, u32 in) -{ - int cnt = 3; - u32 val = 0; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->txq.head)[0]), - pld->address_buffer); - iowrite16((u16)in, pld->base); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->txq.head)[0]), - pld->address_buffer); - val = ioread16(pld->base); - - if (likely(val == in)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; - } - - mif_err("ERR: %s txq.head(%d) != in(%d)\n", - get_dev_name(id), val, in); - udelay(100); - - /* Write head value again */ - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->txq.head)[0]), - pld->address_buffer); - iowrite16((u16)in, pld->base); - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; -} - -static inline void set_tx_tail(struct pld_link_device *pld, int id, u32 out) -{ - return; -} - -static inline u8 *get_tx_buff(struct pld_link_device *pld, int id) -{ - return pld->dev[id]->txq.buff; -} - -static inline u32 get_tx_buff_size(struct pld_link_device *pld, int id) -{ - return pld->dev[id]->txq.size; -} - -static inline u32 get_rx_head(struct pld_link_device *pld, int id) -{ - u16 val1 = 0, val2 = 0, cnt = 3; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->rxq.head)[0]), - pld->address_buffer); - val1 = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->rxq.head)[0]), - pld->address_buffer); - val2 = ioread16(pld->base); - - if (likely(val1 == val2)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - } - - mif_err("ERR: %s rxq.head(%d) != in(%d)\n", - get_dev_name(id), val1, val2); - udelay(100); - - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; -} - -static inline u32 get_rx_tail(struct pld_link_device *pld, int id) -{ - u16 val1 = 0, val2 = 0, cnt = 3; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - do { - /* Check head value written */ - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->rxq.tail)[0]), - pld->address_buffer); - val1 = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->rxq.tail)[0]), - pld->address_buffer); - val2 = ioread16(pld->base); - - if (likely(val1 == val2)) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; - } - - mif_err("ERR: %s rxq.tail(%d) != in(%d)\n", - get_dev_name(id), val1, val2); - udelay(100); - - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return val1; -} - -static inline void set_rx_head(struct pld_link_device *pld, int id, u32 in) -{ - return; -} - -static inline void set_rx_tail(struct pld_link_device *pld, int id, u32 out) -{ - int cnt = 3; - u32 val = 0; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->rxq.tail)[0]), - pld->address_buffer); - iowrite16((u16)out, pld->base); - - do { - /* Check tail value written */ - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->rxq.tail)[0]), - pld->address_buffer); - val = ioread16(pld->base); - - if (val == out) { - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; - } - - mif_err("ERR: %s rxq.tail(%d) != out(%d)\n", - get_dev_name(id), val, out); - udelay(100); - - /* Write tail value again */ - iowrite16(PLD_ADDR_MASK(&(pld->dev[id]->rxq.tail)[0]), - pld->address_buffer); - iowrite16((u16)out, pld->base); - } while (cnt--); - - spin_unlock_irqrestore(&pld->pld_lock, flags); - return; -} - -static inline u8 *get_rx_buff(struct pld_link_device *pld, int id) -{ - return pld->dev[id]->rxq.buff; -} - -static inline u32 get_rx_buff_size(struct pld_link_device *pld, int id) -{ - return pld->dev[id]->rxq.size; -} - -static inline u16 get_mask_req_ack(struct pld_link_device *pld, int id) -{ - return pld->dev[id]->mask_req_ack; -} - -static inline u16 get_mask_res_ack(struct pld_link_device *pld, int id) -{ - return pld->dev[id]->mask_res_ack; -} - -static inline u16 get_mask_send(struct pld_link_device *pld, int id) -{ - return pld->dev[id]->mask_send; -} - -/* Get free space in the TXQ as well as in & out pointers */ -static inline int get_txq_space(struct pld_link_device *pld, int dev, u32 qsize, - u32 *in, u32 *out) -{ - struct link_device *ld = &pld->ld; - int cnt = 3; - u32 head; - u32 tail; - int space; - - do { - head = get_tx_head(pld, dev); - tail = get_tx_tail(pld, dev); - - space = (head < tail) ? (tail - head - 1) : - (qsize + tail - head - 1); - mif_debug("%s: %s_TXQ qsize[%u] in[%u] out[%u] space[%u]\n", - ld->name, get_dev_name(dev), qsize, head, tail, space); - - if (circ_valid(qsize, head, tail)) { - *in = head; - *out = tail; - return space; - } - - mif_info("%s: CAUTION! <%pf> " - "%s_TXQ invalid (size:%d in:%d out:%d)\n", - ld->name, __builtin_return_address(0), - get_dev_name(dev), qsize, head, tail); - - udelay(100); - } while (cnt--); - - *in = 0; - *out = 0; - return -EINVAL; -} - -static void reset_tx_circ(struct pld_link_device *pld, int dev) -{ - set_tx_head(pld, dev, 0); - set_tx_tail(pld, dev, 0); - if (dev == IPC_FMT) - trigger_force_cp_crash(pld); -} - -/* Get data size in the RXQ as well as in & out pointers */ -static inline int get_rxq_rcvd(struct pld_link_device *pld, int dev, u32 qsize, - u32 *in, u32 *out) -{ - struct link_device *ld = &pld->ld; - int cnt = 3; - u32 head; - u32 tail; - u32 rcvd; - - do { - head = get_rx_head(pld, dev); - tail = get_rx_tail(pld, dev); - if (head == tail) { - *in = head; - *out = tail; - return 0; - } - - rcvd = (head > tail) ? (head - tail) : (qsize - tail + head); - mif_info("%s: %s_RXQ qsize[%u] in[%u] out[%u] rcvd[%u]\n", - ld->name, get_dev_name(dev), qsize, head, tail, rcvd); - - if (circ_valid(qsize, head, tail)) { - *in = head; - *out = tail; - return rcvd; - } - - mif_info("%s: CAUTION! <%pf> " - "%s_RXQ invalid (size:%d in:%d out:%d)\n", - ld->name, __builtin_return_address(0), - get_dev_name(dev), qsize, head, tail); - - udelay(100); - } while (cnt--); - - *in = 0; - *out = 0; - return -EINVAL; -} - -static void reset_rx_circ(struct pld_link_device *pld, int dev) -{ - set_rx_head(pld, dev, 0); - set_rx_tail(pld, dev, 0); - if (dev == IPC_FMT) - trigger_force_cp_crash(pld); -} - -static int check_access(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - int i; - u16 magic = get_magic(pld); - u16 access = get_access(pld); - - if (likely(magic == DPRAM_MAGIC_CODE && access == 1)) - return 0; - - for (i = 1; i <= 100; i++) { - mif_info("%s: ERR! magic:%X access:%X -> retry:%d\n", - ld->name, magic, access, i); - udelay(100); - - magic = get_magic(pld); - access = get_access(pld); - if (likely(magic == DPRAM_MAGIC_CODE && access == 1)) - return 0; - } - - mif_info("%s: !CRISIS! magic:%X access:%X\n", ld->name, magic, access); - return -EACCES; -} - -static bool ipc_active(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - - /* Check DPRAM mode */ - if (ld->mode != LINK_MODE_IPC) { - mif_info("%s: <%pf> ld->mode != LINK_MODE_IPC\n", - ld->name, __builtin_return_address(0)); - return false; - } - - if (check_access(pld) < 0) { - mif_info("%s: ERR! <%pf> check_access fail\n", - ld->name, __builtin_return_address(0)); - return false; - } - - return true; -} - -static void pld_ipc_write(struct pld_link_device *pld, int dev, - u32 qsize, u32 in, u32 out, struct sk_buff *skb) -{ - struct link_device *ld = &pld->ld; - u8 __iomem *buff = get_tx_buff(pld, dev); - u8 *src = skb->data; - u32 len = skb->len; - u32 inp; - struct mif_irq_map map; - unsigned long int flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - if (in < out) { - /* +++++++++ in ---------- out ++++++++++ */ - iowrite16(PLD_ADDR_MASK(&(buff+in)[0]), pld->address_buffer); - memcpy(pld->base, src, len); - } else { - /* ------ out +++++++++++ in ------------ */ - u32 space = qsize - in; - - /* 1) in -> buffer end */ - iowrite16(PLD_ADDR_MASK(&(buff+in)[0]), pld->address_buffer); - memcpy(pld->base, src, ((len > space) ? space : len)); - - if (len > space) { - iowrite16(PLD_ADDR_MASK(&buff[0]), - pld->address_buffer); - memcpy(pld->base, (src+space), (len-space)); - } - } - - spin_unlock_irqrestore(&pld->pld_lock, flags); - - /* update new in pointer */ - inp = in + len; - if (inp >= qsize) - inp -= qsize; - set_tx_head(pld, dev, inp); - - if (dev == IPC_FMT) { - set_dpram_map(pld, &map); - mif_irq_log(ld->mc->msd, map, "ipc_write", sizeof("ipc_write")); - mif_ipc_log(MIF_IPC_AP2CP, ld->mc->msd, skb->data, skb->len); - } -} - -static int pld_try_ipc_tx(struct pld_link_device *pld, int dev) -{ - struct link_device *ld = &pld->ld; - struct sk_buff_head *txq = ld->skb_txq[dev]; - struct sk_buff *skb; - unsigned long int flags; - u32 qsize = get_tx_buff_size(pld, dev); - u32 in; - u32 out; - int space; - int copied = 0; - - spin_lock_irqsave(&pld->tx_rx_lock, flags); - - while (1) { - space = get_txq_space(pld, dev, qsize, &in, &out); - if (unlikely(space < 0)) { - spin_unlock_irqrestore(&pld->tx_rx_lock, flags); - reset_tx_circ(pld, dev); - return space; - } - - skb = skb_dequeue(txq); - if (unlikely(!skb)) - break; - - if (unlikely(space < skb->len)) { - atomic_set(&pld->res_required[dev], 1); - skb_queue_head(txq, skb); - spin_unlock_irqrestore(&pld->tx_rx_lock, flags); - mif_info("%s: %s " - "qsize[%u] in[%u] out[%u] free[%u] < len[%u]\n", - ld->name, get_dev_name(dev), - qsize, in, out, space, skb->len); - return -ENOSPC; - } - - /* TX if there is enough room in the queue */ - pld_ipc_write(pld, dev, qsize, in, out, skb); - copied += skb->len; - dev_kfree_skb_any(skb); - } - - spin_unlock_irqrestore(&pld->tx_rx_lock, flags); - - return copied; -} - -static void pld_ipc_rx_task(unsigned long data) -{ - struct pld_link_device *pld = (struct pld_link_device *)data; - struct link_device *ld = &pld->ld; - struct io_device *iod; - struct mif_rxb *rxb; - unsigned qlen; - int i; - - for (i = 0; i < ld->max_ipc_dev; i++) { - iod = pld->iod[i]; - qlen = rxbq_size(&pld->rxbq[i]); - while (qlen > 0) { - rxb = rxbq_get_data_rxb(&pld->rxbq[i]); - iod->recv(iod, ld, rxb->data, rxb->len); - rxb_clear(rxb); - qlen--; - } - } -} - -static void pld_ipc_read(struct pld_link_device *pld, int dev, u8 *dst, - u8 __iomem *src, u32 out, u32 len, u32 qsize) -{ - u8 *ori_det = dst; - unsigned long flags; - - spin_lock_irqsave(&pld->pld_lock, flags); - - if ((out + len) <= qsize) { - /* ----- (out) (in) ----- */ - /* ----- 7f 00 00 7e ----- */ - iowrite16(PLD_ADDR_MASK(&(src+out)[0]), pld->address_buffer); - memcpy(dst, pld->base, len); - } else { - /* (in) ----------- (out) */ - /* 00 7e ----------- 7f 00 */ - unsigned len1 = qsize - out; - - /* 1) out -> buffer end */ - iowrite16(PLD_ADDR_MASK(&(src+out)[0]), pld->address_buffer); - memcpy(dst, pld->base, len1); - - /* 2) buffer start -> in */ - dst += len1; - iowrite16(PLD_ADDR_MASK(&src[0]), pld->address_buffer); - memcpy(dst, pld->base, (len - len1)); - } - - spin_unlock_irqrestore(&pld->pld_lock, flags); - if (pld->ld.mode == LINK_MODE_IPC && ori_det[0] != 0x7F) { - mif_info("ipc read error!! in[%d], out[%d]\n", - get_rx_head(pld, dev), - get_rx_tail(pld, dev)); - } - -} - -/* - ret < 0 : error - ret == 0 : no data - ret > 0 : valid data -*/ -static int pld_ipc_recv_data_with_rxb(struct pld_link_device *pld, int dev) -{ - struct link_device *ld = &pld->ld; - struct mif_rxb *rxb; - u8 __iomem *src = get_rx_buff(pld, dev); - u32 qsize = get_rx_buff_size(pld, dev); - u32 in; - u32 out; - u32 rcvd; - struct mif_irq_map map; - unsigned long int flags; - - spin_lock_irqsave(&pld->tx_rx_lock, flags); - - rcvd = get_rxq_rcvd(pld, dev, qsize, &in, &out); - if (rcvd <= 0) { - spin_unlock_irqrestore(&pld->tx_rx_lock, flags); - return rcvd; - } - - if (dev == IPC_FMT) { - set_dpram_map(pld, &map); - mif_irq_log(ld->mc->msd, map, "ipc_recv", sizeof("ipc_recv")); - } - - /* Allocate an rxb */ - rxb = rxbq_get_free_rxb(&pld->rxbq[dev]); - if (!rxb) { - mif_info("%s: ERR! %s rxbq_get_free_rxb fail\n", - ld->name, get_dev_name(dev)); - spin_unlock_irqrestore(&pld->tx_rx_lock, flags); - return -ENOMEM; - } - - /* Read data from each DPRAM buffer */ - pld_ipc_read(pld, dev, rxb_put(rxb, rcvd), src, out, rcvd, qsize); - - /* Calculate and set new out */ - out += rcvd; - if (out >= qsize) - out -= qsize; - set_rx_tail(pld, dev, out); - - spin_unlock_irqrestore(&pld->tx_rx_lock, flags); - return rcvd; -} - -static void non_command_handler(struct pld_link_device *pld, u16 non_cmd) -{ - struct link_device *ld = &pld->ld; - int i = 0; - int ret = 0; - u16 mask = 0; - - if (!ipc_active(pld)) - return; - - /* Read data from DPRAM */ - for (i = 0; i < ld->max_ipc_dev; i++) { - ret = pld_ipc_recv_data_with_rxb(pld, i); - if (ret < 0) - reset_rx_circ(pld, i); - - /* Check and process REQ_ACK (at this time, in == out) */ - if (non_cmd & get_mask_req_ack(pld, i)) { - mif_debug("%s: send %s_RES_ACK\n", - ld->name, get_dev_name(i)); - mask |= get_mask_res_ack(pld, i); - } - } - - /* Schedule soft IRQ for RX */ - tasklet_hi_schedule(&pld->rx_tsk); - - /* Try TX via DPRAM */ - for (i = 0; i < ld->max_ipc_dev; i++) { - if (atomic_read(&pld->res_required[i]) > 0) { - ret = pld_try_ipc_tx(pld, i); - if (ret > 0) { - atomic_set(&pld->res_required[i], 0); - mask |= get_mask_send(pld, i); - } else if (ret == -ENOSPC) { - mask |= get_mask_req_ack(pld, i); - } - } - } - - if (mask) { - send_intr(pld, INT_NON_CMD(mask)); - mif_debug("%s: send intr 0x%04X\n", ld->name, mask); - } -} - -static void handle_cp_crash(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - struct io_device *iod; - int i; - - for (i = 0; i < ld->max_ipc_dev; i++) { - mif_info("%s: purging %s_skb_txq\b", ld->name, get_dev_name(i)); - skb_queue_purge(ld->skb_txq[i]); - } - - iod = link_get_iod_with_format(ld, IPC_FMT); - iod->modem_state_changed(iod, STATE_CRASH_EXIT); - - iod = link_get_iod_with_format(ld, IPC_BOOT); - iod->modem_state_changed(iod, STATE_CRASH_EXIT); - - iod = link_get_iod_with_channel(ld, RMNET0_CH_ID); - if (iod) - iodevs_for_each(iod->msd, iodev_netif_stop, 0); -} - -static void handle_no_crash_ack(unsigned long arg) -{ - struct pld_link_device *pld = (struct pld_link_device *)arg; - struct link_device *ld = &pld->ld; - - mif_err("%s: ERR! No CRASH_EXIT ACK from CP\n", ld->mc->name); - - if (!wake_lock_active(&pld->wlock)) - wake_lock(&pld->wlock); - - handle_cp_crash(pld); -} - -static int trigger_force_cp_crash(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - - if (ld->mode == LINK_MODE_ULOAD) { - mif_err("%s: CP crash is already in progress\n", ld->mc->name); - return 0; - } - - ld->mode = LINK_MODE_ULOAD; - mif_err("%s: called by %pf\n", ld->name, __builtin_return_address(0)); - - send_intr(pld, INT_CMD(INT_CMD_CRASH_EXIT)); - - mif_add_timer(&pld->crash_ack_timer, FORCE_CRASH_ACK_TIMEOUT, - handle_no_crash_ack, (unsigned long)pld); - - return 0; -} - -static int pld_init_ipc(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - int i; - - if (ld->mode == LINK_MODE_IPC && - get_magic(pld) == DPRAM_MAGIC_CODE && - get_access(pld) == 1) - mif_info("%s: IPC already initialized\n", ld->name); - - /* Clear pointers in every circular queue */ - for (i = 0; i < ld->max_ipc_dev; i++) { - set_tx_head(pld, i, 0); - set_tx_tail(pld, i, 0); - set_rx_head(pld, i, 0); - set_rx_tail(pld, i, 0); - } - - /* Initialize variables for efficient TX/RX processing */ - for (i = 0; i < ld->max_ipc_dev; i++) - pld->iod[i] = link_get_iod_with_format(ld, i); - pld->iod[IPC_RAW] = link_get_iod_with_format(ld, IPC_MULTI_RAW); - - for (i = 0; i < ld->max_ipc_dev; i++) - atomic_set(&pld->res_required[i], 0); - - spin_lock_init(&pld->tx_rx_lock); - - /* Enable IPC */ - atomic_set(&pld->accessing, 0); - - set_magic(pld, DPRAM_MAGIC_CODE); - set_access(pld, 1); - if (get_magic(pld) != DPRAM_MAGIC_CODE || get_access(pld) != 1) - return -EACCES; - - ld->mode = LINK_MODE_IPC; - - if (wake_lock_active(&pld->wlock)) - wake_unlock(&pld->wlock); - - return 0; -} - -static void cmd_req_active_handler(struct pld_link_device *pld) -{ - send_intr(pld, INT_CMD(INT_CMD_RES_ACTIVE)); -} - -static void cmd_crash_reset_handler(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - struct io_device *iod = NULL; - - ld->mode = LINK_MODE_ULOAD; - - if (!wake_lock_active(&pld->wlock)) - wake_lock(&pld->wlock); - - mif_err("%s: Recv 0xC7 (CRASH_RESET)\n", ld->name); - - iod = link_get_iod_with_format(ld, IPC_FMT); - iod->modem_state_changed(iod, STATE_CRASH_RESET); - - iod = link_get_iod_with_format(ld, IPC_BOOT); - iod->modem_state_changed(iod, STATE_CRASH_RESET); -} - -static void cmd_crash_exit_handler(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - - ld->mode = LINK_MODE_ULOAD; - - if (!wake_lock_active(&pld->wlock)) - wake_lock(&pld->wlock); - - mif_err("%s: Recv 0xC9 (CRASH_EXIT)\n", ld->name); - - del_timer(&pld->crash_ack_timer); - - if (pld->ext_op && pld->ext_op->crash_log) - pld->ext_op->crash_log(pld); - - handle_cp_crash(pld); -} - -static void cmd_phone_start_handler(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - struct io_device *iod = NULL; - - mif_info("%s: Recv 0xC8 (CP_START)\n", ld->name); - - pld_init_ipc(pld); - - iod = link_get_iod_with_format(ld, IPC_FMT); - if (!iod) { - mif_info("%s: ERR! no iod\n", ld->name); - return; - } - - if (pld->ext_op && pld->ext_op->cp_start_handler) - pld->ext_op->cp_start_handler(pld); - - if (ld->mc->phone_state != STATE_ONLINE) { - mif_info("%s: phone_state: %d -> ONLINE\n", - ld->name, ld->mc->phone_state); - iod->modem_state_changed(iod, STATE_ONLINE); - } - - mif_info("%s: Send 0xC2 (INIT_END)\n", ld->name); - send_intr(pld, INT_CMD(INT_CMD_INIT_END)); -} - -static void command_handler(struct pld_link_device *pld, u16 cmd) -{ - struct link_device *ld = &pld->ld; - - switch (INT_CMD_MASK(cmd)) { - case INT_CMD_REQ_ACTIVE: - cmd_req_active_handler(pld); - break; - - case INT_CMD_CRASH_RESET: - pld->init_status = DPRAM_INIT_STATE_NONE; - cmd_crash_reset_handler(pld); - break; - - case INT_CMD_CRASH_EXIT: - pld->init_status = DPRAM_INIT_STATE_NONE; - cmd_crash_exit_handler(pld); - break; - - case INT_CMD_PHONE_START: - pld->init_status = DPRAM_INIT_STATE_READY; - cmd_phone_start_handler(pld); - complete_all(&pld->dpram_init_cmd); - break; - - case INT_CMD_NV_REBUILDING: - mif_info("%s: NV_REBUILDING\n", ld->name); - break; - - case INT_CMD_PIF_INIT_DONE: - complete_all(&pld->modem_pif_init_done); - break; - - case INT_CMD_SILENT_NV_REBUILDING: - mif_info("%s: SILENT_NV_REBUILDING\n", ld->name); - break; - - case INT_CMD_NORMAL_PWR_OFF: - /*ToDo:*/ - /*kernel_sec_set_cp_ack()*/; - break; - - case INT_CMD_REQ_TIME_SYNC: - case INT_CMD_CP_DEEP_SLEEP: - case INT_CMD_EMER_DOWN: - break; - - default: - mif_info("%s: unknown command 0x%04X\n", ld->name, cmd); - } -} - -static irqreturn_t pld_irq_handler(int irq, void *data) -{ - struct pld_link_device *pld = (struct pld_link_device *)data; - struct link_device *ld = (struct link_device *)&pld->ld; - u16 int2ap = 0; - - if (unlikely(ld->mode == LINK_MODE_OFFLINE)) - return IRQ_HANDLED; - - int2ap = recv_intr(pld); - - if (unlikely(int2ap == INT_POWERSAFE_FAIL)) { - mif_info("%s: int2ap == INT_POWERSAFE_FAIL\n", ld->name); - goto exit; - } else if (int2ap == 0x1234 || int2ap == 0xDBAB || int2ap == 0xABCD) { - if (pld->ext_op && pld->ext_op->dload_cmd_handler) { - pld->ext_op->dload_cmd_handler(pld, int2ap); - goto exit; - } - } - - if (likely(INT_VALID(int2ap))) { - if (unlikely(INT_CMD_VALID(int2ap))) - command_handler(pld, int2ap); - else - non_command_handler(pld, int2ap); - } else { - mif_info("%s: ERR! invalid intr 0x%04X\n", - ld->name, int2ap); - } - -exit: - clear_intr(pld); - return IRQ_HANDLED; -} - -static void pld_send_ipc(struct link_device *ld, int dev, - struct io_device *iod, struct sk_buff *skb) -{ - struct pld_link_device *pld = to_pld_link_device(ld); - struct sk_buff_head *txq = ld->skb_txq[dev]; - int ret; - u16 mask; - - skb_queue_tail(txq, skb); - if (txq->qlen > 1024) { - mif_debug("%s: %s txq->qlen %d > 1024\n", - ld->name, get_dev_name(dev), txq->qlen); - } - - if (!ipc_active(pld)) - goto exit; - - if (atomic_read(&pld->res_required[dev]) > 0) { - mif_debug("%s: %s_TXQ is full\n", ld->name, get_dev_name(dev)); - goto exit; - } - - ret = pld_try_ipc_tx(pld, dev); - if (ret > 0) { - mask = get_mask_send(pld, dev); - send_intr(pld, INT_NON_CMD(mask)); - } else if (ret == -ENOSPC) { - mask = get_mask_req_ack(pld, dev); - send_intr(pld, INT_NON_CMD(mask)); - mif_info("%s: Send REQ_ACK 0x%04X\n", ld->name, mask); - } else { - mif_info("%s: pld_try_ipc_tx fail (err %d)\n", ld->name, ret); - } - -exit: - return; -} - -static int pld_send(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb) -{ - enum dev_format dev = iod->format; - int len = skb->len; - - switch (dev) { - case IPC_FMT: - case IPC_RAW: - case IPC_RFS: - if (likely(ld->mode == LINK_MODE_IPC)) { - pld_send_ipc(ld, dev, iod, skb); - } else { - mif_info("%s: ld->mode != LINK_MODE_IPC\n", ld->name); - dev_kfree_skb_any(skb); - } - return len; - - default: - mif_info("%s: ERR! no TXQ for %s\n", ld->name, iod->name); - dev_kfree_skb_any(skb); - return -ENODEV; - } -} - -static int pld_force_dump(struct link_device *ld, struct io_device *iod) -{ - struct pld_link_device *pld = to_pld_link_device(ld); - trigger_force_cp_crash(pld); - return 0; -} - -static int pld_dump_start(struct link_device *ld, struct io_device *iod) -{ - struct pld_link_device *pld = to_pld_link_device(ld); - - if (pld->ext_op && pld->ext_op->dump_start) - return pld->ext_op->dump_start(pld); - else - return -ENODEV; -} - -static int pld_dump_update(struct link_device *ld, struct io_device *iod, - unsigned long arg) -{ - struct pld_link_device *pld = to_pld_link_device(ld); - - if (pld->ext_op && pld->ext_op->dump_update) - return pld->ext_op->dump_update(pld, (void *)arg); - else - return -ENODEV; -} - -static int pld_ioctl(struct link_device *ld, struct io_device *iod, - unsigned int cmd, unsigned long arg) -{ - struct pld_link_device *pld = to_pld_link_device(ld); - int err = 0; - -/* - mif_info("%s: cmd 0x%08X\n", ld->name, cmd); -*/ - - switch (cmd) { - case IOCTL_DPRAM_INIT_STATUS: - mif_debug("%s: get dpram init status\n", ld->name); - return pld->init_status; - - default: - if (pld->ext_ioctl) { - err = pld->ext_ioctl(pld, iod, cmd, arg); - } else { - mif_err("%s: ERR! invalid cmd 0x%08X\n", ld->name, cmd); - err = -EINVAL; - } - - break; - } - - return err; -} - -static int pld_table_init(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - u8 __iomem *dp_base; - int i; - - if (!pld->base) { - mif_info("%s: ERR! pld->base == NULL\n", ld->name); - return -EINVAL; - } - dp_base = pld->base; - - /* Map for IPC */ - if (pld->dpctl->ipc_map) { - memcpy(&pld->ipc_map, pld->dpctl->ipc_map, - sizeof(struct dpram_ipc_map)); - } - - pld->magic_ap2cp = pld->ipc_map.magic_ap2cp; - pld->access_ap2cp = pld->ipc_map.access_ap2cp; - - pld->magic_cp2ap = pld->ipc_map.magic_cp2ap; - pld->access_cp2ap = pld->ipc_map.access_cp2ap; - - pld->address_buffer = pld->ipc_map.address_buffer; - - for (i = 0; i < ld->max_ipc_dev; i++) - pld->dev[i] = &pld->ipc_map.dev[i]; - pld->mbx2ap = pld->ipc_map.mbx_cp2ap; - pld->mbx2cp = pld->ipc_map.mbx_ap2cp; - - /* Map for booting */ - if (pld->ext_op && pld->ext_op->init_boot_map) { - pld->ext_op->init_boot_map(pld); - } else { - pld->bt_map.magic = (u32 *)(dp_base); - pld->bt_map.buff = (u8 *)(dp_base + DP_BOOT_BUFF_OFFSET); - pld->bt_map.size = pld->size - 8; - } - - /* Map for download (FOTA, UDL, etc.) */ - if (pld->ext_op && pld->ext_op->init_dl_map) { - pld->ext_op->init_dl_map(pld); - } else { - pld->dl_map.magic = (u32 *)(dp_base); - pld->dl_map.buff = (u8 *)(dp_base + DP_DLOAD_BUFF_OFFSET); - } - - /* Map for upload mode */ - if (pld->ext_op && pld->ext_op->init_ul_map) { - pld->ext_op->init_ul_map(pld); - } else { - pld->ul_map.magic = (u32 *)(dp_base); - pld->ul_map.buff = (u8 *)(dp_base + DP_ULOAD_BUFF_OFFSET); - } - - return 0; -} - -static void pld_setup_common_op(struct pld_link_device *pld) -{ - pld->clear_intr = clear_intr; - pld->recv_intr = recv_intr; - pld->send_intr = send_intr; - pld->get_magic = get_magic; - pld->set_magic = set_magic; - pld->get_access = get_access; - pld->set_access = set_access; - pld->get_tx_head = get_tx_head; - pld->get_tx_tail = get_tx_tail; - pld->set_tx_head = set_tx_head; - pld->set_tx_tail = set_tx_tail; - pld->get_tx_buff = get_tx_buff; - pld->get_tx_buff_size = get_tx_buff_size; - pld->get_rx_head = get_rx_head; - pld->get_rx_tail = get_rx_tail; - pld->set_rx_head = set_rx_head; - pld->set_rx_tail = set_rx_tail; - pld->get_rx_buff = get_rx_buff; - pld->get_rx_buff_size = get_rx_buff_size; - pld->get_mask_req_ack = get_mask_req_ack; - pld->get_mask_res_ack = get_mask_res_ack; - pld->get_mask_send = get_mask_send; -} - -static int pld_link_init(struct link_device *ld, struct io_device *iod) -{ - return 0; -} - -static void pld_link_terminate(struct link_device *ld, struct io_device *iod) -{ - return; -} - -struct link_device *pld_create_link_device(struct platform_device *pdev) -{ - struct modem_data *mdm_data = NULL; - struct pld_link_device *pld = NULL; - struct link_device *ld = NULL; - struct resource *res = NULL; - resource_size_t res_size; - struct modemlink_dpram_control *dpctl = NULL; - unsigned long task_data; - int ret = 0; - int i = 0; - int bsize; - int qsize; - - /* Get the platform data */ - mdm_data = (struct modem_data *)pdev->dev.platform_data; - if (!mdm_data) { - mif_info("ERR! mdm_data == NULL\n"); - goto err; - } - mif_info("modem = %s\n", mdm_data->name); - mif_info("link device = %s\n", mdm_data->link_name); - - if (!mdm_data->dpram_ctl) { - mif_info("ERR! mdm_data->dpram_ctl == NULL\n"); - goto err; - } - dpctl = mdm_data->dpram_ctl; - - /* Alloc DPRAM link device structure */ - pld = kzalloc(sizeof(struct pld_link_device), GFP_KERNEL); - if (!pld) { - mif_info("ERR! kzalloc pld fail\n"); - goto err; - } - ld = &pld->ld; - - /* Retrieve modem data and DPRAM control data from the modem data */ - ld->mdm_data = mdm_data; - ld->name = mdm_data->link_name; - ld->ipc_version = mdm_data->ipc_version; - - /* Retrieve the most basic data for IPC from the modem data */ - pld->dpctl = dpctl; - pld->type = dpctl->dp_type; - - if (mdm_data->ipc_version < SIPC_VER_50) { - if (!dpctl->max_ipc_dev) { - mif_info("ERR! no max_ipc_dev\n"); - goto err; - } - - ld->aligned = dpctl->aligned; - ld->max_ipc_dev = dpctl->max_ipc_dev; - } else { - ld->aligned = 1; - ld->max_ipc_dev = MAX_SIPC5_DEV; - } - - /* Set attributes as a link device */ - ld->init_comm = pld_link_init; - ld->terminate_comm = pld_link_terminate; - ld->send = pld_send; - ld->force_dump = pld_force_dump; - ld->dump_start = pld_dump_start; - ld->dump_update = pld_dump_update; - ld->ioctl = pld_ioctl; - - INIT_LIST_HEAD(&ld->list); - - skb_queue_head_init(&ld->sk_fmt_tx_q); - skb_queue_head_init(&ld->sk_raw_tx_q); - skb_queue_head_init(&ld->sk_rfs_tx_q); - ld->skb_txq[IPC_FMT] = &ld->sk_fmt_tx_q; - ld->skb_txq[IPC_RAW] = &ld->sk_raw_tx_q; - ld->skb_txq[IPC_RFS] = &ld->sk_rfs_tx_q; - - /* Set up function pointers */ - pld_setup_common_op(pld); - pld->ext_op = pld_get_ext_op(mdm_data->modem_type); - if (pld->ext_op && pld->ext_op->ioctl) - pld->ext_ioctl = pld->ext_op->ioctl; - - /* Retrieve DPRAM resource */ - if (!dpctl->dp_base) { - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - mif_info("%s: ERR! platform_get_resource fail\n", - ld->name); - goto err; - } - res_size = resource_size(res); - - dpctl->dp_base = ioremap_nocache(res->start, res_size); - dpctl->dp_size = res_size; - } - pld->base = dpctl->dp_base; - pld->size = dpctl->dp_size; - - mif_info("%s: type %d, aligned %d, base 0x%08X, size %d\n", - ld->name, pld->type, ld->aligned, (int)pld->base, pld->size); - - /* Initialize DPRAM map (physical map -> logical map) */ - ret = pld_table_init(pld); - if (ret < 0) { - mif_info("%s: ERR! pld_table_init fail (err %d)\n", - ld->name, ret); - goto err; - } - - spin_lock_init(&pld->pld_lock); - - /* Disable IPC */ - set_magic(pld, 0); - set_access(pld, 0); - - pld->init_status = DPRAM_INIT_STATE_NONE; - - /* Initialize locks, completions, and bottom halves */ - snprintf(pld->wlock_name, MIF_MAX_NAME_LEN, "%s_wlock", ld->name); - wake_lock_init(&pld->wlock, WAKE_LOCK_SUSPEND, pld->wlock_name); - - init_completion(&pld->dpram_init_cmd); - init_completion(&pld->modem_pif_init_done); - init_completion(&pld->udl_start_complete); - init_completion(&pld->udl_cmd_complete); - init_completion(&pld->crash_start_complete); - init_completion(&pld->crash_recv_done); - - task_data = (unsigned long)pld; - tasklet_init(&pld->rx_tsk, pld_ipc_rx_task, task_data); - - /* Prepare RXB queue */ - qsize = DPRAM_MAX_RXBQ_SIZE; - for (i = 0; i < ld->max_ipc_dev; i++) { - bsize = rxbq_get_page_size(get_rx_buff_size(pld, i)); - pld->rxbq[i].size = qsize; - pld->rxbq[i].in = 0; - pld->rxbq[i].out = 0; - pld->rxbq[i].rxb = rxbq_create_pool(bsize, qsize); - if (!pld->rxbq[i].rxb) { - mif_info("%s: ERR! %s rxbq_create_pool fail\n", - ld->name, get_dev_name(i)); - goto err; - } - mif_info("%s: %s rxbq_pool created (bsize:%d, qsize:%d)\n", - ld->name, get_dev_name(i), bsize, qsize); - } - - /* Prepare a multi-purpose miscellaneous buffer */ - pld->buff = kzalloc(pld->size, GFP_KERNEL); - if (!pld->buff) { - mif_info("%s: ERR! kzalloc pld->buff fail\n", ld->name); - goto err; - } - - /* Retrieve DPRAM IRQ GPIO# */ - pld->gpio_dpram_int = mdm_data->gpio_dpram_int; - - /* Retrieve DPRAM IRQ# */ - if (!dpctl->dpram_irq) { - dpctl->dpram_irq = platform_get_irq_byname(pdev, "dpram_irq"); - if (dpctl->dpram_irq < 0) { - mif_info("%s: ERR! platform_get_irq_byname fail\n", - ld->name); - goto err; - } - } - pld->irq = dpctl->dpram_irq; - - /* Retrieve DPRAM IRQ flags */ - if (!dpctl->dpram_irq_flags) - dpctl->dpram_irq_flags = (IRQF_NO_SUSPEND | IRQF_TRIGGER_LOW); - pld->irq_flags = dpctl->dpram_irq_flags; - - /* Register DPRAM interrupt handler */ - snprintf(pld->irq_name, MIF_MAX_NAME_LEN, "%s_irq", ld->name); - ret = pld_register_isr(pld->irq, pld_irq_handler, pld->irq_flags, - pld->irq_name, pld); - if (ret) - goto err; - - return ld; - -err: - if (pld) { - kfree(pld->buff); - kfree(pld); - } - - return NULL; -} - diff --git a/drivers/misc/modem_if_u1/modem_link_device_pld.h b/drivers/misc/modem_if_u1/modem_link_device_pld.h deleted file mode 100644 index 89c44b2..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_pld.h +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_LINK_DEVICE_PLD_H__ -#define __MODEM_LINK_DEVICE_PLD_H__ - -#include "modem_link_device_memory.h" - -#define PLD_ADDR_MASK(x) (0x00003FFF & (unsigned long)(x)) - -/* - mbx_ap2cp + 0x0 - magic_code + - access_enable + - padding + - mbx_cp2ap + 0x1000 - magic_code + - access_enable + - padding + - fmt_tx_head + fmt_tx_tail + fmt_tx_buff + 0x2000 - raw_tx_head + raw_tx_tail + raw_tx_buff + - fmt_rx_head + fmt_rx_tail + fmt_rx_buff + 0x3000 - raw_rx_head + raw_rx_tail + raw_rx_buff + - = 2 + - 4094 + - 2 + - 4094 + - 2 + - 2 + - 2 + 2 + 1020 + - 2 + 2 + 3064 + - 2 + 2 + 1020 + - 2 + 2 + 3064 - */ - -#define PLD_FMT_TX_BUFF_SZ 1024 -#define PLD_RAW_TX_BUFF_SZ 3072 -#define PLD_FMT_RX_BUFF_SZ 1024 -#define PLD_RAW_RX_BUFF_SZ 3072 - -#define MAX_MSM_EDPRAM_IPC_DEV 2 /* FMT, RAW */ - -struct pld_ipc_map { - u16 mbx_ap2cp; - u16 magic_ap2cp; - u16 access_ap2cp; - u16 fmt_tx_head; - u16 raw_tx_head; - u16 fmt_rx_tail; - u16 raw_rx_tail; - u16 temp1; - u8 padding1[4080]; - - u16 mbx_cp2ap; - u16 magic_cp2ap; - u16 access_cp2ap; - u16 fmt_tx_tail; - u16 raw_tx_tail; - u16 fmt_rx_head; - u16 raw_rx_head; - u16 temp2; - u8 padding2[4080]; - - u8 fmt_tx_buff[PLD_FMT_TX_BUFF_SZ]; - u8 raw_tx_buff[PLD_RAW_TX_BUFF_SZ]; - u8 fmt_rx_buff[PLD_RAW_TX_BUFF_SZ]; - u8 raw_rx_buff[PLD_RAW_RX_BUFF_SZ]; - - u8 padding3[16384]; - - u16 address_buffer; -}; - -struct pld_ext_op; - -struct pld_link_device { - struct link_device ld; - - /* DPRAM address and size */ - enum dpram_type type; /* DPRAM type */ - u8 __iomem *base; /* DPRAM base virtual address */ - u32 size; /* DPRAM size */ - - /* DPRAM IRQ GPIO# */ - unsigned gpio_dpram_int; - - /* DPRAM IRQ from CP */ - int irq; - unsigned long irq_flags; - char irq_name[MIF_MAX_NAME_LEN]; - - /* Link to DPRAM control functions dependent on each platform */ - struct modemlink_dpram_control *dpctl; - - /* Physical configuration -> logical configuration */ - union { - struct dpram_boot_map bt_map; - struct qc_dpram_boot_map qc_bt_map; - }; - - struct dpram_dload_map dl_map; - struct dpram_uload_map ul_map; - - /* IPC device map */ - struct dpram_ipc_map ipc_map; - - /* Pointers (aliases) to IPC device map */ - u16 __iomem *magic_ap2cp; - u16 __iomem *access_ap2cp; - u16 __iomem *magic_cp2ap; - u16 __iomem *access_cp2ap; - u16 __iomem *address_buffer; - - struct dpram_ipc_device *dev[MAX_IPC_DEV]; - u16 __iomem *mbx2ap; - u16 __iomem *mbx2cp; - - /* Wakelock for DPRAM device */ - struct wake_lock wlock; - char wlock_name[MIF_MAX_NAME_LEN]; - - /* For booting */ - unsigned boot_start_complete; - struct completion dpram_init_cmd; - struct completion modem_pif_init_done; - - /* For UDL */ - struct tasklet_struct ul_tsk; - struct tasklet_struct dl_tsk; - struct completion udl_start_complete; - struct completion udl_cmd_complete; - struct dpram_udl_check udl_check; - struct dpram_udl_param udl_param; - - /* For CP crash dump */ - struct timer_list crash_ack_timer; - struct completion crash_start_complete; - struct completion crash_recv_done; - struct timer_list crash_timer; - int crash_rcvd; /* Count of CP crash dump packets received */ - - /* For locking TX process */ - spinlock_t tx_rx_lock; - spinlock_t pld_lock; - - /* For efficient RX process */ - struct tasklet_struct rx_tsk; - struct mif_rxb_queue rxbq[MAX_IPC_DEV]; - struct io_device *iod[MAX_IPC_DEV]; - - /* For retransmission after buffer full state */ - atomic_t res_required[MAX_IPC_DEV]; - - /* For wake-up/sleep control */ - atomic_t accessing; - - /* Multi-purpose miscellaneous buffer */ - u8 *buff; - - /* PLD IPC initialization status */ - int init_status; - - /* Alias to device-specific IOCTL function */ - int (*ext_ioctl)(struct pld_link_device *pld, struct io_device *iod, - unsigned int cmd, unsigned long arg); - - /* Common operations for each DPRAM */ - void (*clear_intr)(struct pld_link_device *pld); - u16 (*recv_intr)(struct pld_link_device *pld); - void (*send_intr)(struct pld_link_device *pld, u16 mask); - u16 (*get_magic)(struct pld_link_device *pld); - void (*set_magic)(struct pld_link_device *pld, u16 value); - u16 (*get_access)(struct pld_link_device *pld); - void (*set_access)(struct pld_link_device *pld, u16 value); - u32 (*get_tx_head)(struct pld_link_device *pld, int id); - u32 (*get_tx_tail)(struct pld_link_device *pld, int id); - void (*set_tx_head)(struct pld_link_device *pld, int id, u32 head); - void (*set_tx_tail)(struct pld_link_device *pld, int id, u32 tail); - u8 *(*get_tx_buff)(struct pld_link_device *pld, int id); - u32 (*get_tx_buff_size)(struct pld_link_device *pld, int id); - u32 (*get_rx_head)(struct pld_link_device *pld, int id); - u32 (*get_rx_tail)(struct pld_link_device *pld, int id); - void (*set_rx_head)(struct pld_link_device *pld, int id, u32 head); - void (*set_rx_tail)(struct pld_link_device *pld, int id, u32 tail); - u8 *(*get_rx_buff)(struct pld_link_device *pld, int id); - u32 (*get_rx_buff_size)(struct pld_link_device *pld, int id); - u16 (*get_mask_req_ack)(struct pld_link_device *pld, int id); - u16 (*get_mask_res_ack)(struct pld_link_device *pld, int id); - u16 (*get_mask_send)(struct pld_link_device *pld, int id); - - /* Extended operations for various modems */ - struct pld_ext_op *ext_op; -}; - -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_pld_link_device(linkdev) \ - container_of(linkdev, struct pld_link_device, ld) - -struct pld_ext_op { - int exist; - - void (*init_boot_map)(struct pld_link_device *pld); - void (*init_dl_map)(struct pld_link_device *pld); - void (*init_ul_map)(struct pld_link_device *pld); - - void (*dload_cmd_handler)(struct pld_link_device *pld, u16 cmd); - - void (*cp_start_handler)(struct pld_link_device *pld); - - void (*crash_log)(struct pld_link_device *pld); - int (*dump_start)(struct pld_link_device *pld); - int (*dump_update)(struct pld_link_device *pld, void *arg); - - int (*ioctl)(struct pld_link_device *pld, struct io_device *iod, - unsigned int cmd, unsigned long arg); - - void (*clear_intr)(struct pld_link_device *pld); -}; - -struct pld_ext_op *pld_get_ext_op(enum modem_t modem); -#endif diff --git a/drivers/misc/modem_if_u1/modem_link_device_pld_ext_op.c b/drivers/misc/modem_if_u1/modem_link_device_pld_ext_op.c deleted file mode 100644 index 4f2df8f..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_pld_ext_op.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_prj.h" -#include "modem_link_device_pld.h" -#include "modem_utils.h" - -#if defined(CONFIG_CDMA_MODEM_MDM6600) || defined(CONFIG_GSM_MODEM_ESC6270) -enum qc_dload_tag { - QC_DLOAD_TAG_NONE = 0, - QC_DLOAD_TAG_BIN, - QC_DLOAD_TAG_NV, - QC_DLOAD_TAG_MAX -}; - -static void qc_dload_task(unsigned long data); - -static void qc_init_boot_map(struct pld_link_device *pld) -{ - struct qc_dpram_boot_map *qbt_map = &pld->qc_bt_map; - struct modemlink_dpram_control *dpctl = pld->dpctl; - - qbt_map->buff = pld->dev[0]->txq.buff; - qbt_map->frame_size = (u16 *)(pld->base + dpctl->boot_size_offset); - qbt_map->tag = (u16 *)(pld->base + dpctl->boot_tag_offset); - qbt_map->count = (u16 *)(pld->base + dpctl->boot_count_offset); - - tasklet_init(&pld->dl_tsk, qc_dload_task, (unsigned long)pld); -} - -static void qc_dload_map(struct pld_link_device *pld, u8 is_upload) -{ - struct qc_dpram_boot_map *qbt_map = &pld->qc_bt_map; - struct modemlink_dpram_control *dpctl = pld->dpctl; - unsigned int upload_offset = 0; - - if (is_upload == 1) { - upload_offset = 0x1000; - qbt_map->buff = pld->dev[0]->rxq.buff; - } else { - upload_offset = 0; - qbt_map->buff = pld->dev[0]->txq.buff; - } - - qbt_map->frame_size = (u16 *)(pld->base + - dpctl->boot_size_offset + upload_offset); - qbt_map->tag = (u16 *)(pld->base + - dpctl->boot_tag_offset + upload_offset); - qbt_map->count = (u16 *)(pld->base + - dpctl->boot_count_offset + upload_offset); - -} - -static int qc_prepare_download(struct pld_link_device *pld) -{ - int retval = 0; - int count = 0; - - qc_dload_map(pld, 0); - - while (1) { - if (pld->udl_check.copy_start) { - pld->udl_check.copy_start = 0; - break; - } - - usleep_range(10000, 11000); - - count++; - if (count > 1000) { - mif_err("ERR! count %d\n", count); - return -1; - } - } - - return retval; -} - -static void _qc_do_download(struct pld_link_device *pld, - struct dpram_udl_param *param) -{ - struct qc_dpram_boot_map *qbt_map = &pld->qc_bt_map; - - if (param->size <= pld->dpctl->max_boot_frame_size) { - iowrite16(PLD_ADDR_MASK(&qbt_map->buff[0]), - pld->address_buffer); - memcpy(pld->base, param->addr, param->size); - - iowrite16(PLD_ADDR_MASK(&qbt_map->frame_size[0]), - pld->address_buffer); - iowrite16(param->size, pld->base); - - iowrite16(PLD_ADDR_MASK(&qbt_map->tag[0]), - pld->address_buffer); - iowrite16(param->tag, pld->base); - - iowrite16(PLD_ADDR_MASK(&qbt_map->count[0]), - pld->address_buffer); - iowrite16(param->count, pld->base); - - pld->send_intr(pld, 0xDB12); - } else { - mif_info("param->size %d\n", param->size); - } -} - -static int _qc_download(struct pld_link_device *pld, void *arg, - enum qc_dload_tag tag) -{ - int retval = 0; - int count = 0; - int cnt_limit; - unsigned char *img; - struct dpram_udl_param param; - - retval = copy_from_user((void *)¶m, (void *)arg, sizeof(param)); - if (retval < 0) { - mif_err("ERR! copy_from_user fail\n"); - return -1; - } - - img = vmalloc(param.size); - if (!img) { - mif_err("ERR! vmalloc fail\n"); - return -1; - } - memset(img, 0, param.size); - memcpy(img, param.addr, param.size); - - pld->udl_check.total_size = param.size; - pld->udl_check.rest_size = param.size; - pld->udl_check.send_size = 0; - pld->udl_check.copy_complete = 0; - - pld->udl_param.addr = img; - pld->udl_param.size = pld->dpctl->max_boot_frame_size; - if (tag == QC_DLOAD_TAG_NV) - pld->udl_param.count = 1; - else - pld->udl_param.count = param.count; - pld->udl_param.tag = tag; - - if (pld->udl_check.rest_size < pld->dpctl->max_boot_frame_size) - pld->udl_param.size = pld->udl_check.rest_size; - - /* Download image (binary or NV) */ - _qc_do_download(pld, &pld->udl_param); - - /* Wait for completion - */ - if (tag == QC_DLOAD_TAG_NV) - cnt_limit = 200; - else - cnt_limit = 1000; - - while (1) { - if (pld->udl_check.copy_complete) { - pld->udl_check.copy_complete = 0; - retval = 0; - break; - } - - usleep_range(10000, 11000); - - count++; - if (count > cnt_limit) { - mif_err("ERR! count %d\n", count); - retval = -1; - break; - } - } - - vfree(img); - - return retval; -} - -static int qc_download_bin(struct pld_link_device *pld, void *arg) -{ - return _qc_download(pld, arg, QC_DLOAD_TAG_BIN); -} - -static int qc_download_nv(struct pld_link_device *pld, void *arg) -{ - return _qc_download(pld, arg, QC_DLOAD_TAG_NV); -} - -static void qc_dload_task(unsigned long data) -{ - struct pld_link_device *pld = (struct pld_link_device *)data; - - pld->udl_check.send_size += pld->udl_param.size; - pld->udl_check.rest_size -= pld->udl_param.size; - - pld->udl_param.addr += pld->udl_param.size; - - if (pld->udl_check.send_size >= pld->udl_check.total_size) { - pld->udl_check.copy_complete = 1; - pld->udl_param.tag = 0; - return; - } - - if (pld->udl_check.rest_size < pld->dpctl->max_boot_frame_size) - pld->udl_param.size = pld->udl_check.rest_size; - - pld->udl_param.count += 1; - - _qc_do_download(pld, &pld->udl_param); -} - -static void qc_dload_cmd_handler(struct pld_link_device *pld, u16 cmd) -{ - switch (cmd) { - case 0x1234: - pld->udl_check.copy_start = 1; - break; - - case 0xDBAB: - tasklet_schedule(&pld->dl_tsk); - break; - - case 0xABCD: - mif_info("[%s] booting Start\n", pld->ld.name); - pld->udl_check.boot_complete = 1; - break; - - default: - mif_err("ERR! unknown command 0x%04X\n", cmd); - } -} - -static int qc_boot_start(struct pld_link_device *pld) -{ - u16 mask = 0; - int count = 0; - - /* Send interrupt -> '0x4567' */ - mask = 0x4567; - pld->send_intr(pld, mask); - - while (1) { - if (pld->udl_check.boot_complete) { - pld->udl_check.boot_complete = 0; - break; - } - - usleep_range(10000, 11000); - - count++; - if (count > 200) { - mif_err("ERR! count %d\n", count); - return -1; - } - } - - return 0; -} - -static int qc_boot_post_process(struct pld_link_device *pld) -{ - int count = 0; - - while (1) { - if (pld->boot_start_complete) { - pld->boot_start_complete = 0; - break; - } - - usleep_range(10000, 11000); - - count++; - if (count > 200) { - mif_err("ERR! count %d\n", count); - return -1; - } - } - - return 0; -} - -static void qc_start_handler(struct pld_link_device *pld) -{ - /* - * INT_MASK_VALID | INT_MASK_CMD | INT_MASK_CP_AIRPLANE_BOOT | - * INT_MASK_CP_AP_ANDROID | INT_MASK_CMD_INIT_END - */ - u16 mask = (0x0080 | 0x0040 | 0x1000 | 0x0100 | 0x0002); - - pld->boot_start_complete = 1; - - /* Send INIT_END code to CP */ - mif_info("send 0x%04X (INIT_END)\n", mask); - - pld->send_intr(pld, mask); -} - -static void qc_crash_log(struct pld_link_device *pld) -{ - struct link_device *ld = &pld->ld; - static unsigned char buf[151]; - u8 __iomem *data = NULL; - - data = pld->get_rx_buff(pld, IPC_FMT); - memcpy(buf, data, (sizeof(buf) - 1)); - - mif_info("PHONE ERR MSG\t| %s Crash\n", ld->mdm_data->name); - mif_info("PHONE ERR MSG\t| %s\n", buf); -} - -static int _qc_data_upload(struct pld_link_device *pld, - struct dpram_udl_param *param) -{ - struct qc_dpram_boot_map *qbt_map = &pld->qc_bt_map; - int retval = 0; - u16 intval = 0; - int count = 0; - - while (1) { - if (!gpio_get_value(pld->gpio_dpram_int)) { - intval = pld->recv_intr(pld); - if (intval == 0xDBAB) { - break; - } else { - mif_err("intr 0x%08x\n", intval); - return -1; - } - } - - usleep_range(1000, 2000); - - count++; - if (count > 200) { - mif_err("<%s:%d>\n", __func__, __LINE__); - return -1; - } - } - - iowrite16(PLD_ADDR_MASK(&qbt_map->frame_size[0]), - pld->address_buffer); - param->size = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&qbt_map->tag[0]), - pld->address_buffer); - param->tag = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&qbt_map->count[0]), - pld->address_buffer); - param->count = ioread16(pld->base); - - iowrite16(PLD_ADDR_MASK(&qbt_map->buff[0]), - pld->address_buffer); - memcpy(param->addr, pld->base, param->size); - - pld->send_intr(pld, 0xDB12); - - return retval; -} - -static int qc_uload_step1(struct pld_link_device *pld) -{ - int retval = 0; - int count = 0; - u16 intval = 0; - u16 mask = 0; - - qc_dload_map(pld, 1); - - mif_info("+---------------------------------------------+\n"); - mif_info("| UPLOAD PHONE SDRAM |\n"); - mif_info("+---------------------------------------------+\n"); - - while (1) { - if (!gpio_get_value(pld->gpio_dpram_int)) { - intval = pld->recv_intr(pld); - mif_info("intr 0x%04x\n", intval); - if (intval == 0x1234) { - break; - } else { - mif_info("ERR! invalid intr\n"); - return -1; - } - } - - usleep_range(1000, 2000); - - count++; - if (count > 200) { - intval = pld->recv_intr(pld); - mif_info("count %d, intr 0x%04x\n", count, intval); - if (intval == 0x1234) - break; - return -1; - } - } - - mask = 0xDEAD; - pld->send_intr(pld, mask); - - return retval; -} - -static int qc_uload_step2(struct pld_link_device *pld, void *arg) -{ - int retval = 0; - struct dpram_udl_param param; - - retval = copy_from_user((void *)¶m, (void *)arg, sizeof(param)); - if (retval < 0) { - mif_err("ERR! copy_from_user fail (err %d)\n", retval); - return -1; - } - - retval = _qc_data_upload(pld, ¶m); - if (retval < 0) { - mif_err("ERR! _qc_data_upload fail (err %d)\n", retval); - return -1; - } - - if (!(param.count % 500)) - mif_info("param->count = %d\n", param.count); - - if (param.tag == 4) { - enable_irq(pld->irq); - mif_info("param->tag = %d\n", param.tag); - } - - retval = copy_to_user((unsigned long *)arg, ¶m, sizeof(param)); - if (retval < 0) { - mif_err("ERR! copy_to_user fail (err %d)\n", retval); - return -1; - } - - return retval; -} - -static int qc_ioctl(struct pld_link_device *pld, struct io_device *iod, - unsigned int cmd, unsigned long arg) -{ - struct link_device *ld = &pld->ld; - int err = 0; - - switch (cmd) { - case IOCTL_DPRAM_PHONE_POWON: - err = qc_prepare_download(pld); - if (err < 0) - mif_info("%s: ERR! prepare_download fail\n", ld->name); - break; - - case IOCTL_DPRAM_PHONEIMG_LOAD: - err = qc_download_bin(pld, (void *)arg); - if (err < 0) - mif_info("%s: ERR! download_bin fail\n", ld->name); - break; - - case IOCTL_DPRAM_NVDATA_LOAD: - err = qc_download_nv(pld, (void *)arg); - if (err < 0) - mif_info("%s: ERR! download_nv fail\n", ld->name); - break; - - case IOCTL_DPRAM_PHONE_BOOTSTART: - err = qc_boot_start(pld); - if (err < 0) { - mif_info("%s: ERR! boot_start fail\n", ld->name); - break; - } - - err = qc_boot_post_process(pld); - if (err < 0) - mif_info("%s: ERR! boot_post_process fail\n", ld->name); - - break; - - case IOCTL_DPRAM_PHONE_UPLOAD_STEP1: - disable_irq_nosync(pld->irq); - err = qc_uload_step1(pld); - if (err < 0) { - enable_irq(pld->irq); - mif_info("%s: ERR! upload_step1 fail\n", ld->name); - } - break; - - case IOCTL_DPRAM_PHONE_UPLOAD_STEP2: - err = qc_uload_step2(pld, (void *)arg); - if (err < 0) { - enable_irq(pld->irq); - mif_info("%s: ERR! upload_step2 fail\n", ld->name); - } - break; - - default: - mif_err("%s: ERR! invalid cmd 0x%08X\n", ld->name, cmd); - err = -EINVAL; - break; - } - - return err; -} -#endif - -static struct pld_ext_op ext_op_set[] = { -#if defined(CONFIG_CDMA_MODEM_MDM6600) - [QC_MDM6600] = { - .exist = 1, - .init_boot_map = qc_init_boot_map, - .dload_cmd_handler = qc_dload_cmd_handler, - .cp_start_handler = qc_start_handler, - .crash_log = qc_crash_log, - .ioctl = qc_ioctl, - }, -#endif -#if defined(CONFIG_GSM_MODEM_ESC6270) - [QC_ESC6270] = { - .exist = 1, - .init_boot_map = qc_init_boot_map, - .dload_cmd_handler = qc_dload_cmd_handler, - .cp_start_handler = qc_start_handler, - .crash_log = qc_crash_log, - .ioctl = qc_ioctl, - }, -#endif -}; - -struct pld_ext_op *pld_get_ext_op(enum modem_t modem) -{ - if (ext_op_set[modem].exist) - return &ext_op_set[modem]; - else - return NULL; -} diff --git a/drivers/misc/modem_if_u1/modem_link_device_spi.c b/drivers/misc/modem_if_u1/modem_link_device_spi.c deleted file mode 100644 index 6faa24a..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_spi.c +++ /dev/null @@ -1,1787 +0,0 @@ -/* - * Copyright (C) 2011 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_spi.h" -#include "modem_utils.h" - -/* For function which has void parmeter */ -static struct spi_link_device *p_spild; -static struct spi_device *p_spi; - -static void spi_send_work(int spi_sigs, bool spi_work_t) -{ - struct spi_work_type *spi_wq; - - spi_wq = kmalloc(sizeof(struct spi_work_type), GFP_ATOMIC); - if (unlikely(!spi_wq)) { - pr_err("[LNK/E] <%s> Failed to kmalloc()\n", __func__); - return; - } - - spi_wq->signal_code = spi_sigs; - INIT_WORK(&spi_wq->work, spi_work); - - if (spi_work_t == SPI_WORK_FRONT) - queue_work_front(p_spild->spi_wq, (struct work_struct *)spi_wq); - else - queue_work(p_spild->spi_wq, (struct work_struct *)spi_wq); -} - -static irqreturn_t spi_srdy_irq_handler(int irq, void *p_ld) -{ - struct link_device *ld = (struct link_device *)p_ld; - struct spi_link_device *spild = to_spi_link_device(ld); - - irqreturn_t result = IRQ_HANDLED; - - if (!spild->boot_done) - return result; - - if (!wake_lock_active(&spild->spi_wake_lock) - && spild->send_modem_spi != 1) { - wake_lock(&spild->spi_wake_lock); - pr_debug("[SPI] [%s](%d) spi_wakelock locked . spild->spi_state[%d]\n", - __func__, __LINE__, (int)spild->spi_state); - } - - if (spild->send_modem_spi == 1) - up(&spild->srdy_sem); - - /* SRDY interrupt work on SPI_STATE_IDLE state for receive data */ - if (spild->spi_state == SPI_STATE_IDLE - || spild->spi_state == SPI_STATE_RX_TERMINATE - || spild->spi_state == SPI_STATE_TX_TERMINATE) - spi_send_work(SPI_WORK_RECEIVE, SPI_WORK_FRONT); - - return result; -} - -static irqreturn_t spi_subsrdy_irq_handler(int irq, void *p_ld) -{ - struct link_device *ld = (struct link_device *)p_ld; - struct spi_link_device *spild = to_spi_link_device(ld); - - irqreturn_t result = IRQ_HANDLED; - - /* SRDY interrupt work on SPI_STATE_TX_WAIT state for send data */ - if (spild->spi_state == SPI_STATE_TX_WAIT) - return result; - - pr_debug("%s spild->spi_state[%d]\n", - "[SPI] spi_main_subsrdy_rising_handler :", - (int)spild->spi_state); - - - return result; -} - -static int spi_send -( - struct link_device *ld, - struct io_device *iod, - struct sk_buff *skb -) -{ - struct sk_buff_head *txq; - enum dev_format fmt = iod->format; - - const u32 cmd_ready = 0x12341234; - const u32 cmd_start = 0x45674567; - int ret; - u32 data; - - switch (fmt) { - case IPC_FMT: - case IPC_RAW: - case IPC_RFS: - txq = ld->skb_txq[fmt]; - skb_queue_tail(txq, skb); - - ret = skb->len; - - break; - - case IPC_BOOT: - if (get_user(data, (u32 __user *)skb->data)) - return -EFAULT; - - if (data == cmd_ready) { - p_spild->ril_send_modem_img = 1; - p_spild->ril_send_cnt = 0; - } else if (data == cmd_start) { - p_spild->ril_send_modem_img = 0; - if (!queue_work(p_spild->ipc_spi_wq, - &p_spild->send_modem_w)) - pr_err("(%d) already exist w-q\n", - __LINE__); - } else { - if (p_spild->ril_send_modem_img) { - memcpy((void *)(p_spild->p_virtual_buff - + p_spild->ril_send_cnt), - skb->data, skb->len); - p_spild->ril_send_cnt += skb->len; - } - } - ret = skb->len; - dev_kfree_skb_any(skb); - - return ret; - - default: - pr_err("[LNK/E] <%s:%s> No TXQ for %s\n", - __func__, ld->name, iod->name); - dev_kfree_skb_any(skb); - return 0; - } - - spi_send_work(SPI_WORK_SEND, SPI_WORK); - - return ret; -} - - -static int spi_register_isr -( - unsigned irq, - irqreturn_t (*isr)(int, void*), - unsigned long flag, - const char *name, - struct link_device *ld -) -{ - int ret = 0; - - ret = request_irq(irq, isr, flag, name, ld); - if (ret) { - pr_err("[LNK/E] <%s> request_irq fail (%d)\n", - __func__, ret); - goto err; - } - - ret = enable_irq_wake(irq); - if (ret) { - pr_err("[LNK/E] <%s> enable_irq_wake fail (%d)\n", - __func__, ret); - free_irq(irq, ld); - goto err; - } - - pr_debug("[LNK] <%s> IRQ#%d handler is registered.\n", __func__, irq); - -err: - return ret; -} - -void spi_unregister_isr(unsigned irq, void *data) -{ - free_irq(irq, data); -} - -int spi_tx_rx_sync(u8 *tx_d, u8 *rx_d, unsigned len) -{ - struct spi_transfer t; - struct spi_message msg; - - memset(&t, 0, sizeof t); - - t.len = len; - - t.tx_buf = tx_d; - t.rx_buf = rx_d; - - t.cs_change = 0; - - t.bits_per_word = 32; - t.speed_hz = 12000000; - - spi_message_init(&msg); - spi_message_add_tail(&t, &msg); - - return spi_sync(p_spi, &msg); -} - -static int spi_buff_write -( - struct spi_link_device *spild, - int dev_id, - const char *buff, - unsigned size -) -{ - u32 templength, buf_length; - u32 spi_data_mux; - u32 spi_packet_free_length; - - u8 *spi_packet; - struct spi_data_packet_header *spi_packet_header; - - spi_packet_header = (struct spi_data_packet_header *)spild->buff; - spi_packet = (char *)spild->buff; - - spi_packet_free_length = SPI_DATA_PACKET_MAX_PACKET_BODY_SIZE - - spi_packet_header->current_data_size; - - buf_length = size + SPI_DATA_MUX_SIZE + SPI_DATA_LENGTH_SIZE; - - /* not enough space in spi packet */ - if (spi_packet_free_length < buf_length) { - spi_packet_header->more = 1; - return 0; - } - - /* check spi mux type */ - switch (dev_id) { - case IPC_FMT: - spi_data_mux = SPI_DATA_MUX_IPC; - break; - - case IPC_RAW: - spi_data_mux = SPI_DATA_MUX_RAW; - break; - - case IPC_RFS: - spi_data_mux = SPI_DATA_MUX_RFS; - break; - - default: - pr_err("%s %s\n", - "[SPI] ERROR : spi_buff_write:", - "invalid dev_id"); - return 0; - } - - /* copy spi mux field */ - memcpy(spi_packet + SPI_DATA_PACKET_HEADER_SIZE + - spi_packet_header->current_data_size, - &spi_data_mux, SPI_DATA_MUX_SIZE); - spi_packet_header->current_data_size += SPI_DATA_MUX_SIZE; - - /* copy spi data length field */ - templength = size-SPI_DATA_BOF_SIZE-SPI_DATA_EOF_SIZE; - memcpy(spi_packet + SPI_DATA_PACKET_HEADER_SIZE + - spi_packet_header->current_data_size, - &templength, SPI_DATA_LENGTH_SIZE); - spi_packet_header->current_data_size += SPI_DATA_LENGTH_SIZE; - - /* copy data field */ - memcpy(spi_packet + SPI_DATA_PACKET_HEADER_SIZE + - spi_packet_header->current_data_size, - buff, size); - spi_packet_header->current_data_size += size; - - return buf_length; -} - - -static void spi_prepare_tx_packet(void) -{ - struct link_device *ld; - struct sk_buff *skb; - int ret; - int i; - - ld = &p_spild->ld; - - for (i = 0; i < p_spild->max_ipc_dev; i++) { - while ((skb = skb_dequeue(ld->skb_txq[i]))) { - ret = spi_buff_write(p_spild, i, skb->data, skb->len); - if (!ret) { - skb_queue_head(ld->skb_txq[i], skb); - break; - } - dev_kfree_skb_any(skb); - } - } -} - - -static void spi_start_data_send(void) -{ - struct link_device *ld; - int i; - - ld = &p_spild->ld; - - for (i = 0; i < p_spild->max_ipc_dev; i++) { - if (skb_queue_len(ld->skb_txq[i]) > 0) - spi_send_work(SPI_WORK_SEND, SPI_WORK); - } -} - -static void spi_tx_work(void) -{ - struct spi_link_device *spild; - struct io_device *iod; - char *spi_packet_buf; - char *spi_sync_buf; - - spild = p_spild; - iod = link_get_iod_with_format(&spild->ld, IPC_FMT); - if (!iod) { - mif_err("no iodevice for modem control\n"); - return; - } - - if (iod->mc->phone_state == STATE_CRASH_EXIT) - return; - - /* check SUB SRDY, SRDY state */ - if (gpio_get_value(spild->gpio_ipc_sub_srdy) == - SPI_GPIOLEVEL_HIGH || - gpio_get_value(spild->gpio_ipc_srdy) == - SPI_GPIOLEVEL_HIGH) { - spi_start_data_send(); - return; - } - - if (get_console_suspended()) - return; - - if (spild->spi_state == SPI_STATE_END) - return; - - /* change state SPI_STATE_IDLE to SPI_STATE_TX_WAIT */ - spild->spi_state = SPI_STATE_TX_WAIT; - spild->spi_timer_tx_state = SPI_STATE_TIME_START; - - gpio_set_value(spild->gpio_ipc_mrdy, SPI_GPIOLEVEL_HIGH); - - /* Start TX timer */ - spild->spi_tx_timer.expires = - jiffies + ((SPI_TIMER_TX_WAIT_TIME * HZ) / 1000); - add_timer(&spild->spi_tx_timer); - /* check SUBSRDY state */ - while (gpio_get_value(spild->gpio_ipc_sub_srdy) == - SPI_GPIOLEVEL_LOW) { - if (spild->spi_timer_tx_state == SPI_STATE_TIME_OVER) { - pr_err("%s spild->spi_state=[%d]\n", - "[spi_tx_work] == spi Fail to receiving SUBSRDY CONF :" - , (int)spild->spi_state); - - spild->spi_timer_tx_state = SPI_STATE_TIME_START; - - gpio_set_value(spild->gpio_ipc_mrdy, - SPI_GPIOLEVEL_LOW); - - /* change state SPI_STATE_TX_WAIT */ - /* to SPI_STATE_IDLE */ - spild->spi_state = SPI_STATE_IDLE; - spi_send_work(SPI_WORK_SEND, SPI_WORK); - - return; - } - } - /* Stop TX timer */ - del_timer(&spild->spi_tx_timer); - - if (spild->spi_state != SPI_STATE_START - && spild->spi_state != SPI_STATE_END - && spild->spi_state != SPI_STATE_INIT) { - spi_packet_buf = spild->buff; - spi_sync_buf = spild->sync_buff; - - gpio_set_value(spild->gpio_ipc_sub_mrdy, SPI_GPIOLEVEL_HIGH); - gpio_set_value(spild->gpio_ipc_mrdy, SPI_GPIOLEVEL_LOW); - - /* change state SPI_STATE_TX_WAIT to - SPI_MAIN_STATE_TX_SENDING */ - spild->spi_state = SPI_STATE_TX_SENDING; - - memset(spi_packet_buf, 0, SPI_MAX_PACKET_SIZE); - memset(spi_sync_buf, 0, SPI_MAX_PACKET_SIZE); - - spi_prepare_tx_packet(); - - if (spi_tx_rx_sync((void *)spi_packet_buf, (void *)spi_sync_buf, - SPI_MAX_PACKET_SIZE)) { - /* TODO: save failed packet */ - /* back data to each queue */ - pr_err("[SPI] spi_dev_send fail\n"); - - /* add cp reset when spi sync fail */ - if (iod) - iod->modem_state_changed(iod, - STATE_CRASH_RESET); - } - - spild->spi_state = SPI_STATE_TX_TERMINATE; - - gpio_set_value(spild->gpio_ipc_sub_mrdy, SPI_GPIOLEVEL_LOW); - - /* change state SPI_MAIN_STATE_TX_SENDING to SPI_STATE_IDLE */ - spild->spi_state = SPI_STATE_IDLE; - spi_start_data_send(); - } else - pr_err("[SPI] ERR : _start_packet_tx:spild->spi_state[%d]", - (int)spild->spi_state); - - return; -} - -int spi_buff_read(struct spi_link_device *spild) -{ - struct link_device *ld; - struct spi_data_packet_header *spi_packet_header; - struct sk_buff *skb; - char *spi_packet; - int dev_id; - unsigned int spi_packet_length; - unsigned int spi_packet_cur_pos = SPI_DATA_PACKET_HEADER_SIZE; - - unsigned int spi_data_mux; - unsigned int spi_data_length; - unsigned int data_length; - u8 *spi_cur_data; - u8 *dst; - - spi_packet = spild->buff; - ld = &spild->ld; - - /* check spi packet header */ - if (*(unsigned int *)spi_packet == 0x00000000 - || *(unsigned int *)spi_packet == 0xFFFFFFFF) { - /* if spi header is invalid, */ - /* read spi header again with next 4 byte */ - spi_packet += SPI_DATA_PACKET_HEADER_SIZE; - } - - /* read spi packet header */ - spi_packet_header = (struct spi_data_packet_header *)spi_packet; - spi_packet_length = SPI_DATA_PACKET_HEADER_SIZE + - spi_packet_header->current_data_size; - - - do { - /* read spi data mux and set current queue */ - memcpy(&spi_data_mux, - spi_packet + spi_packet_cur_pos, SPI_DATA_MUX_SIZE); - - switch (spi_data_mux & SPI_DATA_MUX_NORMAL_MASK) { - case SPI_DATA_MUX_IPC: - dev_id = IPC_FMT; - break; - - case SPI_DATA_MUX_RAW: - dev_id = IPC_RAW; - break; - - case SPI_DATA_MUX_RFS: - dev_id = IPC_RFS; - break; - - default: - pr_err("%s len[%u], pos[%u]\n", - "[SPI] ERROR : spi_buff_read : MUX error", - spi_packet_length, spi_packet_cur_pos); - - return spi_packet_cur_pos - - SPI_DATA_PACKET_HEADER_SIZE; - } - - /* read spi data length */ - memcpy(&spi_data_length, spi_packet + - spi_packet_cur_pos + SPI_DATA_LENGTH_OFFSET, - SPI_DATA_LENGTH_SIZE); - - data_length = spi_data_length + SPI_DATA_BOF_SIZE + - SPI_DATA_EOF_SIZE; - - spi_data_length += SPI_DATA_HEADER_SIZE; - - /* read data and make spi data */ - spi_cur_data = spi_packet + spi_packet_cur_pos; - - /* enqueue spi data */ - skb = alloc_skb(data_length, GFP_ATOMIC); - if (unlikely(!skb)) { - pr_err("%s %s\n", - "[SPI] ERROR : spi_buff_read:", - "Can't allocate memory for SPI"); - return -ENOMEM; - } - - dst = skb_put(skb, data_length); - - memcpy(dst, spi_packet + - spi_packet_cur_pos + SPI_DATA_BOF_OFFSET, - data_length); - - skb_queue_tail(&spild->skb_rxq[dev_id], skb); - - /* move spi packet current posision */ - spi_packet_cur_pos += spi_data_length; - } while ((spi_packet_length - 1) > spi_packet_cur_pos); - - return 1; -} - -static void spi_rx_work(void) -{ - struct link_device *ld; - struct spi_link_device *spild; - struct sk_buff *skb; - struct io_device *iod; - char *spi_packet_buf; - char *spi_sync_buf; - int i; - - spild = p_spild; - ld = &spild->ld; - if (!spild) - pr_err("[LNK/E] <%s> dpld == NULL\n", __func__); - - iod = link_get_iod_with_format(&spild->ld, IPC_FMT); - if (!iod) { - mif_err("no iodevice for modem control\n"); - return; - } - - if (iod->mc->phone_state == STATE_CRASH_EXIT) - return; - - if (!wake_lock_active(&spild->spi_wake_lock) || - gpio_get_value(spild->gpio_ipc_srdy) == SPI_GPIOLEVEL_LOW || - get_console_suspended() || - spild->spi_state == SPI_STATE_END) - return; - - spild->spi_state = SPI_STATE_RX_WAIT; - spild->spi_timer_rx_state = SPI_STATE_TIME_START; - - gpio_set_value(spild->gpio_ipc_sub_mrdy, SPI_GPIOLEVEL_HIGH); - /* Start TX timer */ - spild->spi_rx_timer.expires = - jiffies + ((SPI_TIMER_RX_WAIT_TIME * HZ) / 1000); - add_timer(&spild->spi_rx_timer); - - /* check SUBSRDY state */ - while (gpio_get_value(spild->gpio_ipc_sub_srdy) == - SPI_GPIOLEVEL_LOW) { - if (spild->spi_timer_rx_state == SPI_STATE_TIME_OVER) { - pr_err("[SPI] ERROR(Failed MASTER RX:%d ms)", - SPI_TIMER_RX_WAIT_TIME); - - spild->spi_timer_rx_state = SPI_STATE_TIME_START; - - gpio_set_value(spild->gpio_ipc_sub_mrdy, - SPI_GPIOLEVEL_LOW); - - /* change state SPI_MAIN_STATE_RX_WAIT */ - /* to SPI_STATE_IDLE */ - spild->spi_state = SPI_STATE_IDLE; - - return; - } - } - /* Stop TX timer */ - del_timer(&spild->spi_rx_timer); - - if (spild->spi_state == SPI_STATE_START - || spild->spi_state == SPI_STATE_END - || spild->spi_state == SPI_STATE_INIT) - return; - - spi_packet_buf = spild->buff; - spi_sync_buf = spild->sync_buff; - - memset(spi_packet_buf, 0, SPI_MAX_PACKET_SIZE); - memset(spi_sync_buf, 0, SPI_MAX_PACKET_SIZE); - - if (spi_tx_rx_sync((void *)spi_sync_buf, (void *)spi_packet_buf, - SPI_MAX_PACKET_SIZE) == 0) { - /* parsing SPI packet */ - if (spi_buff_read(spild) > 0) { - /* call function for send data to IPC, RAW, RFS */ - for (i = 0; i < spild->max_ipc_dev; i++) { - iod = spild->iod[i]; - while ((skb = skb_dequeue(&spild->skb_rxq[i])) - != NULL) { - if (iod->recv(iod, ld, skb->data, - skb->len) < 0) - pr_err("[LNK/E] <%s:%s> recv fail\n", - __func__, ld->name); - dev_kfree_skb_any(skb); - } - } - } - } else { - pr_err("%s %s\n", "[SPI] ERROR : spi_rx_work :", - "spi sync failed"); - - /* add cp reset when spi sync fail */ - if (iod) - iod->modem_state_changed(iod, - STATE_CRASH_RESET); - } - - spild->spi_state = SPI_STATE_RX_TERMINATE; - - gpio_set_value(spild->gpio_ipc_sub_mrdy, SPI_GPIOLEVEL_LOW); - - /* change state SPI_MAIN_STATE_RX_WAIT to SPI_STATE_IDLE */ - spild->spi_state = SPI_STATE_IDLE; - spi_start_data_send(); -} - - -static int spi_init_ipc(struct spi_link_device *spild) -{ - struct link_device *ld = &spild->ld; - - int i; - - /* Make aliases to each IO device */ - for (i = 0; i < MAX_DEV_FORMAT; i++) - spild->iod[i] = link_get_iod_with_format(ld, i); - - spild->iod[IPC_RAW] = spild->iod[IPC_MULTI_RAW]; - - /* List up the IO devices connected to each IPC channel */ - for (i = 0; i < MAX_DEV_FORMAT; i++) { - if (spild->iod[i]) - pr_err("[LNK] <%s:%s> spild->iod[%d]->name = %s\n", - __func__, ld->name, i, spild->iod[i]->name); - else - pr_err("[LNK] <%s:%s> No spild->iod[%d]\n", - __func__, ld->name, i); - } - - ld->mode = LINK_MODE_IPC; - - return 0; -} - -unsigned int sprd_crc_calc(char *buf_ptr, unsigned int len) -{ - unsigned int i; - unsigned short crc = 0; - - while (len-- != 0) { - for (i = 0x80; i != 0 ; i = i>>1) { - if ((crc & 0x8000) != 0) { - crc = crc << 1 ; - crc = crc ^ 0x1021; - } else { - crc = crc << 1 ; - } - - if ((*buf_ptr & i) != 0) - crc = crc ^ 0x1021; - } - buf_ptr++; - } - - return crc; - -} - -unsigned short sprd_crc_calc_fdl(unsigned short *src, int len) -{ - unsigned int sum = 0; - unsigned short SourceValue, DestValue = 0; - unsigned short lowSourceValue, hiSourceValue = 0; - - /* Get sum value of the source.*/ - while (len > 1) { - SourceValue = *src++; - DestValue = 0; - lowSourceValue = (SourceValue & 0xFF00) >> 8; - hiSourceValue = (SourceValue & 0x00FF) << 8; - DestValue = lowSourceValue | hiSourceValue; - - sum += DestValue; - len -= 2; - } - - if (len == 1) - sum += *((unsigned char *) src); - - sum = (sum >> 16) + (sum & 0x0FFFF); - sum += (sum >> 16); - - return ~sum; -} - -int encode_msg(struct sprd_image_buf *img, int bcrc) -{ - u16 crc; /* CRC value*/ - u8 *src_ptr; /* source buffer pointer*/ - int dest_len; /* output buffer length*/ - u8 *dest_ptr; /* dest buffer pointer*/ - u8 high_crc, low_crc = 0; - register int curr; - - /* CRC Check. */ - src_ptr = img->tx_b; - - /* CRC Check. */ - if (bcrc) - crc = sprd_crc_calc(src_ptr, img->tx_size); - else - crc = sprd_crc_calc_fdl - ((unsigned short *)src_ptr, img->tx_size); - - high_crc = (crc>>8) & 0xFF; - low_crc = crc & 0xFF; - - /* Get the total size to be allocated.*/ - dest_len = 0; - - for (curr = 0; curr < img->tx_size; curr++) { - switch (*(src_ptr+curr)) { - case HDLC_FLAG: - case HDLC_ESCAPE: - dest_len += 2; - break; - default: - dest_len++; - break; - } - } - - switch (low_crc) { - case HDLC_FLAG: - case HDLC_ESCAPE: - dest_len += 2; - break; - default: - dest_len++; - } - - switch (high_crc) { - case HDLC_FLAG: - case HDLC_ESCAPE: - dest_len += 2; - break; - default: - dest_len++; - } - - dest_ptr = kmalloc(dest_len + 2, GFP_ATOMIC); - /* Memory Allocate fail.*/ - if (dest_ptr == NULL) - return -ENOMEM; - - *dest_ptr = HDLC_FLAG; - dest_len = 1; - - /* do escape*/ - for (curr = 0; curr < img->tx_size; curr++) { - switch (*(src_ptr+curr)) { - case HDLC_FLAG: - case HDLC_ESCAPE: - *(dest_ptr + dest_len++) = HDLC_ESCAPE; - *(dest_ptr + dest_len++) = - *(src_ptr + curr) ^ HDLC_ESCAPE_MASK; - break; - default: - *(dest_ptr + dest_len++) = *(src_ptr + curr); - break; - } - } - - switch (high_crc) { - case HDLC_FLAG: - case HDLC_ESCAPE: - *(dest_ptr + dest_len++) = HDLC_ESCAPE; - *(dest_ptr + dest_len++) = high_crc ^ HDLC_ESCAPE_MASK; - break; - default: - *(dest_ptr + dest_len++) = high_crc; - } - - switch (low_crc) { - case HDLC_FLAG: - case HDLC_ESCAPE: - *(dest_ptr + dest_len++) = HDLC_ESCAPE; - *(dest_ptr + dest_len++) = low_crc ^ HDLC_ESCAPE_MASK; - break; - default: - *(dest_ptr + dest_len++) = low_crc; - } - - - *(dest_ptr + dest_len++) = HDLC_FLAG; - - memcpy(img->encoded_tx_b, dest_ptr, dest_len); - img->encoded_tx_size = dest_len; - - kfree(dest_ptr); - return 0; -} - -int decode_msg(struct sprd_image_buf *img, int bcrc) -{ - u16 crc; /* CRC value*/ - u8 *src_ptr; /* source buffer pointer*/ - int dest_len; /* output buffer length*/ - u8 *dest_ptr; /* dest buffer pointer*/ - register int curr; - - /* Check if exist End Flag.*/ - src_ptr = img->rx_b; - - dest_len = 0; - - if (img->rx_size < 4) - return -EINVAL; - - /* Get the total size to be allocated for decoded message.*/ - for (curr = 1; curr < img->rx_size - 1; curr++) { - switch (*(src_ptr + curr)) { - case HDLC_ESCAPE: - curr++; - dest_len++; - break; - default: - dest_len++; - break; - } - } - - /* Allocate meomory for decoded message*/ - dest_ptr = kmalloc(dest_len, GFP_ATOMIC); - /* Memory allocate fail.*/ - if (dest_ptr == NULL) - return -ENOMEM; - - memset(dest_ptr, 0, dest_len); - - curr = 0; - dest_len = 0; - /* Do de-escape.*/ - for (curr = 1; curr < img->rx_size - 1; curr++) { - switch (*(src_ptr + curr)) { - case HDLC_ESCAPE: - curr++; - *(dest_ptr + dest_len) = - *(src_ptr + curr) ^ HDLC_ESCAPE_MASK; - break; - default: - *(dest_ptr + dest_len) = *(src_ptr + curr); - break; - } - - dest_len = dest_len + 1; - } - - /* CRC Check. */ - if (bcrc) - crc = sprd_crc_calc(dest_ptr, dest_len); - else - crc = sprd_crc_calc_fdl((unsigned short *)dest_ptr, dest_len); - - if (crc != CRC_16_L_OK) { - pr_err("CRC error : 0x%X", crc); - kfree(dest_ptr); - return -EPERM; - } - - memcpy(img->decoded_rx_b, dest_ptr, dest_len - CRC_CHECK_SIZE); - img->decoded_rx_size = dest_len - CRC_CHECK_SIZE ; - - kfree(dest_ptr); - return 0; -} - -static int spi_send_modem_bin_execute_cmd - (u8 *spi_ptr, u32 spi_size, u16 spi_type, - u16 spi_crc, struct sprd_image_buf *sprd_img) -{ - int i, retval; - u16 send_packet_size; - u8 *send_packet_data; - u16 d1_crc; - u16 d2_crc = spi_crc; - u16 type = spi_type; - - /* D1 */ - send_packet_size = spi_size; /* u32 -> u16 */ - sprd_img->tx_size = 6; - M_16_SWAP(d2_crc); - memcpy(sprd_img->tx_b, &send_packet_size, sizeof(send_packet_size)); - memcpy((sprd_img->tx_b+2), &type, sizeof(type)); - memcpy((sprd_img->tx_b+4), &d2_crc, sizeof(d2_crc)); - - d1_crc = sprd_crc_calc_fdl - ((unsigned short *)sprd_img->tx_b, sprd_img->tx_size); - M_16_SWAP(d1_crc); - memcpy((sprd_img->tx_b+6), &d1_crc, sizeof(d1_crc)); - sprd_img->tx_size += 2; - - if (down_timeout(&p_spild->srdy_sem, 2 * HZ)) { - pr_err("(%d) SRDY TimeOUT!!! SRDY : %d, SEM : %d\n", - __LINE__, - gpio_get_value(p_spild->gpio_modem_bin_srdy), - p_spild->srdy_sem.count); - goto err; - } - - retval = spi_tx_rx_sync - (sprd_img->tx_b, sprd_img->rx_b, sprd_img->tx_size); - if (retval != 0) { - pr_err("(%d) spi sync error : %d\n", - __LINE__, retval); - goto err; - } - - if ((type == 0x0003) || (type == 0x0004)) { - pr_err("D2 Skip!!\n"); - goto ACK; - } - - /* D2 */ - send_packet_data = spi_ptr; - - if (down_timeout(&p_spild->srdy_sem, 2 * HZ)) { - pr_err("(%d) SRDY TimeOUT!!! SRDY : %d, SEM : %d\n", __LINE__, - gpio_get_value(p_spild->gpio_modem_bin_srdy), - p_spild->srdy_sem.count); - goto err; - } - - retval = spi_tx_rx_sync - (send_packet_data, sprd_img->rx_b, send_packet_size); - if (retval != 0) { - pr_err("(%d) spi sync error : %d\n", __LINE__, retval); - goto err; - } - -ACK: - - if (p_spild->is_cp_reset) { - while (!gpio_get_value(p_spild->gpio_modem_bin_srdy)) - ; - } else { - if (down_timeout(&p_spild->srdy_sem, 2 * HZ)) { - pr_err("(%d) SRDY TimeOUT!!! SRDY : %d, SEM : %d\n", - __LINE__, - gpio_get_value(p_spild->gpio_modem_bin_srdy), - p_spild->srdy_sem.count); - - pr_err("[SPI DUMP] TX_D1(%d) : [%02x %02x %02x %02x %02x %02x %02x %02x]\n", - sprd_img->tx_size, sprd_img->tx_b[0], - sprd_img->tx_b[1], sprd_img->tx_b[2], - sprd_img->tx_b[3], sprd_img->tx_b[4], - sprd_img->tx_b[5], sprd_img->tx_b[6], - sprd_img->tx_b[7]); - pr_err("[SPI DUMP] TX_D2(%d) :[%02x %02x %02x %02x %02x %02x %02x %02x]\n", - send_packet_size, spi_ptr[0], spi_ptr[1], - spi_ptr[2], spi_ptr[3], spi_ptr[4], - spi_ptr[5], spi_ptr[6], spi_ptr[7]); - - /* WA (CP Reset) jongmoon.suh */ - if (gpio_get_value(p_spild->gpio_modem_bin_srdy)) - ; - else - goto err; - - } - } - - memset(sprd_img->tx_b, 0, SPRD_BLOCK_SIZE+10); - retval = spi_tx_rx_sync(sprd_img->tx_b, sprd_img->rx_b, 8); - if (retval != 0) { - pr_err("(%d) spi sync error : %d\n", - __LINE__, retval); - goto err; - } - - memcpy(sprd_img->decoded_rx_b, sprd_img->rx_b, 4); - - if ((*(sprd_img->decoded_rx_b+0) == 0x00) && \ - (*(sprd_img->decoded_rx_b+1) == 0x80) && \ - (*(sprd_img->decoded_rx_b+2) == 0x00) && \ - (*(sprd_img->decoded_rx_b+3) == 0x00)) { - pr_debug("[SPRD] CP sent ACK"); - } else { - pr_err("Transfer ACK error! srdy_sem = %d\n", - p_spild->srdy_sem.count); - pr_err("[SPI DUMP] RX(%d) : [ ", sprd_img->rx_size); - for (i = 0; i < 15; i++) - pr_err("%02x ", *((u8 *)(sprd_img->rx_b + i))); - pr_err("]"); - - goto err; - } - - return retval; - -err: - return -EINVAL; -} - -static int spi_send_modem_bin_xmit_img - (enum image_type type, struct image_buf *img) -{ - int retval = 0; - struct sprd_image_buf sprd_img; - unsigned int data_size; - unsigned int send_size = 0; - unsigned int rest_size = 0; - unsigned int spi_size = 0; - unsigned int address = 0; - unsigned int fdl1_size = 0; - /* No Translate */ - u16 crc = 0; - u16 spi_type = 0; - - unsigned char *spi_ptr; - unsigned char *ptr; - int i, j = 0; - - u16 sprd_packet_size = SPRD_BLOCK_SIZE; - - sprd_img.tx_b = kmalloc(SPRD_BLOCK_SIZE*2, GFP_ATOMIC); - if (!sprd_img.tx_b) { - pr_err("(%d) tx_b kmalloc fail.", - __LINE__); - return -ENOMEM; - } - memset(sprd_img.tx_b, 0, SPRD_BLOCK_SIZE*2); - - sprd_img.rx_b = kmalloc(SPRD_BLOCK_SIZE*2, GFP_ATOMIC); - if (!sprd_img.rx_b) { - pr_err("(%d) rx_b kmalloc fail.", - __LINE__); - retval = -ENOMEM; - goto err3; - } - memset(sprd_img.rx_b, 0, SPRD_BLOCK_SIZE*2); - - sprd_img.encoded_tx_b = kmalloc(SPRD_BLOCK_SIZE*2, GFP_ATOMIC); - if (!sprd_img.encoded_tx_b) { - pr_err("(%d) encoded_tx_b kmalloc fail.", - __LINE__); - retval = -ENOMEM; - goto err2; - } - memset(sprd_img.encoded_tx_b, 0, SPRD_BLOCK_SIZE*2); - - sprd_img.decoded_rx_b = kmalloc(SPRD_BLOCK_SIZE*2, GFP_ATOMIC); - if (!sprd_img.decoded_rx_b) { - pr_err("(%d) encoded_rx_b kmalloc fail.", - __LINE__); - retval = -ENOMEM; - goto err1; - } - memset(sprd_img.decoded_rx_b, 0, SPRD_BLOCK_SIZE*2); - - pr_debug("(%d) spi_send_modem_bin_xmit_img type : %d.\n", - __LINE__, type); - memcpy(&fdl1_size, (void *)(p_spild->p_virtual_buff + 4), 4); - - switch (type) { - case MODEM_MAIN: - memcpy(&img->address, - (void *)(p_spild->p_virtual_buff + 8), 4); - memcpy(&img->length, - (void *)(p_spild->p_virtual_buff + 12), 4); - img->buf = (unsigned char *) - (p_spild->p_virtual_buff + 0x30 + fdl1_size); - img->offset = img->length + fdl1_size + 0x30; - pr_debug("(%d) spi_send_modem_bin_xmit_img save MAIN to img.\n", - __LINE__); - - break; - - case MODEM_DSP: - memcpy(&img->address, - (void *)(p_spild->p_virtual_buff + 16), 4); - memcpy(&img->length, - (void *)(p_spild->p_virtual_buff + 20), 4); - img->buf = (unsigned char *) - (p_spild->p_virtual_buff + img->offset); - img->offset += img->length; - pr_debug("(%d) spi_send_modem_bin_xmit_img save DSP to img.\n", - __LINE__); - - break; - - case MODEM_NV: - memcpy(&img->address, - (void *)(p_spild->p_virtual_buff + 24), 4); - memcpy(&img->length, - (void *)(p_spild->p_virtual_buff + 28), 4); - img->buf = (unsigned char *) - (p_spild->p_virtual_buff + img->offset); - img->offset += img->length; - pr_debug("(%d) spi_send_modem_bin_xmit_img save NV to img.\n", - __LINE__); - - break; - - case MODEM_EFS: - memcpy(&img->address, - (void *)(p_spild->p_virtual_buff + 32), 4); - memcpy(&img->length, - (void *)(p_spild->p_virtual_buff + 36), 4); - img->buf = (unsigned char *) - (p_spild->p_virtual_buff + img->offset); - img->offset += img->length; - pr_debug("(%d) spi_send_modem_bin_xmit_img save EFS to img.\n", - __LINE__); - - break; - case MODEM_RUN: - memset(sprd_img.encoded_tx_b, 0, SPRD_BLOCK_SIZE*2); - sprd_img.encoded_tx_size = 0; - spi_type = 0x0004; - crc = 0; - - spi_ptr = sprd_img.encoded_tx_b; - spi_size = sprd_img.encoded_tx_size; - - retval = spi_send_modem_bin_execute_cmd - (spi_ptr, spi_size, spi_type, crc, &sprd_img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_execute_cmd fail : %d", - __LINE__, retval); - goto err0; - } - return retval; - - default: - pr_err("(%d) spi_send_modem_bin_xmit_img wrong : %d.", - __LINE__, type); - goto err0; - } - - pr_debug("(%d) Start send img. size : %d\n", - __LINE__, img->length); - - ptr = img->buf; - data_size = sprd_packet_size; - rest_size = img->length; - address = img->address; - - M_32_SWAP(img->address); - M_32_SWAP(img->length); - - /* Send Transfer Start */ - sprd_img.tx_size = 8; - memcpy((sprd_img.tx_b+0), &img->address, sizeof(img->address)); - memcpy((sprd_img.tx_b+4), &img->length, sizeof(img->length)); - - spi_type = 0x0001; - crc = sprd_crc_calc_fdl - ((unsigned short *)sprd_img.tx_b, sprd_img.tx_size); - memcpy(sprd_img.encoded_tx_b, sprd_img.tx_b, sprd_img.tx_size); - sprd_img.encoded_tx_size = sprd_img.tx_size; - - spi_ptr = sprd_img.encoded_tx_b; - spi_size = sprd_img.encoded_tx_size; - - pr_debug("(%d) [Transfer Start, Type = %d, Packet = %d]\n", - __LINE__, type, sprd_packet_size); - retval = spi_send_modem_bin_execute_cmd - (spi_ptr, spi_size, spi_type, crc, &sprd_img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_execute_cmd fail : %d", - __LINE__, retval); - goto err0; - } - M_32_SWAP(img->length); - - /* Send Data */ - for (i = 0; send_size < img->length; i++) { - if (rest_size < sprd_packet_size) - data_size = rest_size; - - sprd_img.encoded_tx_size = sprd_packet_size; - for (j = 0; j < data_size; j++) - *(sprd_img.encoded_tx_b+j) = *(ptr + j); - - spi_type = 0x0002; - crc = sprd_crc_calc_fdl - ((unsigned short *)sprd_img.encoded_tx_b, - sprd_img.encoded_tx_size); - - spi_ptr = sprd_img.encoded_tx_b; - spi_size = sprd_img.encoded_tx_size; - - retval = spi_send_modem_bin_execute_cmd - (spi_ptr, spi_size, spi_type, crc, &sprd_img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_execute_cmd fail : %d, %d", - __LINE__, retval, i); - goto err0; - } - - send_size += data_size; - rest_size -= data_size; - ptr += data_size; - - if (!(i % 100)) - pr_debug("(%d) [%d] 0x%x size done, rest size: 0x%x\n", - __LINE__, i, send_size, rest_size); - } - - /* Send Transfer End */ - memset(sprd_img.encoded_tx_b, 0, SPRD_BLOCK_SIZE * 2); - sprd_img.encoded_tx_size = 0; - - spi_type = 0x0003; - crc = 0; - - spi_ptr = sprd_img.encoded_tx_b; - spi_size = sprd_img.encoded_tx_size; - - pr_debug("(%d) [Transfer END]\n", __LINE__); - retval = spi_send_modem_bin_execute_cmd - (spi_ptr, spi_size, spi_type, crc, &sprd_img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_execute_cmd fail : %d", - __LINE__, retval); - goto err0; - } - -err0: - kfree(sprd_img.decoded_rx_b); -err1: - kfree(sprd_img.encoded_tx_b); -err2: - kfree(sprd_img.rx_b); -err3: - kfree(sprd_img.tx_b); - - return retval; - -} - -static void spi_send_modem_bin(struct work_struct *send_modem_w) -{ - struct spi_link_device *spild; - struct io_device *iod; - int retval; - struct image_buf img; - unsigned long tick1, tick2 = 0; - - spild = p_spild; - iod = link_get_iod_with_format(&spild->ld, IPC_FMT); - if (!iod) { - mif_err("no iodevice for modem control\n"); - return; - } - - tick1 = jiffies_to_msecs(jiffies); - - retval = spi_send_modem_bin_xmit_img(MODEM_MAIN, &img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_xmit_img fail : %d", - __LINE__, retval); - goto err; - } - - retval = spi_send_modem_bin_xmit_img(MODEM_DSP, &img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_xmit_img fail : %d", - __LINE__, retval); - goto err; - } - - retval = spi_send_modem_bin_xmit_img(MODEM_NV, &img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_xmit_img fail : %d", - __LINE__, retval); - goto err; - } - - retval = spi_send_modem_bin_xmit_img(MODEM_EFS, &img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_xmit_img fail : %d", - __LINE__, retval); - goto err; - } - - retval = spi_send_modem_bin_xmit_img(MODEM_RUN, &img); - if (retval < 0) { - pr_err("(%d) spi_send_modem_bin_xmit_img fail : %d", - __LINE__, retval); - goto err; - } - - p_spild->send_modem_spi = 0; - p_spild->is_cp_reset = 0; - tick2 = jiffies_to_msecs(jiffies); - pr_info("Downloading takes %lu msec\n", (tick2-tick1)); - - spi_init_ipc(p_spild); - - sprd_boot_done = 1; - p_spild->ril_send_cnt = 0; - p_spild->spi_state = SPI_STATE_IDLE; - - if (iod) - iod->modem_state_changed(iod, - STATE_ONLINE); - return; -err: - if (iod) - iod->modem_state_changed(iod, - STATE_OFFLINE); - return; - -} - -static inline int _request_mem(struct spi_v_buff *od) -{ - if (!p_spild->p_virtual_buff) { - od->mmio = vmalloc(od->size); - if (!od->mmio) { - pr_err("(%d) Failed to vmalloc size : %lu\n", __LINE__, - od->size); - - return -EBUSY; - } else { - pr_err("(%d) vmalloc Done. mmio : 0x%08x\n", __LINE__, - (u32)od->mmio); - } - } - - memset((void *)od->mmio, 0, od->size); - - p_spild->p_virtual_buff = od->mmio; - - return 0; -} - -void spi_tx_timer_callback(unsigned long param) -{ - if (p_spild->spi_state == SPI_STATE_TX_WAIT) { - p_spild->spi_timer_tx_state = SPI_STATE_TIME_OVER; - pr_debug("[SPI] spi_tx_timer_callback -timer expires\n"); - } -} - -void spi_rx_timer_callback(unsigned long param) -{ - if (p_spild->spi_state == SPI_STATE_RX_WAIT) { - p_spild->spi_timer_rx_state = SPI_STATE_TIME_OVER; - pr_debug("[SPI] spi_rx_timer_callback -timer expires\n"); - } -} - -int spi_sema_init(void) -{ - pr_info("[SPI] Srdy sema init\n"); - sema_init(&p_spild->srdy_sem, 0); - p_spild->send_modem_spi = 1; - return 0; -} - -static void spi_work(struct work_struct *work) -{ - int signal_code; - - struct spi_work_type *spi_wq = - container_of(work, struct spi_work_type, work); - - signal_code = spi_wq->signal_code; - - if (p_spild->spi_state == SPI_STATE_END - || p_spild->spi_state == SPI_STATE_START) { - kfree(spi_wq); - return; - } - - switch (signal_code) { - case SPI_WORK_SEND: - if (p_spild->spi_state == SPI_STATE_IDLE) - spi_tx_work(); - break; - case SPI_WORK_RECEIVE: - if (p_spild->spi_state == SPI_STATE_IDLE - || p_spild->spi_state == SPI_STATE_TX_TERMINATE - || p_spild->spi_state == SPI_STATE_RX_TERMINATE) - spi_rx_work(); - break; - - default: - pr_err("[SPI] ERROR(No signal_code in spi_work[%d])\n", - signal_code); - break; - } - - kfree(spi_wq); - if (wake_lock_active(&p_spild->spi_wake_lock)) { - wake_unlock(&p_spild->spi_wake_lock); - pr_debug("[SPI] [%s](%d) spi_wakelock unlocked .\n", - __func__, __LINE__); - } -} - -static int link_pm_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - struct io_device *iod; - struct link_pm_data *pm_data = - container_of(this, struct link_pm_data, pm_notifier); - - iod = link_get_iod_with_format(&pm_data->spild->ld, IPC_FMT); - if (!iod) { - pr_err("no iodevice for modem control\n"); - return NOTIFY_BAD; - } - - switch (event) { - case PM_SUSPEND_PREPARE: - /* set TD PDA Active High if previous state was LPA */ - mif_info("TD PDA active low to LPA suspend spot\n"); - gpio_set_value(iod->mc->gpio_pda_active, 0); - - return NOTIFY_OK; - case PM_POST_SUSPEND: - /* LPA to Kernel suspend and User Freezing task fail resume, - restore to LPA GPIO states. */ - mif_info("TD PDA active High to LPA GPIO state\n"); - gpio_set_value(iod->mc->gpio_pda_active, 1); - return NOTIFY_OK; - } - return NOTIFY_DONE; -} - -static int spi_probe(struct spi_device *spi) -{ - int ret; - - p_spi = spi; - p_spi->mode = SPI_MODE_1; - p_spi->bits_per_word = 32; - - ret = spi_setup(p_spi); - if (ret != 0) { - - pr_err("[%s] spi setup error\n", __func__); - - return ret; - } - - pr_info("[%s] spi probe done\n", __func__); - - return ret; -} - -static int spi_remove(struct spi_device *spi) -{ - return 0; -} - -static struct spi_driver spi_driver = { - .probe = spi_probe, - .remove = __devexit_p(spi_remove), - .driver = { - .name = "modem_if_spi", - .bus = &spi_bus_type, - .owner = THIS_MODULE, - }, -}; - -static int spi_link_init(void) -{ - int ret; - struct spi_v_buff *od; - struct link_device *ld = &p_spild->ld; - - p_spild->gpio_modem_bin_srdy = p_spild->gpio_ipc_srdy; - - pr_info("(%d) gpio_mrdy : %d, gpio_srdy : %d(%d)\n", __LINE__, - p_spild->gpio_ipc_mrdy, p_spild->gpio_modem_bin_srdy, - gpio_get_value(p_spild->gpio_ipc_srdy)); - - od = kzalloc(sizeof(struct spi_v_buff), GFP_KERNEL); - if (!od) { - pr_err("(%d) failed to allocate device\n", __LINE__); - ret = -ENOMEM; - goto err; - } - - od->base = 0; - od->size = SZ_16M; /* 16M */ - if (p_spild->p_virtual_buff) - od->mmio = p_spild->p_virtual_buff; - ret = _request_mem(od); - if (ret) - goto err; - - sema_init(&p_spild->srdy_sem, 0); - - INIT_WORK(&p_spild->send_modem_w, - spi_send_modem_bin); - - wake_lock_init(&p_spild->spi_wake_lock, - WAKE_LOCK_SUSPEND, - "samsung-spiwakelock"); - - /* Register SPI Srdy interrupt handler */ - ret = spi_register_isr(gpio_to_irq(p_spild->gpio_ipc_srdy), - spi_srdy_irq_handler, IRQF_TRIGGER_RISING, - "spi_srdy_rising", ld); - - if (ret) - goto err; - - /* Register SPI SubSrdy interrupt handler */ - ret = spi_register_isr(gpio_to_irq(p_spild->gpio_ipc_sub_srdy), - spi_subsrdy_irq_handler, IRQF_TRIGGER_RISING, - "spi_subsrdy_rising", ld); - - if (ret) - goto err; - - p_spild->boot_done = 1; - - pr_info("[%s] Done\n", __func__); - return 0; - -err: - kfree(od); - return ret; -} - -/*===================================== -* Description spi restart for CP slient reset -=====================================*/ -void spi_set_restart(void) -{ - struct link_device *ld = &p_spild->ld; - - pr_info("[SPI] spi_set_restart(spi_main_state=[%d])\n", - (int)p_spild->spi_state); - - gpio_set_value(p_spild->gpio_ipc_sub_mrdy, SPI_GPIOLEVEL_LOW); - - p_spild->spi_state = SPI_STATE_END; - - /* Flush SPI work queue */ - flush_workqueue(p_spild->spi_wq); - - /* Unregister SPI Srdy interrupt handler */ - spi_unregister_isr(gpio_to_irq(p_spild->gpio_ipc_srdy), ld); - - /* Unregister SPI SubSrdy interrupt handler */ - spi_unregister_isr(gpio_to_irq(p_spild->gpio_ipc_sub_srdy), ld); - - if (wake_lock_active(&p_spild->spi_wake_lock)) { - wake_unlock(&p_spild->spi_wake_lock); - pr_err("[SPI] [%s](%d) spi_wakelock unlocked.\n", - __func__, __LINE__); - } - wake_lock_destroy(&p_spild->spi_wake_lock); -} - - -int spi_thread_restart(void) -{ - int retval; - - p_spild->send_modem_spi = 1; - p_spild->is_cp_reset = 1; - sprd_boot_done = 0; - - pr_info("[modem_if_spi] spi_thread_restart\n"); - - spi_set_restart(); - - /* Create SPI device */ - retval = spi_link_init(); - if (retval) - goto exit; - - return 0; - -exit: - return retval; -} -EXPORT_SYMBOL(spi_thread_restart); - -static int spi_link_pm_init(struct spi_link_device *spild, - struct platform_device *pdev) -{ - struct modem_data *pdata = - (struct modem_data *)pdev->dev.platform_data; - struct modemlink_pm_data *pm_pdata; - struct link_pm_data *pm_data = - kzalloc(sizeof(struct link_pm_data), GFP_KERNEL); - - if (!pdata || !pdata->link_pm_data) { - mif_err("platform data is NULL\n"); - return -EINVAL; - } - pm_pdata = pdata->link_pm_data; - - if (!pm_data) { - mif_err("link_pm_data is NULL\n"); - return -ENOMEM; - } - - pm_data->spild = spild; - spild->link_pm_data = pm_data; - - pm_data->pm_notifier.notifier_call = link_pm_notifier_event; - register_pm_notifier(&pm_data->pm_notifier); - - return 0; -} - -struct link_device *spi_create_link_device(struct platform_device *pdev) -{ - struct spi_link_device *spild = NULL; - struct link_device *ld; - struct modem_data *pdata; - - int ret; - int i; - - /* Get the platform data */ - pdata = (struct modem_data *)pdev->dev.platform_data; - if (!pdata) { - pr_err("[LNK/E] <%s> pdata == NULL\n", __func__); - goto err; - } - - pr_info("[LNK] <%s> link device = %s\n", __func__, pdata->link_name); - pr_info("[LNK] <%s> modem = %s\n", __func__, pdata->name); - - /* Alloc SPI link device structure */ - p_spild = spild = kzalloc(sizeof(struct spi_link_device), GFP_KERNEL); - if (!spild) { - pr_err("[LNK/E] <%s> Failed to kzalloc()\n", __func__); - goto err; - } - ld = &spild->ld; - - /* Extract modem data and SPI control data from the platform data */ - ld->mdm_data = pdata; - ld->name = "spi"; - - if (ld->aligned) - pr_err("[LNK] <%s> Aligned access is required!!!\n", __func__); - - - ld->send = spi_send; - - INIT_LIST_HEAD(&ld->list); - - skb_queue_head_init(&ld->sk_fmt_tx_q); - skb_queue_head_init(&ld->sk_raw_tx_q); - skb_queue_head_init(&ld->sk_rfs_tx_q); - ld->skb_txq[IPC_FMT] = &ld->sk_fmt_tx_q; - ld->skb_txq[IPC_RAW] = &ld->sk_raw_tx_q; - ld->skb_txq[IPC_RFS] = &ld->sk_rfs_tx_q; - - spild->spi_wq = create_singlethread_workqueue("spi_wq"); - if (!spild->spi_wq) { - pr_err("[LNK/E] <%s> Fail to create workqueue for spi_wq\n", - __func__); - goto err; - } - - spild->spi_state = SPI_STATE_END; - spild->max_ipc_dev = IPC_RFS+1; /* FMT, RAW, RFS */ - - for (i = 0; i < spild->max_ipc_dev; i++) - skb_queue_head_init(&spild->skb_rxq[i]); - - /* Prepare a clean buffer for SPI access */ - spild->buff = kzalloc(SPI_MAX_PACKET_SIZE, GFP_KERNEL); - spild->sync_buff = kzalloc(SPI_MAX_PACKET_SIZE, GFP_KERNEL); - - memset(spild->buff , 0, SPI_MAX_PACKET_SIZE); - memset(spild->sync_buff , 0, SPI_MAX_PACKET_SIZE); - - if (!spild->buff) { - pr_err("[LNK/E] <%s> Failed to alloc spild->buff\n", __func__); - goto err; - } - - /* Initialize SPI pin value */ - spild->gpio_ipc_mrdy = pdata->gpio_ipc_mrdy; - spild->gpio_ipc_srdy = pdata->gpio_ipc_srdy; - spild->gpio_ipc_sub_mrdy = pdata->gpio_ipc_sub_mrdy; - spild->gpio_ipc_sub_srdy = pdata->gpio_ipc_sub_srdy; - - spild->gpio_ap_cp_int1 = pdata->gpio_ap_cp_int1; - spild->gpio_ap_cp_int2 = pdata->gpio_ap_cp_int2; - - /* Create SPI Timer */ - init_timer(&spild->spi_tx_timer); - - spild->spi_tx_timer.expires = - jiffies + ((SPI_TIMER_TX_WAIT_TIME * HZ) / 1000); - - spild->spi_tx_timer.data = 0; - spild->spi_tx_timer.function = spi_tx_timer_callback; - - init_timer(&spild->spi_rx_timer); - - spild->spi_rx_timer.expires = - jiffies + ((SPI_TIMER_RX_WAIT_TIME * HZ) / 1000); - - spild->spi_rx_timer.data = 0; - spild->spi_rx_timer.function = spi_rx_timer_callback; - - ret = spi_register_driver(&spi_driver); - if (ret < 0) { - pr_err("spi_register_driver() fail : %d\n", ret); - goto err; - } - - /* create link pm device */ - ret = spi_link_pm_init(spild, pdev); - if (ret) - goto err; - - /* Create SPI device */ - ret = spi_link_init(); - if (ret) - goto err; - - /* creat work queue thread */ - p_spild->ipc_spi_wq = create_singlethread_workqueue("ipc_spi_wq"); - - if (!p_spild->ipc_spi_wq) { - pr_err("[%s] get workqueue thread fail\n", - __func__); - - ret = -ENOMEM; - goto err; - } - - return ld; - -err: - kfree(spild->buff); - kfree(spild); - return NULL; -} diff --git a/drivers/misc/modem_if_u1/modem_link_device_spi.h b/drivers/misc/modem_if_u1/modem_link_device_spi.h deleted file mode 100644 index 3e2456e..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_spi.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2011 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_LINK_DEVICE_SPI_H__ -#define __MODEM_LINK_DEVICE_SPI_H__ - -#include -#include -#include -#include - - -#define SPI_TIMER_TX_WAIT_TIME 60 /* ms */ -#define SPI_TIMER_RX_WAIT_TIME 500 /* ms */ - -#define SPI_MAX_PACKET_SIZE (2048 * 6) -#define SPI_TASK_EVENT_COUNT 64 -#define SPI_DATA_BOF 0x7F -#define SPI_DATA_EOF 0x7E -#define SPI_DATA_FF_PADDING_HEADER 0xFFFFFFFF - -#define SPI_DATA_MUX_NORMAL_MASK 0x0F -#define SPI_DATA_MUX_MORE_H 0x10 -#define SPI_DATA_MUX_MORE_M 0x20 -#define SPI_DATA_MUX_MORE_T 0x30 - -#define SPI_DATA_MUX_SIZE 2 -#define SPI_DATA_LENGTH_SIZE 4 -#define SPI_DATA_BOF_SIZE 1 -#define SPI_DATA_INNER_LENGTH_SIZE 4 -#define SPI_DATA_IPC_INNER_LENGTH_SIZE 2 -#define SPI_DATA_IPC_INNER_CONTROL_SIZE 1 -#define SPI_DATA_EOF_SIZE 1 -#define SPI_DATA_HEADER_SIZE (SPI_DATA_MUX_SIZE+ \ - SPI_DATA_LENGTH_SIZE+SPI_DATA_BOF_SIZE+SPI_DATA_EOF_SIZE) -#define SPI_DATA_HEADER_SIZE_FRONT (SPI_DATA_MUX_SIZE+ \ - SPI_DATA_LENGTH_SIZE+SPI_DATA_BOF_SIZE) -#define SPI_DATA_IPC_INNER_HEADER_SIZE \ - (SPI_DATA_IPC_INNER_LENGTH_SIZE+ \ - SPI_DATA_IPC_INNER_CONTROL_SIZE) -#define SPI_DATA_SIZE(X) (SPI_DATA_HEADER_SIZE+X) - -#define SPI_DATA_LENGTH_OFFSET SPI_DATA_MUX_SIZE -#define SPI_DATA_BOF_OFFSET (SPI_DATA_LENGTH_OFFSET+ \ - SPI_DATA_LENGTH_SIZE) -#define SPI_DATA_DATA_OFFSET (SPI_DATA_BOF_OFFSET+ \ - SPI_DATA_BOF_SIZE) -#define SPI_DATA_EOF_OFFSET(X) (SPI_DATA_DATA_OFFSET+X) - -#define SPI_DATA_PACKET_HEADER_SIZE 4 -#define SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE 4 -#define SPI_DATA_PACKET_MAX_PACKET_BODY_SIZE \ - (SPI_MAX_PACKET_SIZE-SPI_DATA_PACKET_HEADER_SIZE- \ - SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE) - -#define SPI_DATA_MIN_SIZE (SPI_DATA_HEADER_SIZE*2) -#define SPI_DATA_MAX_SIZE_PER_PACKET (SPI_MAX_PACKET_SIZE- \ - SPI_DATA_PACKET_HEADER_SIZE-SPI_DATA_HEADER_SIZE- \ - SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE) - -#define SPI_DATA_DIVIDE_BUFFER_SIZE SPI_MAX_PACKET_SIZE - -struct spi_work_type { - struct work_struct work; - int signal_code; -}; - -enum spi_msg_t { - SPI_WORK_SEND, - SPI_WORK_RECEIVE -}; - -enum spi_work_t { - SPI_WORK, - SPI_WORK_FRONT -}; - -enum spi_state_t { - SPI_STATE_START, /* before init complete */ - SPI_STATE_INIT, /* initialising */ - SPI_STATE_IDLE, /* suspend. Waiting for event */ - /* state to start tx. Become from idle */ - SPI_STATE_TX_START, - SPI_STATE_TX_CONFIRM, - /* (in case of master) */ - /* wait srdy rising interrupt to check slave preparing */ - /* (in case of slave) */ - /* wait submrdy rising interrupt to check sync complete */ - SPI_STATE_TX_WAIT, - SPI_STATE_TX_SENDING, /* tx data sending */ - SPI_STATE_TX_TERMINATE, - SPI_STATE_TX_MORE, - - /* in case of slave, wait submrdy rising interrupt to */ - SPI_STATE_RX_WAIT, - - /* check sync complete then it starts to read buffer */ - SPI_STATE_RX_MORE, - SPI_STATE_RX_TERMINATE, - SPI_STATE_END /* spi task is stopped */ -}; - -enum spi_timer_state_t { - SPI_STATE_TIME_START, - SPI_STATE_TIME_OVER -}; - -enum spi_gpiolevel_t { - SPI_GPIOLEVEL_LOW = 0, - SPI_GPIOLEVEL_HIGH -}; - -enum spi_data_type_t { - SPI_DATA_MUX_IPC = 0x01, - SPI_DATA_MUX_RAW = 0x02, - SPI_DATA_MUX_RFS = 0x03, - SPI_DATA_MUX_CMD = 0x04, -}; - -struct spi_data_packet_header { - /* 12bit : packet size less than SPI_DEV_PACKET_SIZE */ - unsigned long current_data_size:31; - /* 1bit : packet division flag */ - unsigned long more:1; -}; - -struct link_pm_data { - struct miscdevice miscdev; - struct spi_link_device *spild; - - struct notifier_block pm_notifier; -}; - -struct spi_link_device { - struct link_device ld; - - /* Link to SPI control functions dependent on each platform */ - int max_ipc_dev; - - /* Wakelock for SPI device */ - struct wake_lock spi_wake_lock; - /* Workqueue for modem bin transfers */ - struct workqueue_struct *ipc_spi_wq; - - /* SPI state */ - int spi_state; - - /* SPI Timer state */ - int spi_timer_tx_state; - int spi_timer_rx_state; - - /* SPI GPIO pins */ - unsigned int gpio_ipc_mrdy; - unsigned int gpio_ipc_srdy; - unsigned int gpio_ipc_sub_mrdy; - unsigned int gpio_ipc_sub_srdy; - - unsigned int gpio_modem_bin_srdy; - - unsigned int gpio_ap_cp_int1; - unsigned int gpio_ap_cp_int2; - - /* value for checking spi pin status */ - unsigned long mrdy_low_time_save; - unsigned long mrdy_high_time_save; - - /* SPI Wait Timer */ - struct timer_list spi_tx_timer; - struct timer_list spi_rx_timer; - - struct workqueue_struct *spi_wq; - struct spi_work_type spi_work; - - /* For send modem bin */ - struct work_struct send_modem_w; - - struct io_device *iod[MAX_DEV_FORMAT]; - struct sk_buff_head skb_rxq[MAX_DEV_FORMAT]; - - /* LINK PM DEVICE DATA */ - struct link_pm_data *link_pm_data; - - /* Multi-purpose miscellaneous buffer */ - u8 *buff; - u8 *sync_buff; - - struct semaphore srdy_sem; - - int send_modem_spi; - int is_cp_reset; - int boot_done; - int ril_send_modem_img; - unsigned long ril_send_cnt; - - void __iomem *p_virtual_buff; -}; - -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_spi_link_device(linkdev) \ - container_of(linkdev, struct spi_link_device, ld) - -struct spi_v_buff { - unsigned long base; - unsigned long size; - void __iomem *mmio; -}; - -extern unsigned int lpcharge; -extern int get_console_suspended(void); -static void spi_work(struct work_struct *work); - -/* Send SPRD main image through SPI */ -#define SPRD_BLOCK_SIZE 32768 - -enum image_type { - MODEM_MAIN, - MODEM_DSP, - MODEM_NV, - MODEM_EFS, - MODEM_RUN, -}; - -struct image_buf { - unsigned int length; - unsigned int offset; - unsigned int address; - unsigned char *buf; -}; - -struct sprd_image_buf { - u8 *tx_b; - u8 *rx_b; - u8 *encoded_tx_b; - u8 *decoded_rx_b; - - int tx_size; - int rx_size; - int encoded_tx_size; - int decoded_rx_size; -}; - -/* CRC */ -#define CRC_16_L_OK 0x0 -#define HDLC_FLAG 0x7E -#define HDLC_ESCAPE 0x7D -#define HDLC_ESCAPE_MASK 0x20 -#define CRC_CHECK_SIZE 0x02 - -#define M_32_SWAP(a) { \ - u32 _tmp; \ - _tmp = a; \ - ((u8 *)&a)[0] = ((u8 *)&_tmp)[3]; \ - ((u8 *)&a)[1] = ((u8 *)&_tmp)[2]; \ - ((u8 *)&a)[2] = ((u8 *)&_tmp)[1]; \ - ((u8 *)&a)[3] = ((u8 *)&_tmp)[0]; \ - } - -#define M_16_SWAP(a) { \ - u16 _tmp; \ - _tmp = (u16)a; \ - ((u8 *)&a)[0] = ((u8 *)&_tmp)[1]; \ - ((u8 *)&a)[1] = ((u8 *)&_tmp)[0]; \ - } - -#endif diff --git a/drivers/misc/modem_if_u1/modem_link_device_usb.c b/drivers/misc/modem_if_u1/modem_link_device_usb.c deleted file mode 100644 index 457b6c9..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_usb.c +++ /dev/null @@ -1,1028 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#define DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_usb.h" -#include "modem_utils.h" -#include "modem_link_pm_usb.h" - -#include - -#define URB_COUNT 4 - -static int usb_tx_urb_with_skb(struct usb_link_device *usb_ld, - struct sk_buff *skb, struct if_usb_devdata *pipe_data); - -static void -usb_free_urbs(struct usb_link_device *usb_ld, struct if_usb_devdata *pipe) -{ - struct usb_device *usbdev = usb_ld->usbdev; - struct urb *urb; - - while ((urb = usb_get_from_anchor(&pipe->urbs))) { - usb_poison_urb(urb); - usb_free_coherent(usbdev, pipe->rx_buf_size, - urb->transfer_buffer, urb->transfer_dma); - urb->transfer_buffer = NULL; - usb_put_urb(urb); - usb_free_urb(urb); - } -} - -static int start_ipc(struct link_device *ld, struct io_device *iod) -{ - struct sk_buff *skb; - char data[1] = {'a'}; - int err; - struct usb_link_device *usb_ld = to_usb_link_device(ld); - struct if_usb_devdata *pipe_data = &usb_ld->devdata[IF_USB_FMT_EP]; - - if (has_hub(usb_ld) && usb_ld->link_pm_data->hub_handshake_done) { - mif_err("Already send start ipc, skip start ipc\n"); - err = 0; - goto exit; - } - - if (!usb_ld->if_usb_connected) { - mif_err("HSIC/USB not connected, skip start ipc\n"); - err = -ENODEV; - goto exit; - } - - if (has_hub(usb_ld) && - usb_ld->if_usb_initstates == INIT_IPC_START_DONE) { - mif_debug("Already IPC started\n"); - err = 0; - goto exit; - } - - mif_info("send 'a'\n"); - - skb = alloc_skb(16, GFP_ATOMIC); - if (unlikely(!skb)) - return -ENOMEM; - memcpy(skb_put(skb, 1), data, 1); - - skbpriv(skb)->iod = iod; - skbpriv(skb)->ld = &usb_ld->ld; - err = usb_tx_urb_with_skb(usb_ld, skb, pipe_data); - if (err < 0) { - mif_err("usb_tx_urb fail\n"); - goto exit; - } - usb_ld->link_pm_data->hub_handshake_done = true; - usb_ld->if_usb_initstates = INIT_IPC_START_DONE; -exit: - return err; -} - -static int usb_init_communication(struct link_device *ld, - struct io_device *iod) -{ - int err = 0; - switch (iod->format) { - case IPC_BOOT: - ld->com_state = COM_BOOT; - skb_queue_purge(&ld->sk_fmt_tx_q); - break; - - case IPC_RAMDUMP: - ld->com_state = COM_CRASH; - break; - - case IPC_FMT: - err = start_ipc(ld, iod); - break; - - case IPC_RFS: - case IPC_RAW: - - default: - ld->com_state = COM_ONLINE; - break; - } - - mif_debug("com_state = %d\n", ld->com_state); - return err; -} - -static void usb_terminate_communication( - struct link_device *ld, struct io_device *iod) -{ - mif_debug("com_state = %d\n", ld->com_state); -} - -static int usb_rx_submit(struct if_usb_devdata *pipe, struct urb *urb, - gfp_t gfp_flags) -{ - int ret; - - usb_anchor_urb(urb, &pipe->reading); - ret = usb_submit_urb(urb, gfp_flags); - if (ret) { - usb_unanchor_urb(urb); - usb_anchor_urb(urb, &pipe->urbs); - mif_err("submit urb fail with ret (%d)\n", ret); - } - - usb_mark_last_busy(urb->dev); - return ret; -} - -static void usb_rx_complete(struct urb *urb) -{ - struct if_usb_devdata *pipe_data = urb->context; - struct usb_link_device *usb_ld = usb_get_intfdata(pipe_data->data_intf); - struct io_device *iod; - int iod_format = IPC_FMT; - int ret; - - usb_mark_last_busy(urb->dev); - - switch (urb->status) { - case 0: - case -ENOENT: - if (!urb->actual_length) - goto re_submit; - /* call iod recv */ - /* how we can distinguish boot ch with fmt ch ?? */ - switch (pipe_data->format) { - case IF_USB_FMT_EP: - iod_format = IPC_FMT; - pr_buffer("rx", (char *)urb->transfer_buffer, - (size_t)urb->actual_length, 16); - break; - case IF_USB_RAW_EP: - iod_format = IPC_MULTI_RAW; - break; - case IF_USB_RFS_EP: - iod_format = IPC_RFS; - break; - default: - break; - } - - /* during boot stage fmt end point */ - /* shared with boot io device */ - /* when we use fmt device only, at boot and ipc exchange - it can be reduced to 1 device */ - if (iod_format == IPC_FMT && - usb_ld->ld.com_state == COM_BOOT) - iod_format = IPC_BOOT; - if (iod_format == IPC_FMT && - usb_ld->ld.com_state == COM_CRASH) - iod_format = IPC_RAMDUMP; - - iod = link_get_iod_with_format(&usb_ld->ld, iod_format); - if (iod) { - ret = iod->recv(iod, - &usb_ld->ld, - (char *)urb->transfer_buffer, - urb->actual_length); - if (ret < 0) - mif_err("io device recv error :%d\n", ret); - } -re_submit: - if (urb->status || atomic_read(&usb_ld->suspend_count)) - break; - - usb_mark_last_busy(urb->dev); - usb_rx_submit(pipe_data, urb, GFP_ATOMIC); - return; - case -ESHUTDOWN: - case -EPROTO: - break; - case -EOVERFLOW: - mif_err("RX overflow\n"); - break; - default: - mif_err("RX complete Status (%d)\n", urb->status); - break; - } - - usb_anchor_urb(urb, &pipe_data->urbs); -} - -static int usb_send(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb) -{ - struct sk_buff_head *txq; - size_t tx_size; - - if (iod->format == IPC_RAW) - txq = &ld->sk_raw_tx_q; - else - txq = &ld->sk_fmt_tx_q; - - /* store the tx size before run the tx_delayed_work*/ - tx_size = skb->len; - - /* en queue skb data */ - skb_queue_tail(txq, skb); - - queue_delayed_work(ld->tx_wq, &ld->tx_delayed_work, 0); - - return tx_size; -} - -static void usb_tx_complete(struct urb *urb) -{ - int ret = 0; - struct sk_buff *skb = urb->context; - - switch (urb->status) { - case 0: - break; - default: - mif_err("TX error (%d)\n", urb->status); - } - - usb_mark_last_busy(urb->dev); - ret = pm_runtime_put_autosuspend(&urb->dev->dev); - if (ret < 0 && ret != -EAGAIN) - mif_debug("pm_runtime_put_autosuspend failed: %d\n", ret); - usb_free_urb(urb); - dev_kfree_skb_any(skb); -} - -static void if_usb_force_disconnect(struct work_struct *work) -{ - struct usb_link_device *usb_ld = - container_of(work, struct usb_link_device, disconnect_work); - struct usb_device *udev = usb_ld->usbdev; - - /* if already disconnected before run this workqueue */ - if (!udev || !(&udev->dev) || !usb_ld->if_usb_connected) - return; - - /* disconnect udev's parent if usb hub used */ - if (has_hub(usb_ld)) - udev = udev->parent; - - pm_runtime_get_sync(&udev->dev); - if (udev->state != USB_STATE_NOTATTACHED) { - usb_force_disconnect(udev); - mif_info("force disconnect\n"); - } - pm_runtime_put_autosuspend(&udev->dev); -} - -static void -usb_change_modem_state(struct usb_link_device *usb_ld, enum modem_state state) -{ - struct io_device *iod; - - iod = link_get_iod_with_format(&usb_ld->ld, IPC_FMT); - if (iod) - iod->modem_state_changed(iod, state); -} - -static int usb_tx_urb_with_skb(struct usb_link_device *usb_ld, - struct sk_buff *skb, struct if_usb_devdata *pipe_data) -{ - int ret, cnt = 0; - struct urb *urb; - struct usb_device *usbdev = usb_ld->usbdev; - unsigned long flags; - - if (!usbdev || (usbdev->state == USB_STATE_NOTATTACHED) || - usb_ld->host_wake_timeout_flag) - return -ENODEV; - - pm_runtime_get_noresume(&usbdev->dev); - - if (usbdev->dev.power.runtime_status == RPM_SUSPENDED || - usbdev->dev.power.runtime_status == RPM_SUSPENDING) { - usb_ld->resume_status = AP_INITIATED_RESUME; - SET_SLAVE_WAKEUP(usb_ld->pdata, 1); - - while (!wait_event_interruptible_timeout(usb_ld->l2_wait, - usbdev->dev.power.runtime_status == RPM_ACTIVE - || pipe_data->disconnected, - HOST_WAKEUP_TIMEOUT_JIFFIES)) { - - if (cnt == MAX_RETRY) { - mif_err("host wakeup timeout !!\n"); - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - pm_runtime_put_autosuspend(&usbdev->dev); - schedule_work(&usb_ld->disconnect_work); - usb_ld->host_wake_timeout_flag = 1; - return -1; - } - mif_err("host wakeup timeout ! retry..\n"); - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - udelay(100); - SET_SLAVE_WAKEUP(usb_ld->pdata, 1); - cnt++; - } - - if (pipe_data->disconnected) { - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - pm_runtime_put_autosuspend(&usbdev->dev); - return -ENODEV; - } - - mif_debug("wait_q done (runtime_status=%d)\n", - usbdev->dev.power.runtime_status); - } - - urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - mif_err("alloc urb error\n"); - if (pm_runtime_put_autosuspend(&usbdev->dev) < 0) - mif_debug("pm_runtime_put_autosuspend fail\n"); - return -ENOMEM; - } - - urb->transfer_flags = URB_ZERO_PACKET; - usb_fill_bulk_urb(urb, usbdev, pipe_data->tx_pipe, skb->data, - skb->len, usb_tx_complete, (void *)skb); - - spin_lock_irqsave(&usb_ld->lock, flags); - if (atomic_read(&usb_ld->suspend_count)) { - /* transmission will be done in resume */ - usb_anchor_urb(urb, &usb_ld->deferred); - usb_put_urb(urb); - mif_debug("anchor urb (0x%p)\n", urb); - spin_unlock_irqrestore(&usb_ld->lock, flags); - return 0; - } - spin_unlock_irqrestore(&usb_ld->lock, flags); - - ret = usb_submit_urb(urb, GFP_KERNEL); - if (ret < 0) { - mif_err("usb_submit_urb with ret(%d)\n", ret); - if (pm_runtime_put_autosuspend(&usbdev->dev) < 0) - mif_debug("pm_runtime_put_autosuspend fail\n"); - } - return ret; -} - -static void usb_tx_work(struct work_struct *work) -{ - int ret = 0; - struct link_device *ld = - container_of(work, struct link_device, tx_delayed_work.work); - struct usb_link_device *usb_ld = to_usb_link_device(ld); - struct io_device *iod; - struct sk_buff *skb; - struct if_usb_devdata *pipe_data; - struct link_pm_data *pm_data = usb_ld->link_pm_data; - - /*TODO: check the PHONE ACTIVE STATES */ - /* because tx data wait until hub on with wait_for_complettion, it - should queue to single_threaded work queue */ - if (!link_pm_set_active(usb_ld)) - return; - - while (ld->sk_fmt_tx_q.qlen || ld->sk_raw_tx_q.qlen) { - /* send skb from fmt_txq and raw_txq, - * one by one for fair flow control */ - skb = skb_dequeue(&ld->sk_fmt_tx_q); - if (skb) { - iod = skbpriv(skb)->iod; - switch (iod->format) { - case IPC_BOOT: - case IPC_RAMDUMP: - case IPC_FMT: - /* boot device uses same intf with fmt*/ - pipe_data = &usb_ld->devdata[IF_USB_FMT_EP]; - break; - case IPC_RFS: - pipe_data = &usb_ld->devdata[IF_USB_RFS_EP]; - break; - default: - /* wrong packet for fmt tx q , drop it */ - dev_kfree_skb_any(skb); - continue; - } - - ret = usb_tx_urb_with_skb(usb_ld, skb, pipe_data); - if (ret < 0) { - mif_err("usb_tx_urb_with_skb, ret(%d)\n", - ret); - skb_queue_head(&ld->sk_fmt_tx_q, skb); - return; - } - } - - skb = skb_dequeue(&ld->sk_raw_tx_q); - if (skb) { - pipe_data = &usb_ld->devdata[IF_USB_RAW_EP]; - ret = usb_tx_urb_with_skb(usb_ld, skb, pipe_data); - if (ret < 0) { - mif_err("usb_tx_urb_with_skb " - "for raw, ret(%d)\n", - ret); - skb_queue_head(&ld->sk_raw_tx_q, skb); - return; - } - } - } -} - -static int if_usb_suspend(struct usb_interface *intf, pm_message_t message) -{ - struct usb_link_device *usb_ld = usb_get_intfdata(intf); - struct link_pm_data *pm_data = usb_ld->link_pm_data; - int i; - - if (atomic_inc_return(&usb_ld->suspend_count) == IF_USB_DEVNUM_MAX) { - mif_debug("L2\n"); - - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) - usb_kill_anchored_urbs(&usb_ld->devdata[i].reading); - - if (pm_data->freq_unlock) - pm_data->freq_unlock(&usb_ld->usbdev->dev); - - wake_unlock(&usb_ld->susplock); - } - - return 0; -} - -static void runtime_pm_work(struct work_struct *work) -{ - struct usb_link_device *usb_ld = container_of(work, - struct usb_link_device, runtime_pm_work.work); - int ret; - - ret = pm_request_autosuspend(&usb_ld->usbdev->dev); - - if (ret == -EAGAIN || ret == 1) - queue_delayed_work(system_nrt_wq, &usb_ld->runtime_pm_work, - msecs_to_jiffies(50)); -} - -static void post_resume_work(struct work_struct *work) -{ - struct usb_link_device *usb_ld = container_of(work, - struct usb_link_device, post_resume_work.work); - struct link_pm_data *pm_data = usb_ld->link_pm_data; - struct usb_device *udev = usb_ld->usbdev; - - /* if already disconnected before run this workqueue */ - if (!udev || !(&udev->dev) || !usb_ld->if_usb_connected) - return; - - /* lock cpu/bus frequency when L2->L0 */ - if (pm_data->freq_lock) - pm_data->freq_lock(&udev->dev); -} - -static void wait_enumeration_work(struct work_struct *work) -{ - struct usb_link_device *usb_ld = container_of(work, - struct usb_link_device, wait_enumeration.work); - if (usb_ld->if_usb_connected == 0) { - mif_err("USB disconnected and not enumerated for long time\n"); - usb_change_modem_state(usb_ld, STATE_CRASH_EXIT); - } -} - -static int if_usb_resume(struct usb_interface *intf) -{ - int i, ret; - struct sk_buff *skb; - struct usb_link_device *usb_ld = usb_get_intfdata(intf); - struct if_usb_devdata *pipe; - struct urb *urb; - - spin_lock_irq(&usb_ld->lock); - if (!atomic_dec_return(&usb_ld->suspend_count)) { - spin_unlock_irq(&usb_ld->lock); - - mif_debug("\n"); - wake_lock(&usb_ld->susplock); - - /* HACK: Runtime pm does not allow requesting autosuspend from - * resume callback, delayed it after resume */ - queue_delayed_work(system_nrt_wq, &usb_ld->runtime_pm_work, - msecs_to_jiffies(50)); - - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) { - pipe = &usb_ld->devdata[i]; - while ((urb = usb_get_from_anchor(&pipe->urbs))) { - ret = usb_rx_submit(pipe, urb, GFP_KERNEL); - if (ret < 0) { - usb_put_urb(urb); - mif_err( - "usb_rx_submit error with (%d)\n", - ret); - return ret; - } - usb_put_urb(urb); - } - } - - while ((urb = usb_get_from_anchor(&usb_ld->deferred))) { - mif_debug("got urb (0x%p) from anchor & resubmit\n", - urb); - ret = usb_submit_urb(urb, GFP_KERNEL); - if (ret < 0) { - mif_err("resubmit failed\n"); - skb = urb->context; - dev_kfree_skb_any(skb); - usb_free_urb(urb); - ret = pm_runtime_put_autosuspend( - &usb_ld->usbdev->dev); - if (ret < 0 && ret != -EAGAIN) - mif_debug("pm_runtime_put_autosuspend " - "failed: %d\n", ret); - } - } - SET_SLAVE_WAKEUP(usb_ld->pdata, 1); - udelay(100); - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - - /* if_usb_resume() is atomic. post_resume_work is - * a kind of bottom halves - */ - queue_delayed_work(system_nrt_wq, &usb_ld->post_resume_work, 0); - - return 0; - } - - spin_unlock_irq(&usb_ld->lock); - return 0; -} - -static int if_usb_reset_resume(struct usb_interface *intf) -{ - int ret; - - mif_debug("\n"); - ret = if_usb_resume(intf); - return ret; -} - -static struct usb_device_id if_usb_ids[] = { - { USB_DEVICE(0x04e8, 0x6999), /* CMC221 LTE Modem */ - /*.driver_info = 0,*/ - }, - { } /* terminating entry */ -}; -MODULE_DEVICE_TABLE(usb, if_usb_ids); - -static struct usb_driver if_usb_driver; -static void if_usb_disconnect(struct usb_interface *intf) -{ - struct usb_link_device *usb_ld = usb_get_intfdata(intf); - struct usb_device *usbdev = usb_ld->usbdev; - struct link_pm_data *pm_data = usb_ld->link_pm_data; - int dev_id = intf->altsetting->desc.bInterfaceNumber; - struct if_usb_devdata *pipe_data = &usb_ld->devdata[dev_id]; - - - usb_set_intfdata(intf, NULL); - - pipe_data->disconnected = 1; - smp_wmb(); - - wake_up(&usb_ld->l2_wait); - - usb_ld->if_usb_connected = 0; - usb_ld->flow_suspend = 1; - - dev_dbg(&usbdev->dev, "%s\n", __func__); - usb_ld->dev_count--; - usb_driver_release_interface(&if_usb_driver, pipe_data->data_intf); - - usb_kill_anchored_urbs(&pipe_data->reading); - usb_free_urbs(usb_ld, pipe_data); - - if (usb_ld->dev_count == 0) { - cancel_delayed_work_sync(&usb_ld->runtime_pm_work); - cancel_delayed_work_sync(&usb_ld->post_resume_work); - cancel_delayed_work_sync(&usb_ld->ld.tx_delayed_work); - usb_put_dev(usbdev); - usb_ld->usbdev = NULL; - if (!has_hub(usb_ld)) - pm_runtime_forbid(pm_data->root_hub); - } -} - -static int __devinit if_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ - struct usb_host_interface *data_desc; - struct usb_link_device *usb_ld = - (struct usb_link_device *)id->driver_info; - struct link_device *ld = &usb_ld->ld; - struct usb_interface *data_intf; - struct usb_device *usbdev = interface_to_usbdev(intf); - struct device *dev, *ehci_dev, *root_hub; - struct if_usb_devdata *pipe; - struct urb *urb; - int i; - int j; - int dev_id; - int err; - - /* To detect usb device order probed */ - dev_id = intf->cur_altsetting->desc.bInterfaceNumber; - - if (dev_id >= IF_USB_DEVNUM_MAX) { - dev_err(&intf->dev, "Device id %d cannot support\n", - dev_id); - return -EINVAL; - } - - if (!usb_ld) { - dev_err(&intf->dev, - "if_usb device doesn't be allocated\n"); - err = ENOMEM; - goto out; - } - - mif_info("probe dev_id=%d usb_device_id(0x%p), usb_ld (0x%p)\n", - dev_id, id, usb_ld); - - usb_ld->usbdev = usbdev; - usb_get_dev(usbdev); - - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) { - data_intf = usb_ifnum_to_if(usbdev, i); - - /* remap endpoint of RAW to no.1 for LTE modem */ - if (i == 0) - pipe = &usb_ld->devdata[1]; - else if (i == 1) - pipe = &usb_ld->devdata[0]; - else - pipe = &usb_ld->devdata[i]; - - pipe->disconnected = 0; - pipe->data_intf = data_intf; - data_desc = data_intf->cur_altsetting; - - /* Endpoints */ - if (usb_pipein(data_desc->endpoint[0].desc.bEndpointAddress)) { - pipe->rx_pipe = usb_rcvbulkpipe(usbdev, - data_desc->endpoint[0].desc.bEndpointAddress); - pipe->tx_pipe = usb_sndbulkpipe(usbdev, - data_desc->endpoint[1].desc.bEndpointAddress); - pipe->rx_buf_size = 1024*4; - } else { - pipe->rx_pipe = usb_rcvbulkpipe(usbdev, - data_desc->endpoint[1].desc.bEndpointAddress); - pipe->tx_pipe = usb_sndbulkpipe(usbdev, - data_desc->endpoint[0].desc.bEndpointAddress); - pipe->rx_buf_size = 1024*4; - } - - if (i == 0) { - dev_info(&usbdev->dev, "USB IF USB device found\n"); - } else { - err = usb_driver_claim_interface(&if_usb_driver, - data_intf, usb_ld); - if (err < 0) { - mif_err("failed to cliam usb interface\n"); - goto out; - } - } - - usb_set_intfdata(data_intf, usb_ld); - usb_ld->dev_count++; - pm_suspend_ignore_children(&data_intf->dev, true); - - for (j = 0; j < URB_COUNT; j++) { - urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - mif_err("alloc urb fail\n"); - err = -ENOMEM; - goto out2; - } - - urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - urb->transfer_buffer = usb_alloc_coherent(usbdev, - pipe->rx_buf_size, GFP_KERNEL, - &urb->transfer_dma); - if (!urb->transfer_buffer) { - mif_err( - "Failed to allocate transfer buffer\n"); - usb_free_urb(urb); - err = -ENOMEM; - goto out2; - } - - usb_fill_bulk_urb(urb, usbdev, pipe->rx_pipe, - urb->transfer_buffer, pipe->rx_buf_size, - usb_rx_complete, pipe); - usb_anchor_urb(urb, &pipe->urbs); - } - } - - /* temporary call reset_resume */ - atomic_set(&usb_ld->suspend_count, 1); - if_usb_reset_resume(data_intf); - atomic_set(&usb_ld->suspend_count, 0); - - SET_HOST_ACTIVE(usb_ld->pdata, 1); - usb_ld->host_wake_timeout_flag = 0; - - if (gpio_get_value(usb_ld->pdata->gpio_phone_active)) { - struct link_pm_data *pm_data = usb_ld->link_pm_data; - int delay = pm_data->autosuspend_delay_ms ?: - DEFAULT_AUTOSUSPEND_DELAY_MS; - pm_runtime_set_autosuspend_delay(&usbdev->dev, delay); - dev = &usbdev->dev; - if (dev->parent) { - dev_dbg(&usbdev->dev, "if_usb Runtime PM Start!!\n"); - usb_enable_autosuspend(usb_ld->usbdev); - /* s5p-ehci runtime pm allow - usb phy suspend mode */ - root_hub = &usbdev->bus->root_hub->dev; - ehci_dev = root_hub->parent; - mif_debug("ehci device = %s, %s\n", - dev_driver_string(ehci_dev), - dev_name(ehci_dev)); - pm_runtime_allow(ehci_dev); - - if (!pm_data->autosuspend) - pm_runtime_forbid(dev); - - if (has_hub(usb_ld)) - link_pm_preactive(pm_data); - - pm_data->root_hub = root_hub; - } - - usb_ld->flow_suspend = 0; - /* Queue work if skbs were pending before a disconnect/probe */ - if (ld->sk_fmt_tx_q.qlen || ld->sk_raw_tx_q.qlen) - queue_delayed_work(ld->tx_wq, &ld->tx_delayed_work, 0); - - usb_ld->if_usb_connected = 1; - /*USB3503*/ - mif_debug("hub active complete\n"); - - usb_change_modem_state(usb_ld, STATE_ONLINE); - } else { - usb_change_modem_state(usb_ld, STATE_LOADER_DONE); - } - - /* check dynamic switching gpio received - * before usb enumeration is completed - */ - if (ld->mc->need_switch_to_usb) { - ld->mc->need_switch_to_usb = false; - rawdevs_set_tx_link(ld->msd, LINKDEV_USB); - } - - return 0; - -out2: - usb_ld->dev_count--; - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) - usb_free_urbs(usb_ld, &usb_ld->devdata[i]); -out: - usb_set_intfdata(intf, NULL); - return err; -} - -irqreturn_t usb_resume_irq(int irq, void *data) -{ - int ret; - struct usb_link_device *usb_ld = data; - int hwup; - static int wake_status = -1; - struct device *dev; - - hwup = gpio_get_value(usb_ld->pdata->gpio_host_wakeup); - if (hwup == wake_status) { - mif_err("Received spurious wake irq: %d", hwup); - return IRQ_HANDLED; - } - wake_status = hwup; - - irq_set_irq_type(irq, hwup ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); - /* - * exynos BSP has problem when using level interrupt. - * If we change irq type from interrupt handler, - * we can get level interrupt twice. - * this is temporary solution until SYS.LSI resolve this problem. - */ - __raw_writel(eint_irq_to_bit(irq), S5P_EINT_PEND(EINT_REG_NR(irq))); - wake_lock_timeout(&usb_ld->gpiolock, 100); - - mif_err("< H-WUP %d\n", hwup); - - if (!link_pm_is_connected(usb_ld)) - return IRQ_HANDLED; - - if (hwup) { - dev = &usb_ld->usbdev->dev; - mif_info("runtime status=%d\n", - dev->power.runtime_status); - - /* if usb3503 was on, usb_if was resumed by probe */ - if (has_hub(usb_ld) && - (dev->power.runtime_status == RPM_ACTIVE || - dev->power.runtime_status == RPM_RESUMING)) - return IRQ_HANDLED; - - device_lock(dev); - if (dev->power.is_prepared || dev->power.is_suspended) { - pm_runtime_get_noresume(dev); - ret = 0; - } else { - ret = pm_runtime_get_sync(dev); - } - device_unlock(dev); - if (ret < 0) { - mif_err("pm_runtime_get fail (%d)\n", ret); - return IRQ_HANDLED; - } - } else { - if (usb_ld->resume_status == AP_INITIATED_RESUME) - wake_up(&usb_ld->l2_wait); - usb_ld->resume_status = CP_INITIATED_RESUME; - pm_runtime_mark_last_busy(&usb_ld->usbdev->dev); - pm_runtime_put_autosuspend(&usb_ld->usbdev->dev); - } - - return IRQ_HANDLED; -} - -static int if_usb_init(struct usb_link_device *usb_ld) -{ - int ret; - int i; - struct if_usb_devdata *pipe; - - /* give it to probe, or global variable needed */ - if_usb_ids[0].driver_info = (unsigned long)usb_ld; - - for (i = 0; i < IF_USB_DEVNUM_MAX; i++) { - pipe = &usb_ld->devdata[i]; - pipe->format = i; - pipe->disconnected = 1; - init_usb_anchor(&pipe->urbs); - init_usb_anchor(&pipe->reading); - } - - init_waitqueue_head(&usb_ld->l2_wait); - init_usb_anchor(&usb_ld->deferred); - - ret = usb_register(&if_usb_driver); - if (ret) { - mif_err("usb_register_driver() fail : %d\n", ret); - return ret; - } - - return 0; -} - -struct link_device *usb_create_link_device(void *data) -{ - int ret; - struct modem_data *pdata; - struct platform_device *pdev = (struct platform_device *)data; - struct usb_link_device *usb_ld = NULL; - struct link_device *ld = NULL; - - pdata = pdev->dev.platform_data; - - usb_ld = kzalloc(sizeof(struct usb_link_device), GFP_KERNEL); - if (!usb_ld) - goto err; - - INIT_LIST_HEAD(&usb_ld->ld.list); - skb_queue_head_init(&usb_ld->ld.sk_fmt_tx_q); - skb_queue_head_init(&usb_ld->ld.sk_raw_tx_q); - spin_lock_init(&usb_ld->lock); - - ld = &usb_ld->ld; - usb_ld->pdata = pdata; - - ld->name = "usb"; - ld->init_comm = usb_init_communication; - ld->terminate_comm = usb_terminate_communication; - ld->send = usb_send; - ld->com_state = COM_NONE; - - /*ld->tx_wq = create_singlethread_workqueue("usb_tx_wq");*/ - ld->tx_wq = alloc_workqueue("usb_tx_wq", - WQ_HIGHPRI | WQ_UNBOUND | WQ_RESCUER, 1); - - if (!ld->tx_wq) { - mif_err("fail to create work Q.\n"); - goto err; - } - - usb_ld->pdata->irq_host_wakeup = platform_get_irq(pdev, 1); - wake_lock_init(&usb_ld->gpiolock, WAKE_LOCK_SUSPEND, - "modem_usb_gpio_wake"); - wake_lock_init(&usb_ld->susplock, WAKE_LOCK_SUSPEND, - "modem_usb_suspend_block"); - - INIT_DELAYED_WORK(&ld->tx_delayed_work, usb_tx_work); - INIT_DELAYED_WORK(&usb_ld->runtime_pm_work, runtime_pm_work); - INIT_DELAYED_WORK(&usb_ld->post_resume_work, post_resume_work); - INIT_DELAYED_WORK(&usb_ld->wait_enumeration, wait_enumeration_work); - INIT_WORK(&usb_ld->disconnect_work, if_usb_force_disconnect); - - /* create link pm device */ - ret = link_pm_init(usb_ld, data); - if (ret) - goto err; - - ret = if_usb_init(usb_ld); - if (ret) - goto err; - - return ld; -err: - if (ld && ld->tx_wq) - destroy_workqueue(ld->tx_wq); - - kfree(usb_ld); - - return NULL; -} - -static struct usb_driver if_usb_driver = { - .name = "if_usb_driver", - .probe = if_usb_probe, - .disconnect = if_usb_disconnect, - .id_table = if_usb_ids, - .suspend = if_usb_suspend, - .resume = if_usb_resume, - .reset_resume = if_usb_reset_resume, - .supports_autosuspend = 1, -}; - -static void __exit if_usb_exit(void) -{ - usb_deregister(&if_usb_driver); -} - -bool usb_is_enumerated(struct modem_shared *msd) -{ - struct link_device *ld = find_linkdev(msd, LINKDEV_USB); - if (ld) - return to_usb_link_device(ld)->usbdev != NULL; - else - return false; -} - - -/* lte specific functions */ - -static int lte_wake_resume(struct device *pdev) -{ - struct modem_data *pdata = pdev->platform_data; - int val; - - val = gpio_get_value(pdata->gpio_host_wakeup); - if (!val) { - mif_debug("> S-WUP 1\n"); - gpio_set_value(pdata->gpio_slave_wakeup, 1); - } - - return 0; -} - -static const struct dev_pm_ops lte_wake_pm_ops = { - .resume = lte_wake_resume, -}; - -static struct platform_driver lte_wake_driver = { - .driver = { - .name = "modem_lte_wake", - .pm = <e_wake_pm_ops, - }, -}; - -static int __init lte_wake_init(void) -{ - return platform_driver_register(<e_wake_driver); -} -module_init(lte_wake_init); diff --git a/drivers/misc/modem_if_u1/modem_link_device_usb.h b/drivers/misc/modem_if_u1/modem_link_device_usb.h deleted file mode 100644 index 8233fd1..0000000 --- a/drivers/misc/modem_if_u1/modem_link_device_usb.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_LINK_DEVICE_USB_H__ -#define __MODEM_LINK_DEVICE_USB_H__ - -#include -#include - -#define IF_USB_DEVNUM_MAX 3 - -#define IF_USB_FMT_EP 0 -#define IF_USB_RAW_EP 1 -#define IF_USB_RFS_EP 2 - -#define DEFAULT_AUTOSUSPEND_DELAY_MS 500 -#define HOST_WAKEUP_TIMEOUT_JIFFIES msecs_to_jiffies(500) -#define WAIT_ENUMURATION_TIMEOUT_JIFFIES msecs_to_jiffies(15000) -#define MAX_RETRY 30 - -#define IOCTL_LINK_CONTROL_ENABLE _IO('o', 0x30) -#define IOCTL_LINK_CONTROL_ACTIVE _IO('o', 0x31) -#define IOCTL_LINK_GET_HOSTWAKE _IO('o', 0x32) -#define IOCTL_LINK_CONNECTED _IO('o', 0x33) -#define IOCTL_LINK_SET_BIAS_CLEAR _IO('o', 0x34) - -#define IOCTL_LINK_PORT_ON _IO('o', 0x35) -#define IOCTL_LINK_PORT_OFF _IO('o', 0x36) - -enum RESUME_STATUS { - CP_INITIATED_RESUME, - AP_INITIATED_RESUME, -}; - -enum IPC_INIT_STATUS { - INIT_IPC_NOT_READY, - INIT_IPC_START_DONE, /* send 'a' done */ -}; - -enum hub_status { - HUB_STATE_OFF, /* usb3503 0ff*/ - HUB_STATE_RESUMMING, /* usb3503 on, but enummerattion was not yet*/ - HUB_STATE_ACTIVE, /* hub and CMC221 enumerate */ -}; - -struct if_usb_devdata { - struct usb_interface *data_intf; - unsigned int tx_pipe; - unsigned int rx_pipe; - u8 disconnected; - - int format; - struct usb_anchor urbs; - struct usb_anchor reading; - unsigned int rx_buf_size; -}; - -struct usb_link_device { - /*COMMON LINK DEVICE*/ - struct link_device ld; - - struct modem_data *pdata; - - /*USB SPECIFIC LINK DEVICE*/ - struct usb_device *usbdev; - struct if_usb_devdata devdata[IF_USB_DEVNUM_MAX]; - struct delayed_work runtime_pm_work; - struct delayed_work post_resume_work; - struct delayed_work wait_enumeration; - struct work_struct disconnect_work; - - struct wake_lock gpiolock; - struct wake_lock susplock; - - unsigned int dev_count; - unsigned int suspended; - atomic_t suspend_count; - enum RESUME_STATUS resume_status; - int if_usb_connected; - int if_usb_initstates; - int flow_suspend; - int host_wake_timeout_flag; - - unsigned gpio_slave_wakeup; - unsigned gpio_host_wakeup; - unsigned gpio_host_active; - int irq_host_wakeup; - struct delayed_work dwork; - struct work_struct resume_work; - int cpcrash_flag; - wait_queue_head_t l2_wait; - - spinlock_t lock; - struct usb_anchor deferred; - - /* LINK PM DEVICE DATA */ - struct link_pm_data *link_pm_data; -}; -/* converts from struct link_device* to struct xxx_link_device* */ -#define to_usb_link_device(linkdev) \ - container_of(linkdev, struct usb_link_device, ld) - -#define SET_SLAVE_WAKEUP(_pdata, _value) \ -do { \ - gpio_set_value(_pdata->gpio_slave_wakeup, _value); \ - mif_debug("> S-WUP %s\n", _value ? "1" : "0"); \ -} while (0) - -#define SET_HOST_ACTIVE(_pdata, _value) \ -do { \ - gpio_set_value(_pdata->gpio_host_active, _value); \ - mif_debug("> H-ACT %s\n", _value ? "1" : "0"); \ -} while (0) - -#define has_hub(usb_ld) ((usb_ld)->link_pm_data->has_usbhub) - -irqreturn_t usb_resume_irq(int irq, void *data); -bool usb_is_enumerated(struct modem_shared *msd); - -#endif diff --git a/drivers/misc/modem_if_u1/modem_link_pm_usb.c b/drivers/misc/modem_if_u1/modem_link_pm_usb.c deleted file mode 100644 index 1b2614e..0000000 --- a/drivers/misc/modem_if_u1/modem_link_pm_usb.c +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright (C) 2012 Samsung Electronics. - * - * 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. - * - */ - -#define DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_link_pm_usb.h" - -static inline void start_hub_work(struct link_pm_data *pm_data, int delay) -{ - if (pm_data->hub_work_running == false) { - pm_data->hub_work_running = true; - wake_lock(&pm_data->hub_lock); - mif_debug("link_pm_hub_work is started\n"); - } - - schedule_delayed_work(&pm_data->link_pm_hub, msecs_to_jiffies(delay)); -} - -static inline void end_hub_work(struct link_pm_data *pm_data) -{ - wake_unlock(&pm_data->hub_lock); - pm_data->hub_work_running = false; - mif_debug("link_pm_hub_work is done\n"); -} - -bool link_pm_is_connected(struct usb_link_device *usb_ld) -{ - if (has_hub(usb_ld)) { - struct link_pm_data *pm_data = usb_ld->link_pm_data; - if (pm_data->hub_init_lock) - return false; - - if (pm_data->hub_status == HUB_STATE_OFF) { - if (pm_data->hub_work_running == false) - start_hub_work(pm_data, 0); - return false; - } - } - - if (!usb_ld->if_usb_connected) { - mif_err("mif: if not connected\n"); - return false; - } - - return true; -} - -void link_pm_preactive(struct link_pm_data *pm_data) -{ - if (pm_data->root_hub) { - mif_info("pre-active\n"); - pm_data->hub_on_retry_cnt = 0; - complete(&pm_data->hub_active); - pm_runtime_put_sync(pm_data->root_hub); - } - - pm_data->hub_status = HUB_STATE_ACTIVE; -} - -static void link_pm_hub_work(struct work_struct *work) -{ - int err; - struct link_pm_data *pm_data = - container_of(work, struct link_pm_data, link_pm_hub.work); - - if (pm_data->hub_status == HUB_STATE_ACTIVE) { - end_hub_work(pm_data); - return; - } - - if (!pm_data->port_enable) { - mif_err("mif: hub power func not assinged\n"); - end_hub_work(pm_data); - return; - } - - /* If kernel if suspend, wait the ehci resume */ - if (pm_data->dpm_suspending) { - mif_info("dpm_suspending\n"); - start_hub_work(pm_data, 500); - return; - } - - switch (pm_data->hub_status) { - case HUB_STATE_OFF: - pm_data->hub_status = HUB_STATE_RESUMMING; - mif_trace("hub off->on\n"); - - /* skip 1st time before first probe */ - if (pm_data->root_hub) - pm_runtime_get_sync(pm_data->root_hub); - err = pm_data->port_enable(2, 1); - if (err < 0) { - mif_err("hub on fail err=%d\n", err); - err = pm_data->port_enable(2, 0); - if (err < 0) - mif_err("hub off fail err=%d\n", err); - pm_data->hub_status = HUB_STATE_OFF; - if (pm_data->root_hub) - pm_runtime_put_sync(pm_data->root_hub); - end_hub_work(pm_data); - } else { - /* resume root hub */ - start_hub_work(pm_data, 100); - } - break; - case HUB_STATE_RESUMMING: - if (pm_data->hub_on_retry_cnt++ > 50) { - pm_data->hub_on_retry_cnt = 0; - pm_data->hub_status = HUB_STATE_OFF; - if (pm_data->root_hub) - pm_runtime_put_sync(pm_data->root_hub); - end_hub_work(pm_data); - } else { - mif_info("hub resumming: %d\n", - pm_data->hub_on_retry_cnt); - start_hub_work(pm_data, 200); - } - break; - } -exit: - return; -} - -static int link_pm_hub_standby(void *args) -{ - struct link_pm_data *pm_data = args; - struct usb_link_device *usb_ld = pm_data->usb_ld; - int err = 0; - - if (!pm_data->port_enable) { - mif_err("port power func not assinged\n"); - return -ENODEV; - } - - err = pm_data->port_enable(2, 0); - if (err < 0) - mif_err("hub off fail err=%d\n", err); - - pm_data->hub_status = HUB_STATE_OFF; - - /* this function is atomic. - * make force disconnect in workqueue.. - */ - if (pm_data->usb_ld->if_usb_connected) - schedule_work(&usb_ld->disconnect_work); - - return err; -} - -bool link_pm_set_active(struct usb_link_device *usb_ld) -{ - int ret; - struct link_pm_data *pm_data = usb_ld->link_pm_data; - - if (has_hub(usb_ld)) { - if (pm_data->hub_status != HUB_STATE_ACTIVE) { - INIT_COMPLETION(pm_data->hub_active); - SET_SLAVE_WAKEUP(usb_ld->pdata, 1); - ret = wait_for_completion_timeout(&pm_data->hub_active, - msecs_to_jiffies(2000)); - if (!ret) { /*timeout*/ - mif_err("hub on timeout - retry\n"); - SET_SLAVE_WAKEUP(usb_ld->pdata, 0); - queue_delayed_work(usb_ld->ld.tx_wq, - &usb_ld->ld.tx_delayed_work, 0); - return false; - } - } - } else { - /* TODO do something */ - } - return true; -} - -static long link_pm_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int value, err = 0; - struct link_pm_data *pm_data = file->private_data; - struct usb_link_device *usb_ld = pm_data->usb_ld; - - mif_info("cmd: 0x%08x\n", cmd); - - switch (cmd) { - case IOCTL_LINK_CONTROL_ACTIVE: - if (copy_from_user(&value, (const void __user *)arg, - sizeof(int))) - return -EFAULT; - gpio_set_value(pm_data->gpio_link_active, value); - break; - case IOCTL_LINK_GET_HOSTWAKE: - return !gpio_get_value(pm_data->gpio_link_hostwake); - case IOCTL_LINK_CONNECTED: - return usb_ld->if_usb_connected; - case IOCTL_LINK_PORT_ON: - /* ignore cp host wakeup irq, set the hub_init_lock when AP try - CP off and release hub_init_lock when CP boot done */ - pm_data->hub_init_lock = 0; - if (pm_data->root_hub) - pm_runtime_get_sync(pm_data->root_hub); - if (pm_data->port_enable) { - err = pm_data->port_enable(2, 1); - if (err < 0) { - mif_err("hub on fail err=%d\n", err); - goto exit; - } - pm_data->hub_status = HUB_STATE_RESUMMING; - } - break; - case IOCTL_LINK_PORT_OFF: - err = link_pm_hub_standby(pm_data); - if (err < 0) { - mif_err("usb3503 active fail\n"); - goto exit; - } - pm_data->hub_init_lock = 1; - pm_data->hub_handshake_done = 0; - break; - default: - break; - } -exit: - return err; -} - -static ssize_t show_autosuspend(struct device *dev, - struct device_attribute *attr, char *buf) -{ - char *p = buf; - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct link_pm_data *pm_data = container_of(miscdev, - struct link_pm_data, miscdev); - struct usb_link_device *usb_ld = pm_data->usb_ld; - - p += sprintf(buf, "%s\n", pm_data->autosuspend ? "on" : "off"); - - return p - buf; -} - -static ssize_t store_autosuspend(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct link_pm_data *pm_data = container_of(miscdev, - struct link_pm_data, miscdev); - struct usb_link_device *usb_ld = pm_data->usb_ld; - struct task_struct *task = get_current(); - char taskname[TASK_COMM_LEN]; - - mif_info("autosuspend: %s: %s(%d)'\n", - buf, get_task_comm(taskname, task), task->pid); - - if (!strncmp(buf, "on", 2)) { - pm_data->autosuspend = true; - if (usb_ld->usbdev) - pm_runtime_allow(&usb_ld->usbdev->dev); - } else if (!strncmp(buf, "off", 3)) { - pm_data->autosuspend = false; - if (usb_ld->usbdev) - pm_runtime_forbid(&usb_ld->usbdev->dev); - } - - return count; -} - -static struct device_attribute attr_autosuspend = - __ATTR(autosuspend, S_IRUGO | S_IWUSR, - show_autosuspend, store_autosuspend); - -static int link_pm_open(struct inode *inode, struct file *file) -{ - struct link_pm_data *pm_data = - (struct link_pm_data *)file->private_data; - file->private_data = (void *)pm_data; - return 0; -} - -static int link_pm_release(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - return 0; -} - -static const struct file_operations link_pm_fops = { - .owner = THIS_MODULE, - .open = link_pm_open, - .release = link_pm_release, - .unlocked_ioctl = link_pm_ioctl, -}; - -static int link_pm_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - struct link_pm_data *pm_data = - container_of(this, struct link_pm_data, pm_notifier); - struct usb_link_device *usb_ld = pm_data->usb_ld; - - switch (event) { - case PM_SUSPEND_PREPARE: - pm_data->dpm_suspending = true; - if (has_hub(usb_ld)) - link_pm_hub_standby(pm_data); - return NOTIFY_OK; - case PM_POST_SUSPEND: - pm_data->dpm_suspending = false; - return NOTIFY_OK; - } - return NOTIFY_DONE; -} - -int link_pm_init(struct usb_link_device *usb_ld, void *data) -{ - int err; - int irq; - struct platform_device *pdev = (struct platform_device *)data; - struct modem_data *pdata = - (struct modem_data *)pdev->dev.platform_data; - struct modemlink_pm_data *pm_pdata = pdata->link_pm_data; - struct link_pm_data *pm_data = - kzalloc(sizeof(struct link_pm_data), GFP_KERNEL); - if (!pm_data) { - mif_err("link_pm_data is NULL\n"); - return -ENOMEM; - } - /* get link pm data from modemcontrol's platform data */ - pm_data->gpio_link_active = pm_pdata->gpio_link_active; - pm_data->gpio_link_hostwake = pm_pdata->gpio_link_hostwake; - pm_data->gpio_link_slavewake = pm_pdata->gpio_link_slavewake; - pm_data->link_reconnect = pm_pdata->link_reconnect; - pm_data->port_enable = pm_pdata->port_enable; - pm_data->freq_lock = pm_pdata->freq_lock; - pm_data->freq_unlock = pm_pdata->freq_unlock; - pm_data->autosuspend_delay_ms = pm_pdata->autosuspend_delay_ms; - pm_data->autosuspend = true; - - pm_data->usb_ld = usb_ld; - usb_ld->link_pm_data = pm_data; - - pm_data->miscdev.minor = MISC_DYNAMIC_MINOR; - pm_data->miscdev.name = "link_pm"; - pm_data->miscdev.fops = &link_pm_fops; - - err = misc_register(&pm_data->miscdev); - if (err < 0) { - mif_err("fail to register pm device(%d)\n", err); - goto err_misc_register; - } - - err = device_create_file(pm_data->miscdev.this_device, - &attr_autosuspend); - if (err) { - mif_err("fail to create file: autosuspend: %d\n", err); - goto err_create_file; - } - - pm_data->hub_init_lock = 1; - irq = gpio_to_irq(usb_ld->pdata->gpio_host_wakeup); - err = request_threaded_irq(irq, NULL, usb_resume_irq, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, "modem_usb_wake", usb_ld); - if (err) { - mif_err("Failed to allocate an interrupt(%d)\n", irq); - goto err_request_irq; - } - enable_irq_wake(irq); - - pm_data->has_usbhub = pm_pdata->has_usbhub; - - if (has_hub(usb_ld)) { - init_completion(&pm_data->hub_active); - pm_data->hub_status = HUB_STATE_OFF; - pm_data->hub_handshake_done = 0; - pm_data->root_hub = NULL; - - pm_pdata->hub_standby = link_pm_hub_standby; - pm_pdata->hub_pm_data = pm_data; - - wake_lock_init(&pm_data->hub_lock, WAKE_LOCK_SUSPEND, - "modem_hub_enum_lock"); - INIT_DELAYED_WORK(&pm_data->link_pm_hub, link_pm_hub_work); - pm_data->hub_work_running = false; - } - - pm_data->pm_notifier.notifier_call = link_pm_notifier_event; - register_pm_notifier(&pm_data->pm_notifier); - - return 0; - -err_request_irq: -err_create_file: - misc_deregister(&pm_data->miscdev); -err_misc_register: - kfree(pm_data); - return err; -} diff --git a/drivers/misc/modem_if_u1/modem_link_pm_usb.h b/drivers/misc/modem_if_u1/modem_link_pm_usb.h deleted file mode 100644 index d26af76..0000000 --- a/drivers/misc/modem_if_u1/modem_link_pm_usb.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2012 Samsung Electronics. - * - * 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 __MODEM_LINK_PM_USB_H__ -#define __MODEM_LINK_PM_USB_H__ - -#include -#include "modem_prj.h" -#include "modem_link_device_usb.h" - -struct link_pm_data { - struct miscdevice miscdev; - struct usb_link_device *usb_ld; - unsigned gpio_link_active; - unsigned gpio_link_hostwake; - unsigned gpio_link_slavewake; - int (*link_reconnect)(void); - int link_reconnect_cnt; - - struct workqueue_struct *wq; - struct completion active_done; - -/*USB3503*/ - struct completion hub_active; - int hub_status; - bool has_usbhub; - /* ignore hub on by host wakeup irq before cp power on*/ - int hub_init_lock; - /* C1 stay disconnect status after send 'a', skip 'a' next enumeration*/ - int hub_handshake_done; - struct wake_lock hub_lock; - struct delayed_work link_pm_hub; - bool hub_work_running; - int hub_on_retry_cnt; - struct device *root_hub; - - struct notifier_block pm_notifier; - bool dpm_suspending; - - int (*port_enable)(int, int); - - int (*freq_lock)(struct device *dev); - int (*freq_unlock)(struct device *dev); - - int autosuspend_delay_ms; /* if zero, the default value is used */ - bool autosuspend; -}; - -bool link_pm_set_active(struct usb_link_device *usb_ld); -bool link_pm_is_connected(struct usb_link_device *usb_ld); -void link_pm_preactive(struct link_pm_data *pm_data); -int link_pm_init(struct usb_link_device *usb_ld, void *data); - -#endif diff --git a/drivers/misc/modem_if_u1/modem_modemctl_device_cbp71.c b/drivers/misc/modem_if_u1/modem_modemctl_device_cbp71.c deleted file mode 100644 index 28f2ce7..0000000 --- a/drivers/misc/modem_if_u1/modem_modemctl_device_cbp71.c +++ /dev/null @@ -1,233 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_cbp7.1.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_dpram.h" - -#define PIF_TIMEOUT (180 * HZ) -#define DPRAM_INIT_TIMEOUT (15 * HZ) - -static int cbp71_on(struct modem_ctl *mc) -{ - int RetVal = 0; - int dpram_init_RetVal = 0; - struct link_device *ld = get_current_link(mc->iod); - struct dpram_link_device *dpram_ld = to_dpram_link_device(ld); - - mif_info("cbp71_on()\n"); - - if (!mc->gpio_cp_off || !mc->gpio_cp_reset) { - mif_err("no gpio data\n"); - return -ENXIO; - } - gpio_set_value(mc->gpio_cp_reset, 0); - msleep(600); - gpio_set_value(mc->gpio_cp_reset, 1); - msleep(100); - gpio_set_value(mc->gpio_cp_off, 0); - msleep(300); - - gpio_set_value(mc->gpio_pda_active, 1); - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - - /* Wait here until the PHONE is up. - * Waiting as the this called from IOCTL->UM thread */ - mif_debug("power control waiting for INT_MASK_CMD_PIF_INIT_DONE\n"); - - /* 1HZ = 1 clock tick, 100 default */ - dpram_ld->clear_interrupt(dpram_ld); - - dpram_init_RetVal = - wait_event_interruptible_timeout( - dpram_ld->dpram_init_cmd_wait_q, - dpram_ld->dpram_init_cmd_wait_condition, - DPRAM_INIT_TIMEOUT); - - if (!dpram_init_RetVal) { - /*RetVal will be 0 on timeout, non zero if interrupted */ - mif_err("INIT_START cmd was not arrived.\n"); - mif_err("init_cmd_wait_condition is 0 and wait timeout happend\n"); - return -ENXIO; - } - - RetVal = wait_event_interruptible_timeout( - dpram_ld->modem_pif_init_done_wait_q, - dpram_ld->modem_pif_init_wait_condition, - PIF_TIMEOUT); - - if (!RetVal) { - /*RetVal will be 0 on timeout, non zero if interrupted */ - mif_err("PIF init failed\n"); - mif_err("pif_init_wait_condition is 0 and wait timeout happend\n"); - return -ENXIO; - } - - mif_debug("complete cbp71_on\n"); - - mc->iod->modem_state_changed(mc->iod, STATE_ONLINE); - - return 0; -} - -static int cbp71_off(struct modem_ctl *mc) -{ - mif_debug("cbp71_off()\n"); - - if (!mc->gpio_cp_off || !mc->gpio_cp_reset) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - mif_err("Phone power Off. - do nothing\n"); - - mc->iod->modem_state_changed(mc->iod, STATE_OFFLINE); - - return 0; -} - -static int cbp71_reset(struct modem_ctl *mc) -{ - int ret = 0; - - mif_debug("cbp71_reset()\n"); - - ret = cbp71_off(mc); - if (ret) - return -ENXIO; - - msleep(100); - - ret = cbp71_on(mc); - if (ret) - return -ENXIO; - - return 0; -} - -static int cbp71_boot_on(struct modem_ctl *mc) -{ - mif_debug("cbp71_boot_on()\n"); - - if (!mc->gpio_cp_reset) { - mif_err("no gpio data\n"); - return -ENXIO; - } - gpio_set_value(mc->gpio_cp_reset, 0); - msleep(600); - gpio_set_value(mc->gpio_cp_reset, 1); - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - - return 0; -} - -static int cbp71_boot_off(struct modem_ctl *mc) -{ - mif_debug("cbp71_boot_off()\n"); - return 0; -} - -static irqreturn_t phone_active_irq_handler(int irq, void *_mc) -{ - int phone_reset = 0; - int phone_active_value = 0; - int phone_state = 0; - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - if (!mc->gpio_cp_reset || !mc->gpio_phone_active) { - mif_err("no gpio data\n"); - return IRQ_HANDLED; - } - - phone_reset = gpio_get_value(mc->gpio_cp_reset); - phone_active_value = gpio_get_value(mc->gpio_phone_active); - - if (phone_reset && phone_active_value) - phone_state = STATE_ONLINE; - else if (phone_reset && !phone_active_value) - phone_state = STATE_CRASH_EXIT; - else - phone_state = STATE_OFFLINE; - - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - - if (phone_active_value) - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_LOW); - else - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_HIGH); - - mif_info("phone_active_irq_handler : phone_state=%d\n", phone_state); - - return IRQ_HANDLED; -} - -static void cbp71_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = cbp71_on; - mc->ops.modem_off = cbp71_off; - mc->ops.modem_reset = cbp71_reset; - mc->ops.modem_boot_on = cbp71_boot_on; - mc->ops.modem_boot_off = cbp71_boot_off; -} - -int cbp71_init_modemctl_device(struct modem_ctl *mc, - struct modem_data *pdata) -{ - int ret = 0; - struct platform_device *pdev; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_reset_req_n = pdata->gpio_reset_req_n; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel; - mc->gpio_cp_warm_reset = pdata->gpio_cp_warm_reset; - mc->gpio_cp_off = pdata->gpio_cp_off; - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = platform_get_irq(pdev, 0); - - cbp71_get_ops(mc); - - /*TODO: check*/ - ret = request_irq(mc->irq_phone_active, phone_active_irq_handler, - IRQF_TRIGGER_HIGH, "phone_active", mc); - if (ret) { - mif_err("failed to irq_phone_active request_irq: %d\n" - , ret); - return ret; - } - - ret = enable_irq_wake(mc->irq_phone_active); - if (ret) - mif_err("failed to enable_irq_wake:%d\n", ret); - - return ret; -} diff --git a/drivers/misc/modem_if_u1/modem_modemctl_device_cbp72.c b/drivers/misc/modem_if_u1/modem_modemctl_device_cbp72.c deleted file mode 100644 index 2617be8..0000000 --- a/drivers/misc/modem_if_u1/modem_modemctl_device_cbp72.c +++ /dev/null @@ -1,273 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_cbp7.1.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_dpram.h" - -#define PIF_TIMEOUT (180 * HZ) -#define DPRAM_INIT_TIMEOUT (30 * HZ) - - -static irqreturn_t phone_active_handler(int irq, void *arg) -{ - struct modem_ctl *mc = (struct modem_ctl *)arg; - int phone_reset = gpio_get_value(mc->gpio_cp_reset); - int phone_active = gpio_get_value(mc->gpio_phone_active); - int phone_state = mc->phone_state; - - mif_info("state = %d, phone_reset = %d, phone_active = %d\n", - phone_state, phone_reset, phone_active); - - if (phone_reset && phone_active) { - if (mc->phone_state == STATE_BOOTING) { - phone_state = STATE_ONLINE; - mc->bootd->modem_state_changed(mc->bootd, phone_state); - } - } else if (phone_reset && !phone_active) { - if (mc->phone_state == STATE_ONLINE) { - phone_state = STATE_CRASH_EXIT; - mc->bootd->modem_state_changed(mc->bootd, phone_state); - } - } else { - phone_state = STATE_OFFLINE; - if (mc->bootd && mc->bootd->modem_state_changed) - mc->bootd->modem_state_changed(mc->bootd, phone_state); - } - - if (phone_active) - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_LOW); - else - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_HIGH); - - mif_info("phone_state = %d\n", phone_state); - - return IRQ_HANDLED; -} - -static int cbp72_on(struct modem_ctl *mc) -{ - mif_info("start!!!\n"); - - /* prevent sleep during bootloader downloading */ - if (!wake_lock_active(&mc->mc_wake_lock)) - wake_lock(&mc->mc_wake_lock); - - gpio_set_value(mc->gpio_cp_on, 0); - if (mc->gpio_cp_off) - gpio_set_value(mc->gpio_cp_off, 1); - gpio_set_value(mc->gpio_cp_reset, 0); - - msleep(500); - - gpio_set_value(mc->gpio_cp_on, 1); - if (mc->gpio_cp_off) - gpio_set_value(mc->gpio_cp_off, 0); - - msleep(100); - - gpio_set_value(mc->gpio_cp_reset, 1); - - msleep(300); - - gpio_set_value(mc->gpio_pda_active, 1); - - mc->bootd->modem_state_changed(mc->bootd, STATE_BOOTING); - - mif_info("complete!!!\n"); - - return 0; -} - -static int cbp72_off(struct modem_ctl *mc) -{ - mif_info("cbp72_off()\n"); - - if (!mc->gpio_cp_off || !mc->gpio_cp_reset) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_on, 0); - gpio_set_value(mc->gpio_cp_off, 1); - - mc->bootd->modem_state_changed(mc->bootd, STATE_OFFLINE); - - return 0; -} - -static int cbp72_reset(struct modem_ctl *mc) -{ - int ret = 0; - - mif_debug("cbp72_reset()\n"); - - ret = cbp72_off(mc); - if (ret) - return -ENXIO; - - msleep(100); - - ret = cbp72_on(mc); - if (ret) - return -ENXIO; - - return 0; -} - -static int cbp72_boot_on(struct modem_ctl *mc) -{ - mif_info("\n"); - - if (!mc->gpio_cp_reset) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_reset, 0); - - msleep(600); - - gpio_set_value(mc->gpio_cp_reset, 1); - - mc->bootd->modem_state_changed(mc->bootd, STATE_BOOTING); - - return 0; -} - -static int cbp72_boot_off(struct modem_ctl *mc) -{ - int ret; - struct link_device *ld = get_current_link(mc->bootd); - struct dpram_link_device *dpld = to_dpram_link_device(ld); - mif_debug("\n"); - /* Wait here until the PHONE is up. - * Waiting as the this called from IOCTL->UM thread */ - mif_info("Waiting for INT_CMD_PHONE_START\n"); - ret = wait_for_completion_interruptible_timeout( - &dpld->dpram_init_cmd, DPRAM_INIT_TIMEOUT); - if (!ret) { - /* ret == 0 on timeout, ret < 0 if interrupted */ - mif_err("Timeout!!! (PHONE_START was not arrived.)\n"); - return -ENXIO; - } - - mif_info("Waiting for INT_CMD_PIF_INIT_DONE\n"); - ret = wait_for_completion_interruptible_timeout( - &dpld->modem_pif_init_done, PIF_TIMEOUT); - if (!ret) { - mif_err("Timeout!!! (PIF_INIT_DONE was not arrived.)\n"); - return -ENXIO; - } - mc->bootd->modem_state_changed(mc->bootd, STATE_ONLINE); - - wake_unlock(&mc->mc_wake_lock); - - return 0; -} - -static int cbp72_force_crash_exit(struct modem_ctl *mc) -{ - struct link_device *ld = get_current_link(mc->bootd); - - mif_err("device = %s\n", mc->bootd->name); - - /* Make DUMP start */ - ld->force_dump(ld, mc->bootd); - - msleep_interruptible(1000); - - mc->bootd->modem_state_changed(mc->bootd, STATE_CRASH_EXIT); - - return 0; -} - -static void cbp72_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = cbp72_on; - mc->ops.modem_off = cbp72_off; - mc->ops.modem_reset = cbp72_reset; - mc->ops.modem_boot_on = cbp72_boot_on; - mc->ops.modem_boot_off = cbp72_boot_off; - mc->ops.modem_force_crash_exit = cbp72_force_crash_exit; -} - -int cbp72_init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) -{ - int ret = 0; - int irq = 0; - unsigned long flag = 0; - struct platform_device *pdev = NULL; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_cp_off = pdata->gpio_cp_off; - mc->gpio_reset_req_n = pdata->gpio_reset_req_n; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel; - mc->gpio_cp_warm_reset = pdata->gpio_cp_warm_reset; - - if (!mc->gpio_cp_on || !mc->gpio_cp_reset || !mc->gpio_phone_active) { - mif_err("no GPIO data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_reset, 0); - if (mc->gpio_cp_off) - gpio_set_value(mc->gpio_cp_off, 1); - gpio_set_value(mc->gpio_cp_on, 0); - - cbp72_get_ops(mc); - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = platform_get_irq_byname(pdev, "cp_active_irq"); - if (!mc->irq_phone_active) { - mif_err("get irq fail\n"); - return -1; - } - - irq = mc->irq_phone_active; - mif_info("PHONE_ACTIVE IRQ# = %d\n", irq); - - flag = IRQF_TRIGGER_HIGH; - ret = request_irq(irq, phone_active_handler, flag, "cbp_active", mc); - if (ret) { - mif_err("request_irq fail (%d)\n", ret); - return ret; - } - - wake_lock_init(&mc->mc_wake_lock, WAKE_LOCK_SUSPEND, "cbp72_wake_lock"); - - ret = enable_irq_wake(irq); - if (ret) - mif_err("enable_irq_wake fail (%d)\n", ret); - - return 0; -} - diff --git a/drivers/misc/modem_if_u1/modem_modemctl_device_cmc221.c b/drivers/misc/modem_if_u1/modem_modemctl_device_cmc221.c deleted file mode 100644 index eddc91a..0000000 --- a/drivers/misc/modem_if_u1/modem_modemctl_device_cmc221.c +++ /dev/null @@ -1,317 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_cmc221.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ -#include - -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_link_device_usb.h" -#include "modem_link_device_dpram.h" -#include "modem_utils.h" - -#define PIF_TIMEOUT (180 * HZ) -#define DPRAM_INIT_TIMEOUT (30 * HZ) - -static void mc_state_fsm(struct modem_ctl *mc) -{ - struct link_device *ld = get_current_link(mc->iod); - int cp_on = gpio_get_value(mc->gpio_cp_on); - int cp_reset = gpio_get_value(mc->gpio_cp_reset); - int cp_active = gpio_get_value(mc->gpio_phone_active); - int old_state = mc->phone_state; - int new_state = mc->phone_state; - - mif_err("%s: old_state:%d cp_on:%d cp_reset:%d cp_active:%d\n", - mc->name, old_state, cp_on, cp_reset, cp_active); - - if (!cp_active) { - if (!cp_on) { - gpio_set_value(mc->gpio_cp_reset, 0); - new_state = STATE_OFFLINE; - ld->mode = LINK_MODE_OFFLINE; - mif_err("%s: new_state = PHONE_PWR_OFF\n", mc->name); - } else if (old_state == STATE_ONLINE) { - new_state = STATE_CRASH_EXIT; - mif_err("%s: new_state = CRASH_EXIT\n", mc->name); - } else { - mif_err("%s: Don't care!!!\n", mc->name); - } - } - - if (old_state != new_state) { - mc->bootd->modem_state_changed(mc->bootd, new_state); - mc->iod->modem_state_changed(mc->iod, new_state); - } -} - -static irqreturn_t phone_active_handler(int irq, void *arg) -{ - struct modem_ctl *mc = (struct modem_ctl *)arg; - int cp_reset = gpio_get_value(mc->gpio_cp_reset); - - if (cp_reset) - mc_state_fsm(mc); - - return IRQ_HANDLED; -} - -/* TX dynamic switching between DPRAM and USB in one modem */ -static irqreturn_t dynamic_switching_handler(int irq, void *arg) -{ - struct modem_ctl *mc = (struct modem_ctl *)arg; - int txpath = gpio_get_value(mc->gpio_dynamic_switching); - bool enumerated = usb_is_enumerated(mc->msd); - - mif_err("txpath=%d, enumeration=%d\n", txpath, enumerated); - - /* do not switch to USB, when USB is not enumerated. */ - if (!enumerated && txpath) { - mc->need_switch_to_usb = true; - return IRQ_HANDLED; - } - - mc->need_switch_to_usb = false; - rawdevs_set_tx_link(mc->msd, txpath ? LINKDEV_USB : LINKDEV_DPRAM); - - return IRQ_HANDLED; -} - -static int cmc221_on(struct modem_ctl *mc) -{ - struct link_device *ld = get_current_link(mc->iod); - - if (!wake_lock_active(&mc->mc_wake_lock)) - wake_lock(&mc->mc_wake_lock); - set_sromc_access(true); - - mc->phone_state = STATE_OFFLINE; - ld->mode = LINK_MODE_OFFLINE; - - mif_err("%s\n", mc->name); - - disable_irq_nosync(mc->irq_phone_active); - - gpio_set_value(mc->gpio_cp_on, 0); - msleep(100); - - gpio_set_value(mc->gpio_cp_reset, 0); - msleep(500); - - gpio_set_value(mc->gpio_cp_on, 1); - msleep(100); - - gpio_set_value(mc->gpio_cp_reset, 1); - - return 0; -} - -static int cmc221_off(struct modem_ctl *mc) -{ - int cp_on = gpio_get_value(mc->gpio_cp_on); - - mif_err("%s\n", mc->name); - - if (mc->phone_state == STATE_OFFLINE || cp_on == 0) - return 0; - - if (!wake_lock_active(&mc->mc_wake_lock)) - wake_lock(&mc->mc_wake_lock); - set_sromc_access(true); - - gpio_set_value(mc->gpio_cp_on, 0); - - return 0; -} - -static int cmc221_force_crash_exit(struct modem_ctl *mc) -{ - struct link_device *ld = get_current_link(mc->bootd); - - mif_err("%s\n", mc->name); - - /* Make DUMP start */ - ld->force_dump(ld, mc->bootd); - - return 0; -} - -static int cmc221_dump_reset(struct modem_ctl *mc) -{ - mif_err("%s\n", mc->name); - - if (!wake_lock_active(&mc->mc_wake_lock)) - wake_lock(&mc->mc_wake_lock); - set_sromc_access(true); - - gpio_set_value(mc->gpio_host_active, 0); - gpio_set_value(mc->gpio_cp_reset, 0); - - udelay(200); - - gpio_set_value(mc->gpio_cp_reset, 1); - - msleep(300); - - return 0; -} - -static int cmc221_reset(struct modem_ctl *mc) -{ - mif_err("%s\n", mc->name); - - if (cmc221_off(mc)) - return -ENXIO; - - msleep(100); - - if (cmc221_on(mc)) - return -ENXIO; - - return 0; -} - -static int cmc221_boot_on(struct modem_ctl *mc) -{ - mif_err("%s\n", mc->name); - - gpio_set_value(mc->gpio_pda_active, 1); - - mc->bootd->modem_state_changed(mc->bootd, STATE_BOOTING); - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - - return 0; -} - -static int cmc221_boot_off(struct modem_ctl *mc) -{ - int ret; - struct link_device *ld = get_current_link(mc->bootd); - struct dpram_link_device *dpld = to_dpram_link_device(ld); - - mif_err("%s\n", mc->name); - - ret = wait_for_completion_interruptible_timeout(&dpld->dpram_init_cmd, - DPRAM_INIT_TIMEOUT); - if (!ret) { - /* ret == 0 on timeout, ret < 0 if interrupted */ - mif_err("%s: ERR! timeout (CP_START not arrived)\n", mc->name); - return -ENXIO; - } - - enable_irq(mc->irq_phone_active); - - return 0; -} - -static int cmc221_boot_done(struct modem_ctl *mc) -{ - mif_err("%s\n", mc->name); - - set_sromc_access(false); - if (wake_lock_active(&mc->mc_wake_lock)) - wake_unlock(&mc->mc_wake_lock); - - return 0; -} - -static void cmc221_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = cmc221_on; - mc->ops.modem_off = cmc221_off; - mc->ops.modem_reset = cmc221_reset; - mc->ops.modem_boot_on = cmc221_boot_on; - mc->ops.modem_boot_off = cmc221_boot_off; - mc->ops.modem_boot_done = cmc221_boot_done; - mc->ops.modem_force_crash_exit = cmc221_force_crash_exit; - mc->ops.modem_dump_reset = cmc221_dump_reset; -} - -int cmc221_init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) -{ - int ret = 0; - int irq = 0; - unsigned long flag = 0; - struct platform_device *pdev = NULL; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_pda_active = pdata->gpio_pda_active; -#if 0 /*TODO: check the GPIO map*/ - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel; - mc->gpio_slave_wakeup = pdata->gpio_slave_wakeup; - mc->gpio_host_active = pdata->gpio_host_active; - mc->gpio_host_wakeup = pdata->gpio_host_wakeup; -#endif - mc->gpio_dynamic_switching = pdata->gpio_dynamic_switching; - mc->need_switch_to_usb = false; - - if (!mc->gpio_cp_on || !mc->gpio_cp_reset || !mc->gpio_phone_active) { - mif_err("%s: ERR! no GPIO data\n", mc->name); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_on, 0); - - cmc221_get_ops(mc); - dev_set_drvdata(mc->dev, mc); - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = platform_get_irq_byname(pdev, STR_CP_ACTIVE_IRQ); - if (!mc->irq_phone_active) { - mif_err("%s: ERR! get cp_active_irq fail\n", mc->name); - return -1; - } - mif_err("%s: PHONE_ACTIVE IRQ# = %d\n", mc->name, mc->irq_phone_active); - - wake_lock_init(&mc->mc_wake_lock, WAKE_LOCK_SUSPEND, "cmc_wake_lock"); - - flag = IRQF_TRIGGER_FALLING | IRQF_NO_SUSPEND; - irq = mc->irq_phone_active; - ret = request_irq(irq, phone_active_handler, flag, "cmc_active", mc); - if (ret) { - mif_err("%s: ERR! request_irq(#%d) fail (err %d)\n", - mc->name, irq, ret); - return ret; - } - ret = enable_irq_wake(irq); - if (ret) { - mif_err("%s: WARNING! enable_irq_wake(#%d) fail (err %d)\n", - mc->name, irq, ret); - } - - flag = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_NO_SUSPEND; - if (mc->gpio_dynamic_switching) { - irq = gpio_to_irq(mc->gpio_dynamic_switching); - mif_err("%s: DYNAMIC_SWITCH IRQ# = %d\n", mc->name, irq); - ret = request_irq(irq, dynamic_switching_handler, flag, - "dynamic_switching", mc); - if (ret) { - mif_err("%s: ERR! request_irq(#%d) fail (err %d)\n", - mc->name, irq, ret); - return ret; - } - } - - return 0; -} diff --git a/drivers/misc/modem_if_u1/modem_modemctl_device_esc6270.c b/drivers/misc/modem_if_u1/modem_modemctl_device_esc6270.c deleted file mode 100644 index adc2eee..0000000 --- a/drivers/misc/modem_if_u1/modem_modemctl_device_esc6270.c +++ /dev/null @@ -1,343 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_esc6270.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include - -#include - -#if defined(CONFIG_LINK_DEVICE_DPRAM) -#include "modem_link_device_dpram.h" -#elif defined(CONFIG_LINK_DEVICE_PLD) -#include "modem_link_device_pld.h" -#endif - -#if defined(CONFIG_LINK_DEVICE_DPRAM) || defined(CONFIG_LINK_DEVICE_PLD) -#include - -#define PIF_TIMEOUT (180 * HZ) -#define DPRAM_INIT_TIMEOUT (30 * HZ) - -static int esc6270_on(struct modem_ctl *mc) -{ - int ret; - struct link_device *ld = get_current_link(mc->iod); - - pr_info("[MODEM_IF:ESC] <%s> start!!!\n", __func__); - - if (!mc->gpio_cp_reset) { - pr_err("[MODEM_IF:ESC] no gpio data\n"); - return -ENXIO; - } - - if (mc->gpio_reset_req_n) - gpio_set_value(mc->gpio_reset_req_n, 1); - - gpio_set_value(mc->gpio_cp_reset, 1); - msleep(30); - - gpio_set_value(mc->gpio_cp_on, 1); - msleep(500); - - gpio_set_value(mc->gpio_cp_on, 0); - msleep(500); - - gpio_set_value(mc->gpio_pda_active, 1); - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - ld->mode = LINK_MODE_BOOT; - - return 0; -} - -static int esc6270_off(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF:ESC] esc6270_off()\n"); - -#if 1 - if (!mc->gpio_cp_reset) { - pr_err("[MODEM_IF:ESC] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_on, 0); -#endif - - mc->iod->modem_state_changed(mc->iod, STATE_OFFLINE); - - return 0; -} - -static int esc6270_reset(struct modem_ctl *mc) -{ - int ret = 0; - - pr_debug("[MODEM_IF:ESC] esc6270_reset()\n"); - - ret = esc6270_off(mc); - if (ret) - return -ENXIO; - - msleep(100); - - ret = esc6270_on(mc); - if (ret) - return -ENXIO; - - return 0; -} - -int esc6270_boot_on(struct modem_ctl *mc) -{ - struct link_device *ld = get_current_link(mc->iod); -#if defined(CONFIG_LINK_DEVICE_DPRAM) - /* clear intr */ - struct dpram_link_device *dpld = to_dpram_link_device(ld); - u16 recv_msg = dpld->recv_intr(dpld); - - pr_info("[MODEM_IF:ESC] dpram intr: %x\n", recv_msg); -#endif - - pr_info("[MODEM_IF:ESC] <%s>\n", __func__); - - /* Need to init uart byt gpio_flm_uart_sel GPIO */ - if (!mc->gpio_cp_reset || !mc->gpio_flm_uart_sel) { - pr_err("[MODEM_IF:ESC] no gpio data\n"); - return -ENXIO; - } - gpio_set_value(mc->gpio_flm_uart_sel, 1); - - pr_info(" - ESC_PHONE_ON : %d, ESC_RESET_N : %d\n", - gpio_get_value(mc->gpio_cp_on), - gpio_get_value(mc->gpio_cp_reset)); - - gpio_set_value(mc->gpio_cp_on, 0); - gpio_direction_output(mc->gpio_cp_reset, 0); - msleep(100); - - gpio_direction_output(mc->gpio_cp_on, 1); - msleep(44); - - pr_info(" - ESC_PHONE_ON : %d, ESC_RESET_N : %d\n", - gpio_get_value(mc->gpio_cp_on), - gpio_get_value(mc->gpio_cp_reset)); - - gpio_direction_input(mc->gpio_cp_reset); - msleep(600); - gpio_direction_output(mc->gpio_cp_on, 0); - - msleep(20); - pr_info(" - ESC_PHONE_ON : %d, ESC_RESET_N : %d\n", - gpio_get_value(mc->gpio_cp_on), - gpio_get_value(mc->gpio_cp_reset)); - -#if defined(CONFIG_LINK_DEVICE_PLD) - gpio_direction_output(mc->gpio_fpga_cs_n, 1); -#endif - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - ld->mode = LINK_MODE_BOOT; - - return 0; -} - -static int esc6270_boot_off(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF:ESC] <%s>\n", __func__); - - if (!mc->gpio_flm_uart_sel) { - pr_err("[MODEM_IF:ESC] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_flm_uart_sel, 0); - - mc->iod->modem_state_changed(mc->iod, STATE_OFFLINE); - - return 0; -} - -static int esc6270_active_count; - -static irqreturn_t phone_active_irq_handler(int irq, void *arg) -{ - struct modem_ctl *mc = (struct modem_ctl *)arg; - int phone_reset = 0; - int phone_active = 0; - int phone_state = 0; - int cp_dump_int = 0; - - if (!mc->gpio_cp_reset || - !mc->gpio_phone_active) { /* || !mc->gpio_cp_dump_int) { */ - pr_err("[MODEM_IF:ESC] no gpio data\n"); - return IRQ_HANDLED; - } - - phone_reset = gpio_get_value(mc->gpio_cp_reset); - phone_active = gpio_get_value(mc->gpio_phone_active); - cp_dump_int = gpio_get_value(mc->gpio_cp_dump_int); - - pr_info("[MODEM_IF:ESC] <%s> phone_reset=%d, phone_active=%d, cp_dump_int=%d\n", - __func__, phone_reset, phone_active, cp_dump_int); - - if (phone_reset && phone_active) { - phone_state = STATE_ONLINE; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - } else if (phone_reset && !phone_active) { - if (mc->phone_state == STATE_ONLINE) { - phone_state = STATE_CRASH_EXIT; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, - phone_state); - } - } else { - phone_state = STATE_OFFLINE; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - } - - if (phone_active) - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_LOW); - else - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_HIGH); - - pr_info("[MODEM_IF::ESC] <%s> phone_state = %d\n", - __func__, phone_state); - - return IRQ_HANDLED; -} - -#if defined(CONFIG_SIM_DETECT) -static irqreturn_t sim_detect_irq_handler(int irq, void *_mc) -{ - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - pr_info("[MODEM_IF:ESC] <%s> gpio_sim_detect = %d\n", - __func__, gpio_get_value(mc->gpio_sim_detect)); - - if (mc->iod && mc->iod->sim_state_changed) - mc->iod->sim_state_changed(mc->iod, - !gpio_get_value(mc->gpio_sim_detect)); - - return IRQ_HANDLED; -} -#endif - -static void esc6270_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = esc6270_on; - mc->ops.modem_off = esc6270_off; - mc->ops.modem_reset = esc6270_reset; - mc->ops.modem_boot_on = esc6270_boot_on; - mc->ops.modem_boot_off = esc6270_boot_off; -} - -int esc6270_init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) -{ - int ret = 0; - struct platform_device *pdev; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_reset_req_n = pdata->gpio_reset_req_n; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel; - mc->gpio_cp_warm_reset = pdata->gpio_cp_warm_reset; - mc->gpio_sim_detect = pdata->gpio_sim_detect; - -#if defined(CONFIG_LINK_DEVICE_PLD) - mc->gpio_fpga_cs_n = pdata->gpio_fpga1_cs_n; -#endif - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_on, 0); - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = platform_get_irq_byname(pdev, "cp_active_irq"); - pr_info("[MODEM_IF:ESC] <%s> PHONE_ACTIVE IRQ# = %d\n", - __func__, mc->irq_phone_active); - - esc6270_get_ops(mc); - - if (mc->irq_phone_active) { - ret = request_irq(mc->irq_phone_active, - phone_active_irq_handler, - IRQF_TRIGGER_HIGH, - "esc_active", - mc); - if (ret) { - pr_err("[MODEM_IF:ESC] <%s> failed to request_irq IRQ# %d (err=%d)\n", - __func__, mc->irq_phone_active, ret); - return ret; - } - - ret = enable_irq_wake(mc->irq_phone_active); - if (ret) { - pr_err("[MODEM_IF:ESC] %s: failed to enable_irq_wake IRQ# %d (err=%d)\n", - __func__, mc->irq_phone_active, ret); - free_irq(mc->irq_phone_active, mc); - return ret; - } - } - -#if defined(CONFIG_SIM_DETECT) - mc->irq_sim_detect = platform_get_irq_byname(pdev, "sim_irq"); - pr_info("[MODEM_IF:ESC] <%s> SIM_DECTCT IRQ# = %d\n", - __func__, mc->irq_sim_detect); - - if (mc->irq_sim_detect) { - ret = request_irq(mc->irq_sim_detect, sim_detect_irq_handler, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "esc_sim_detect", mc); - if (ret) { - mif_err("failed to request_irq: %d\n", ret); - mc->sim_state.online = false; - mc->sim_state.changed = false; - return ret; - } - - ret = enable_irq_wake(mc->irq_sim_detect); - if (ret) { - mif_err("failed to enable_irq_wake: %d\n", ret); - free_irq(mc->irq_sim_detect, mc); - mc->sim_state.online = false; - mc->sim_state.changed = false; - return ret; - } - - /* initialize sim_state => insert: gpio=0, remove: gpio=1 */ - mc->sim_state.online = !gpio_get_value(mc->gpio_sim_detect); - } -#endif - - return ret; -} -#endif diff --git a/drivers/misc/modem_if_u1/modem_modemctl_device_mdm6600.c b/drivers/misc/modem_if_u1/modem_modemctl_device_mdm6600.c deleted file mode 100644 index e2f6b0b..0000000 --- a/drivers/misc/modem_if_u1/modem_modemctl_device_mdm6600.c +++ /dev/null @@ -1,790 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_mdm6600.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include - -#include - -#if defined(CONFIG_MACH_M0_CTC) -#include -#endif - -#if defined(CONFIG_MACH_U1_KOR_LGT) -#include - -static int mdm6600_on(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] mdm6600_on()\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_reset_msm || !mc->gpio_cp_on) { - pr_err("[MODEM_IF] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_pda_active, 0); - gpio_set_value(mc->gpio_cp_reset, 1); - gpio_set_value(mc->gpio_cp_reset_msm, 1); - msleep(30); - gpio_set_value(mc->gpio_cp_on, 1); - msleep(300); - gpio_set_value(mc->gpio_cp_on, 0); - msleep(500); - - gpio_set_value(mc->gpio_pda_active, 1); - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - - return 0; -} - -static int mdm6600_off(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] mdm6600_off()\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_reset_msm || !mc->gpio_cp_on) { - pr_err("[MODEM_IF] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_on, 0); - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_reset_msm, 0); - - mc->iod->modem_state_changed(mc->iod, STATE_OFFLINE); - - return 0; -} - -static int mdm6600_reset(struct modem_ctl *mc) -{ - int ret; - - pr_info("[MODEM_IF] mdm6600_reset()\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_reset_msm || !mc->gpio_cp_on) { - pr_err("[MODEM_IF] no gpio data\n"); - return -ENXIO; - } - - if (system_rev >= 0x05) { - dev_err(mc->dev, "[%s] system_rev: %d\n", __func__, system_rev); - - gpio_set_value(mc->gpio_cp_reset_msm, 0); - msleep(100); /* no spec, confirm later exactly how much time - needed to initialize CP with RESET_PMU_N */ - gpio_set_value(mc->gpio_cp_reset_msm, 1); - msleep(40); /* > 37.2 + 2 msec */ - } else { - dev_err(mc->dev, "[%s] system_rev: %d\n", __func__, system_rev); - - gpio_set_value(mc->gpio_cp_reset, 0); - msleep(500); /* no spec, confirm later exactly how much time - needed to initialize CP with RESET_PMU_N */ - gpio_set_value(mc->gpio_cp_reset, 1); - msleep(40); /* > 37.2 + 2 msec */ - } - - return 0; -} - -static int mdm6600_boot_on(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] mdm6600_boot_on()\n"); - - if (!mc->gpio_boot_sw_sel) { - pr_err("[MODEM_IF] no gpio data\n"); - return -ENXIO; - } - - if (mc->vbus_on) - mc->vbus_on(); - - if (mc->gpio_boot_sw_sel) - gpio_set_value(mc->gpio_boot_sw_sel, 0); - mc->usb_boot = true; - - return 0; -} - -static int mdm6600_boot_off(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] mdm6600_boot_off()\n"); - - if (!mc->gpio_boot_sw_sel) { - pr_err("[MODEM_IF] no gpio data\n"); - return -ENXIO; - } - - if (mc->vbus_off) - mc->vbus_off(); - - if (mc->gpio_boot_sw_sel) - gpio_set_value(mc->gpio_boot_sw_sel, 1); - mc->usb_boot = false; - - return 0; -} - -static int count; - -static irqreturn_t phone_active_irq_handler(int irq, void *_mc) -{ - int phone_reset = 0; - int phone_active_value = 0; - int cp_dump_value = 0; - int phone_state = 0; - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - if (!mc->gpio_cp_reset || !mc->gpio_phone_active -/*|| !mc->gpio_cp_dump_int */) { - pr_err("[MODEM_IF] no gpio data\n"); - return IRQ_HANDLED; - } - - phone_reset = gpio_get_value(mc->gpio_cp_reset); - phone_active_value = gpio_get_value(mc->gpio_phone_active); - - pr_info("[MODEM_IF] PA EVENT : reset =%d, pa=%d, cp_dump=%d\n", - phone_reset, phone_active_value, cp_dump_value); - - if (phone_reset && phone_active_value) { - phone_state = STATE_ONLINE; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - } else if (phone_reset && !phone_active_value) { - if (count == 1) { - phone_state = STATE_CRASH_EXIT; - if (mc->iod) { - ld = get_current_link(mc->iod); - if (ld->terminate_comm) - ld->terminate_comm(ld, mc->iod); - } - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed - (mc->iod, phone_state); - count = 0; - } else { - count++; - } - } else { - phone_state = STATE_OFFLINE; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - } - - pr_info("phone_active_irq_handler : phone_state=%d\n", phone_state); - - return IRQ_HANDLED; -} - -static void mdm6600_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = mdm6600_on; - mc->ops.modem_off = mdm6600_off; - mc->ops.modem_reset = mdm6600_reset; - mc->ops.modem_boot_on = mdm6600_boot_on; - mc->ops.modem_boot_off = mdm6600_boot_off; -} - -int mdm6600_init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) -{ - int ret; - struct platform_device *pdev; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_reset_msm = pdata->gpio_cp_reset_msm; - mc->gpio_boot_sw_sel = pdata->gpio_boot_sw_sel; - - mc->vbus_on = pdata->vbus_on; - mc->vbus_off = pdata->vbus_off; - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = platform_get_irq_byname(pdev, "cp_active_irq"); - pr_info("[MODEM_IF] <%s> PHONE_ACTIVE IRQ# = %d\n", - __func__, mc->irq_phone_active); - - mdm6600_get_ops(mc); - - ret = request_irq(mc->irq_phone_active, phone_active_irq_handler, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "phone_active", mc); - if (ret) { - pr_err("[MODEM_IF] %s: failed to request_irq:%d\n", - __func__, ret); - goto err_request_irq; - } - - ret = enable_irq_wake(mc->irq_phone_active); - if (ret) { - pr_err("[MODEM_IF] %s: failed to enable_irq_wake:%d\n", - __func__, ret); - goto err_set_wake_irq; - } - - return ret; - - err_set_wake_irq: - free_irq(mc->irq_phone_active, mc); - err_request_irq: - return ret; -} -#endif /* CONFIG_MACH_U1_KOR_LGT */ - -#if defined(CONFIG_MACH_M0_CTC) || defined(CONFIG_MACH_T0_CHN_CTC) - -#if defined(CONFIG_LINK_DEVICE_DPRAM) -#include "modem_link_device_dpram.h" -#elif defined(CONFIG_LINK_DEVICE_PLD) -#include "modem_link_device_pld.h" -#endif - -#define PIF_TIMEOUT (180 * HZ) -#define DPRAM_INIT_TIMEOUT (30 * HZ) - -#if defined(CONFIG_MACH_M0_DUOSCTC) || defined(CONFIG_MACH_M0_GRANDECTC) || \ - defined(CONFIG_MACH_T0_CHN_CTC) -static void mdm6600_vbus_on(void) -{ - struct regulator *regulator; - - pr_info("[MSM] <%s>\n", __func__); - -#if defined(CONFIG_MACH_T0_CHN_CTC) - if (system_rev == 4) - regulator = regulator_get(NULL, "vcc_1.8v_lcd"); - else - regulator = regulator_get(NULL, "vcc_1.8v_usb"); -#else - regulator = regulator_get(NULL, "vusbhub_osc_1.8v"); -#endif - if (IS_ERR(regulator)) { - pr_err("[MSM] error getting regulator_get <%s>\n", __func__); - return ; - } - regulator_enable(regulator); - regulator_put(regulator); - - pr_info("[MSM] <%s> enable\n", __func__); -} - -static void mdm6600_vbus_off(void) -{ - struct regulator *regulator; - - pr_info("[MSM] <%s>\n", __func__); - -#if defined(CONFIG_MACH_T0_CHN_CTC) - if (system_rev == 4) - regulator = regulator_get(NULL, "vcc_1.8v_lcd"); - else - regulator = regulator_get(NULL, "vcc_1.8v_usb"); -#else - regulator = regulator_get(NULL, "vusbhub_osc_1.8v"); -#endif - if (IS_ERR(regulator)) { - pr_err("[MSM] error getting regulator_get <%s>\n", __func__); - return ; - } - regulator_disable(regulator); - regulator_put(regulator); - - pr_info("[MSM] <%s> disable\n", __func__); -} -#endif - -static int mdm6600_on(struct modem_ctl *mc) -{ - struct link_device *ld = get_current_link(mc->iod); - - pr_info("[MSM] <%s>\n", __func__); - - if (!mc->gpio_reset_req_n || !mc->gpio_cp_reset - || !mc->gpio_cp_on || !mc->gpio_pda_active) { - pr_err("[MSM] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_pda_active, 1); - - gpio_set_value(mc->gpio_cp_on, 1); - msleep(500); - - gpio_set_value(mc->gpio_reset_req_n, 1); - msleep(50); - - gpio_set_value(mc->gpio_cp_reset, 1); - msleep(50); - - gpio_set_value(mc->gpio_cp_on, 0); - msleep(500); - -#if defined(CONFIG_LINK_DEVICE_PLD) - gpio_set_value(mc->gpio_fpga_cs_n, 1); -#endif - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - ld->mode = LINK_MODE_BOOT; - - return 0; -} - -static int mdm6600_off(struct modem_ctl *mc) -{ - pr_info("[MSM] <%s>\n", __func__); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_on) { - pr_err("[MSM] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_reset_req_n, 0); - gpio_set_value(mc->gpio_cp_on, 0); - - msleep(200); - - mc->iod->modem_state_changed(mc->iod, STATE_OFFLINE); - - return 0; -} - -static int mdm6600_reset(struct modem_ctl *mc) -{ - int ret = 0; - struct link_device *ld = get_current_link(mc->iod); - - pr_info("[MSM] <%s>\n", __func__); - - if (!mc->gpio_reset_req_n || !mc->gpio_cp_reset - || !mc->gpio_cp_on || !mc->gpio_pda_active) { - pr_err("[MSM] no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_reset_req_n, 0); - gpio_set_value(mc->gpio_cp_on, 0); - - msleep(100); - - gpio_set_value(mc->gpio_cp_on, 1); - msleep(300); - - gpio_set_value(mc->gpio_reset_req_n, 1); - msleep(50); - - gpio_set_value(mc->gpio_cp_reset, 1); - msleep(50); - - gpio_set_value(mc->gpio_cp_on, 0); - msleep(100); - - gpio_set_value(mc->gpio_pda_active, 1); - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - ld->mode = LINK_MODE_BOOT; - - return 0; -} - -static int mdm6600_boot_on(struct modem_ctl *mc) -{ - struct regulator *regulator; - struct link_device *ld = get_current_link(mc->iod); - struct dpram_link_device *dpld = to_dpram_link_device(ld); - - pr_info("[MSM] <%s>\n", __func__); - - dpld->recv_intr(dpld); - - if (!mc->gpio_flm_uart_sel) { - pr_err("[MSM] no gpio data\n"); - return -ENXIO; - } - -#if defined(CONFIG_MACH_M0_DUOSCTC) || defined(CONFIG_MACH_T0_CHN_CTC) - mdm6600_vbus_on(); -#elif defined(CONFIG_MACH_M0_GRANDECTC) - if (system_rev >= 14) - mdm6600_vbus_on(); -#endif - - pr_info("[MSM] <%s> %s\n", __func__, "USB_BOOT_EN initializing"); - if (system_rev < 11) { - - gpio_direction_output(GPIO_USB_BOOT_EN, 0); - s3c_gpio_setpull(GPIO_USB_BOOT_EN, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN, 0); - - gpio_direction_output(GPIO_BOOT_SW_SEL, 0); - s3c_gpio_setpull(GPIO_BOOT_SW_SEL, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_BOOT_SW_SEL, 0); - - msleep(100); - - gpio_direction_output(GPIO_USB_BOOT_EN, 1); - gpio_set_value(GPIO_USB_BOOT_EN, 1); - - pr_info("[MSM] <%s> USB_BOOT_EN:[%d]\n", __func__, - gpio_get_value(GPIO_USB_BOOT_EN)); - - gpio_direction_output(GPIO_BOOT_SW_SEL, 1); - gpio_set_value(GPIO_BOOT_SW_SEL, 1); - - pr_info("[MSM] <%s> BOOT_SW_SEL : [%d]\n", __func__, - gpio_get_value(GPIO_BOOT_SW_SEL)); - } else if (system_rev == 11) { - gpio_direction_output(GPIO_USB_BOOT_EN, 0); - s3c_gpio_setpull(GPIO_USB_BOOT_EN, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN, 0); - - gpio_direction_output(GPIO_USB_BOOT_EN_REV06, 0); - s3c_gpio_setpull(GPIO_USB_BOOT_EN_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN_REV06, 0); - - msleep(100); - - gpio_direction_output(GPIO_USB_BOOT_EN, 1); - gpio_set_value(GPIO_USB_BOOT_EN, 1); - - pr_info("[MSM] <%s> USB_BOOT_EN:[%d]\n", __func__, - gpio_get_value(GPIO_USB_BOOT_EN)); - - gpio_direction_output(GPIO_USB_BOOT_EN_REV06, 1); - gpio_set_value(GPIO_USB_BOOT_EN_REV06, 1); - - pr_info("[MSM(%d)] <%s> USB_BOOT_EN:[%d]\n", system_rev, - __func__, gpio_get_value(GPIO_USB_BOOT_EN_REV06)); - - gpio_direction_output(GPIO_BOOT_SW_SEL, 0); - s3c_gpio_setpull(GPIO_BOOT_SW_SEL, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_BOOT_SW_SEL, 0); - - gpio_direction_output(GPIO_BOOT_SW_SEL_REV06, 0); - s3c_gpio_setpull(GPIO_BOOT_SW_SEL_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_BOOT_SW_SEL_REV06, 0); - - msleep(100); - - gpio_direction_output(GPIO_BOOT_SW_SEL, 1); - gpio_set_value(GPIO_BOOT_SW_SEL, 1); - - pr_info("[MSM] <%s> BOOT_SW_SEL : [%d]\n", __func__, - gpio_get_value(GPIO_BOOT_SW_SEL)); - - gpio_direction_output(GPIO_BOOT_SW_SEL_REV06, 1); - gpio_set_value(GPIO_BOOT_SW_SEL_REV06, 1); - - pr_info("[MSM(%d)] <%s> BOOT_SW_SEL : [%d]\n", system_rev, - __func__, gpio_get_value(GPIO_BOOT_SW_SEL_REV06)); - - } else { /* system_rev>11 */ - gpio_direction_output(GPIO_USB_BOOT_EN_REV06, 0); - s3c_gpio_setpull(GPIO_USB_BOOT_EN_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN_REV06, 0); - - gpio_direction_output(GPIO_BOOT_SW_SEL_REV06, 0); - s3c_gpio_setpull(GPIO_BOOT_SW_SEL_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_BOOT_SW_SEL_REV06, 0); - - msleep(100); - - gpio_direction_output(GPIO_USB_BOOT_EN_REV06, 1); - gpio_set_value(GPIO_USB_BOOT_EN_REV06, 1); - - pr_info("[MSM] <%s> USB_BOOT_EN:[%d]\n", __func__, - gpio_get_value(GPIO_USB_BOOT_EN_REV06)); - - gpio_direction_output(GPIO_BOOT_SW_SEL_REV06, 1); - gpio_set_value(GPIO_BOOT_SW_SEL_REV06, 1); - - pr_info("[MSM] <%s> BOOT_SW_SEL : [%d]\n", __func__, - gpio_get_value(GPIO_BOOT_SW_SEL_REV06)); - - } - - mc->iod->modem_state_changed(mc->iod, STATE_BOOTING); - - return 0; -} - -static int mdm6600_boot_off(struct modem_ctl *mc) -{ - pr_info("[MSM] <%s>\n", __func__); - - if (!mc->gpio_flm_uart_sel -#if defined(CONFIG_MACH_M0_CTC) - || !mc->gpio_flm_uart_sel_rev06 -#endif - ) { - pr_err("[MSM] no gpio data\n"); - return -ENXIO; - } - -#if defined(CONFIG_MACH_M0_DUOSCTC) || defined(CONFIG_MACH_T0_CHN_CTC) - mdm6600_vbus_off(); -#elif defined(CONFIG_MACH_M0_GRANDECTC) - if (system_rev >= 14) - mdm6600_vbus_off(); -#endif - - if (system_rev < 11) { - gpio_direction_output(GPIO_USB_BOOT_EN, 0); - s3c_gpio_setpull(GPIO_USB_BOOT_EN, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN, 0); - gpio_direction_output(GPIO_BOOT_SW_SEL, 0); - s3c_gpio_setpull(GPIO_BOOT_SW_SEL, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_BOOT_SW_SEL, 0); - - } else if (system_rev == 11) { - gpio_direction_output(GPIO_USB_BOOT_EN, 0); - s3c_gpio_setpull(GPIO_USB_BOOT_EN, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN, 0); - - gpio_direction_output(GPIO_BOOT_SW_SEL, 0); - s3c_gpio_setpull(GPIO_BOOT_SW_SEL, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_BOOT_SW_SEL, 0); - -#if defined(CONFIG_MACH_M0_CTC) - gpio_direction_output(GPIO_USB_BOOT_EN_REV06, 0); - s3c_gpio_setpull(GPIO_USB_BOOT_EN_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN_REV06, 0); - - gpio_direction_output(GPIO_BOOT_SW_SEL_REV06, 0); - s3c_gpio_setpull(GPIO_BOOT_SW_SEL_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_BOOT_SW_SEL_REV06, 0); -#endif - - } else { /* system_rev>11 */ -#if defined(CONFIG_MACH_M0_CTC) - gpio_direction_output(GPIO_USB_BOOT_EN_REV06, 0); - s3c_gpio_setpull(GPIO_USB_BOOT_EN_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN_REV06, 0); - - gpio_direction_output(GPIO_BOOT_SW_SEL_REV06, 0); - s3c_gpio_setpull(GPIO_BOOT_SW_SEL_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_BOOT_SW_SEL_REV06, 0); -#endif - } - -#if defined(CONFIG_MACH_M0_CTC) - if (max7693_muic_cp_usb_state()) { - msleep(30); - gpio_direction_output(GPIO_USB_BOOT_EN, 1); - s3c_gpio_setpull(GPIO_USB_BOOT_EN, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN, 1); - gpio_direction_output(GPIO_USB_BOOT_EN_REV06, 1); - s3c_gpio_setpull(GPIO_USB_BOOT_EN_REV06, S3C_GPIO_PULL_NONE); - gpio_set_value(GPIO_USB_BOOT_EN_REV06, 1); - } -#endif - - gpio_set_value(GPIO_BOOT_SW_SEL, 0); - - return 0; -} - - -static int mdm6600_force_crash_exit(struct modem_ctl *mc) -{ - pr_info("[MSM] <%s>\n", __func__); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_on) { - pr_err("[MSM] no gpio data\n"); - return -ENXIO; - } - - s3c_gpio_cfgpin(mc->gpio_cp_dump_int, S3C_GPIO_OUTPUT); - gpio_direction_output(mc->gpio_cp_dump_int, 1); - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_on, 0); - gpio_set_value(mc->gpio_cp_reset, 1); - - return 0; -} - -static irqreturn_t phone_active_irq_handler(int irq, void *arg) -{ - struct modem_ctl *mc = (struct modem_ctl *)arg; - int phone_reset = 0; - int phone_active = 0; - int phone_state = 0; - int cp_dump_int = 0; - - if (!mc->gpio_cp_reset || - !mc->gpio_phone_active || !mc->gpio_cp_dump_int) { - pr_err("[MSM] no gpio data\n"); - return IRQ_HANDLED; - } - - phone_reset = gpio_get_value(mc->gpio_cp_reset); - phone_active = gpio_get_value(mc->gpio_phone_active); - cp_dump_int = gpio_get_value(mc->gpio_cp_dump_int); - - pr_info("[MSM] <%s> phone_reset=%d, phone_active=%d, cp_dump_int=%d\n", - __func__, phone_reset, phone_active, cp_dump_int); - - if (phone_reset && phone_active) { - phone_state = STATE_ONLINE; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - } else if (phone_reset && !phone_active) { - if (mc->phone_state == STATE_ONLINE) { - phone_state = STATE_CRASH_EXIT; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, - phone_state); - } - } else { - phone_state = STATE_OFFLINE; - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - } - - if (phone_active) - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_LOW); - else - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_HIGH); - - pr_info("[MSM] <%s> phone_state = %d\n", __func__, phone_state); - - return IRQ_HANDLED; -} - -#if defined(CONFIG_SIM_DETECT) -static irqreturn_t sim_detect_irq_handler(int irq, void *_mc) -{ - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - pr_info("[MSM] <%s> gpio_sim_detect = %d\n", - __func__, gpio_get_value(mc->gpio_sim_detect)); - - if (mc->iod && mc->iod->sim_state_changed) - mc->iod->sim_state_changed(mc->iod, - !gpio_get_value(mc->gpio_sim_detect)); - - return IRQ_HANDLED; -} -#endif - -static void mdm6600_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = mdm6600_on; - mc->ops.modem_off = mdm6600_off; - mc->ops.modem_reset = mdm6600_reset; - mc->ops.modem_boot_on = mdm6600_boot_on; - mc->ops.modem_boot_off = mdm6600_boot_off; - mc->ops.modem_force_crash_exit = mdm6600_force_crash_exit; -} - -int mdm6600_init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) -{ - int ret = 0; - struct platform_device *pdev; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_reset_req_n = pdata->gpio_reset_req_n; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel; -#if defined(CONFIG_MACH_M0_CTC) - mc->gpio_flm_uart_sel_rev06 = pdata->gpio_flm_uart_sel_rev06; -#endif - mc->gpio_cp_warm_reset = pdata->gpio_cp_warm_reset; - mc->gpio_sim_detect = pdata->gpio_sim_detect; - -#if defined(CONFIG_LINK_DEVICE_PLD) - mc->gpio_fpga_cs_n = pdata->gpio_fpga2_cs_n; -#endif - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_cp_on, 0); - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = platform_get_irq_byname(pdev, "cp_active_irq"); - pr_info("[MSM] <%s> PHONE_ACTIVE IRQ# = %d\n", - __func__, mc->irq_phone_active); - - mdm6600_get_ops(mc); - - ret = request_irq(mc->irq_phone_active, - phone_active_irq_handler, - IRQF_TRIGGER_HIGH, "msm_active", mc); - if (ret) { - pr_err("[MSM] <%s> failed to request_irq IRQ# %d (err=%d)\n", - __func__, mc->irq_phone_active, ret); - return ret; - } - - ret = enable_irq_wake(mc->irq_phone_active); - if (ret) { - pr_err("[MSM] %s: failed to enable_irq_wake IRQ# %d (err=%d)\n", - __func__, mc->irq_phone_active, ret); - free_irq(mc->irq_phone_active, mc); - return ret; - } - -#if defined(CONFIG_SIM_DETECT) - mc->irq_sim_detect = platform_get_irq_byname(pdev, "sim_irq"); - pr_info("[MSM] <%s> SIM_DECTCT IRQ# = %d\n", - __func__, mc->irq_sim_detect); - - if (mc->irq_sim_detect) { - ret = request_irq(mc->irq_sim_detect, sim_detect_irq_handler, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "msm_sim_detect", mc); - if (ret) { - mif_err("[MSM] failed to request_irq: %d\n", ret); - mc->sim_state.online = false; - mc->sim_state.changed = false; - return ret; - } - - ret = enable_irq_wake(mc->irq_sim_detect); - if (ret) { - mif_err("[MSM] failed to enable_irq_wake: %d\n", ret); - free_irq(mc->irq_sim_detect, mc); - mc->sim_state.online = false; - mc->sim_state.changed = false; - return ret; - } - - /* initialize sim_state => insert: gpio=0, remove: gpio=1 */ - mc->sim_state.online = !gpio_get_value(mc->gpio_sim_detect); - } -#endif - - return ret; -} -#endif diff --git a/drivers/misc/modem_if_u1/modem_modemctl_device_sprd8803.c b/drivers/misc/modem_if_u1/modem_modemctl_device_sprd8803.c deleted file mode 100644 index c352e89..0000000 --- a/drivers/misc/modem_if_u1/modem_modemctl_device_sprd8803.c +++ /dev/null @@ -1,262 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "modem_prj.h" -#include - -spinlock_t irq_lock; -int irq_lock_flag; - -int sprd_boot_done; -extern int spi_thread_restart(void); - -static int sprd8803_on(struct modem_ctl *mc) -{ - if (!mc->gpio_cp_on || !mc->gpio_pda_active) { - pr_err("[MODEM_IF] no gpio data\n"); - return -ENXIO; - } - - s3c_gpio_cfgpin(EXYNOS4_GPA1(4), S3C_GPIO_SFN(2)); - s3c_gpio_cfgpin(EXYNOS4_GPA1(5), S3C_GPIO_SFN(2)); - -#ifdef CONFIG_SEC_DUAL_MODEM_MODE - gpio_set_value(mc->gpio_sim_io_sel, 1); - gpio_set_value(mc->gpio_cp_ctrl1, 0); - gpio_set_value(mc->gpio_cp_ctrl2, 1); -#endif - msleep(100); - pr_info("[MODEM_IF] %s\n", __func__); - gpio_set_value(mc->gpio_cp_on, 1); - gpio_set_value(mc->gpio_pda_active, 1); - - spin_lock(&irq_lock); - if (!irq_lock_flag) { - enable_irq(mc->irq_phone_active); - enable_irq(gpio_to_irq(mc->gpio_cp_dump_int)); - enable_irq_wake(mc->irq_phone_active); - enable_irq_wake(gpio_to_irq(mc->gpio_cp_dump_int)); - irq_lock_flag = 1; - } - spin_unlock(&irq_lock); - - mc->phone_state = STATE_BOOTING; - - return 0; -} - -static int sprd8803_off(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s\n", __func__); - - if (!mc->gpio_cp_on) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_on, 0); - - spin_lock(&irq_lock); - if (irq_lock_flag) { - disable_irq(mc->irq_phone_active); - disable_irq(gpio_to_irq(mc->gpio_cp_dump_int)); - disable_irq_wake(mc->irq_phone_active); - disable_irq_wake(gpio_to_irq(mc->gpio_cp_dump_int)); - irq_lock_flag = 0; - } - spin_unlock(&irq_lock); - - mc->phone_state = STATE_OFFLINE; - - return 0; -} - -static int sprd8803_reset(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s\n", __func__); - - spi_thread_restart(); - - return 0; -} - -static int sprd8803_boot_on(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s %d\n", __func__, mc->phone_state); - return mc->phone_state; -} - -static int sprd8803_boot_off(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s\n", __func__); - spi_sema_init(); - return 0; -} - -static int sprd8803_dump_reset(struct modem_ctl *mc) -{ - pr_info("[MODEM_IF] %s\n", __func__); - - if (!mc->gpio_ap_cp_int2) - return -ENXIO; - - gpio_set_value(mc->gpio_ap_cp_int2, 0); - mc->phone_state = STATE_OFFLINE; - msleep(100); - gpio_set_value(mc->gpio_ap_cp_int2, 1); - - return 0; -} - -static irqreturn_t phone_active_irq_handler(int irq, void *_mc) -{ - int phone_reset = 0; - int phone_active_value = 0; - int cp_dump_value = 0; - int phone_state = 0; - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - disable_irq_nosync(mc->irq_phone_active); - - if (!mc->gpio_phone_active || - !mc->gpio_cp_dump_int) { - pr_err("[MODEM_IF] no gpio data\n"); - goto exit; - } - - if (!sprd_boot_done) - goto exit; - - phone_active_value = gpio_get_value(mc->gpio_phone_active); - cp_dump_value = gpio_get_value(mc->gpio_cp_dump_int); - - pr_err("PA EVENT : pa=%d, cp_dump=%d\n", - phone_active_value, cp_dump_value); - - if (phone_active_value) - phone_state = STATE_ONLINE; - else - phone_state = STATE_OFFLINE; - - if (phone_active_value && cp_dump_value) - phone_state = STATE_CRASH_EXIT; - - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - - if (mc->bootd && mc->bootd->modem_state_changed) - mc->bootd->modem_state_changed(mc->bootd, phone_state); - -exit: - enable_irq(mc->irq_phone_active); - - return IRQ_HANDLED; -} - -static void sprd8803_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = sprd8803_on; - mc->ops.modem_off = sprd8803_off; - mc->ops.modem_reset = sprd8803_reset; - mc->ops.modem_boot_on = sprd8803_boot_on; - mc->ops.modem_boot_off = sprd8803_boot_off; - mc->ops.modem_dump_reset = sprd8803_dump_reset; - mc->ops.modem_force_crash_exit = sprd8803_dump_reset; -} - -int sprd8803_init_modemctl_device(struct modem_ctl *mc, - struct modem_data *pdata) -{ - int ret = 0; - int irq_cp_dump_int; - struct platform_device *pdev; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_ap_cp_int1 = pdata->gpio_ap_cp_int1; - mc->gpio_ap_cp_int2 = pdata->gpio_ap_cp_int2; - -#ifdef CONFIG_SEC_DUAL_MODEM_MODE - mc->gpio_sim_io_sel = pdata->gpio_sim_io_sel; - mc->gpio_cp_ctrl1 = pdata->gpio_cp_ctrl1; - mc->gpio_cp_ctrl2 = pdata->gpio_cp_ctrl2; -#endif - - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = gpio_to_irq(mc->gpio_phone_active); - irq_cp_dump_int = gpio_to_irq(mc->gpio_cp_dump_int); - - sprd8803_get_ops(mc); - - ret = request_irq(mc->irq_phone_active, phone_active_irq_handler, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "phone_active", mc); - if (ret) { - pr_err("[MODEM_IF] %s: failed to request_irq:%d\n", - __func__, ret); - return ret; - } - - ret = enable_irq_wake(mc->irq_phone_active); - if (ret) { - pr_err("[MODEM_IF] %s: failed to enable_irq_wake:%d\n", - __func__, ret); - free_irq(mc->irq_phone_active, mc); - } - - ret = request_irq(irq_cp_dump_int, phone_active_irq_handler, - IRQF_TRIGGER_RISING, - "cp_dump_int", mc); - if (ret) { - pr_err("[MODEM_IF] %s: failed to request_irq:%d\n", - __func__, ret); - return ret; - } - - ret = enable_irq_wake(irq_cp_dump_int); - if (ret) { - pr_err("[MODEM_IF] %s: failed to enable_irq_wake:%d\n", - __func__, ret); - free_irq(irq_cp_dump_int, mc); - } - - irq_lock_flag = 1; - spin_lock_init(&irq_lock); - - spin_lock(&irq_lock); - if (irq_lock_flag) { - disable_irq(mc->irq_phone_active); - disable_irq(gpio_to_irq(mc->gpio_cp_dump_int)); - disable_irq_wake(mc->irq_phone_active); - disable_irq_wake(gpio_to_irq(mc->gpio_cp_dump_int)); - irq_lock_flag = 0; - } - spin_unlock(&irq_lock); - - return ret; -} diff --git a/drivers/misc/modem_if_u1/modem_modemctl_device_xmm6260.c b/drivers/misc/modem_if_u1/modem_modemctl_device_xmm6260.c deleted file mode 100644 index c2d5067..0000000 --- a/drivers/misc/modem_if_u1/modem_modemctl_device_xmm6260.c +++ /dev/null @@ -1,303 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_xmm6260.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include - -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" - -static int xmm6260_on(struct modem_ctl *mc) -{ - mif_info("xmm6260_on()\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_on || !mc->gpio_reset_req_n) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - if (mc->gpio_revers_bias_clear) - mc->gpio_revers_bias_clear(); - - - gpio_set_value(mc->gpio_cp_on, 0); - gpio_set_value(mc->gpio_cp_reset, 0); - udelay(160); - gpio_set_value(mc->gpio_pda_active, 0); - msleep(500); /* must be >500ms for CP can boot up under -20 degrees */ - gpio_set_value(mc->gpio_cp_reset, 1); - udelay(160); - gpio_set_value(mc->gpio_reset_req_n, 1); - udelay(160); - gpio_set_value(mc->gpio_cp_on, 1); - udelay(60); - gpio_set_value(mc->gpio_cp_on, 0); - msleep(20); - - if (mc->gpio_revers_bias_restore) - mc->gpio_revers_bias_restore(); - - - gpio_set_value(mc->gpio_pda_active, 1); - - mc->phone_state = STATE_BOOTING; - - return 0; - -} - -static int xmm6260_off(struct modem_ctl *mc) -{ - mif_info("xmm6260_off()\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_on) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_on, 0); - gpio_set_value(mc->gpio_cp_reset, 0); - - mc->phone_state = STATE_OFFLINE; - - return 0; -} - - -static int xmm6260_reset(struct modem_ctl *mc) -{ - - mif_info("xmm6260_reset()\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_reset_req_n) - return -ENXIO; - - if (mc->gpio_revers_bias_clear) - mc->gpio_revers_bias_clear(); - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_reset_req_n, 0); - - mc->phone_state = STATE_OFFLINE; - - msleep(20); - - gpio_set_value(mc->gpio_cp_reset, 1); -/* TODO: check the reset timming with C2C connection */ - udelay(160); - - gpio_set_value(mc->gpio_reset_req_n, 1); - udelay(100); - - gpio_set_value(mc->gpio_cp_on, 1); - udelay(60); - gpio_set_value(mc->gpio_cp_on, 0); - msleep(20); - - if (mc->gpio_revers_bias_restore) - mc->gpio_revers_bias_restore(); - - mc->phone_state = STATE_BOOTING; - - return 0; -} - -static int xmm6260_boot_on(struct modem_ctl *mc) -{ - mif_info("xmm6260_boot_on()\n"); - - if (!mc->gpio_flm_uart_sel) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_flm_uart_sel, 0); - - return 0; -} - -static int xmm6260_boot_off(struct modem_ctl *mc) -{ - mif_info("xmm6260_boot_off()\n"); - - if (!mc->gpio_flm_uart_sel) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_flm_uart_sel, 1); - - return 0; -} - -static irqreturn_t phone_active_irq_handler(int irq, void *_mc) -{ - int phone_reset = 0; - int phone_active_value = 0; - int cp_dump_value = 0; - int phone_state = 0; - struct modem_ctl *mc = (struct modem_ctl *)_mc; - struct link_device *ld; - - disable_irq_nosync(mc->irq_phone_active); - - if (!mc->gpio_cp_reset || !mc->gpio_phone_active || - !mc->gpio_cp_dump_int) { - mif_err("no gpio data\n"); - return IRQ_HANDLED; - } - - phone_reset = gpio_get_value(mc->gpio_cp_reset); - phone_active_value = gpio_get_value(mc->gpio_phone_active); - cp_dump_value = gpio_get_value(mc->gpio_cp_dump_int); - - mif_info("PA EVENT : reset =%d, pa=%d, cp_dump=%d\n", - phone_reset, phone_active_value, cp_dump_value); - - if (phone_reset && phone_active_value) - phone_state = STATE_BOOTING; - else if (phone_reset && !phone_active_value) { - if (mc->phone_state == STATE_BOOTING) - goto set_type; - if (cp_dump_value) - phone_state = STATE_CRASH_EXIT; - else - phone_state = STATE_CRASH_RESET; - if (mc->iod) { - ld = get_current_link(mc->iod); - if (ld->terminate_comm) - ld->terminate_comm(ld, mc->iod); - } - } else - phone_state = STATE_OFFLINE; - - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - - if (mc->bootd && mc->bootd->modem_state_changed) - mc->bootd->modem_state_changed(mc->bootd, phone_state); - -set_type: - if (phone_active_value) - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_LOW); - else - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_HIGH); - enable_irq(mc->irq_phone_active); - - return IRQ_HANDLED; -} - -static irqreturn_t sim_detect_irq_handler(int irq, void *_mc) -{ - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - if (mc->iod && mc->iod->sim_state_changed) - mc->iod->sim_state_changed(mc->iod, - !gpio_get_value(mc->gpio_sim_detect)); - - return IRQ_HANDLED; -} - -static void xmm6260_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = xmm6260_on; - mc->ops.modem_off = xmm6260_off; - mc->ops.modem_reset = xmm6260_reset; - mc->ops.modem_boot_on = xmm6260_boot_on; - mc->ops.modem_boot_off = xmm6260_boot_off; -} - -int xmm6260_init_modemctl_device(struct modem_ctl *mc, - struct modem_data *pdata) -{ - int ret; - struct platform_device *pdev; - - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_reset_req_n = pdata->gpio_reset_req_n; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel; - mc->gpio_cp_warm_reset = pdata->gpio_cp_warm_reset; - mc->gpio_revers_bias_clear = pdata->gpio_revers_bias_clear; - mc->gpio_revers_bias_restore = pdata->gpio_revers_bias_restore; - mc->gpio_sim_detect = pdata->gpio_sim_detect; - - pdev = to_platform_device(mc->dev); - /* mc->irq_phone_active = platform_get_irq(pdev, 0); */ - mc->irq_phone_active = gpio_to_irq(mc->gpio_phone_active); - - if (mc->gpio_sim_detect) - mc->irq_sim_detect = gpio_to_irq(mc->gpio_sim_detect); - - xmm6260_get_ops(mc); - - /* initialize phone active */ - ret = request_irq(mc->irq_phone_active, phone_active_irq_handler, - IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, - "phone_active", mc); - if (ret) { - mif_err("failed to request_irq:%d\n", ret); - goto err_phone_active_request_irq; - } - - ret = enable_irq_wake(mc->irq_phone_active); - if (ret) { - mif_err("failed to enable_irq_wake:%d\n", ret); - goto err_phone_active_set_wake_irq; - } - - /* initialize sim_state if gpio_sim_detect exists */ - mc->sim_state.online = false; - mc->sim_state.changed = false; - if (mc->gpio_sim_detect) { - ret = request_irq(mc->irq_sim_detect, sim_detect_irq_handler, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "sim_detect", mc); - if (ret) { - mif_err("failed to request_irq: %d\n", ret); - goto err_sim_detect_request_irq; - } - - ret = enable_irq_wake(mc->irq_sim_detect); - if (ret) { - mif_err("failed to enable_irq_wake: %d\n", ret); - goto err_sim_detect_set_wake_irq; - } - - /* initialize sim_state => insert: gpio=0, remove: gpio=1 */ - mc->sim_state.online = !gpio_get_value(mc->gpio_sim_detect); - } - - return ret; - -err_sim_detect_set_wake_irq: - free_irq(mc->irq_sim_detect, mc); -err_sim_detect_request_irq: - mc->sim_state.online = false; - mc->sim_state.changed = false; -err_phone_active_set_wake_irq: - free_irq(mc->irq_phone_active, mc); -err_phone_active_request_irq: - return ret; -} diff --git a/drivers/misc/modem_if_u1/modem_modemctl_device_xmm6262.c b/drivers/misc/modem_if_u1/modem_modemctl_device_xmm6262.c deleted file mode 100644 index 518bb8f..0000000 --- a/drivers/misc/modem_if_u1/modem_modemctl_device_xmm6262.c +++ /dev/null @@ -1,344 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_modemctl_device_xmm6262.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#define DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "modem_prj.h" - -static int xmm6262_on(struct modem_ctl *mc) -{ - mif_info("\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_on || !mc->gpio_reset_req_n) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - if (mc->gpio_revers_bias_clear) - mc->gpio_revers_bias_clear(); - -#ifdef CONFIG_SEC_DUAL_MODEM_MODE - gpio_set_value(mc->gpio_sim_io_sel, 0); - gpio_set_value(mc->gpio_cp_ctrl1, 1); - gpio_set_value(mc->gpio_cp_ctrl2, 0); -#endif - - /* TODO */ - gpio_set_value(mc->gpio_reset_req_n, 0); - gpio_set_value(mc->gpio_cp_on, 0); - gpio_set_value(mc->gpio_cp_reset, 0); - msleep(100); - gpio_set_value(mc->gpio_cp_reset, 1); - /* If XMM6262 was connected with C2C, AP wait 50ms to BB Reset*/ - msleep(50); - gpio_set_value(mc->gpio_reset_req_n, 1); - - gpio_set_value(mc->gpio_cp_on, 1); - udelay(60); - gpio_set_value(mc->gpio_cp_on, 0); - msleep(20); - - mc->phone_state = STATE_BOOTING; - - if (mc->gpio_revers_bias_restore) - mc->gpio_revers_bias_restore(); - gpio_set_value(mc->gpio_pda_active, 1); - - - return 0; -} - -static int xmm6262_off(struct modem_ctl *mc) -{ - mif_info("\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_cp_on) { - mif_err("no gpio data\n"); - return -ENXIO; - } - - gpio_set_value(mc->gpio_cp_on, 0); - gpio_set_value(mc->gpio_cp_reset, 0); - - return 0; -} - -static int xmm6262_reset(struct modem_ctl *mc) -{ - mif_info("\n"); - - if (!mc->gpio_cp_reset || !mc->gpio_reset_req_n) - return -ENXIO; - - if (mc->gpio_revers_bias_clear) - mc->gpio_revers_bias_clear(); - - gpio_set_value(mc->gpio_cp_reset, 0); - gpio_set_value(mc->gpio_reset_req_n, 0); - - mc->phone_state = STATE_OFFLINE; - - msleep(20); - - gpio_set_value(mc->gpio_cp_reset, 1); - /* TODO: check the reset timming with C2C connection */ - udelay(160); - - gpio_set_value(mc->gpio_reset_req_n, 1); - udelay(100); - - gpio_set_value(mc->gpio_cp_on, 1); - udelay(60); - gpio_set_value(mc->gpio_cp_on, 0); - msleep(20); - - if (mc->gpio_revers_bias_restore) - mc->gpio_revers_bias_restore(); - - mc->phone_state = STATE_BOOTING; - - return 0; -} - -static irqreturn_t phone_active_irq_handler(int irq, void *_mc) -{ - int phone_reset = 0; - int phone_active_value = 0; - int cp_dump_value = 0; - int phone_state = 0; - struct modem_ctl *mc = (struct modem_ctl *)_mc; - - disable_irq_nosync(mc->irq_phone_active); - - if (!mc->gpio_cp_reset || !mc->gpio_phone_active || - !mc->gpio_cp_dump_int) { - mif_err("no gpio data\n"); - return IRQ_HANDLED; - } - - phone_reset = gpio_get_value(mc->gpio_cp_reset); - phone_active_value = gpio_get_value(mc->gpio_phone_active); - cp_dump_value = gpio_get_value(mc->gpio_cp_dump_int); - - mif_info("PA EVENT : reset =%d, pa=%d, cp_dump=%d\n", - phone_reset, phone_active_value, cp_dump_value); - - if (phone_reset && phone_active_value) { - phone_state = STATE_BOOTING; - } else if (mc->dev->power.is_suspended && !phone_active_value) { - /*fixing dpm timeout by port2 resume retry*/ - mif_err("CP reset while dpm resume\n"); - xmm6262_off(mc); - phone_state = STATE_CRASH_RESET; - } else if (phone_reset && !phone_active_value) { - phone_state = - (cp_dump_value) ? STATE_CRASH_EXIT : STATE_CRASH_RESET; - } else { - phone_state = STATE_OFFLINE; - } - - if (mc->iod && mc->iod->modem_state_changed) - mc->iod->modem_state_changed(mc->iod, phone_state); - - if (mc->bootd && mc->bootd->modem_state_changed) - mc->bootd->modem_state_changed(mc->bootd, phone_state); - - if (phone_active_value) - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_LOW); - else - irq_set_irq_type(mc->irq_phone_active, IRQ_TYPE_LEVEL_HIGH); - enable_irq(mc->irq_phone_active); - - return IRQ_HANDLED; -} - -#ifdef CONFIG_FAST_BOOT -#include -extern bool fake_shut_down; -static void mif_sim_detect_complete(struct modem_ctl *mc) -{ - if (mc->sim_shutdown_req) { - mif_info("fake shutdown sim changed shutdown\n"); - kernel_power_off(); - /*kernel_restart(NULL);*/ - mc->sim_shutdown_req = false; - } -} - -static int mif_init_sim_shutdown(struct modem_ctl *mc) -{ - mc->sim_shutdown_req = false; - mc->modem_complete = mif_sim_detect_complete; - - return 0; -} - -static void mif_check_fake_shutdown(struct modem_ctl *mc, bool online) -{ - if (fake_shut_down && mc->sim_state.online != online) - mc->sim_shutdown_req = true; -} - -#else -static inline int mif_init_sim_shutdown(struct modem_ctl *mc) { return 0; } -#define mif_check_fake_shutdown(a, b) do {} while (0) -#endif - - -#define SIM_DETECT_DEBUG -static irqreturn_t sim_detect_irq_handler(int irq, void *_mc) -{ - struct modem_ctl *mc = (struct modem_ctl *)_mc; -#ifdef SIM_DETECT_DEBUG - int val = gpio_get_value(mc->gpio_sim_detect); - static int unchange; - static int prev_val; - - if (mc->phone_state == STATE_BOOTING) { - mif_info("BOOTING, reset unchange\n"); - unchange = 0; - } - - if (prev_val == val) { - if (unchange++ > 50) { - mif_err("Abnormal SIM detect GPIO irqs"); - disable_irq_nosync(mc->gpio_sim_detect); - panic("SIM detect IRQ Error"); - } - } else { - unchange = 0; - } - prev_val = val; -#endif - if (mc->iod && mc->iod->sim_state_changed) { - mif_check_fake_shutdown(mc, - gpio_get_value(mc->gpio_sim_detect) == mc->sim_polarity - ); - mc->iod->sim_state_changed(mc->iod, - gpio_get_value(mc->gpio_sim_detect) == mc->sim_polarity - ); - } - - return IRQ_HANDLED; -} - -static void xmm6262_get_ops(struct modem_ctl *mc) -{ - mc->ops.modem_on = xmm6262_on; - mc->ops.modem_off = xmm6262_off; - mc->ops.modem_reset = xmm6262_reset; -} - -int xmm6262_init_modemctl_device(struct modem_ctl *mc, - struct modem_data *pdata) -{ - int ret = 0; - struct platform_device *pdev; - - mc->gpio_reset_req_n = pdata->gpio_reset_req_n; - mc->gpio_cp_on = pdata->gpio_cp_on; - mc->gpio_cp_reset = pdata->gpio_cp_reset; - mc->gpio_pda_active = pdata->gpio_pda_active; - mc->gpio_phone_active = pdata->gpio_phone_active; - mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; - mc->gpio_ap_dump_int = pdata->gpio_ap_dump_int; - mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel; - mc->gpio_cp_warm_reset = pdata->gpio_cp_warm_reset; - mc->gpio_sim_detect = pdata->gpio_sim_detect; - mc->sim_polarity = pdata->sim_polarity; - - mc->gpio_revers_bias_clear = pdata->gpio_revers_bias_clear; - mc->gpio_revers_bias_restore = pdata->gpio_revers_bias_restore; - -#ifdef CONFIG_SEC_DUAL_MODEM_MODE - mc->gpio_sim_io_sel = pdata->gpio_sim_io_sel; - mc->gpio_cp_ctrl1 = pdata->gpio_cp_ctrl1; - mc->gpio_cp_ctrl2 = pdata->gpio_cp_ctrl2; -#endif - - - pdev = to_platform_device(mc->dev); - mc->irq_phone_active = gpio_to_irq(mc->gpio_phone_active); - - if (mc->gpio_sim_detect) - mc->irq_sim_detect = gpio_to_irq(mc->gpio_sim_detect); - - xmm6262_get_ops(mc); - - ret = request_irq(mc->irq_phone_active, phone_active_irq_handler, - IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, - "phone_active", mc); - if (ret) { - mif_err("failed to request_irq:%d\n", ret); - goto err_phone_active_request_irq; - } - - ret = enable_irq_wake(mc->irq_phone_active); - if (ret) { - mif_err("failed to enable_irq_wake:%d\n", ret); - goto err_phone_active_set_wake_irq; - } - - /* initialize sim_state if gpio_sim_detect exists */ - mc->sim_state.online = false; - mc->sim_state.changed = false; - if (mc->gpio_sim_detect) { - ret = request_irq(mc->irq_sim_detect, sim_detect_irq_handler, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "sim_detect", mc); - if (ret) { - mif_err("failed to request_irq: %d\n", ret); - goto err_sim_detect_request_irq; - } - - ret = enable_irq_wake(mc->irq_sim_detect); - if (ret) { - mif_err("failed to enable_irq_wake: %d\n", ret); - goto err_sim_detect_set_wake_irq; - } - - /* initialize sim_state => insert: gpio=0, remove: gpio=1 */ - mc->sim_state.online = - gpio_get_value(mc->gpio_sim_detect) == mc->sim_polarity; - - ret = mif_init_sim_shutdown(mc); - if (ret) { - mif_err("failed to sim fake shutdown init: %d\n", ret); - goto err_sim_detect_set_wake_irq; - } - } - - return ret; - -err_sim_detect_set_wake_irq: - free_irq(mc->irq_sim_detect, mc); -err_sim_detect_request_irq: - mc->sim_state.online = false; - mc->sim_state.changed = false; -err_phone_active_set_wake_irq: - free_irq(mc->irq_phone_active, mc); -err_phone_active_request_irq: - return ret; -} diff --git a/drivers/misc/modem_if_u1/modem_net_flowcontrol_device.c b/drivers/misc/modem_if_u1/modem_net_flowcontrol_device.c deleted file mode 100644 index b3f055d..0000000 --- a/drivers/misc/modem_if_u1/modem_net_flowcontrol_device.c +++ /dev/null @@ -1,116 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_net_flowcontrol_device.c - * - * Copyright (C) 2011 Google, Inc. - * Copyright (C) 2011 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "modem_prj.h" - - -#define NET_FLOWCONTROL_DEV_NAME_LEN 8 - -static int modem_net_flowcontrol_device_open( - struct inode *inode, struct file *filp) -{ - return 0; -} - -static int modem_net_flowcontrol_device_release( - struct inode *inode, struct file *filp) -{ - return 0; -} - -static long modem_net_flowcontrol_device_ioctl( - struct file *filp, unsigned int cmd, unsigned long arg) -{ - struct net *this_net; - struct net_device *ndev; - char dev_name[NET_FLOWCONTROL_DEV_NAME_LEN]; - u8 chan; - - if (copy_from_user(&chan, (void __user *)arg, sizeof(char))) - return -EFAULT; - - if (chan > 15) - return -ENODEV; - - snprintf(dev_name, NET_FLOWCONTROL_DEV_NAME_LEN, "rmnet%d", (int)chan); - this_net = get_net_ns_by_pid(current->pid); - ndev = __dev_get_by_name(this_net, dev_name); - if (ndev == NULL) { - mif_err("device = %s not exist\n", dev_name); - return -ENODEV; - } - - switch (cmd) { - case IOCTL_MODEM_NET_SUSPEND: - netif_stop_queue(ndev); - mif_info("NET SUSPEND(%s)\n", dev_name); - break; - case IOCTL_MODEM_NET_RESUME: - netif_wake_queue(ndev); - mif_info("NET RESUME(%s)\n", dev_name); - break; - default: - return -EINVAL; - } - return 0; -} - -static const struct file_operations modem_net_flowcontrol_device_fops = { - .owner = THIS_MODULE, - .open = modem_net_flowcontrol_device_open, - .release = modem_net_flowcontrol_device_release, - .unlocked_ioctl = modem_net_flowcontrol_device_ioctl, -}; - -static int __init modem_net_flowcontrol_device_init(void) -{ - int ret = 0; - struct io_device *net_flowcontrol_dev; - - net_flowcontrol_dev = kzalloc(sizeof(struct io_device), GFP_KERNEL); - if (!net_flowcontrol_dev) { - mif_err("net_flowcontrol_dev io device memory alloc fail\n"); - return -ENOMEM; - } - - net_flowcontrol_dev->miscdev.minor = MISC_DYNAMIC_MINOR; - net_flowcontrol_dev->miscdev.name = "modem_br"; - net_flowcontrol_dev->miscdev.fops = &modem_net_flowcontrol_device_fops; - - ret = misc_register(&net_flowcontrol_dev->miscdev); - if (ret) { - mif_err("failed to register misc br device : %s\n", - net_flowcontrol_dev->miscdev.name); - kfree(net_flowcontrol_dev); - } - - return ret; -} - -module_init(modem_net_flowcontrol_device_init); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Samsung Modem IF Net Flowcontrol Driver"); diff --git a/drivers/misc/modem_if_u1/modem_prj.h b/drivers/misc/modem_if_u1/modem_prj.h deleted file mode 100644 index 7141502..0000000 --- a/drivers/misc/modem_if_u1/modem_prj.h +++ /dev/null @@ -1,773 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_PRJ_H__ -#define __MODEM_PRJ_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_CPINFO_SIZE 512 - -#define MAX_LINK_DEVTYPE 3 - -#define MAX_FMT_DEVS 10 -#define MAX_RAW_DEVS 32 -#define MAX_RFS_DEVS 10 -#define MAX_NUM_IO_DEV (MAX_FMT_DEVS + MAX_RAW_DEVS + MAX_RFS_DEVS) - -#define MAX_IOD_RXQ_LEN 2048 - -#define IOCTL_MODEM_ON _IO('o', 0x19) -#define IOCTL_MODEM_OFF _IO('o', 0x20) -#define IOCTL_MODEM_RESET _IO('o', 0x21) -#define IOCTL_MODEM_BOOT_ON _IO('o', 0x22) -#define IOCTL_MODEM_BOOT_OFF _IO('o', 0x23) -#define IOCTL_MODEM_BOOT_DONE _IO('o', 0x24) - -#define IOCTL_MODEM_PROTOCOL_SUSPEND _IO('o', 0x25) -#define IOCTL_MODEM_PROTOCOL_RESUME _IO('o', 0x26) - -#define IOCTL_MODEM_STATUS _IO('o', 0x27) -#define IOCTL_MODEM_DL_START _IO('o', 0x28) -#define IOCTL_MODEM_FW_UPDATE _IO('o', 0x29) - -#define IOCTL_MODEM_NET_SUSPEND _IO('o', 0x30) -#define IOCTL_MODEM_NET_RESUME _IO('o', 0x31) - -#define IOCTL_MODEM_DUMP_START _IO('o', 0x32) -#define IOCTL_MODEM_DUMP_UPDATE _IO('o', 0x33) -#define IOCTL_MODEM_FORCE_CRASH_EXIT _IO('o', 0x34) -#define IOCTL_MODEM_CP_UPLOAD _IO('o', 0x35) -#define IOCTL_MODEM_DUMP_RESET _IO('o', 0x36) - -#if defined(CONFIG_SEC_DUAL_MODEM_MODE) -#define IOCTL_MODEM_SWITCH_MODEM _IO('o', 0x37) -#endif - -#define IOCTL_DPRAM_SEND_BOOT _IO('o', 0x40) -#define IOCTL_DPRAM_INIT_STATUS _IO('o', 0x43) - -/* ioctl command definitions. */ -#define IOCTL_DPRAM_PHONE_POWON _IO('o', 0xd0) -#define IOCTL_DPRAM_PHONEIMG_LOAD _IO('o', 0xd1) -#define IOCTL_DPRAM_NVDATA_LOAD _IO('o', 0xd2) -#define IOCTL_DPRAM_PHONE_BOOTSTART _IO('o', 0xd3) - -#define IOCTL_DPRAM_PHONE_UPLOAD_STEP1 _IO('o', 0xde) -#define IOCTL_DPRAM_PHONE_UPLOAD_STEP2 _IO('o', 0xdf) - -/* ioctl command for IPC Logger */ -#define IOCTL_MIF_LOG_DUMP _IO('o', 0x51) -#define IOCTL_MIF_DPRAM_DUMP _IO('o', 0x52) - -/* modem status */ -#define MODEM_OFF 0 -#define MODEM_CRASHED 1 -#define MODEM_RAMDUMP 2 -#define MODEM_POWER_ON 3 -#define MODEM_BOOTING_NORMAL 4 -#define MODEM_BOOTING_RAMDUMP 5 -#define MODEM_DUMPING 6 -#define MODEM_RUNNING 7 - -#define HDLC_HEADER_MAX_SIZE 6 /* fmt 3, raw 6, rfs 6 */ - -#define PSD_DATA_CHID_BEGIN 0x2A -#define PSD_DATA_CHID_END 0x38 - -#define PS_DATA_CH_0 10 -#define PS_DATA_CH_LAST 24 -#define RMNET0_CH_ID PS_DATA_CH_0 - -#define IP6VERSION 6 - -#define SOURCE_MAC_ADDR {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC} - -/* IP loopback */ -#define CP2AP_LOOPBACK_CHANNEL 30 /* CP -> AP -> CP */ -#define DATA_LOOPBACK_CHANNEL 31 /* AP -> CP -> AP */ - -/* Debugging features */ -#define MIF_LOG_DIR "/sdcard/log" -#define MIF_MAX_PATH_LEN 256 -#define MIF_MAX_NAME_LEN 64 -#define MIF_MAX_STR_LEN 32 - -/* Does modem ctl structure will use state ? or status defined below ?*/ -enum modem_state { - STATE_OFFLINE, - STATE_CRASH_RESET, /* silent reset */ - STATE_CRASH_EXIT, /* cp ramdump */ - STATE_BOOTING, - STATE_ONLINE, - STATE_NV_REBUILDING, /* <= rebuilding start */ - STATE_LOADER_DONE, - STATE_SIM_ATTACH, - STATE_SIM_DETACH, -#if defined(CONFIG_SEC_DUAL_MODEM_MODE) - STATE_MODEM_SWITCH, -#endif -}; - -enum com_state { - COM_NONE, - COM_ONLINE, - COM_HANDSHAKE, - COM_BOOT, - COM_CRASH, -}; - -enum link_mode { - LINK_MODE_OFFLINE = 0, - LINK_MODE_BOOT, - LINK_MODE_IPC, - LINK_MODE_DLOAD, - LINK_MODE_ULOAD, -}; - -struct sim_state { - bool online; /* SIM is online? */ - bool changed; /* online is changed? */ -}; - -#define HDLC_START 0x7F -#define HDLC_END 0x7E -#define SIZE_OF_HDLC_START 1 -#define SIZE_OF_HDLC_END 1 -#define MAX_LINK_PADDING_SIZE 3 - -struct header_data { - char hdr[HDLC_HEADER_MAX_SIZE]; - unsigned len; - unsigned frag_len; - char start; /*hdlc start header 0x7F*/ -}; - -struct fmt_hdr { - u16 len; - u8 control; -} __packed; - -struct raw_hdr { - u32 len; - u8 channel; - u8 control; -} __packed; - -struct rfs_hdr { - u32 len; - u8 cmd; - u8 id; -} __packed; - -struct sipc_fmt_hdr { - u16 len; - u8 msg_seq; - u8 ack_seq; - u8 main_cmd; - u8 sub_cmd; - u8 cmd_type; -} __packed; - -#define SIPC5_START_MASK 0b11111000 -#define SIPC5_CONFIG_MASK 0b00000111 -#define SIPC5_EXT_FIELD_MASK 0b00000011 - -#define SIPC5_PADDING_EXIST 0b00000100 -#define SIPC5_EXT_FIELD_EXIST 0b00000010 -#define SIPC5_CTL_FIELD_EXIST 0b00000001 - -#define SIPC5_MAX_HEADER_SIZE 6 -#define SIPC5_HEADER_SIZE_WITH_EXT_LEN 6 -#define SIPC5_HEADER_SIZE_WITH_CTL_FLD 5 -#define SIPC5_MIN_HEADER_SIZE 4 -#define SIPC5_CONFIG_SIZE 1 -#define SIPC5_CH_ID_SIZE 1 - -#define SIPC5_CONFIG_OFFSET 0 -#define SIPC5_CH_ID_OFFSET 1 -#define SIPC5_LEN_OFFSET 2 -#define SIPC5_CTL_OFFSET 4 - -#define SIPC5_CH_ID_PDP_0 10 -#define SIPC5_CH_ID_PDP_LAST 24 -#define SIPC5_CH_ID_FMT_0 235 -#define SIPC5_CH_ID_RFS_0 245 -#define SIPC5_CH_ID_MAX 255 - -#define SIPC5_CH_ID_FLOW_CTRL 255 -#define FLOW_CTRL_SUSPEND ((u8)(0xCA)) -#define FLOW_CTRL_RESUME ((u8)(0xCB)) - -/* If iod->id is 0, do not need to store to `iodevs_tree_fmt' in SIPC4 */ -#define sipc4_is_not_reserved_channel(ch) ((ch) != 0) - -/* Channel 0, 5, 6, 27, 255 are reserved in SIPC5. - * see SIPC5 spec: 2.2.2 Channel Identification (Ch ID) Field. - * They do not need to store in `iodevs_tree_fmt' - */ -#define sipc5_is_not_reserved_channel(ch) \ - ((ch) != 0 && (ch) != 5 && (ch) != 6 && (ch) != 27 && (ch) != 255) - -struct sipc5_link_hdr { - u8 cfg; - u8 ch; - u16 len; - union { - u8 ctl; - u16 ext_len; - }; -} __packed; - -struct sipc5_frame_data { - /* Config octet */ - u8 config; - - /* Channel ID */ - u8 ch_id; - - /* Control for multiple FMT frame */ - u8 control; - - /* Frame configuration set by header analysis */ - bool padding; - bool ctl_fld; - bool ext_len; - - /* Frame length calculated from the length fields */ - unsigned len; - - /* The length of link layer header */ - unsigned hdr_len; - - /* The length of received header */ - unsigned hdr_rcvd; - - /* The length of data payload */ - unsigned data_len; - - /* The length of received data */ - unsigned data_rcvd; - - /* Header buffer */ - u8 hdr[SIPC5_MAX_HEADER_SIZE]; -}; - -struct vnet { - struct io_device *iod; -}; - -/* for fragmented data from link devices */ -struct fragmented_data { - struct sk_buff *skb_recv; - struct header_data h_data; - struct sipc5_frame_data f_data; - /* page alloc fail retry*/ - unsigned realloc_offset; -}; -#define fragdata(iod, ld) (&(iod)->fragments[(ld)->link_type]) - -/** struct skbuff_priv - private data of struct sk_buff - * this is matched to char cb[48] of struct sk_buff - */ -struct skbuff_private { - struct io_device *iod; - struct link_device *ld; - struct io_device *real_iod; /* for rx multipdp */ - u8 ch_id; - u8 control; -} __packed; - -static inline struct skbuff_private *skbpriv(struct sk_buff *skb) -{ - BUILD_BUG_ON(sizeof(struct skbuff_private) > sizeof(skb->cb)); - return (struct skbuff_private *)&skb->cb; -} - -struct io_device { - /* rb_tree node for an io device */ - struct rb_node node_chan; - struct rb_node node_fmt; - - /* Name of the IO device */ - char *name; - - /* Reference count */ - atomic_t opened; - - /* Wait queue for the IO device */ - wait_queue_head_t wq; - - /* Misc and net device structures for the IO device */ - struct miscdevice miscdev; - struct net_device *ndev; - - /* ID and Format for channel on the link */ - unsigned id; - enum modem_link link_types; - enum dev_format format; - enum modem_io io_typ; - enum modem_network net_typ; - - /* The name of the application that will use this IO device */ - char *app; - - /* Whether or not handover among 2+ link devices */ - bool use_handover; - - /* SIPC version */ - enum sipc_ver ipc_version; - - /* Rx queue of sk_buff */ - struct sk_buff_head sk_rx_q; - - /* - ** work for each io device, when delayed work needed - ** use this for private io device rx action - */ - struct delayed_work rx_work; - - struct fragmented_data fragments[LINKDEV_MAX]; - - /* for multi-frame */ - struct sk_buff *skb[128]; - - /* called from linkdevice when a packet arrives for this iodevice */ - int (*recv)(struct io_device *iod, struct link_device *ld, - const char *data, unsigned int len); - int (*recv_skb)(struct io_device *iod, struct link_device *ld, - struct sk_buff *skb); - - /* inform the IO device that the modem is now online or offline or - * crashing or whatever... - */ - void (*modem_state_changed)(struct io_device *iod, enum modem_state); - - /* inform the IO device that the SIM is not inserting or removing */ - void (*sim_state_changed)(struct io_device *iod, bool sim_online); - - struct modem_ctl *mc; - struct modem_shared *msd; - - struct wake_lock wakelock; - long waketime; - - /* DO NOT use __current_link directly - * you MUST use skbpriv(skb)->ld in mc, link, etc.. - */ - struct link_device *__current_link; -}; -#define to_io_device(misc) container_of(misc, struct io_device, miscdev) - -/* get_current_link, set_current_link don't need to use locks. - * In ARM, set_current_link and get_current_link are compiled to - * each one instruction (str, ldr) as atomic_set, atomic_read. - * And, the order of set_current_link and get_current_link is not important. - */ -#define get_current_link(iod) ((iod)->__current_link) -#define set_current_link(iod, ld) ((iod)->__current_link = (ld)) - -struct link_device { - struct list_head list; - char *name; - - enum modem_link link_type; - unsigned aligned; - - /* Maximum IPC device = the last IPC device (e.g. IPC_RFS) + 1 */ - int max_ipc_dev; - - /* SIPC version */ - enum sipc_ver ipc_version; - - /* Modem data */ - struct modem_data *mdm_data; - - /* Modem control */ - struct modem_ctl *mc; - - /* Modem shared data */ - struct modem_shared *msd; - - /* Operation mode of the link device */ - enum link_mode mode; - - struct io_device *fmt_iods[4]; - - /* TX queue of socket buffers */ - struct sk_buff_head sk_fmt_tx_q; - struct sk_buff_head sk_raw_tx_q; - struct sk_buff_head sk_rfs_tx_q; - - struct sk_buff_head *skb_txq[MAX_IPC_DEV]; - - bool raw_tx_suspended; /* for misc dev */ - struct completion raw_tx_resumed_by_cp; - - /** - * This flag is for TX flow control on network interface. - * This must be set and clear only by a flow control command from CP. - */ - bool suspend_netif_tx; - - struct workqueue_struct *tx_wq; - struct work_struct tx_work; - struct delayed_work tx_delayed_work; - - struct delayed_work *tx_dwork[MAX_IPC_DEV]; - struct delayed_work fmt_tx_dwork; - struct delayed_work raw_tx_dwork; - struct delayed_work rfs_tx_dwork; - - struct workqueue_struct *rx_wq; - struct work_struct rx_work; - struct delayed_work rx_delayed_work; - - enum com_state com_state; - - /* init communication - setting link driver */ - int (*init_comm)(struct link_device *ld, struct io_device *iod); - - /* terminate communication */ - void (*terminate_comm)(struct link_device *ld, struct io_device *iod); - - /* called by an io_device when it has a packet to send over link - * - the io device is passed so the link device can look at id and - * format fields to determine how to route/format the packet - */ - int (*send)(struct link_device *ld, struct io_device *iod, - struct sk_buff *skb); - - int (*udl_start)(struct link_device *ld, struct io_device *iod); - - int (*force_dump)(struct link_device *ld, struct io_device *iod); - - int (*dump_start)(struct link_device *ld, struct io_device *iod); - - int (*modem_update)(struct link_device *ld, struct io_device *iod, - unsigned long arg); - - int (*dump_update)(struct link_device *ld, struct io_device *iod, - unsigned long arg); - - int (*ioctl)(struct link_device *ld, struct io_device *iod, - unsigned cmd, unsigned long _arg); -}; - -/** rx_alloc_skb - allocate an skbuff and set skb's iod, ld - * @length: length to allocate - * @iod: struct io_device * - * @ld: struct link_device * - * - * %NULL is returned if there is no free memory. - */ -static inline struct sk_buff *rx_alloc_skb(unsigned int length, - struct io_device *iod, struct link_device *ld) -{ - struct sk_buff *skb; - - if (iod->format == IPC_MULTI_RAW || iod->format == IPC_RAW) - skb = dev_alloc_skb(length); - else - skb = alloc_skb(length, GFP_ATOMIC); - - if (likely(skb)) { - skbpriv(skb)->iod = iod; - skbpriv(skb)->ld = ld; - } - return skb; -} - -struct modemctl_ops { - int (*modem_on) (struct modem_ctl *); - int (*modem_off) (struct modem_ctl *); - int (*modem_reset) (struct modem_ctl *); - int (*modem_boot_on) (struct modem_ctl *); - int (*modem_boot_off) (struct modem_ctl *); - int (*modem_boot_done) (struct modem_ctl *); - int (*modem_force_crash_exit) (struct modem_ctl *); - int (*modem_dump_reset) (struct modem_ctl *); -}; - -/* for IPC Logger */ -struct mif_storage { - char *addr; - unsigned int cnt; -}; - -/* modem_shared - shared data for all io/link devices and a modem ctl - * msd : mc : iod : ld = 1 : 1 : M : N - */ -struct modem_shared { - /* list of link devices */ - struct list_head link_dev_list; - - /* rb_tree root of io devices. */ - struct rb_root iodevs_tree_chan; /* group by channel */ - struct rb_root iodevs_tree_fmt; /* group by dev_format */ - - /* for IPC Logger */ - struct mif_storage storage; - spinlock_t lock; - - /* loopbacked IP address - * default is 0.0.0.0 (disabled) - * after you setted this, you can use IP packet loopback using this IP. - * exam: echo 1.2.3.4 > /sys/devices/virtual/misc/umts_multipdp/loopback - */ - __be32 loopback_ipaddr; -}; - -struct modem_ctl { - struct device *dev; - char *name; - struct modem_data *mdm_data; - - struct modem_shared *msd; - - enum modem_state phone_state; - struct sim_state sim_state; - - unsigned gpio_cp_on; - unsigned gpio_reset_req_n; - unsigned gpio_cp_reset; - unsigned gpio_pda_active; - unsigned gpio_phone_active; - unsigned gpio_cp_dump_int; - unsigned gpio_ap_dump_int; - unsigned gpio_flm_uart_sel; -#if defined(CONFIG_MACH_M0_CTC) - unsigned gpio_flm_uart_sel_rev06; -#endif - unsigned gpio_cp_warm_reset; - unsigned gpio_cp_off; - unsigned gpio_sim_detect; - unsigned gpio_dynamic_switching; - - int irq_phone_active; - int irq_sim_detect; - -#ifdef CONFIG_LTE_MODEM_CMC221 - const struct attribute_group *group; - unsigned gpio_slave_wakeup; - unsigned gpio_host_wakeup; - unsigned gpio_host_active; - int irq_host_wakeup; - - struct delayed_work dwork; -#endif /*CONFIG_LTE_MODEM_CMC221*/ - - struct work_struct work; - -#if defined(CONFIG_MACH_U1_KOR_LGT) - unsigned gpio_cp_reset_msm; - unsigned gpio_boot_sw_sel; - void (*vbus_on)(void); - void (*vbus_off)(void); - bool usb_boot; -#endif - -#ifdef CONFIG_TDSCDMA_MODEM_SPRD8803 - unsigned gpio_ap_cp_int1; - unsigned gpio_ap_cp_int2; -#endif - -#ifdef CONFIG_SEC_DUAL_MODEM_MODE - unsigned gpio_sim_io_sel; - unsigned gpio_cp_ctrl1; - unsigned gpio_cp_ctrl2; -#endif - -#ifdef CONFIG_LINK_DEVICE_PLD - unsigned gpio_fpga_cs_n; -#endif - - struct modemctl_ops ops; - struct io_device *iod; - struct io_device *bootd; - - /* Wakelock for modem_ctl */ - struct wake_lock mc_wake_lock; - - void (*gpio_revers_bias_clear)(void); - void (*gpio_revers_bias_restore)(void); - - bool need_switch_to_usb; - bool sim_polarity; - - bool sim_shutdown_req; - void (*modem_complete)(struct modem_ctl *mc); - -}; - -int sipc4_init_io_device(struct io_device *iod); -int sipc5_init_io_device(struct io_device *iod); - -/** - * get_dev_name - * @dev: IPC device (enum dev_format) - * - * Returns IPC device name as a string. - * - */ -static const inline char *get_dev_name(int dev) -{ - if (dev == IPC_FMT) - return "FMT"; - else if (dev == IPC_RAW) - return "RAW"; - else if (dev == IPC_RFS) - return "RFS"; - else if (dev == IPC_BOOT) - return "BOOT"; - else if (dev == IPC_RAMDUMP) - return "DUMP"; - else - return "NONE"; -} - -/** - * sipc5_start_valid - * @cfg: configuration field of an SIPC5 link frame - * - * Returns TRUE if the start (configuration field) of an SIPC5 link frame - * is valid or returns FALSE if it is not valid. - * - */ -static inline int sipc5_start_valid(u8 cfg) -{ - return (cfg & SIPC5_START_MASK) == SIPC5_START_MASK; -} - -/** - * sipc5_get_hdr_len - * @cfg: configuration field of an SIPC5 link frame - * - * Returns the length of SIPC5 link layer header in an SIPC5 link frame - * - */ -static inline unsigned sipc5_get_hdr_len(u8 cfg) -{ - if (cfg & SIPC5_EXT_FIELD_EXIST) { - if (cfg & SIPC5_CTL_FIELD_EXIST) - return SIPC5_HEADER_SIZE_WITH_CTL_FLD; - else - return SIPC5_HEADER_SIZE_WITH_EXT_LEN; - } else { - return SIPC5_MIN_HEADER_SIZE; - } -} - -/** - * sipc5_get_ch_id - * @frm: pointer to an SIPC5 frame - * - * Returns the channel ID in an SIPC5 link frame - * - */ -static inline u8 sipc5_get_ch_id(u8 *frm) -{ - return *(frm + SIPC5_CH_ID_OFFSET); -} - -/** - * sipc5_get_frame_sz16 - * @frm: pointer to an SIPC5 link frame - * - * Returns the length of an SIPC5 link frame without the extended length field - * - */ -static inline int sipc5_get_frame_sz16(u8 *frm) -{ - int sz16 = (int)(*((u16 *)(frm + SIPC5_LEN_OFFSET))); - return sz16; -} - -/** - * sipc5_get_frame_sz32 - * @frm: pointer to an SIPC5 frame - * - * Returns the length of an SIPC5 link frame with the extended length field - * - */ -static inline int sipc5_get_frame_sz32(u8 *frm) -{ - int sz32 = (int)(*((u32 *)(frm + SIPC5_LEN_OFFSET))); - return sz32; -} - -/** - * sipc5_calc_padding_size - * @len: length of an SIPC5 link frame - * - * Returns the padding size for an SIPC5 link frame - * - */ -static inline int sipc5_calc_padding_size(int len) -{ - int residue = len & 0x3; - return residue ? (4 - residue) : 0; -} - -/** - * sipc5_check_frame_in_dev - * @ld: pointer to the link device structure - * @dev: IPC device (enum dev_format) - * @frm: pointer to the start of an SIPC5 frame - * @rest: size of the rest data in the device buffer including this frame - * - * Returns - * < 0 : error - * == 0 : no data - * > 0 : valid data - * - */ -static inline int sipc5_check_frame_in_dev(struct link_device *ld, int dev, - u8 *frm, int rest) -{ - int len; - - if (unlikely(!sipc5_start_valid(frm[0]))) { - mif_err("%s: ERR! %s invalid start 0x%02X\n", - ld->name, get_dev_name(dev), frm[0]); - return -EBADMSG; - } - - len = sipc5_get_frame_sz16(frm); - if (unlikely(len > rest)) { - mif_err("%s: ERR! %s len %d > rest %d\n", - ld->name, get_dev_name(dev), len, rest); - return -EBADMSG; - } - - return len; -} - -extern void set_sromc_access(bool access); - -#if defined(CONFIG_TDSCDMA_MODEM_SPRD8803) && defined(CONFIG_LINK_DEVICE_SPI) -extern int spi_sema_init(void); -extern int sprd_boot_done; -#endif - -#endif diff --git a/drivers/misc/modem_if_u1/modem_sim_slot_switch.c b/drivers/misc/modem_if_u1/modem_sim_slot_switch.c deleted file mode 100644 index 366d0fa..0000000 --- a/drivers/misc/modem_if_u1/modem_sim_slot_switch.c +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include -#include -#include - -#include - -#include - -extern struct class *sec_class; -struct device *slot_switch_dev; - -static ssize_t get_slot_switch(struct device *dev, struct device_attribute *attr, char *buf) -{ - int value; - - //return '0' slot path is '||', return '1' slot path is 'X' - value = gpio_get_value(GPIO_UIM_SIM_SEL); -#if defined(CONFIG_MACH_T0_CHN_CTC) - if (system_rev <= 7) - value = (~value & 0x1); -#endif - printk("Current Slot is %x\n", value); - - return sprintf(buf, "%d\n", value); -} - -static ssize_t set_slot_switch(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) -{ - int value; - - sscanf(buf, "%d", &value); - - switch(value) { - case 0: -#if defined(CONFIG_MACH_T0_CHN_CTC) - if (system_rev <= 7) - gpio_set_value(GPIO_UIM_SIM_SEL, 1); - else -#endif - gpio_set_value(GPIO_UIM_SIM_SEL, 0); - printk("set slot switch to %x\n", gpio_get_value(GPIO_UIM_SIM_SEL)); - break; - case 1: -#if defined(CONFIG_MACH_T0_CHN_CTC) - if (system_rev <= 7) - gpio_set_value(GPIO_UIM_SIM_SEL, 0); - else -#endif - gpio_set_value(GPIO_UIM_SIM_SEL, 1); - printk("set slot switch to %x\n", gpio_get_value(GPIO_UIM_SIM_SEL)); - break; - default: - printk("Enter 0 or 1!!\n"); - } - - return size; -} - -static DEVICE_ATTR(slot_sel, S_IRUGO | S_IWUSR | S_IWGRP, - get_slot_switch, set_slot_switch); - -static int __init slot_switch_manager_init(void) -{ - int ret = 0; - int err = 0; - - printk("slot_switch_manager_init\n"); - - //initailize uim_sim_switch gpio - err = gpio_request(GPIO_UIM_SIM_SEL, "PDA_ACTIVE"); - if (err) { - pr_err("fail to request gpio %s, gpio %d, errno %d\n", - "PDA_ACTIVE", GPIO_UIM_SIM_SEL, err); - } else { - gpio_direction_output(GPIO_UIM_SIM_SEL, 1); - s3c_gpio_setpull(GPIO_UIM_SIM_SEL, S3C_GPIO_PULL_NONE); -#if defined(CONFIG_MACH_T0_CHN_CTC) - if (system_rev <= 7) - gpio_set_value(GPIO_UIM_SIM_SEL, 1); - else -#endif - gpio_set_value(GPIO_UIM_SIM_SEL, 0); - } - - //initailize slot switch device - slot_switch_dev = device_create(sec_class, - NULL, 0, NULL, "slot_switch"); - if (IS_ERR(slot_switch_dev)) - pr_err("Failed to create device(switch)!\n"); - - if (device_create_file(slot_switch_dev, &dev_attr_slot_sel) < 0) - pr_err("Failed to create device file(%s)!\n", - dev_attr_slot_sel.attr.name); - - return ret; -} - -static void __exit slot_switch_manager_exit(void) -{ -} - -module_init(slot_switch_manager_init); -module_exit(slot_switch_manager_exit); - -MODULE_AUTHOR("SAMSUNG ELECTRONICS CO., LTD"); -MODULE_DESCRIPTION("Slot Switch"); -MODULE_LICENSE("GPL"); diff --git a/drivers/misc/modem_if_u1/modem_utils.c b/drivers/misc/modem_if_u1/modem_utils.c deleted file mode 100644 index 113a199..0000000 --- a/drivers/misc/modem_if_u1/modem_utils.c +++ /dev/null @@ -1,1237 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_variation.h" -#include "modem_utils.h" - -#define CMD_SUSPEND ((unsigned short)(0x00CA)) -#define CMD_RESUME ((unsigned short)(0x00CB)) - -#define TX_SEPARATOR "mif: >>>>>>>>>> Outgoing packet " -#define RX_SEPARATOR "mif: Incoming packet <<<<<<<<<<" -#define LINE_SEPARATOR \ - "mif: ------------------------------------------------------------" -#define LINE_BUFF_SIZE 80 - -static const char *hex = "0123456789abcdef"; - -void ts2utc(struct timespec *ts, struct utc_time *utc) -{ - struct tm tm; - - time_to_tm((ts->tv_sec - (sys_tz.tz_minuteswest * 60)), 0, &tm); - utc->year = 1900 + tm.tm_year; - utc->mon = 1 + tm.tm_mon; - utc->day = tm.tm_mday; - utc->hour = tm.tm_hour; - utc->min = tm.tm_min; - utc->sec = tm.tm_sec; - utc->msec = (ts->tv_nsec > 0) ? (ts->tv_nsec / 1000000) : 0; -} - -void get_utc_time(struct utc_time *utc) -{ - struct timespec ts; - getnstimeofday(&ts); - ts2utc(&ts, utc); -} - -#ifdef CONFIG_LINK_DEVICE_DPRAM -#include "modem_link_device_dpram.h" -int mif_dump_dpram(struct io_device *iod) -{ - struct link_device *ld = get_current_link(iod); - struct dpram_link_device *dpld = to_dpram_link_device(ld); - u32 size = dpld->size; - unsigned long read_len = 0; - struct sk_buff *skb; - char *buff; - - buff = kzalloc(size, GFP_ATOMIC); - if (!buff) { - mif_err("ERR! kzalloc fail\n"); - return -ENOMEM; - } else { - dpld->dpram_dump(ld, buff); - } - - while (read_len < size) { - skb = alloc_skb(MAX_IPC_SKB_SIZE, GFP_ATOMIC); - if (!skb) { - mif_err("ERR! alloc_skb fail\n"); - kfree(buff); - return -ENOMEM; - } - memcpy(skb_put(skb, MAX_IPC_SKB_SIZE), - buff + read_len, MAX_IPC_SKB_SIZE); - skb_queue_tail(&iod->sk_rx_q, skb); - read_len += MAX_IPC_SKB_SIZE; - wake_up(&iod->wq); - } - kfree(buff); - return 0; -} -#endif - -int mif_dump_log(struct modem_shared *msd, struct io_device *iod) -{ - struct sk_buff *skb; - unsigned long read_len = 0; - unsigned long int flags; - - spin_lock_irqsave(&msd->lock, flags); - while (read_len < MAX_MIF_BUFF_SIZE) { - skb = alloc_skb(MAX_IPC_SKB_SIZE, GFP_ATOMIC); - if (!skb) { - mif_err("ERR! alloc_skb fail\n"); - spin_unlock_irqrestore(&msd->lock, flags); - return -ENOMEM; - } - memcpy(skb_put(skb, MAX_IPC_SKB_SIZE), - msd->storage.addr + read_len, MAX_IPC_SKB_SIZE); - skb_queue_tail(&iod->sk_rx_q, skb); - read_len += MAX_IPC_SKB_SIZE; - wake_up(&iod->wq); - } - spin_unlock_irqrestore(&msd->lock, flags); - return 0; -} - -static unsigned long long get_kernel_time(void) -{ - int this_cpu; - unsigned long flags; - unsigned long long time; - - preempt_disable(); - raw_local_irq_save(flags); - - this_cpu = smp_processor_id(); - time = cpu_clock(this_cpu); - - preempt_enable(); - raw_local_irq_restore(flags); - - return time; -} - -void mif_ipc_log(enum mif_log_id id, - struct modem_shared *msd, const char *data, size_t len) -{ - struct mif_ipc_block *block; - unsigned long int flags; - - spin_lock_irqsave(&msd->lock, flags); - - block = (struct mif_ipc_block *) - (msd->storage.addr + (MAX_LOG_SIZE * msd->storage.cnt)); - msd->storage.cnt = ((msd->storage.cnt + 1) < MAX_LOG_CNT) ? - msd->storage.cnt + 1 : 0; - - spin_unlock_irqrestore(&msd->lock, flags); - - block->id = id; - block->time = get_kernel_time(); - block->len = (len > MAX_IPC_LOG_SIZE) ? MAX_IPC_LOG_SIZE : len; - memcpy(block->buff, data, block->len); -} - -void _mif_irq_log(enum mif_log_id id, struct modem_shared *msd, - struct mif_irq_map map, const char *data, size_t len) -{ - struct mif_irq_block *block; - unsigned long int flags; - - spin_lock_irqsave(&msd->lock, flags); - - block = (struct mif_irq_block *) - (msd->storage.addr + (MAX_LOG_SIZE * msd->storage.cnt)); - msd->storage.cnt = ((msd->storage.cnt + 1) < MAX_LOG_CNT) ? - msd->storage.cnt + 1 : 0; - - spin_unlock_irqrestore(&msd->lock, flags); - - block->id = id; - block->time = get_kernel_time(); - memcpy(&(block->map), &map, sizeof(struct mif_irq_map)); - if (data) - memcpy(block->buff, data, - (len > MAX_IRQ_LOG_SIZE) ? MAX_IRQ_LOG_SIZE : len); -} - -void _mif_com_log(enum mif_log_id id, - struct modem_shared *msd, const char *format, ...) -{ - struct mif_common_block *block; - unsigned long int flags; - va_list args; - int ret; - - spin_lock_irqsave(&msd->lock, flags); - - block = (struct mif_common_block *) - (msd->storage.addr + (MAX_LOG_SIZE * msd->storage.cnt)); - msd->storage.cnt = ((msd->storage.cnt + 1) < MAX_LOG_CNT) ? - msd->storage.cnt + 1 : 0; - - spin_unlock_irqrestore(&msd->lock, flags); - - block->id = id; - block->time = get_kernel_time(); - - va_start(args, format); - ret = vsnprintf(block->buff, MAX_COM_LOG_SIZE, format, args); - va_end(args); -} - -void _mif_time_log(enum mif_log_id id, struct modem_shared *msd, - struct timespec epoch, const char *data, size_t len) -{ - struct mif_time_block *block; - unsigned long int flags; - - spin_lock_irqsave(&msd->lock, flags); - - block = (struct mif_time_block *) - (msd->storage.addr + (MAX_LOG_SIZE * msd->storage.cnt)); - msd->storage.cnt = ((msd->storage.cnt + 1) < MAX_LOG_CNT) ? - msd->storage.cnt + 1 : 0; - - spin_unlock_irqrestore(&msd->lock, flags); - - block->id = id; - block->time = get_kernel_time(); - memcpy(&block->epoch, &epoch, sizeof(struct timespec)); - - if (data) - memcpy(block->buff, data, - (len > MAX_IRQ_LOG_SIZE) ? MAX_IRQ_LOG_SIZE : len); -} - -/* dump2hex - * dump data to hex as fast as possible. - * the length of @buff must be greater than "@len * 3" - * it need 3 bytes per one data byte to print. - */ -static inline int dump2hex(char *buff, const char *data, size_t len) -{ - char *dest = buff; - int i; - - for (i = 0; i < len; i++) { - *dest++ = hex[(data[i] >> 4) & 0xf]; - *dest++ = hex[data[i] & 0xf]; - *dest++ = ' '; - } - if (likely(len > 0)) - dest--; /* last space will be overwrited with null */ - - *dest = '\0'; - - return dest - buff; -} - -void pr_ipc(const char *tag, const char *data, size_t len) -{ - struct utc_time utc; - unsigned char str[128]; - - get_utc_time(&utc); - dump2hex(str, data, (len > 32 ? 32 : len)); - pr_info("%s: %s: [%02d:%02d:%02d.%03d] %s\n", - MIF_TAG, tag, utc.hour, utc.min, utc.sec, utc.msec, str); -} - -/* print buffer as hex string */ -int pr_buffer(const char *tag, const char *data, size_t data_len, - size_t max_len) -{ - size_t len = min(data_len, max_len); - unsigned char str[len ? len * 3 : 1]; /* 1 <= sizeof <= max_len*3 */ - dump2hex(str, data, len); - - /* don't change this printk to mif_debug for print this as level7 */ - return printk(KERN_INFO "%s: %s(%u): %s%s\n", MIF_TAG, tag, data_len, - str, (len == data_len) ? "" : " ..."); -} - -/* flow control CM from CP, it use in serial devices */ -int link_rx_flowctl_cmd(struct link_device *ld, const char *data, size_t len) -{ - struct modem_shared *msd = ld->msd; - unsigned short *cmd, *end = (unsigned short *)(data + len); - - mif_debug("flow control cmd: size=%d\n", len); - - for (cmd = (unsigned short *)data; cmd < end; cmd++) { - switch (*cmd) { - case CMD_SUSPEND: - iodevs_for_each(msd, iodev_netif_stop, 0); - ld->raw_tx_suspended = true; - mif_info("flowctl CMD_SUSPEND(%04X)\n", *cmd); - break; - - case CMD_RESUME: - iodevs_for_each(msd, iodev_netif_wake, 0); - ld->raw_tx_suspended = false; - complete_all(&ld->raw_tx_resumed_by_cp); - mif_info("flowctl CMD_RESUME(%04X)\n", *cmd); - break; - - default: - mif_err("flowctl BAD CMD: %04X\n", *cmd); - break; - } - } - - return 0; -} - -struct io_device *get_iod_with_channel(struct modem_shared *msd, - unsigned channel) -{ - struct rb_node *n = msd->iodevs_tree_chan.rb_node; - struct io_device *iodev; - while (n) { - iodev = rb_entry(n, struct io_device, node_chan); - if (channel < iodev->id) - n = n->rb_left; - else if (channel > iodev->id) - n = n->rb_right; - else - return iodev; - } - return NULL; -} - -struct io_device *get_iod_with_format(struct modem_shared *msd, - enum dev_format format) -{ - struct rb_node *n = msd->iodevs_tree_fmt.rb_node; - struct io_device *iodev; - while (n) { - iodev = rb_entry(n, struct io_device, node_fmt); - if (format < iodev->format) - n = n->rb_left; - else if (format > iodev->format) - n = n->rb_right; - else - return iodev; - } - return NULL; -} - -struct io_device *insert_iod_with_channel(struct modem_shared *msd, - unsigned channel, struct io_device *iod) -{ - struct rb_node **p = &msd->iodevs_tree_chan.rb_node; - struct rb_node *parent = NULL; - struct io_device *iodev; - while (*p) { - parent = *p; - iodev = rb_entry(parent, struct io_device, node_chan); - if (channel < iodev->id) - p = &(*p)->rb_left; - else if (channel > iodev->id) - p = &(*p)->rb_right; - else - return iodev; - } - rb_link_node(&iod->node_chan, parent, p); - rb_insert_color(&iod->node_chan, &msd->iodevs_tree_chan); - return NULL; -} - -struct io_device *insert_iod_with_format(struct modem_shared *msd, - enum dev_format format, struct io_device *iod) -{ - struct rb_node **p = &msd->iodevs_tree_fmt.rb_node; - struct rb_node *parent = NULL; - struct io_device *iodev; - while (*p) { - parent = *p; - iodev = rb_entry(parent, struct io_device, node_fmt); - if (format < iodev->format) - p = &(*p)->rb_left; - else if (format > iodev->format) - p = &(*p)->rb_right; - else - return iodev; - } - rb_link_node(&iod->node_fmt, parent, p); - rb_insert_color(&iod->node_fmt, &msd->iodevs_tree_fmt); - return NULL; -} - -void iodevs_for_each(struct modem_shared *msd, action_fn action, void *args) -{ - struct io_device *iod; - struct rb_node *node = rb_first(&msd->iodevs_tree_chan); - for (; node; node = rb_next(node)) { - iod = rb_entry(node, struct io_device, node_chan); - action(iod, args); - } -} - -void iodev_netif_wake(struct io_device *iod, void *args) -{ - if (iod->io_typ == IODEV_NET && iod->ndev) { - netif_wake_queue(iod->ndev); - mif_info("%s\n", iod->name); - } -} - -void iodev_netif_stop(struct io_device *iod, void *args) -{ - if (iod->io_typ == IODEV_NET && iod->ndev) { - netif_stop_queue(iod->ndev); - mif_info("%s\n", iod->name); - } -} - -static void iodev_set_tx_link(struct io_device *iod, void *args) -{ - struct link_device *ld = (struct link_device *)args; - if (iod->format == IPC_RAW && IS_CONNECTED(iod, ld)) { - set_current_link(iod, ld); - mif_err("%s -> %s\n", iod->name, ld->name); - } -} - -void rawdevs_set_tx_link(struct modem_shared *msd, enum modem_link link_type) -{ - struct link_device *ld = find_linkdev(msd, link_type); - if (ld) - iodevs_for_each(msd, iodev_set_tx_link, ld); -} - -void mif_netif_stop(struct link_device *ld) -{ - struct io_device *iod; - - if (ld->ipc_version < SIPC_VER_50) - iod = link_get_iod_with_channel(ld, 0x20 | RMNET0_CH_ID); - else - iod = link_get_iod_with_channel(ld, RMNET0_CH_ID); - - if (iod) - iodevs_for_each(iod->msd, iodev_netif_stop, 0); -} - -void mif_netif_wake(struct link_device *ld) -{ - struct io_device *iod; - - /** - * If ld->suspend_netif_tx is true, this means that there was a SUSPEND - * flow control command from CP so MIF must wait for a RESUME command - * from CP. - */ - if (ld->suspend_netif_tx) { - mif_info("%s: waiting for FLOW_CTRL_RESUME\n", ld->name); - return; - } - - if (ld->ipc_version < SIPC_VER_50) - iod = link_get_iod_with_channel(ld, 0x20 | RMNET0_CH_ID); - else - iod = link_get_iod_with_channel(ld, RMNET0_CH_ID); - - if (iod) - iodevs_for_each(iod->msd, iodev_netif_wake, 0); -} - -/** - * ipv4str_to_be32 - ipv4 string to be32 (big endian 32bits integer) - * @return: return zero when errors occurred - */ -__be32 ipv4str_to_be32(const char *ipv4str, size_t count) -{ - unsigned char ip[4]; - char ipstr[16]; /* == strlen("xxx.xxx.xxx.xxx") + 1 */ - char *next = ipstr; - char *p; - int i; - - strncpy(ipstr, ipv4str, ARRAY_SIZE(ipstr)); - - for (i = 0; i < 4; i++) { - p = strsep(&next, "."); - if (kstrtou8(p, 10, &ip[i]) < 0) - return 0; /* == 0.0.0.0 */ - } - - return *((__be32 *)ip); -} - -void mif_add_timer(struct timer_list *timer, unsigned long expire, - void (*function)(unsigned long), unsigned long data) -{ - if (timer_pending(timer)) - return; - - init_timer(timer); - timer->expires = get_jiffies_64() + expire; - timer->function = function; - timer->data = data; - add_timer(timer); -} - -void mif_print_data(const char *buff, int len) -{ - int words = len >> 4; - int residue = len - (words << 4); - int i; - char *b; - char last[80]; - char tb[8]; - - /* Make the last line, if ((len % 16) > 0) */ - if (residue > 0) { - memset(last, 0, sizeof(last)); - memset(tb, 0, sizeof(tb)); - b = (char *)buff + (words << 4); - - sprintf(last, "%04X: ", (words << 4)); - for (i = 0; i < residue; i++) { - sprintf(tb, "%02x ", b[i]); - strcat(last, tb); - if ((i & 0x3) == 0x3) { - sprintf(tb, " "); - strcat(last, tb); - } - } - } - - for (i = 0; i < words; i++) { - b = (char *)buff + (i << 4); - mif_err("%04X: " - "%02x %02x %02x %02x %02x %02x %02x %02x " - "%02x %02x %02x %02x %02x %02x %02x %02x\n", - (i << 4), - b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], - b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]); - } - - /* Print the last line */ - if (residue > 0) - mif_err("%s\n", last); -} - -void mif_dump2format16(const char *data, int len, char *buff, char *tag) -{ - char *d; - int i; - int words = len >> 4; - int residue = len - (words << 4); - char line[LINE_BUFF_SIZE]; - char tb[8]; - - for (i = 0; i < words; i++) { - memset(line, 0, LINE_BUFF_SIZE); - d = (char *)data + (i << 4); - - if (tag) - sprintf(line, "%s%04X| " - "%02x %02x %02x %02x " - "%02x %02x %02x %02x " - "%02x %02x %02x %02x " - "%02x %02x %02x %02x\n", - tag, (i << 4), - d[0], d[1], d[2], d[3], - d[4], d[5], d[6], d[7], - d[8], d[9], d[10], d[11], - d[12], d[13], d[14], d[15]); - else - sprintf(line, "%04X| " - "%02x %02x %02x %02x " - "%02x %02x %02x %02x " - "%02x %02x %02x %02x " - "%02x %02x %02x %02x\n", - (i << 4), - d[0], d[1], d[2], d[3], - d[4], d[5], d[6], d[7], - d[8], d[9], d[10], d[11], - d[12], d[13], d[14], d[15]); - - strcat(buff, line); - } - - /* Make the last line, if (len % 16) > 0 */ - if (residue > 0) { - memset(line, 0, LINE_BUFF_SIZE); - memset(tb, 0, sizeof(tb)); - d = (char *)data + (words << 4); - - if (tag) - sprintf(line, "%s%04X|", tag, (words << 4)); - else - sprintf(line, "%04X|", (words << 4)); - - for (i = 0; i < residue; i++) { - sprintf(tb, " %02x", d[i]); - strcat(line, tb); - if ((i & 0x3) == 0x3) { - sprintf(tb, " "); - strcat(line, tb); - } - } - strcat(line, "\n"); - - strcat(buff, line); - } -} - -void mif_dump2format4(const char *data, int len, char *buff, char *tag) -{ - char *d; - int i; - int words = len >> 2; - int residue = len - (words << 2); - char line[LINE_BUFF_SIZE]; - char tb[8]; - - for (i = 0; i < words; i++) { - memset(line, 0, LINE_BUFF_SIZE); - d = (char *)data + (i << 2); - - if (tag) - sprintf(line, "%s%04X| %02x %02x %02x %02x\n", - tag, (i << 2), d[0], d[1], d[2], d[3]); - else - sprintf(line, "%04X| %02x %02x %02x %02x\n", - (i << 2), d[0], d[1], d[2], d[3]); - - strcat(buff, line); - } - - /* Make the last line, if (len % 4) > 0 */ - if (residue > 0) { - memset(line, 0, LINE_BUFF_SIZE); - memset(tb, 0, sizeof(tb)); - d = (char *)data + (words << 2); - - if (tag) - sprintf(line, "%s%04X|", tag, (words << 2)); - else - sprintf(line, "%04X|", (words << 2)); - - for (i = 0; i < residue; i++) { - sprintf(tb, " %02x", d[i]); - strcat(line, tb); - } - strcat(line, "\n"); - - strcat(buff, line); - } -} - -void mif_print_dump(const char *data, int len, int width) -{ - char *buff; - - buff = kzalloc(len << 3, GFP_ATOMIC); - if (!buff) { - mif_err("ERR! kzalloc fail\n"); - return; - } - - if (width == 16) - mif_dump2format16(data, len, buff, LOG_TAG); - else - mif_dump2format4(data, len, buff, LOG_TAG); - - pr_info("%s", buff); - - kfree(buff); -} - -void print_sipc4_hdlc_fmt_frame(const u8 *psrc) -{ - u8 *frm; /* HDLC Frame */ - struct fmt_hdr *hh; /* HDLC Header */ - struct sipc_fmt_hdr *fh; /* IPC Header */ - u16 hh_len = sizeof(struct fmt_hdr); - u16 fh_len = sizeof(struct sipc_fmt_hdr); - u8 *data; - int dlen; - - /* Actual HDLC header starts from after START flag (0x7F) */ - frm = (u8 *)(psrc + 1); - - /* Point HDLC header and IPC header */ - hh = (struct fmt_hdr *)(frm); - fh = (struct sipc_fmt_hdr *)(frm + hh_len); - - /* Point IPC data */ - data = frm + (hh_len + fh_len); - dlen = hh->len - (hh_len + fh_len); - - mif_err("--------------------HDLC & FMT HEADER----------------------\n"); - - mif_err("HDLC: length %d, control 0x%02x\n", hh->len, hh->control); - - mif_err("(M)0x%02X, (S)0x%02X, (T)0x%02X, mseq %d, aseq %d, len %d\n", - fh->main_cmd, fh->sub_cmd, fh->cmd_type, - fh->msg_seq, fh->ack_seq, fh->len); - - mif_err("-----------------------IPC FMT DATA------------------------\n"); - - if (dlen > 0) { - if (dlen > 64) - dlen = 64; - mif_print_data(data, dlen); - } - - mif_err("-----------------------------------------------------------\n"); -} - -void print_sipc4_fmt_frame(const u8 *psrc) -{ - struct sipc_fmt_hdr *fh = (struct sipc_fmt_hdr *)psrc; - u16 fh_len = sizeof(struct sipc_fmt_hdr); - u8 *data; - int dlen; - - /* Point IPC data */ - data = (u8 *)(psrc + fh_len); - dlen = fh->len - fh_len; - - mif_err("----------------------IPC FMT HEADER-----------------------\n"); - - mif_err("(M)0x%02X, (S)0x%02X, (T)0x%02X, mseq:%d, aseq:%d, len:%d\n", - fh->main_cmd, fh->sub_cmd, fh->cmd_type, - fh->msg_seq, fh->ack_seq, fh->len); - - mif_err("-----------------------IPC FMT DATA------------------------\n"); - - if (dlen > 0) - mif_print_data(data, dlen); - - mif_err("-----------------------------------------------------------\n"); -} - -void print_sipc5_link_fmt_frame(const u8 *psrc) -{ - u8 *lf; /* Link Frame */ - struct sipc5_link_hdr *lh; /* Link Header */ - struct sipc_fmt_hdr *fh; /* IPC Header */ - u16 lh_len; - u16 fh_len; - u8 *data; - int dlen; - - lf = (u8 *)psrc; - - /* Point HDLC header and IPC header */ - lh = (struct sipc5_link_hdr *)lf; - if (lh->cfg & SIPC5_CTL_FIELD_EXIST) - lh_len = SIPC5_HEADER_SIZE_WITH_CTL_FLD; - else - lh_len = SIPC5_MIN_HEADER_SIZE; - fh = (struct sipc_fmt_hdr *)(lf + lh_len); - fh_len = sizeof(struct sipc_fmt_hdr); - - /* Point IPC data */ - data = lf + (lh_len + fh_len); - dlen = lh->len - (lh_len + fh_len); - - mif_err("--------------------LINK & FMT HEADER----------------------\n"); - - mif_err("LINK: cfg 0x%02X, ch %d, len %d\n", lh->cfg, lh->ch, lh->len); - - mif_err("(M)0x%02X, (S)0x%02X, (T)0x%02X, mseq:%d, aseq:%d, len:%d\n", - fh->main_cmd, fh->sub_cmd, fh->cmd_type, - fh->msg_seq, fh->ack_seq, fh->len); - - mif_err("-----------------------IPC FMT DATA------------------------\n"); - - if (dlen > 0) { - if (dlen > 64) - dlen = 64; - mif_print_data(data, dlen); - } - - mif_err("-----------------------------------------------------------\n"); -} - -static void strcat_tcp_header(char *buff, u8 *pkt) -{ - struct tcphdr *tcph = (struct tcphdr *)pkt; - int eol; - char line[LINE_BUFF_SIZE]; - char flag_str[32]; - -/*------------------------------------------------------------------------- - - TCP Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Port | Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Sequence Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Acknowledgment Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Data | |C|E|U|A|P|R|S|F| | - | Offset| Rsvd |W|C|R|C|S|S|Y|I| Window | - | | |R|E|G|K|H|T|N|N| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Checksum | Urgent Pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options | Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - --------------------------------------------------------------------------*/ - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, - "%s: TCP:: Src.Port %u, Dst.Port %u\n", - MIF_TAG, ntohs(tcph->source), ntohs(tcph->dest)); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, - "%s: TCP:: SEQ 0x%08X(%u), ACK 0x%08X(%u)\n", - MIF_TAG, ntohs(tcph->seq), ntohs(tcph->seq), - ntohs(tcph->ack_seq), ntohs(tcph->ack_seq)); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - memset(flag_str, 0, sizeof(flag_str)); - if (tcph->cwr) - strcat(flag_str, "CWR "); - if (tcph->ece) - strcat(flag_str, "ECE"); - if (tcph->urg) - strcat(flag_str, "URG "); - if (tcph->ack) - strcat(flag_str, "ACK "); - if (tcph->psh) - strcat(flag_str, "PSH "); - if (tcph->rst) - strcat(flag_str, "RST "); - if (tcph->syn) - strcat(flag_str, "SYN "); - if (tcph->fin) - strcat(flag_str, "FIN "); - eol = strlen(flag_str) - 1; - if (eol > 0) - flag_str[eol] = 0; - snprintf(line, LINE_BUFF_SIZE, "%s: TCP:: Flags {%s}\n", - MIF_TAG, flag_str); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, - "%s: TCP:: Window %u, Checksum 0x%04X, Urgent %u\n", MIF_TAG, - ntohs(tcph->window), ntohs(tcph->check), ntohs(tcph->urg_ptr)); - strcat(buff, line); -} - -static void strcat_udp_header(char *buff, u8 *pkt) -{ - struct udphdr *udph = (struct udphdr *)pkt; - char line[LINE_BUFF_SIZE]; - -/*------------------------------------------------------------------------- - - UDP Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Port | Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Length | Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - --------------------------------------------------------------------------*/ - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, - "%s: UDP:: Src.Port %u, Dst.Port %u\n", - MIF_TAG, ntohs(udph->source), ntohs(udph->dest)); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, - "%s: UDP:: Length %u, Checksum 0x%04X\n", - MIF_TAG, ntohs(udph->len), ntohs(udph->check)); - strcat(buff, line); - - if (ntohs(udph->dest) == 53) { - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, "%s: UDP:: DNS query!!!\n", - MIF_TAG); - strcat(buff, line); - } - - if (ntohs(udph->source) == 53) { - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, "%s: UDP:: DNS response!!!\n", - MIF_TAG); - strcat(buff, line); - } -} - -void print_ip4_packet(const u8 *ip_pkt, bool tx) -{ - char *buff; - struct iphdr *iph = (struct iphdr *)ip_pkt; - u8 *pkt = (u8 *)ip_pkt + (iph->ihl << 2); - u16 flags = (ntohs(iph->frag_off) & 0xE000); - u16 frag_off = (ntohs(iph->frag_off) & 0x1FFF); - int eol; - char line[LINE_BUFF_SIZE]; - char flag_str[16]; - -/*--------------------------------------------------------------------------- - IPv4 Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |Version| IHL |Type of Service| Total Length | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Identification |C|D|M| Fragment Offset | - | |E|F|F| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Time to Live | Protocol | Header Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Address | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Destination Address | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options | Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - IHL - Header Length - Flags - Consist of 3 bits - The 1st bit is "Congestion" bit. - The 2nd bit is "Dont Fragment" bit. - The 3rd bit is "More Fragments" bit. - ----------------------------------------------------------------------------*/ - - if (iph->version != 4) - return; - - buff = kzalloc(4096, GFP_ATOMIC); - if (!buff) - return; - - - memset(line, 0, LINE_BUFF_SIZE); - if (tx) - snprintf(line, LINE_BUFF_SIZE, "\n%s\n", TX_SEPARATOR); - else - snprintf(line, LINE_BUFF_SIZE, "\n%s\n", RX_SEPARATOR); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, "%s\n", LINE_SEPARATOR); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, - "%s: IP4:: Version %u, Header Length %u, TOS %u, Length %u\n", - MIF_TAG, iph->version, (iph->ihl << 2), iph->tos, - ntohs(iph->tot_len)); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, "%s: IP4:: ID %u, Fragment Offset %u\n", - MIF_TAG, ntohs(iph->id), frag_off); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - memset(flag_str, 0, sizeof(flag_str)); - if (flags & IP_CE) - strcat(flag_str, "CE "); - if (flags & IP_DF) - strcat(flag_str, "DF "); - if (flags & IP_MF) - strcat(flag_str, "MF "); - eol = strlen(flag_str) - 1; - if (eol > 0) - flag_str[eol] = 0; - snprintf(line, LINE_BUFF_SIZE, "%s: IP4:: Flags {%s}\n", - MIF_TAG, flag_str); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, - "%s: IP4:: TTL %u, Protocol %u, Header Checksum 0x%04X\n", - MIF_TAG, iph->ttl, iph->protocol, ntohs(iph->check)); - strcat(buff, line); - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, - "%s: IP4:: Src.IP %u.%u.%u.%u, Dst.IP %u.%u.%u.%u\n", - MIF_TAG, ip_pkt[12], ip_pkt[13], ip_pkt[14], ip_pkt[15], - ip_pkt[16], ip_pkt[17], ip_pkt[18], ip_pkt[19]); - strcat(buff, line); - - switch (iph->protocol) { - case 6: /* TCP */ - strcat_tcp_header(buff, pkt); - break; - - case 17: /* UDP */ - strcat_udp_header(buff, pkt); - break; - - default: - break; - } - - memset(line, 0, LINE_BUFF_SIZE); - snprintf(line, LINE_BUFF_SIZE, "%s\n", LINE_SEPARATOR); - strcat(buff, line); - - pr_info("%s", buff); - - kfree(buff); -} - -bool is_dns_packet(const u8 *ip_pkt) -{ - struct iphdr *iph = (struct iphdr *)ip_pkt; - struct udphdr *udph = (struct udphdr *)(ip_pkt + (iph->ihl << 2)); - - /* If this packet is not a UDP packet, return here. */ - if (iph->protocol != 17) - return false; - - if (ntohs(udph->dest) == 53 || ntohs(udph->source) == 53) - return true; - else - return false; -} - -bool is_syn_packet(const u8 *ip_pkt) -{ - struct iphdr *iph = (struct iphdr *)ip_pkt; - struct tcphdr *tcph = (struct tcphdr *)(ip_pkt + (iph->ihl << 2)); - - /* If this packet is not a TCP packet, return here. */ - if (iph->protocol != 6) - return false; - - if (tcph->syn || tcph->fin) - return true; - else - return false; -} - -int memcmp16_to_io(const void __iomem *to, void *from, int size) -{ - u16 *d = (u16 *)to; - u16 *s = (u16 *)from; - int count = size >> 1; - int diff = 0; - int i; - u16 d1; - u16 s1; - - for (i = 0; i < count; i++) { - d1 = ioread16(d); - s1 = *s; - if (d1 != s1) { - diff++; - mif_err("ERR! [%d] d:0x%04X != s:0x%04X\n", i, d1, s1); - } - d++; - s++; - } - - return diff; -} - -int mif_test_dpram(char *dp_name, u8 __iomem *start, u32 size) -{ - u8 __iomem *dst; - int i; - u16 val; - - mif_info("%s: start = 0x%p, size = %d\n", dp_name, start, size); - - dst = start; - for (i = 0; i < (size >> 1); i++) { - iowrite16((i & 0xFFFF), dst); - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - val = ioread16(dst); - if (val != (i & 0xFFFF)) { - mif_info("%s: ERR! dst[%d] 0x%04X != 0x%04X\n", - dp_name, i, val, (i & 0xFFFF)); - return -EINVAL; - } - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - iowrite16(0x00FF, dst); - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - val = ioread16(dst); - if (val != 0x00FF) { - mif_info("%s: ERR! dst[%d] 0x%04X != 0x00FF\n", - dp_name, i, val); - return -EINVAL; - } - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - iowrite16(0x0FF0, dst); - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - val = ioread16(dst); - if (val != 0x0FF0) { - mif_info("%s: ERR! dst[%d] 0x%04X != 0x0FF0\n", - dp_name, i, val); - return -EINVAL; - } - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - iowrite16(0xFF00, dst); - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - val = ioread16(dst); - if (val != 0xFF00) { - mif_info("%s: ERR! dst[%d] 0x%04X != 0xFF00\n", - dp_name, i, val); - return -EINVAL; - } - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - iowrite16(0, dst); - dst += 2; - } - - dst = start; - for (i = 0; i < (size >> 1); i++) { - val = ioread16(dst); - if (val != 0) { - mif_info("%s: ERR! dst[%d] 0x%04X != 0\n", - dp_name, i, val); - return -EINVAL; - } - dst += 2; - } - - mif_info("%s: PASS!!!\n", dp_name); - return 0; -} - -struct file *mif_open_file(const char *path) -{ - struct file *fp; - mm_segment_t old_fs; - - old_fs = get_fs(); - set_fs(get_ds()); - - fp = filp_open(path, O_RDWR|O_CREAT|O_APPEND, 0666); - - set_fs(old_fs); - - if (IS_ERR(fp)) - return NULL; - - return fp; -} - -void mif_save_file(struct file *fp, const char *buff, size_t size) -{ - int ret; - mm_segment_t old_fs; - - old_fs = get_fs(); - set_fs(get_ds()); - - ret = fp->f_op->write(fp, buff, size, &fp->f_pos); - if (ret < 0) - mif_err("ERR! write fail\n"); - - set_fs(old_fs); -} - -void mif_close_file(struct file *fp) -{ - mm_segment_t old_fs; - - old_fs = get_fs(); - set_fs(get_ds()); - - filp_close(fp, NULL); - - set_fs(old_fs); -} - diff --git a/drivers/misc/modem_if_u1/modem_utils.h b/drivers/misc/modem_if_u1/modem_utils.h deleted file mode 100644 index 219e059..0000000 --- a/drivers/misc/modem_if_u1/modem_utils.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics. - * - * 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 __MODEM_UTILS_H__ -#define __MODEM_UTILS_H__ - -#include - -#define IS_CONNECTED(iod, ld) ((iod)->link_types & LINKTYPE((ld)->link_type)) - -#define MAX_MIF_BUFF_SIZE 0x80000 /* 512kb */ -#define MAX_MIF_SEPA_SIZE 32 -#define MIF_SEPARATOR "IPC_LOGGER(VER1.1)" -#define MIF_SEPARATOR_DPRAM "DPRAM_LOGGER(VER1.1)" -#define MAX_IPC_SKB_SIZE 4096 -#define MAX_LOG_SIZE 64 - -#define MIF_TAG "mif" - -#define MAX_LOG_CNT (MAX_MIF_BUFF_SIZE / MAX_LOG_SIZE) -#define MIF_ID_SIZE sizeof(enum mif_log_id) - -#define MAX_IPC_LOG_SIZE \ - (MAX_LOG_SIZE - sizeof(enum mif_log_id) \ - - sizeof(unsigned long long) - sizeof(size_t)) -#define MAX_IRQ_LOG_SIZE \ - (MAX_LOG_SIZE - sizeof(enum mif_log_id) \ - - sizeof(unsigned long long) - sizeof(struct mif_irq_map)) -#define MAX_COM_LOG_SIZE \ - (MAX_LOG_SIZE - sizeof(enum mif_log_id) \ - - sizeof(unsigned long long)) -#define MAX_TIM_LOG_SIZE \ - (MAX_LOG_SIZE - sizeof(enum mif_log_id) \ - - sizeof(unsigned long long) - sizeof(struct timespec)) - -enum mif_log_id { - MIF_IPC_RL2AP = 1, - MIF_IPC_AP2CP, - MIF_IPC_CP2AP, - MIF_IPC_AP2RL, - MIF_IRQ, - MIF_COM, - MIF_TIME -}; - -struct mif_irq_map { - u16 magic; - u16 access; - - u16 fmt_tx_in; - u16 fmt_tx_out; - u16 fmt_rx_in; - u16 fmt_rx_out; - - u16 raw_tx_in; - u16 raw_tx_out; - u16 raw_rx_in; - u16 raw_rx_out; - - u16 cp2ap; -}; - -struct mif_ipc_block { - enum mif_log_id id; - unsigned long long time; - size_t len; - char buff[MAX_IPC_LOG_SIZE]; -}; - -struct mif_irq_block { - enum mif_log_id id; - unsigned long long time; - struct mif_irq_map map; - char buff[MAX_IRQ_LOG_SIZE]; -}; - -struct mif_common_block { - enum mif_log_id id; - unsigned long long time; - char buff[MAX_COM_LOG_SIZE]; -}; - -struct mif_time_block { - enum mif_log_id id; - unsigned long long time; - struct timespec epoch; - char buff[MAX_TIM_LOG_SIZE]; -}; - -struct utc_time { - u16 year; - u8 mon:4, - day:4; - u8 hour; - u8 min; - u8 sec; - u16 msec; -} __packed; - -void ts2utc(struct timespec *ts, struct utc_time *utc); -void get_utc_time(struct utc_time *utc); - -int mif_dump_dpram(struct io_device *); -int mif_dump_log(struct modem_shared *, struct io_device *); - -#define mif_irq_log(msd, map, data, len) \ - _mif_irq_log(MIF_IRQ, msd, map, data, len) -#define mif_com_log(msd, format, ...) \ - _mif_com_log(MIF_COM, msd, pr_fmt(format), ##__VA_ARGS__) -#define mif_time_log(msd, epoch, data, len) \ - _mif_time_log(MIF_TIME, msd, epoch, data, len) - -void mif_ipc_log(enum mif_log_id, - struct modem_shared *, const char *, size_t); -void _mif_irq_log(enum mif_log_id, - struct modem_shared *, struct mif_irq_map, const char *, size_t); -void _mif_com_log(enum mif_log_id, - struct modem_shared *, const char *, ...); -void _mif_time_log(enum mif_log_id, - struct modem_shared *, struct timespec, const char *, size_t); - -/** find_linkdev - find a link device - * @msd: struct modem_shared * - */ -static inline struct link_device *find_linkdev(struct modem_shared *msd, - enum modem_link link_type) -{ - struct link_device *ld; - list_for_each_entry(ld, &msd->link_dev_list, list) { - if (ld->link_type == link_type) - return ld; - } - return NULL; -} - -/** countbits - count number of 1 bits as fastest way - * @n: number - */ -static inline unsigned int countbits(unsigned int n) -{ - unsigned int i; - for (i = 0; n != 0; i++) - n &= (n - 1); - return i; -} - -/* print IPC message as hex string with UTC time */ -void pr_ipc(const char *tag, const char *data, size_t len); - -/* print buffer as hex string */ -int pr_buffer(const char *tag, const char *data, size_t data_len, - size_t max_len); - -/* print a sk_buff as hex string */ -#define pr_skb(tag, skb) \ - pr_buffer(tag, (char *)((skb)->data), (size_t)((skb)->len), (size_t)16) - -/* print a urb as hex string */ -#define pr_urb(tag, urb) \ - pr_buffer(tag, (char *)((urb)->transfer_buffer), \ - (size_t)((urb)->actual_length), (size_t)16) - -/* Stop/wake all TX queues in network interfaces */ -void mif_netif_stop(struct link_device *ld); -void mif_netif_wake(struct link_device *ld); - -/* flow control CMD from CP, it use in serial devices */ -int link_rx_flowctl_cmd(struct link_device *ld, const char *data, size_t len); - -/* get iod from tree functions */ - -struct io_device *get_iod_with_format(struct modem_shared *msd, - enum dev_format format); -struct io_device *get_iod_with_channel(struct modem_shared *msd, - unsigned channel); - -static inline struct io_device *link_get_iod_with_format( - struct link_device *ld, enum dev_format format) -{ - struct io_device *iod = get_iod_with_format(ld->msd, format); - return (iod && IS_CONNECTED(iod, ld)) ? iod : NULL; -} - -static inline struct io_device *link_get_iod_with_channel( - struct link_device *ld, unsigned channel) -{ - struct io_device *iod = get_iod_with_channel(ld->msd, channel); - return (iod && IS_CONNECTED(iod, ld)) ? iod : NULL; -} - -/* insert iod to tree functions */ -struct io_device *insert_iod_with_format(struct modem_shared *msd, - enum dev_format format, struct io_device *iod); -struct io_device *insert_iod_with_channel(struct modem_shared *msd, - unsigned channel, struct io_device *iod); - -/* iodev for each */ -typedef void (*action_fn)(struct io_device *iod, void *args); -void iodevs_for_each(struct modem_shared *msd, action_fn action, void *args); - -/* netif wake/stop queue of iod */ -void iodev_netif_wake(struct io_device *iod, void *args); -void iodev_netif_stop(struct io_device *iod, void *args); - -/* change tx_link of raw devices */ -void rawdevs_set_tx_link(struct modem_shared *msd, enum modem_link link_type); - -__be32 ipv4str_to_be32(const char *ipv4str, size_t count); - -void mif_add_timer(struct timer_list *timer, unsigned long expire, - void (*function)(unsigned long), unsigned long data); - -/* debug helper functions for sipc4, sipc5 */ -void mif_print_data(const char *buff, int len); -void mif_dump2format16(const char *data, int len, char *buff, char *tag); -void mif_dump2format4(const char *data, int len, char *buff, char *tag); -void mif_print_dump(const char *data, int len, int width); -void print_sipc4_hdlc_fmt_frame(const u8 *psrc); -void print_sipc4_fmt_frame(const u8 *psrc); -void print_sipc5_link_fmt_frame(const u8 *psrc); - -/*--------------------------------------------------------------------------- - - IPv4 Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |Version| IHL |Type of Service| Total Length | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Identification |C|D|M| Fragment Offset | - | |E|F|F| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Time to Live | Protocol | Header Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Address | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Destination Address | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options | Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - IHL - Header Length - Flags - Consist of 3 bits - The 1st bit is "Congestion" bit. - The 2nd bit is "Dont Fragment" bit. - The 3rd bit is "More Fragments" bit. - ----------------------------------------------------------------------------*/ -#define IPV4_HDR_SIZE 20 - -/*------------------------------------------------------------------------- - - TCP Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Port | Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Sequence Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Acknowledgment Number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Data | |C|E|U|A|P|R|S|F| | - | Offset| Rsvd |W|C|R|C|S|S|Y|I| Window | - | | |R|E|G|K|H|T|N|N| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Checksum | Urgent Pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options | Padding | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - --------------------------------------------------------------------------*/ -#define TCP_HDR_SIZE 20 - -/*------------------------------------------------------------------------- - - UDP Header Format - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Source Port | Destination Port | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Length | Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | data | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - --------------------------------------------------------------------------*/ -#define UDP_HDR_SIZE 8 - -void print_ip4_packet(const u8 *ip_pkt, bool tx); -bool is_dns_packet(const u8 *ip_pkt); -bool is_syn_packet(const u8 *ip_pkt); - -int memcmp16_to_io(const void __iomem *to, void *from, int size); -int mif_test_dpram(char *dp_name, u8 __iomem *start, u32 size); -struct file *mif_open_file(const char *path); -void mif_save_file(struct file *fp, const char *buff, size_t size); -void mif_close_file(struct file *fp); - -#endif/*__MODEM_UTILS_H__*/ diff --git a/drivers/misc/modem_if_u1/modem_variation.h b/drivers/misc/modem_if_u1/modem_variation.h deleted file mode 100644 index b5ec61b..0000000 --- a/drivers/misc/modem_if_u1/modem_variation.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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 __MODEM_VARIATION_H__ -#define __MODEM_VARIATION_H__ - -#include - -#define DECLARE_MODEM_INIT(type) \ - int type ## _init_modemctl_device(struct modem_ctl *mc, \ - struct modem_data *pdata) -#define DECLARE_MODEM_INIT_DUMMY(type) \ - static DECLARE_MODEM_INIT(type) { return 0; } - -#define DECLARE_LINK_INIT(type) \ - struct link_device *type ## _create_link_device( \ - struct platform_device *pdev) -#define DECLARE_LINK_INIT_DUMMY(type) \ - static DECLARE_LINK_INIT(type) { return NULL; } - -#define MODEM_INIT_CALL(type) type ## _init_modemctl_device -#define LINK_INIT_CALL(type) type ## _create_link_device - -/* add declaration of modem & link type */ -/* modem device support */ -DECLARE_MODEM_INIT_DUMMY(dummy) - -#ifdef CONFIG_UMTS_MODEM_XMM6260 -DECLARE_MODEM_INIT(xmm6260); -#else -DECLARE_MODEM_INIT_DUMMY(xmm6260) -#endif - -#ifdef CONFIG_UMTS_MODEM_XMM6262 -DECLARE_MODEM_INIT(xmm6262); -#else -DECLARE_MODEM_INIT_DUMMY(xmm6262) -#endif - -#ifdef CONFIG_CDMA_MODEM_CBP71 -DECLARE_MODEM_INIT(cbp71); -#else -DECLARE_MODEM_INIT_DUMMY(cbp71) -#endif - -#ifdef CONFIG_CDMA_MODEM_CBP72 -DECLARE_MODEM_INIT(cbp72); -#else -DECLARE_MODEM_INIT_DUMMY(cbp72) -#endif - -#ifdef CONFIG_LTE_MODEM_CMC221 -DECLARE_MODEM_INIT(cmc221); -#else -DECLARE_MODEM_INIT_DUMMY(cmc221) -#endif - -#ifdef CONFIG_CDMA_MODEM_MDM6600 -DECLARE_MODEM_INIT(mdm6600); -#else -DECLARE_MODEM_INIT_DUMMY(mdm6600) -#endif - -#ifdef CONFIG_GSM_MODEM_ESC6270 -DECLARE_MODEM_INIT(esc6270); -#else -DECLARE_MODEM_INIT_DUMMY(esc6270) -#endif - -#ifdef CONFIG_TDSCDMA_MODEM_SPRD8803 -DECLARE_MODEM_INIT(sprd8803); -#else -DECLARE_MODEM_INIT_DUMMY(sprd8803) -#endif - -/* link device support */ -DECLARE_LINK_INIT_DUMMY(undefined) - -#ifdef CONFIG_LINK_DEVICE_MIPI -DECLARE_LINK_INIT(mipi); -#else -DECLARE_LINK_INIT_DUMMY(mipi) -#endif - -#ifdef CONFIG_LINK_DEVICE_DPRAM -DECLARE_LINK_INIT(dpram); -#else -DECLARE_LINK_INIT_DUMMY(dpram) -#endif - -#ifdef CONFIG_LINK_DEVICE_PLD -DECLARE_LINK_INIT(pld); -#else -DECLARE_LINK_INIT_DUMMY(pld) -#endif - -#ifdef CONFIG_LINK_DEVICE_SPI -DECLARE_LINK_INIT(spi); -#else -DECLARE_LINK_INIT_DUMMY(spi) -#endif - -#ifdef CONFIG_LINK_DEVICE_USB -DECLARE_LINK_INIT(usb); -#else -DECLARE_LINK_INIT_DUMMY(usb) -#endif - -#ifdef CONFIG_LINK_DEVICE_HSIC -DECLARE_LINK_INIT(hsic); -#else -DECLARE_LINK_INIT_DUMMY(hsic) -#endif - -#ifdef CONFIG_LINK_DEVICE_C2C -DECLARE_LINK_INIT(c2c); -#else -DECLARE_LINK_INIT_DUMMY(c2c) -#endif - -typedef int (*modem_init_call)(struct modem_ctl *, struct modem_data *); -static modem_init_call modem_init_func[] = { - MODEM_INIT_CALL(xmm6260), - MODEM_INIT_CALL(xmm6262), - MODEM_INIT_CALL(cbp71), - MODEM_INIT_CALL(cbp72), - MODEM_INIT_CALL(cmc221), - MODEM_INIT_CALL(mdm6600), - MODEM_INIT_CALL(esc6270), - MODEM_INIT_CALL(sprd8803), - MODEM_INIT_CALL(dummy), -}; - -typedef struct link_device *(*link_init_call)(struct platform_device *); -static link_init_call link_init_func[] = { - LINK_INIT_CALL(undefined), - LINK_INIT_CALL(mipi), - LINK_INIT_CALL(dpram), - LINK_INIT_CALL(spi), - LINK_INIT_CALL(usb), - LINK_INIT_CALL(hsic), - LINK_INIT_CALL(c2c), - LINK_INIT_CALL(pld), -}; - -static int call_modem_init_func(struct modem_ctl *mc, struct modem_data *pdata) -{ - if (modem_init_func[pdata->modem_type]) - return modem_init_func[pdata->modem_type](mc, pdata); - else - return -ENOTSUPP; -} - -static struct link_device *call_link_init_func(struct platform_device *pdev, - enum modem_link link_type) -{ - if (link_init_func[link_type]) - return link_init_func[link_type](pdev); - else - return NULL; -} - -#endif diff --git a/drivers/misc/modem_if_u1/sipc4_io_device.c b/drivers/misc/modem_if_u1/sipc4_io_device.c deleted file mode 100644 index 7330c28..0000000 --- a/drivers/misc/modem_if_u1/sipc4_io_device.c +++ /dev/null @@ -1,1710 +0,0 @@ -/* /linux/drivers/misc/modem_if/modem_io_device.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#ifdef CONFIG_LINK_DEVICE_C2C -#include -#endif -#include "modem_prj.h" -#include "modem_utils.h" - -/* - * MAX_RXDATA_SIZE is used at making skb, when it called with page size - * it need more bytes to allocate itself (Ex, cache byte, shared info, - * padding...) - * So, give restriction to allocation size below 1 page to prevent - * big pages broken. - */ -#define MAX_RXDATA_SIZE 0x0E00 /* 4 * 1024 - 512 */ -#define MAX_BOOTDATA_SIZE 0x4008 /* EBL package format*/ -#define MAX_MULTI_FMT_SIZE 0x4000 /* 16 * 1024 */ - -static const char hdlc_start[1] = { HDLC_START }; -static const char hdlc_end[1] = { HDLC_END }; - -static int rx_iodev_skb(struct sk_buff *skb); - -static ssize_t show_waketime(struct device *dev, - struct device_attribute *attr, char *buf) -{ - unsigned int msec; - char *p = buf; - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct io_device *iod = container_of(miscdev, struct io_device, - miscdev); - - msec = jiffies_to_msecs(iod->waketime); - - p += sprintf(buf, "raw waketime : %ums\n", msec); - - return p - buf; -} - -static ssize_t store_waketime(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - unsigned long msec; - int ret; - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct io_device *iod = container_of(miscdev, struct io_device, - miscdev); - - ret = strict_strtoul(buf, 10, &msec); - if (ret) - return count; - - iod->waketime = msecs_to_jiffies(msec); - - return count; -} - -static struct device_attribute attr_waketime = - __ATTR(waketime, S_IRUGO | S_IWUSR, show_waketime, store_waketime); - -static ssize_t show_loopback(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct modem_shared *msd = - container_of(miscdev, struct io_device, miscdev)->msd; - unsigned char *ip = (unsigned char *)&msd->loopback_ipaddr; - char *p = buf; - - p += sprintf(buf, "%u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]); - - return p - buf; -} - -static ssize_t store_loopback(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct modem_shared *msd = - container_of(miscdev, struct io_device, miscdev)->msd; - - msd->loopback_ipaddr = ipv4str_to_be32(buf, count); - - return count; -} - -static struct device_attribute attr_loopback = - __ATTR(loopback, S_IRUGO | S_IWUSR, show_loopback, store_loopback); - -static int get_header_size(struct io_device *iod) -{ - switch (iod->format) { - case IPC_FMT: - return sizeof(struct fmt_hdr); - - case IPC_RAW: - case IPC_MULTI_RAW: - return sizeof(struct raw_hdr); - - case IPC_RFS: - return sizeof(struct rfs_hdr); - - case IPC_BOOT: - /* minimum size for transaction align */ - return 4; - - case IPC_RAMDUMP: - default: - return 0; - } -} - -static int get_hdlc_size(struct io_device *iod, char *buf) -{ - struct fmt_hdr *fmt_header; - struct raw_hdr *raw_header; - struct rfs_hdr *rfs_header; - - mif_debug("buf : %02x %02x %02x (%d)\n", *buf, *(buf + 1), - *(buf + 2), __LINE__); - - switch (iod->format) { - case IPC_FMT: - fmt_header = (struct fmt_hdr *)buf; - if (iod->mc->mdm_data->ipc_version == SIPC_VER_42) - return fmt_header->len & 0x3FFF; - else - return fmt_header->len; - case IPC_RAW: - case IPC_MULTI_RAW: - raw_header = (struct raw_hdr *)buf; - return raw_header->len; - case IPC_RFS: - rfs_header = (struct rfs_hdr *)buf; - return rfs_header->len; - default: - break; - } - return 0; -} - -static void *get_header(struct io_device *iod, size_t count, - char *frame_header_buf) -{ - struct fmt_hdr *fmt_h; - struct raw_hdr *raw_h; - struct rfs_hdr *rfs_h; - - switch (iod->format) { - case IPC_FMT: - fmt_h = (struct fmt_hdr *)frame_header_buf; - - fmt_h->len = count + sizeof(struct fmt_hdr); - fmt_h->control = 0; - - return (void *)frame_header_buf; - - case IPC_RAW: - case IPC_MULTI_RAW: - raw_h = (struct raw_hdr *)frame_header_buf; - - raw_h->len = count + sizeof(struct raw_hdr); - raw_h->channel = iod->id & 0x1F; - raw_h->control = 0; - - return (void *)frame_header_buf; - - case IPC_RFS: - rfs_h = (struct rfs_hdr *)frame_header_buf; - - rfs_h->len = count + sizeof(struct raw_hdr); - rfs_h->id = iod->id; - - return (void *)frame_header_buf; - - default: - return 0; - } -} - -static inline int calc_padding_size(struct io_device *iod, - struct link_device *ld, unsigned len) -{ - if (ld->aligned) - return (4 - (len & 0x3)) & 0x3; - else - return 0; -} - -static inline int rx_hdlc_head_start_check(char *buf) -{ - /* check hdlc head and return size of start byte */ - return (buf[0] == HDLC_START) ? SIZE_OF_HDLC_START : -EBADMSG; -} - -static inline int rx_hdlc_tail_check(char *buf) -{ - /* check hdlc tail and return size of tail byte */ - return (buf[0] == HDLC_END) ? SIZE_OF_HDLC_END : -EBADMSG; -} - -/* remove hdlc header and store IPC header */ -static int rx_hdlc_head_check(struct io_device *iod, struct link_device *ld, - char *buf, unsigned rest) -{ - struct header_data *hdr = &fragdata(iod, ld)->h_data; - int head_size = get_header_size(iod); - int done_len = 0; - int len = 0; - - /* first frame, remove start header 7F */ - if (!hdr->start) { - len = rx_hdlc_head_start_check(buf); - if (len < 0) { - mif_err("Wrong HDLC start: 0x%x\n", *buf); - return len; /*Wrong hdlc start*/ - } - - mif_debug("check len : %d, rest : %d (%d)\n", len, - rest, __LINE__); - - /* set the start flag of current packet */ - hdr->start = HDLC_START; - hdr->len = 0; - - /* debug print */ - switch (iod->format) { - case IPC_FMT: - case IPC_RAW: - case IPC_MULTI_RAW: - case IPC_RFS: - /* TODO: print buf... */ - break; - - case IPC_CMD: - case IPC_BOOT: - case IPC_RAMDUMP: - default: - break; - } - - buf += len; - done_len += len; - rest -= len; /* rest, call by value */ - } - - mif_debug("check len : %d, rest : %d (%d)\n", - len, rest, __LINE__); - - /* store the HDLC header to iod priv */ - if (hdr->len < head_size) { - len = min(rest, head_size - hdr->len); - memcpy(hdr->hdr + hdr->len, buf, len); - hdr->len += len; - done_len += len; - } - - mif_debug("check done_len : %d, rest : %d (%d)\n", done_len, - rest, __LINE__); - return done_len; -} - -/* alloc skb and copy data to skb */ -static int rx_hdlc_data_check(struct io_device *iod, struct link_device *ld, - char *buf, unsigned rest) -{ - struct header_data *hdr = &fragdata(iod, ld)->h_data; - struct sk_buff *skb = fragdata(iod, ld)->skb_recv; - int head_size = get_header_size(iod); - int data_size = get_hdlc_size(iod, hdr->hdr) - head_size; - int alloc_size; - int len = 0; - int done_len = 0; - int rest_len = data_size - hdr->frag_len; - int continue_len = fragdata(iod, ld)->realloc_offset; - - mif_debug("head_size : %d, data_size : %d (%d)\n", head_size, - data_size, __LINE__); - - if (continue_len) { - /* check the HDLC header*/ - if (rx_hdlc_head_start_check(buf) == SIZE_OF_HDLC_START) { - rest_len -= (head_size + SIZE_OF_HDLC_START); - continue_len += (head_size + SIZE_OF_HDLC_START); - } - - buf += continue_len; - rest -= continue_len; - done_len += continue_len; - fragdata(iod, ld)->realloc_offset = 0; - - mif_debug("realloc_offset = %d\n", continue_len); - } - - /* first payload data - alloc skb */ - if (!skb) { - /* make skb data size under MAX_RXDATA_SIZE */ - alloc_size = min(data_size, MAX_RXDATA_SIZE); - alloc_size = min(alloc_size, rest_len); - - /* exceptional case for RFS channel - * make skb for header info first - */ - if (iod->format == IPC_RFS && !hdr->frag_len) { - skb = rx_alloc_skb(head_size, iod, ld); - if (unlikely(!skb)) - return -ENOMEM; - memcpy(skb_put(skb, head_size), hdr->hdr, head_size); - rx_iodev_skb(skb); - } - - /* allocate first packet for data, when its size exceed - * MAX_RXDATA_SIZE, this packet will split to - * multiple packets - */ - skb = rx_alloc_skb(alloc_size, iod, ld); - if (unlikely(!skb)) { - fragdata(iod, ld)->realloc_offset = continue_len; - return -ENOMEM; - } - fragdata(iod, ld)->skb_recv = skb; - } - - while (rest) { - /* copy length cannot exceed rest_len */ - len = min_t(int, rest_len, rest); - /* copy length should be under skb tailroom size */ - len = min(len, skb_tailroom(skb)); - /* when skb tailroom is bigger than MAX_RXDATA_SIZE - * restrict its size to MAX_RXDATA_SIZE just for convinience */ - len = min(len, MAX_RXDATA_SIZE); - - /* copy bytes to skb */ - memcpy(skb_put(skb, len), buf, len); - - /* adjusting variables */ - buf += len; - rest -= len; - done_len += len; - rest_len -= len; - hdr->frag_len += len; - - /* check if it is final for this packet sequence */ - if (!rest_len || !rest) - break; - - /* more bytes are remain for this packet sequence - * pass fully loaded skb to rx queue - * and allocate another skb for continues data recv chain - */ - rx_iodev_skb(skb); - fragdata(iod, ld)->skb_recv = NULL; - - alloc_size = min(rest_len, MAX_RXDATA_SIZE); - - skb = rx_alloc_skb(alloc_size, iod, ld); - if (unlikely(!skb)) { - fragdata(iod, ld)->realloc_offset = done_len; - return -ENOMEM; - } - fragdata(iod, ld)->skb_recv = skb; - } - - mif_debug("rest : %d, alloc_size : %d , len : %d (%d)\n", - rest, alloc_size, skb->len, __LINE__); - - return done_len; -} - -static int rx_multi_fmt_frame(struct sk_buff *rx_skb) -{ - struct io_device *iod = skbpriv(rx_skb)->iod; - struct link_device *ld = skbpriv(rx_skb)->ld; - struct fmt_hdr *fh = - (struct fmt_hdr *)fragdata(iod, ld)->h_data.hdr; - unsigned int id = fh->control & 0x7F; - struct sk_buff *skb = iod->skb[id]; - unsigned char *data = fragdata(iod, ld)->skb_recv->data; - unsigned int rcvd = fragdata(iod, ld)->skb_recv->len; - - if (!skb) { - /* If there has been no multiple frame with this ID */ - if (!(fh->control & 0x80)) { - /* It is a single frame because the "more" bit is 0. */ -#if 0 - mif_err("\n<%s> Rx FMT frame (len %d)\n", - iod->name, rcvd); - print_sipc4_fmt_frame(data); - mif_err("\n"); -#endif - skb_queue_tail(&iod->sk_rx_q, - fragdata(iod, ld)->skb_recv); - mif_debug("wake up wq of %s\n", iod->name); - wake_up(&iod->wq); - return 0; - } else { - struct fmt_hdr *fh = NULL; - skb = rx_alloc_skb(MAX_MULTI_FMT_SIZE, iod, ld); - if (!skb) { - mif_err("<%d> alloc_skb fail\n", - __LINE__); - return -ENOMEM; - } - iod->skb[id] = skb; - - fh = (struct fmt_hdr *)data; - mif_info("Start multi-frame (ID %d, len %d)", - id, fh->len); - } - } - - /* Start multi-frame processing */ - - memcpy(skb_put(skb, rcvd), data, rcvd); - dev_kfree_skb_any(fragdata(iod, ld)->skb_recv); - - if (fh->control & 0x80) { - /* The last frame has not arrived yet. */ - mif_info("Receiving (ID %d, %d bytes)\n", - id, skb->len); - } else { - /* It is the last frame because the "more" bit is 0. */ - mif_info("The Last (ID %d, %d bytes received)\n", - id, skb->len); -#if 0 - mif_err("\n<%s> Rx FMT frame (len %d)\n", - iod->name, skb->len); - print_sipc4_fmt_frame(skb->data); - mif_err("\n"); -#endif - skb_queue_tail(&iod->sk_rx_q, skb); - iod->skb[id] = NULL; - mif_info("wake up wq of %s\n", iod->name); - wake_up(&iod->wq); - } - - return 0; -} - -static int rx_multi_fmt_frame_sipc42(struct sk_buff *rx_skb) -{ - struct io_device *iod = skbpriv(rx_skb)->iod; - struct link_device *ld = skbpriv(rx_skb)->ld; - struct fmt_hdr *fh = - (struct fmt_hdr *)fragdata(iod, ld)->h_data.hdr; - unsigned int id = fh->control & 0x7F; - struct sk_buff *skb = iod->skb[id]; - unsigned char *data = fragdata(iod, ld)->skb_recv->data; - unsigned int rcvd = fragdata(iod, ld)->skb_recv->len; - - u8 ch; - struct io_device *real_iod = NULL; - - ch = (fh->len & 0xC000) >> 14; - fh->len = fh->len & 0x3FFF; - real_iod = ld->fmt_iods[ch]; - if (!real_iod) { - mif_err("wrong channel %d\n", ch); - return -1; - } - skbpriv(rx_skb)->real_iod = real_iod; - - if (!skb) { - /* If there has been no multiple frame with this ID */ - if (!(fh->control & 0x80)) { - /* It is a single frame because the "more" bit is 0. */ -#if 0 - mif_err("\n<%s> Rx FMT frame (len %d)\n", - iod->name, rcvd); - print_sipc4_fmt_frame(data); - mif_err("\n"); -#endif - skb_queue_tail(&real_iod->sk_rx_q, - fragdata(iod, ld)->skb_recv); - mif_debug("wake up wq of %s\n", iod->name); - wake_up(&real_iod->wq); - return 0; - } else { - struct fmt_hdr *fh = NULL; - skb = rx_alloc_skb(MAX_MULTI_FMT_SIZE, real_iod, ld); - if (!skb) { - mif_err("alloc_skb fail\n"); - return -ENOMEM; - } - real_iod->skb[id] = skb; - - fh = (struct fmt_hdr *)data; - mif_err("Start multi-frame (ID %d, len %d)", - id, fh->len); - } - } - - /* Start multi-frame processing */ - - memcpy(skb_put(skb, rcvd), data, rcvd); - dev_kfree_skb_any(fragdata(real_iod, ld)->skb_recv); - - if (fh->control & 0x80) { - /* The last frame has not arrived yet. */ - mif_err("Receiving (ID %d, %d bytes)\n", - id, skb->len); - } else { - /* It is the last frame because the "more" bit is 0. */ - mif_err("The Last (ID %d, %d bytes received)\n", - id, skb->len); -#if 0 - mif_err("\n<%s> Rx FMT frame (len %d)\n", - iod->name, skb->len); - print_sipc4_fmt_frame(skb->data); - mif_err("\n"); -#endif - skb_queue_tail(&real_iod->sk_rx_q, skb); - real_iod->skb[id] = NULL; - mif_info("wake up wq of %s\n", real_iod->name); - wake_up(&real_iod->wq); - } - - return 0; -} - -static int rx_iodev_skb_raw(struct sk_buff *skb) -{ - int err = 0; - struct io_device *iod = skbpriv(skb)->real_iod; - struct net_device *ndev = NULL; - struct iphdr *ip_header = NULL; - struct ethhdr *ehdr = NULL; - const char source[ETH_ALEN] = SOURCE_MAC_ADDR; - - /* check the real_iod is open? */ - /* - if (atomic_read(&iod->opened) == 0) { - mif_err("<%s> is not opened.\n", - iod->name); - pr_skb("drop packet", skb); - return -ENOENT; - } - */ - - switch (iod->io_typ) { - case IODEV_MISC: - mif_debug("<%s> sk_rx_q.qlen = %d\n", - iod->name, iod->sk_rx_q.qlen); - skb_queue_tail(&iod->sk_rx_q, skb); - wake_up(&iod->wq); - return 0; - - case IODEV_NET: - ndev = iod->ndev; - if (!ndev) { - mif_err("<%s> ndev == NULL", - iod->name); - return -EINVAL; - } - - skb->dev = ndev; - ndev->stats.rx_packets++; - ndev->stats.rx_bytes += skb->len; - - /* check the version of IP */ - ip_header = (struct iphdr *)skb->data; - if (ip_header->version == IP6VERSION) - skb->protocol = htons(ETH_P_IPV6); - else - skb->protocol = htons(ETH_P_IP); - - if (iod->use_handover) { - skb_push(skb, sizeof(struct ethhdr)); - ehdr = (void *)skb->data; - memcpy(ehdr->h_dest, ndev->dev_addr, ETH_ALEN); - memcpy(ehdr->h_source, source, ETH_ALEN); - ehdr->h_proto = skb->protocol; - skb->ip_summed = CHECKSUM_UNNECESSARY; - skb_reset_mac_header(skb); - - skb_pull(skb, sizeof(struct ethhdr)); - } - - if (in_irq()) - err = netif_rx(skb); - else - err = netif_rx_ni(skb); - - if (err != NET_RX_SUCCESS) - dev_err(&ndev->dev, "rx error: %d\n", err); - - return err; - - default: - mif_err("wrong io_type : %d\n", iod->io_typ); - return -EINVAL; - } -} - -static void rx_iodev_work(struct work_struct *work) -{ - int ret = 0; - struct sk_buff *skb = NULL; - struct io_device *iod = container_of(work, struct io_device, - rx_work.work); - - while ((skb = skb_dequeue(&iod->sk_rx_q)) != NULL) { - ret = rx_iodev_skb_raw(skb); - if (ret < 0) { - mif_err("<%s> rx_iodev_skb_raw err = %d", - iod->name, ret); - dev_kfree_skb_any(skb); - } else if (ret == NET_RX_DROP) { - mif_err("<%s> ret == NET_RX_DROP\n", - iod->name); - schedule_delayed_work(&iod->rx_work, - msecs_to_jiffies(100)); - break; - } - } -} - -static int rx_multipdp(struct sk_buff *skb) -{ - u8 ch; - struct io_device *iod = skbpriv(skb)->iod; - struct link_device *ld = skbpriv(skb)->ld; - struct raw_hdr *raw_header = - (struct raw_hdr *)fragdata(iod, ld)->h_data.hdr; - struct io_device *real_iod = NULL; - - ch = raw_header->channel; - if (ch == DATA_LOOPBACK_CHANNEL && ld->msd->loopback_ipaddr) - ch = RMNET0_CH_ID; - - real_iod = link_get_iod_with_channel(ld, 0x20 | ch); - if (!real_iod) { - mif_err("wrong channel %d\n", ch); - return -1; - } - - skbpriv(skb)->real_iod = real_iod; - skb_queue_tail(&iod->sk_rx_q, skb); - mif_debug("sk_rx_qlen:%d\n", iod->sk_rx_q.qlen); - - schedule_delayed_work(&iod->rx_work, 0); - return 0; -} - -/* de-mux function draft */ -static int rx_iodev_skb(struct sk_buff *skb) -{ - struct io_device *iod = skbpriv(skb)->iod; - - switch (iod->format) { - case IPC_MULTI_RAW: - return rx_multipdp(skb); - - case IPC_FMT: - if (iod->mc->mdm_data->ipc_version == SIPC_VER_42) - return rx_multi_fmt_frame_sipc42(skb); - else - return rx_multi_fmt_frame(skb); - - case IPC_RFS: - default: - skb_queue_tail(&iod->sk_rx_q, skb); - mif_debug("wake up wq of %s\n", iod->name); - wake_up(&iod->wq); - return 0; - } -} - -static int rx_hdlc_packet(struct io_device *iod, struct link_device *ld, - const char *data, unsigned recv_size) -{ - int rest = (int)recv_size; - char *buf = (char *)data; - int err = 0; - int len = 0; - unsigned rcvd = 0; - - if (rest <= 0) - goto exit; - - mif_debug("RX_SIZE = %d, ld: %s\n", rest, ld->name); - - if (fragdata(iod, ld)->h_data.frag_len) { - /* - If the fragdata(iod, ld)->h_data.frag_len field is - not zero, there is a HDLC frame that is waiting for more data - or HDLC_END in the skb (fragdata(iod, ld)->skb_recv). - In this case, rx_hdlc_head_check() must be skipped. - */ - goto data_check; - } - -next_frame: - err = len = rx_hdlc_head_check(iod, ld, buf, rest); - if (err < 0) - goto exit; - mif_debug("check len : %d, rest : %d (%d)\n", len, rest, - __LINE__); - - buf += len; - rest -= len; - if (rest <= 0) - goto exit; - -data_check: - /* - If the return value of rx_hdlc_data_check() is zero, there remains - only HDLC_END that will be received. - */ - err = len = rx_hdlc_data_check(iod, ld, buf, rest); - if (err < 0) - goto exit; - mif_debug("check len : %d, rest : %d (%d)\n", len, rest, - __LINE__); - - buf += len; - rest -= len; - - if (!rest && fragdata(iod, ld)->h_data.frag_len) { - /* - Data is being received and more data or HDLC_END does not - arrive yet, but there is no more data in the buffer. More - data may come within the next frame from the link device. - */ - return 0; - } else if (rest <= 0) - goto exit; - - /* At this point, one HDLC frame except HDLC_END has been received. */ - - err = len = rx_hdlc_tail_check(buf); - if (err < 0) { - mif_err("Wrong HDLC end: 0x%02X\n", *buf); - goto exit; - } - mif_debug("check len : %d, rest : %d (%d)\n", len, rest, - __LINE__); - buf += len; - rest -= len; - - /* At this point, one complete HDLC frame has been received. */ - - /* - The padding size is applied for the next HDLC frame. Zero will be - returned by calc_padding_size() if the link device does not require - 4-byte aligned access. - */ - rcvd = get_hdlc_size(iod, fragdata(iod, ld)->h_data.hdr) + - (SIZE_OF_HDLC_START + SIZE_OF_HDLC_END); - len = calc_padding_size(iod, ld, rcvd); - buf += len; - rest -= len; - if (rest < 0) - goto exit; - - err = rx_iodev_skb(fragdata(iod, ld)->skb_recv); - if (err < 0) - goto exit; - - /* initialize header & skb */ - fragdata(iod, ld)->skb_recv = NULL; - memset(&fragdata(iod, ld)->h_data, 0x00, - sizeof(struct header_data)); - fragdata(iod, ld)->realloc_offset = 0; - - if (rest) - goto next_frame; - -exit: - /* free buffers. mipi-hsi re-use recv buf */ - - if (rest < 0) - err = -ERANGE; - - if (err == -ENOMEM) { - if (!(fragdata(iod, ld)->h_data.frag_len)) - memset(&fragdata(iod, ld)->h_data, 0x00, - sizeof(struct header_data)); - return err; - } - - if (err < 0 && fragdata(iod, ld)->skb_recv) { - dev_kfree_skb_any(fragdata(iod, ld)->skb_recv); - fragdata(iod, ld)->skb_recv = NULL; - - /* clear headers */ - memset(&fragdata(iod, ld)->h_data, 0x00, - sizeof(struct header_data)); - fragdata(iod, ld)->realloc_offset = 0; - } - - return err; -} - -static int rx_rfs_packet(struct io_device *iod, struct link_device *ld, - const char *data, unsigned size) -{ - int err = 0; - int pad = 0; - int rcvd = 0; - struct sk_buff *skb; - - if (data[0] != HDLC_START) { - mif_err("Dropping RFS packet ... " - "size = %d, start = %02X %02X %02X %02X\n", - size, - data[0], data[1], data[2], data[3]); - return -EINVAL; - } - - if (data[size-1] != HDLC_END) { - for (pad = 1; pad < 4; pad++) - if (data[(size-1)-pad] == HDLC_END) - break; - - if (pad >= 4) { - char *b = (char *)data; - unsigned sz = size; - mif_err("size %d, No END_FLAG!!!\n", size); - mif_err("end = %02X %02X %02X %02X\n", - b[sz-4], b[sz-3], b[sz-2], b[sz-1]); - return -EINVAL; - } else { - mif_info("padding = %d\n", pad); - } - } - - skb = rx_alloc_skb(size, iod, ld); - if (unlikely(!skb)) { - mif_err("alloc_skb fail\n"); - return -ENOMEM; - } - - /* copy the RFS haeder to skb->data */ - rcvd = size - sizeof(hdlc_start) - sizeof(hdlc_end) - pad; - memcpy(skb_put(skb, rcvd), ((char *)data + sizeof(hdlc_start)), rcvd); - - fragdata(iod, ld)->skb_recv = skb; - err = rx_iodev_skb(fragdata(iod, ld)->skb_recv); - - return err; -} - -/* called from link device when a packet arrives for this io device */ -static int io_dev_recv_data_from_link_dev(struct io_device *iod, - struct link_device *ld, const char *data, unsigned int len) -{ - struct sk_buff *skb; - int err; - unsigned int alloc_size, rest_len; - char *cur; - - - /* check the iod(except IODEV_DUMMY) is open? - * if the iod is MULTIPDP, check this data on rx_iodev_skb_raw() - * because, we cannot know the channel no in here. - */ - /* - if (iod->io_typ != IODEV_DUMMY && atomic_read(&iod->opened) == 0) { - mif_err("<%s> is not opened.\n", iod->name); - pr_buffer("drop packet", data, len, 16u); - return -ENOENT; - } - */ - - switch (iod->format) { - case IPC_RFS: -#ifdef CONFIG_IPC_CMC22x_OLD_RFS - err = rx_rfs_packet(iod, ld, data, len); - return err; -#endif - - case IPC_FMT: - case IPC_RAW: - case IPC_MULTI_RAW: - if (iod->waketime) - wake_lock_timeout(&iod->wakelock, iod->waketime); - err = rx_hdlc_packet(iod, ld, data, len); - if (err < 0) - mif_err("fail process HDLC frame\n"); - return err; - - case IPC_CMD: - /* TODO- handle flow control command from CP */ - return 0; - - case IPC_BOOT: - case IPC_RAMDUMP: - /* save packet to sk_buff */ - skb = rx_alloc_skb(len, iod, ld); - if (skb) { - mif_debug("boot len : %d\n", len); - - memcpy(skb_put(skb, len), data, len); - skb_queue_tail(&iod->sk_rx_q, skb); - mif_debug("skb len : %d\n", skb->len); - - wake_up(&iod->wq); - return len; - } - /* 32KB page alloc fail case, alloc 3.5K a page.. */ - mif_info("(%d)page fail, alloc fragment pages\n", len); - - rest_len = len; - cur = (char *)data; - while (rest_len) { - alloc_size = min_t(unsigned int, MAX_RXDATA_SIZE, - rest_len); - skb = rx_alloc_skb(alloc_size, iod, ld); - if (!skb) { - mif_err("fail alloc skb (%d)\n", __LINE__); - return -ENOMEM; - } - mif_debug("boot len : %d\n", alloc_size); - - memcpy(skb_put(skb, alloc_size), cur, alloc_size); - skb_queue_tail(&iod->sk_rx_q, skb); - mif_debug("skb len : %d\n", skb->len); - - rest_len -= alloc_size; - cur += alloc_size; - } - wake_up(&iod->wq); - return len; - - default: - return -EINVAL; - } -} - -/* inform the IO device that the modem is now online or offline or - * crashing or whatever... - */ -static void io_dev_modem_state_changed(struct io_device *iod, - enum modem_state state) -{ - iod->mc->phone_state = state; - mif_err("modem state changed. (iod: %s, state: %d)\n", - iod->name, state); - - if ((state == STATE_CRASH_RESET) || (state == STATE_CRASH_EXIT) - || (state == STATE_NV_REBUILDING)) - wake_up(&iod->wq); -} - -/** - * io_dev_sim_state_changed - * @iod: IPC's io_device - * @sim_online: SIM is online? - */ -static void io_dev_sim_state_changed(struct io_device *iod, bool sim_online) -{ - if (atomic_read(&iod->opened) == 0) { - mif_err("iod is not opened: %s\n", iod->name); - /* update latest sim status */ - iod->mc->sim_state.online = sim_online; - } else if (iod->mc->sim_state.online == sim_online) { - mif_err("sim state not changed.\n"); - } else { - iod->mc->sim_state.online = sim_online; - iod->mc->sim_state.changed = true; - wake_lock_timeout(&iod->mc->bootd->wakelock, - iod->mc->bootd->waketime); - mif_err("sim state changed. (iod: %s, state: " - "[online=%d, changed=%d])\n", - iod->name, iod->mc->sim_state.online, - iod->mc->sim_state.changed); - wake_up(&iod->wq); - } -} - -static int misc_open(struct inode *inode, struct file *filp) -{ - struct io_device *iod = to_io_device(filp->private_data); - struct modem_shared *msd = iod->msd; - struct link_device *ld; - int ret; - filp->private_data = (void *)iod; - - mif_err("iod = %s\n", iod->name); - atomic_inc(&iod->opened); - - list_for_each_entry(ld, &msd->link_dev_list, list) { - if (IS_CONNECTED(iod, ld) && ld->init_comm) { - ret = ld->init_comm(ld, iod); - if (ret < 0) { - mif_err("%s: init_comm error: %d\n", - ld->name, ret); - return ret; - } - } - } - - return 0; -} - -static int misc_release(struct inode *inode, struct file *filp) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - struct modem_shared *msd = iod->msd; - struct link_device *ld; - - mif_err("iod = %s\n", iod->name); - atomic_dec(&iod->opened); - skb_queue_purge(&iod->sk_rx_q); - - list_for_each_entry(ld, &msd->link_dev_list, list) { - if (IS_CONNECTED(iod, ld) && ld->terminate_comm) - ld->terminate_comm(ld, iod); - } - - return 0; -} - -static unsigned int misc_poll(struct file *filp, struct poll_table_struct *wait) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - - poll_wait(filp, &iod->wq, wait); - - if ((!skb_queue_empty(&iod->sk_rx_q)) && - (iod->mc->phone_state != STATE_OFFLINE)) { - return POLLIN | POLLRDNORM; - } else if ((iod->mc->phone_state == STATE_CRASH_RESET) || - (iod->mc->phone_state == STATE_CRASH_EXIT) || - (iod->mc->phone_state == STATE_NV_REBUILDING) || -#if defined(CONFIG_SEC_DUAL_MODEM_MODE) - (iod->mc->phone_state == STATE_MODEM_SWITCH) || -#endif - (iod->mc->sim_state.changed)) { - if (iod->format == IPC_RAW) { - msleep(20); - return 0; - } - return POLLHUP; - } else { - return 0; - } -} - -static long misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - int p_state; - struct io_device *iod = (struct io_device *)filp->private_data; - struct link_device *ld = get_current_link(iod); - char cpinfo_buf[530] = "CP Crash "; - unsigned long size; - int ret; - char str[TASK_COMM_LEN]; - - mif_debug("cmd = 0x%x\n", cmd); - - switch (cmd) { - case IOCTL_MODEM_ON: - mif_debug("misc_ioctl : IOCTL_MODEM_ON\n"); - return iod->mc->ops.modem_on(iod->mc); - - case IOCTL_MODEM_OFF: - mif_debug("misc_ioctl : IOCTL_MODEM_OFF\n"); - return iod->mc->ops.modem_off(iod->mc); - - case IOCTL_MODEM_RESET: - mif_debug("misc_ioctl : IOCTL_MODEM_RESET\n"); - return iod->mc->ops.modem_reset(iod->mc); - - case IOCTL_MODEM_BOOT_ON: - mif_debug("misc_ioctl : IOCTL_MODEM_BOOT_ON\n"); - return iod->mc->ops.modem_boot_on(iod->mc); - - case IOCTL_MODEM_BOOT_OFF: - mif_debug("misc_ioctl : IOCTL_MODEM_BOOT_OFF\n"); - return iod->mc->ops.modem_boot_off(iod->mc); - - /* TODO - will remove this command after ril updated */ - case IOCTL_MODEM_BOOT_DONE: - mif_debug("misc_ioctl : IOCTL_MODEM_BOOT_DONE\n"); - return 0; - - case IOCTL_MODEM_STATUS: - mif_debug("misc_ioctl : IOCTL_MODEM_STATUS\n"); - - p_state = iod->mc->phone_state; - if ((p_state == STATE_CRASH_RESET) || - (p_state == STATE_CRASH_EXIT)) { - mif_err("<%s> send err state : %d\n", - iod->name, p_state); - } else if (iod->mc->sim_state.changed && - !strcmp(get_task_comm(str, get_current()), "rild")) { - int s_state = iod->mc->sim_state.online ? - STATE_SIM_ATTACH : STATE_SIM_DETACH; - iod->mc->sim_state.changed = false; - - mif_info("SIM states (%d) to %s\n", s_state, str); - return s_state; - } else if (p_state == STATE_NV_REBUILDING) { - mif_info("send nv rebuild state : %d\n", - p_state); - iod->mc->phone_state = STATE_ONLINE; - } - return p_state; - - case IOCTL_MODEM_PROTOCOL_SUSPEND: - mif_info("misc_ioctl : IOCTL_MODEM_PROTOCOL_SUSPEND\n"); - - if (iod->format != IPC_MULTI_RAW) - return -EINVAL; - - iodevs_for_each(iod->msd, iodev_netif_stop, 0); - return 0; - - case IOCTL_MODEM_PROTOCOL_RESUME: - mif_info("misc_ioctl : IOCTL_MODEM_PROTOCOL_RESUME\n"); - - if (iod->format != IPC_MULTI_RAW) - return -EINVAL; - - iodevs_for_each(iod->msd, iodev_netif_wake, 0); - return 0; - - case IOCTL_MODEM_DUMP_START: - mif_err("misc_ioctl : IOCTL_MODEM_DUMP_START\n"); - return ld->dump_start(ld, iod); - - case IOCTL_MODEM_DUMP_UPDATE: - mif_debug("misc_ioctl : IOCTL_MODEM_DUMP_UPDATE\n"); - return ld->dump_update(ld, iod, arg); - - case IOCTL_MODEM_FORCE_CRASH_EXIT: - mif_debug("misc_ioctl : IOCTL_MODEM_FORCE_CRASH_EXIT\n"); - if (iod->mc->ops.modem_force_crash_exit) - return iod->mc->ops.modem_force_crash_exit(iod->mc); - return -EINVAL; - - case IOCTL_MODEM_CP_UPLOAD: - mif_err("misc_ioctl : IOCTL_MODEM_CP_UPLOAD\n"); - if (copy_from_user(cpinfo_buf + strlen(cpinfo_buf), - (void __user *)arg, MAX_CPINFO_SIZE) != 0) - panic("CP Crash"); - else - panic(cpinfo_buf); - return 0; - - case IOCTL_MODEM_DUMP_RESET: - mif_err("misc_ioctl : IOCTL_MODEM_DUMP_RESET\n"); - return iod->mc->ops.modem_dump_reset(iod->mc); - -#if defined(CONFIG_SEC_DUAL_MODEM_MODE) - case IOCTL_MODEM_SWITCH_MODEM: - mif_err("misc_ioctl : IOCTL_MODEM_SWITCH_MODEM\n"); - iod->mc->phone_state = STATE_MODEM_SWITCH; - wake_up(&iod->wq); - return 0; -#endif - - case IOCTL_MIF_LOG_DUMP: - size = MAX_MIF_BUFF_SIZE; - ret = copy_to_user((void __user *)arg, &size, - sizeof(unsigned long)); - if (ret < 0) - return -EFAULT; - - mif_dump_log(iod->mc->msd, iod); - return 0; - - case IOCTL_MIF_DPRAM_DUMP: -#ifdef CONFIG_LINK_DEVICE_DPRAM - if (iod->mc->mdm_data->link_types & LINKTYPE(LINKDEV_DPRAM)) { - size = iod->mc->mdm_data->dpram_ctl->dp_size; - ret = copy_to_user((void __user *)arg, &size, - sizeof(unsigned long)); - if (ret < 0) - return -EFAULT; - mif_dump_dpram(iod); - return 0; - } -#endif - return -EINVAL; - - default: - /* If you need to handle the ioctl for specific link device, - * then assign the link ioctl handler to ld->ioctl - * It will be call for specific link ioctl */ - if (ld->ioctl) - return ld->ioctl(ld, iod, cmd, arg); - - mif_err("misc_ioctl : ioctl 0x%X is not defined.\n", cmd); - return -EINVAL; - } - return 0; -} - -static size_t _boot_write(struct io_device *iod, const char __user *buf, - size_t count) -{ - int rest_len = count, frame_len = 0; - char *cur = (char *)buf; - struct sk_buff *skb = NULL; - struct link_device *ld = get_current_link(iod); - int ret; - - while (rest_len) { - frame_len = min(rest_len, MAX_BOOTDATA_SIZE); - skb = alloc_skb(frame_len, GFP_KERNEL); - if (!skb) { - mif_err("fail alloc skb (%d)\n", __LINE__); - return -ENOMEM; - } - if (copy_from_user( - skb_put(skb, frame_len), cur, frame_len) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - rest_len -= frame_len; - cur += frame_len; - - skbpriv(skb)->iod = iod; - skbpriv(skb)->ld = ld; - - ret = ld->send(ld, iod, skb); - if (ret < 0) { - dev_kfree_skb_any(skb); - return ret; - } - } - return count; -} - -static ssize_t misc_write(struct file *filp, const char __user *buf, - size_t count, loff_t *ppos) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - struct link_device *ld = get_current_link(iod); - int frame_len = 0; - char frame_header_buf[sizeof(struct raw_hdr)]; - struct sk_buff *skb; - int err; - size_t tx_size; - - /* TODO - check here flow control for only raw data */ - - frame_len = SIZE_OF_HDLC_START + - get_header_size(iod) + - count + - SIZE_OF_HDLC_END; - if (ld->aligned) - frame_len += MAX_LINK_PADDING_SIZE; - - skb = alloc_skb(frame_len, GFP_KERNEL); - if (!skb) { - if (frame_len > MAX_BOOTDATA_SIZE && iod->format == IPC_BOOT) { - mif_info("large alloc fail\n"); - return _boot_write(iod, buf, count); - } - mif_err("fail alloc skb (%d)\n", __LINE__); - return -ENOMEM; - } - - switch (iod->format) { - case IPC_BOOT: - case IPC_RAMDUMP: - if (copy_from_user(skb_put(skb, count), buf, count) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - break; - - case IPC_RFS: - memcpy(skb_put(skb, SIZE_OF_HDLC_START), hdlc_start, - SIZE_OF_HDLC_START); - if (copy_from_user(skb_put(skb, count), buf, count) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - memcpy(skb_put(skb, SIZE_OF_HDLC_END), hdlc_end, - SIZE_OF_HDLC_END); - break; - - default: - memcpy(skb_put(skb, SIZE_OF_HDLC_START), hdlc_start, - SIZE_OF_HDLC_START); - memcpy(skb_put(skb, get_header_size(iod)), - get_header(iod, count, frame_header_buf), - get_header_size(iod)); - if (copy_from_user(skb_put(skb, count), buf, count) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - memcpy(skb_put(skb, SIZE_OF_HDLC_END), hdlc_end, - SIZE_OF_HDLC_END); - break; - } - - skb_put(skb, calc_padding_size(iod, ld, skb->len)); - -#if 0 - if (iod->format == IPC_FMT) { - mif_err("\n<%s> Tx HDLC FMT frame (len %d)\n", - iod->name, skb->len); - print_sipc4_hdlc_fmt_frame(skb->data); - mif_err("\n"); - } -#endif -#if 0 - if (iod->format == IPC_RAW) { - mif_err("\n<%s> Tx HDLC RAW frame (len %d)\n", - iod->name, skb->len); - mif_print_data(skb->data, (skb->len < 64 ? skb->len : 64)); - mif_err("\n"); - } -#endif -#if 0 - if (iod->format == IPC_RFS) { - mif_err("\n<%s> Tx HDLC RFS frame (len %d)\n", - iod->name, skb->len); - mif_print_data(skb->data, (skb->len < 64 ? skb->len : 64)); - mif_err("\n"); - } -#endif - - /* send data with sk_buff, link device will put sk_buff - * into the specific sk_buff_q and run work-q to send data - */ - tx_size = skb->len; - - skbpriv(skb)->iod = iod; - skbpriv(skb)->ld = ld; - - err = ld->send(ld, iod, skb); - if (err < 0) { - dev_kfree_skb_any(skb); - return err; - } - - if (err != tx_size) - mif_err("WARNNING: wrong tx size: %s, format=%d " - "count=%d, tx_size=%d, return_size=%d", - iod->name, iod->format, count, tx_size, err); - - /* Temporaly enable t he RFS log for debugging IPC RX pedding issue */ - if (iod->format == IPC_RFS) - mif_info("write rfs size = %d\n", count); - - return count; -} - -static ssize_t misc_read(struct file *filp, char *buf, size_t count, - loff_t *f_pos) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - struct sk_buff *skb = NULL; - int pktsize = 0; - unsigned int rest_len, copy_len; - char *cur = buf; - - skb = skb_dequeue(&iod->sk_rx_q); - if (!skb) { - mif_err("<%s> no data from sk_rx_q\n", iod->name); - return 0; - } - mif_debug("<%s> skb->len : %d\n", iod->name, skb->len); - - if (iod->format == IPC_BOOT) { - pktsize = rest_len = count; - while (rest_len) { - if (skb->len > rest_len) { - /* BOOT device receviced rx data as serial - stream, return data by User requested size */ - mif_err("skb->len %d > count %d\n", skb->len, - rest_len); - pr_skb("BOOT-wRX", skb); - if (copy_to_user(cur, skb->data, rest_len) - != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - cur += rest_len; - skb_pull(skb, rest_len); - if (skb->len) { - mif_info("queue-head, skb->len = %d\n", - skb->len); - skb_queue_head(&iod->sk_rx_q, skb); - } - mif_debug("return %u\n", rest_len); - return rest_len; - } - - copy_len = min(rest_len, skb->len); - if (copy_to_user(cur, skb->data, copy_len) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - cur += skb->len; - dev_kfree_skb_any(skb); - rest_len -= copy_len; - - if (!rest_len) - break; - - skb = skb_dequeue(&iod->sk_rx_q); - if (!skb) { - mif_err("<%s> %d / %d sk_rx_q\n", iod->name, - (count - rest_len), count); - return count - rest_len; - } - } - } else { - if (skb->len > count) { - mif_err("<%s> skb->len %d > count %d\n", iod->name, - skb->len, count); - dev_kfree_skb_any(skb); - return -EFAULT; - } - pktsize = skb->len; - if (copy_to_user(buf, skb->data, pktsize) != 0) { - dev_kfree_skb_any(skb); - return -EFAULT; - } - if (iod->format == IPC_FMT) - mif_debug("copied %d bytes to user\n", pktsize); - - dev_kfree_skb_any(skb); - } - return pktsize; -} - -#ifdef CONFIG_LINK_DEVICE_C2C -static int misc_mmap(struct file *filp, struct vm_area_struct *vma) -{ - int r = 0; - unsigned long size = 0; - unsigned long pfn = 0; - unsigned long offset = 0; - struct io_device *iod = (struct io_device *)filp->private_data; - - if (!vma) - return -EFAULT; - - size = vma->vm_end - vma->vm_start; - offset = vma->vm_pgoff << PAGE_SHIFT; - if (offset + size > (C2C_CP_RGN_SIZE + C2C_SH_RGN_SIZE)) { - mif_err("offset + size > C2C_CP_RGN_SIZE\n"); - return -EINVAL; - } - - /* Set the noncacheable property to the region */ - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - vma->vm_flags |= VM_RESERVED | VM_IO; - - pfn = __phys_to_pfn(C2C_CP_RGN_ADDR + offset); - r = remap_pfn_range(vma, vma->vm_start, pfn, size, vma->vm_page_prot); - if (r) { - mif_err("Failed in remap_pfn_range()!!!\n"); - return -EAGAIN; - } - - mif_err("VA = 0x%08lx, offset = 0x%lx, size = %lu\n", - vma->vm_start, offset, size); - - return 0; -} -#endif - -static const struct file_operations misc_io_fops = { - .owner = THIS_MODULE, - .open = misc_open, - .release = misc_release, - .poll = misc_poll, - .unlocked_ioctl = misc_ioctl, - .write = misc_write, - .read = misc_read, -#ifdef CONFIG_LINK_DEVICE_C2C - .mmap = misc_mmap, -#endif -}; - -static int vnet_open(struct net_device *ndev) -{ - struct vnet *vnet = netdev_priv(ndev); - netif_start_queue(ndev); - atomic_inc(&vnet->iod->opened); - return 0; -} - -static int vnet_stop(struct net_device *ndev) -{ - struct vnet *vnet = netdev_priv(ndev); - atomic_dec(&vnet->iod->opened); - netif_stop_queue(ndev); - return 0; -} - -static int vnet_xmit(struct sk_buff *skb, struct net_device *ndev) -{ - int ret = 0; - int headroom = 0; - int tailroom = 0; - struct sk_buff *skb_new = NULL; - struct vnet *vnet = netdev_priv(ndev); - struct io_device *iod = vnet->iod; - struct link_device *ld = get_current_link(iod); - struct raw_hdr hd; - struct iphdr *ip_header = NULL; - - /* When use `handover' with Network Bridge, - * user -> TCP/IP(kernel) -> bridge device -> TCP/IP(kernel) -> this. - * - * We remove the one ethernet header of skb before using skb->len, - * because the skb has two ethernet headers. - */ - if (iod->use_handover) { - if (iod->id >= PSD_DATA_CHID_BEGIN && - iod->id <= PSD_DATA_CHID_END) - skb_pull(skb, sizeof(struct ethhdr)); - } - - /* ip loop-back */ - ip_header = (struct iphdr *)skb->data; - if (iod->msd->loopback_ipaddr && - ip_header->daddr == iod->msd->loopback_ipaddr) { - swap(ip_header->saddr, ip_header->daddr); - hd.channel = DATA_LOOPBACK_CHANNEL; - } else { - hd.channel = iod->id & 0x1F; - } - hd.len = skb->len + sizeof(hd); - hd.control = 0; - - headroom = sizeof(hd) + sizeof(hdlc_start); - tailroom = sizeof(hdlc_end); - if (ld->aligned) - tailroom += MAX_LINK_PADDING_SIZE; - if (skb_headroom(skb) < headroom || skb_tailroom(skb) < tailroom) { - skb_new = skb_copy_expand(skb, headroom, tailroom, GFP_ATOMIC); - /* skb_copy_expand success or not, free old skb from caller */ - dev_kfree_skb_any(skb); - if (!skb_new) - return -ENOMEM; - } else - skb_new = skb; - - memcpy(skb_push(skb_new, sizeof(hd)), &hd, sizeof(hd)); - memcpy(skb_push(skb_new, sizeof(hdlc_start)), hdlc_start, - sizeof(hdlc_start)); - memcpy(skb_put(skb_new, sizeof(hdlc_end)), hdlc_end, sizeof(hdlc_end)); - skb_put(skb_new, calc_padding_size(iod, ld, skb_new->len)); - - skbpriv(skb_new)->iod = iod; - skbpriv(skb_new)->ld = ld; - - ret = ld->send(ld, iod, skb_new); - if (ret < 0) { - netif_stop_queue(ndev); - dev_kfree_skb_any(skb_new); - return NETDEV_TX_BUSY; - } - - ndev->stats.tx_packets++; - ndev->stats.tx_bytes += skb->len; - - return NETDEV_TX_OK; -} - -static struct net_device_ops vnet_ops = { - .ndo_open = vnet_open, - .ndo_stop = vnet_stop, - .ndo_start_xmit = vnet_xmit, -}; - -static void vnet_setup(struct net_device *ndev) -{ - ndev->netdev_ops = &vnet_ops; - ndev->type = ARPHRD_PPP; - ndev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; - ndev->addr_len = 0; - ndev->hard_header_len = 0; - ndev->tx_queue_len = 1000; - ndev->mtu = ETH_DATA_LEN; - ndev->watchdog_timeo = 5 * HZ; -} - -static void vnet_setup_ether(struct net_device *ndev) -{ - ndev->netdev_ops = &vnet_ops; - ndev->type = ARPHRD_ETHER; - ndev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST | IFF_SLAVE; - ndev->addr_len = ETH_ALEN; - random_ether_addr(ndev->dev_addr); - ndev->hard_header_len = 0; - ndev->tx_queue_len = 1000; - ndev->mtu = ETH_DATA_LEN; - ndev->watchdog_timeo = 5 * HZ; -} - -int sipc4_init_io_device(struct io_device *iod) -{ - int ret = 0; - struct vnet *vnet; - - /* Get modem state from modem control device */ - iod->modem_state_changed = io_dev_modem_state_changed; - - iod->sim_state_changed = io_dev_sim_state_changed; - - /* Get data from link device */ - iod->recv = io_dev_recv_data_from_link_dev; - - /* Register misc or net device */ - switch (iod->io_typ) { - case IODEV_MISC: - init_waitqueue_head(&iod->wq); - skb_queue_head_init(&iod->sk_rx_q); - INIT_DELAYED_WORK(&iod->rx_work, rx_iodev_work); - - iod->miscdev.minor = MISC_DYNAMIC_MINOR; - iod->miscdev.name = iod->name; - iod->miscdev.fops = &misc_io_fops; - - ret = misc_register(&iod->miscdev); - if (ret) - mif_err("failed to register misc io device : %s\n", - iod->name); - - break; - - case IODEV_NET: - skb_queue_head_init(&iod->sk_rx_q); - if (iod->use_handover) - iod->ndev = alloc_netdev(0, iod->name, - vnet_setup_ether); - else - iod->ndev = alloc_netdev(0, iod->name, vnet_setup); - - if (!iod->ndev) { - mif_err("failed to alloc netdev\n"); - return -ENOMEM; - } - - ret = register_netdev(iod->ndev); - if (ret) - free_netdev(iod->ndev); - - mif_debug("(iod:0x%p)\n", iod); - vnet = netdev_priv(iod->ndev); - mif_debug("(vnet:0x%p)\n", vnet); - vnet->iod = iod; - - break; - - case IODEV_DUMMY: - skb_queue_head_init(&iod->sk_rx_q); - INIT_DELAYED_WORK(&iod->rx_work, rx_iodev_work); - - iod->miscdev.minor = MISC_DYNAMIC_MINOR; - iod->miscdev.name = iod->name; - iod->miscdev.fops = &misc_io_fops; - - ret = misc_register(&iod->miscdev); - if (ret) - mif_err("failed to register misc io device : %s\n", - iod->name); - ret = device_create_file(iod->miscdev.this_device, - &attr_waketime); - if (ret) - mif_err("failed to create `waketime' file : %s\n", - iod->name); - ret = device_create_file(iod->miscdev.this_device, - &attr_loopback); - if (ret) - mif_err("failed to create `loopback file' : %s\n", - iod->name); - break; - - default: - mif_err("wrong io_type : %d\n", iod->io_typ); - return -EINVAL; - } - - mif_debug("%s(%d) : init_io_device() done : %d\n", - iod->name, iod->io_typ, ret); - return ret; -} - diff --git a/drivers/misc/modem_if_u1/sipc4_modem.c b/drivers/misc/modem_if_u1/sipc4_modem.c deleted file mode 100644 index 542b482..0000000 --- a/drivers/misc/modem_if_u1/sipc4_modem.c +++ /dev/null @@ -1,366 +0,0 @@ -/* linux/drivers/modem/modem.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_variation.h" -#include "modem_utils.h" - -#define FMT_WAKE_TIME (HZ/2) -#define RFS_WAKE_TIME (HZ*3) -#define RAW_WAKE_TIME (HZ*6) - -static struct modem_shared *create_modem_shared_data(void) -{ - struct modem_shared *msd; - - msd = kzalloc(sizeof(struct modem_shared), GFP_KERNEL); - if (!msd) - return NULL; - - /* initialize link device list */ - INIT_LIST_HEAD(&msd->link_dev_list); - - /* initialize tree of io devices */ - msd->iodevs_tree_chan = RB_ROOT; - msd->iodevs_tree_fmt = RB_ROOT; - - msd->storage.cnt = 0; - msd->storage.addr = - kzalloc(MAX_MIF_BUFF_SIZE + MAX_MIF_SEPA_SIZE, GFP_KERNEL); - if (!msd->storage.addr) { - mif_err("IPC logger buff alloc failed!!\n"); - return NULL; - } - memset(msd->storage.addr, 0, MAX_MIF_BUFF_SIZE); - memcpy(msd->storage.addr, MIF_SEPARATOR, MAX_MIF_SEPA_SIZE); - msd->storage.addr += MAX_MIF_SEPA_SIZE; - spin_lock_init(&msd->lock); - - return msd; -} - -static struct modem_ctl *create_modemctl_device(struct platform_device *pdev, - struct modem_shared *msd) -{ - int ret = 0; - struct modem_data *pdata; - struct modem_ctl *modemctl; - struct device *dev = &pdev->dev; - - /* create modem control device */ - modemctl = kzalloc(sizeof(struct modem_ctl), GFP_KERNEL); - if (!modemctl) - return NULL; - - modemctl->msd = msd; - modemctl->dev = dev; - modemctl->phone_state = STATE_OFFLINE; - - pdata = pdev->dev.platform_data; - modemctl->mdm_data = pdata; - modemctl->name = pdata->name; - - /* init modemctl device for getting modemctl operations */ - ret = call_modem_init_func(modemctl, pdata); - if (ret) { - kfree(modemctl); - return NULL; - } - - mif_info("%s is created!!!\n", pdata->name); - - return modemctl; -} - -static struct io_device *create_io_device(struct modem_io_t *io_t, - struct modem_shared *msd, struct modem_ctl *modemctl, - struct modem_data *pdata) -{ - int ret = 0; - struct io_device *iod = NULL; - - iod = kzalloc(sizeof(struct io_device), GFP_KERNEL); - if (!iod) { - mif_err("iod == NULL\n"); - return NULL; - } - - rb_init_node(&iod->node_chan); - rb_init_node(&iod->node_fmt); - - iod->name = io_t->name; - iod->id = io_t->id; - iod->format = io_t->format; - iod->io_typ = io_t->io_type; - iod->link_types = io_t->links; - iod->net_typ = pdata->modem_net; - iod->use_handover = pdata->use_handover; - iod->ipc_version = pdata->ipc_version; - atomic_set(&iod->opened, 0); - - /* link between io device and modem control */ - iod->mc = modemctl; - if (iod->format == IPC_FMT) - modemctl->iod = iod; - if (iod->format == IPC_BOOT) { - modemctl->bootd = iod; - mif_info("Bood device = %s\n", iod->name); - } - - /* link between io device and modem shared */ - iod->msd = msd; - - /* add iod to rb_tree */ - if (iod->format != IPC_RAW) - insert_iod_with_format(msd, iod->format, iod); - - if (sipc4_is_not_reserved_channel(iod->id)) - insert_iod_with_channel(msd, iod->id, iod); - - /* register misc device or net device */ - ret = sipc4_init_io_device(iod); - if (ret) { - kfree(iod); - mif_err("sipc4_init_io_device fail (%d)\n", ret); - return NULL; - } - - mif_debug("%s is created!!!\n", iod->name); - return iod; -} - -static int attach_devices(struct io_device *iod, enum modem_link tx_link) -{ - struct modem_shared *msd = iod->msd; - struct link_device *ld; - - /* find link type for this io device */ - list_for_each_entry(ld, &msd->link_dev_list, list) { - if (IS_CONNECTED(iod, ld)) { - /* The count 1 bits of iod->link_types is count - * of link devices of this iod. - * If use one link device, - * or, 2+ link devices and this link is tx_link, - * set iod's link device with ld - */ - if ((countbits(iod->link_types) <= 1) || - (tx_link == ld->link_type)) { - mif_debug("set %s->%s\n", iod->name, ld->name); - - set_current_link(iod, ld); - - if (iod->ipc_version == SIPC_VER_42) { - if (iod->format == IPC_FMT) { - int ch = iod->id & 0x03; - ld->fmt_iods[ch] = iod; - } - } - } - } - } - - /* if use rx dynamic switch, set tx_link at modem_io_t of - * board-*-modems.c - */ - if (!get_current_link(iod)) { - mif_err("%s->link == NULL\n", iod->name); - BUG(); - } - - switch (iod->format) { - case IPC_FMT: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = FMT_WAKE_TIME; - break; - - case IPC_RFS: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = RFS_WAKE_TIME; - break; - - case IPC_MULTI_RAW: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = RAW_WAKE_TIME; - break; - case IPC_BOOT: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = 3 * HZ; - default: - break; - } - - return 0; -} - -static int __devinit modem_probe(struct platform_device *pdev) -{ - int i; - struct modem_data *pdata = pdev->dev.platform_data; - struct modem_shared *msd = NULL; - struct modem_ctl *modemctl = NULL; - struct io_device *iod[pdata->num_iodevs]; - struct link_device *ld; - - mif_err("%s\n", pdev->name); - memset(iod, 0, sizeof(iod)); - - msd = create_modem_shared_data(); - if (!msd) { - mif_err("msd == NULL\n"); - goto err_free_modemctl; - } - - modemctl = create_modemctl_device(pdev, msd); - if (!modemctl) { - mif_err("modemctl == NULL\n"); - goto err_free_modemctl; - } - - /* create link device */ - /* support multi-link device */ - for (i = 0; i < LINKDEV_MAX ; i++) { - /* find matching link type */ - if (pdata->link_types & LINKTYPE(i)) { - ld = call_link_init_func(pdev, i); - if (!ld) - goto err_free_modemctl; - - mif_err("link created: %s\n", ld->name); - ld->link_type = i; - ld->mc = modemctl; - ld->msd = msd; - list_add(&ld->list, &msd->link_dev_list); - } - } - - /* create io deivces and connect to modemctl device */ - for (i = 0; i < pdata->num_iodevs; i++) { - iod[i] = create_io_device(&pdata->iodevs[i], msd, modemctl, - pdata); - if (!iod[i]) { - mif_err("iod[%d] == NULL\n", i); - goto err_free_modemctl; - } - - attach_devices(iod[i], pdata->iodevs[i].tx_link); - } - - platform_set_drvdata(pdev, modemctl); - - mif_info("Complete!!!\n"); - return 0; - -err_free_modemctl: - for (i = 0; i < pdata->num_iodevs; i++) - if (iod[i] != NULL) - kfree(iod[i]); - - if (modemctl != NULL) - kfree(modemctl); - - if (msd != NULL) - kfree(msd); - - return -ENOMEM; -} - -static void modem_shutdown(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct modem_ctl *mc = dev_get_drvdata(dev); - mc->ops.modem_off(mc); - mc->phone_state = STATE_OFFLINE; -} - -static int modem_suspend(struct device *pdev) -{ -#ifndef CONFIG_LINK_DEVICE_HSIC - struct modem_ctl *mc = dev_get_drvdata(pdev); - - if (mc->gpio_pda_active) - gpio_set_value(mc->gpio_pda_active, 0); -#endif - - return 0; -} - -static int modem_resume(struct device *pdev) -{ -#ifndef CONFIG_LINK_DEVICE_HSIC - struct modem_ctl *mc = dev_get_drvdata(pdev); - - if (mc->gpio_pda_active) - gpio_set_value(mc->gpio_pda_active, 1); -#endif - - return 0; -} - -#ifdef CONFIG_FAST_BOOT -static void modem_complete(struct device *pdev) -{ - struct modem_ctl *mc = dev_get_drvdata(pdev); - - if (mc->modem_complete) - mc->modem_complete(mc); -} -#endif - -static const struct dev_pm_ops modem_pm_ops = { - .suspend = modem_suspend, - .resume = modem_resume, -#ifdef CONFIG_FAST_BOOT - .complete = modem_complete, -#endif -}; - -static struct platform_driver modem_driver = { - .probe = modem_probe, - .shutdown = modem_shutdown, - .driver = { - .name = "modem_if", - .pm = &modem_pm_ops, - }, -}; - -static int __init modem_init(void) -{ - return platform_driver_register(&modem_driver); -} - -module_init(modem_init); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Samsung Modem Interface Driver"); diff --git a/drivers/misc/modem_if_u1/sipc5_io_device.c b/drivers/misc/modem_if_u1/sipc5_io_device.c deleted file mode 100644 index 2613531..0000000 --- a/drivers/misc/modem_if_u1/sipc5_io_device.c +++ /dev/null @@ -1,1608 +0,0 @@ -/* /linux/drivers/misc/modem_if/sipc5_io_device.c - * - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#ifdef CONFIG_LINK_DEVICE_C2C -#include -#endif -#include "modem_prj.h" -#include "modem_utils.h" - -static ssize_t show_waketime(struct device *dev, - struct device_attribute *attr, char *buf) -{ - unsigned int msec; - char *p = buf; - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct io_device *iod = container_of(miscdev, struct io_device, - miscdev); - - msec = jiffies_to_msecs(iod->waketime); - - p += sprintf(buf, "raw waketime : %ums\n", msec); - - return p - buf; -} - -static ssize_t store_waketime(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - unsigned long msec; - int ret; - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct io_device *iod = container_of(miscdev, struct io_device, - miscdev); - - ret = strict_strtoul(buf, 10, &msec); - if (ret) - return count; - - iod->waketime = msecs_to_jiffies(msec); - - return count; -} - -static struct device_attribute attr_waketime = - __ATTR(waketime, S_IRUGO | S_IWUSR, show_waketime, store_waketime); - -static ssize_t show_loopback(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct modem_shared *msd = - container_of(miscdev, struct io_device, miscdev)->msd; - unsigned char *ip = (unsigned char *)&msd->loopback_ipaddr; - char *p = buf; - - p += sprintf(buf, "%u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]); - - return p - buf; -} - -static ssize_t store_loopback(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct modem_shared *msd = - container_of(miscdev, struct io_device, miscdev)->msd; - - msd->loopback_ipaddr = ipv4str_to_be32(buf, count); - - return count; -} - -static struct device_attribute attr_loopback = - __ATTR(loopback, S_IRUGO | S_IWUSR, show_loopback, store_loopback); - -static void iodev_showtxlink(struct io_device *iod, void *args) -{ - char **p = (char **)args; - struct link_device *ld = get_current_link(iod); - - if (iod->io_typ == IODEV_NET && IS_CONNECTED(iod, ld)) - *p += sprintf(*p, "%s: %s\n", iod->name, ld->name); -} - -static ssize_t show_txlink(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct miscdevice *miscdev = dev_get_drvdata(dev); - struct modem_shared *msd = - container_of(miscdev, struct io_device, miscdev)->msd; - char *p = buf; - - iodevs_for_each(msd, iodev_showtxlink, &p); - - return p - buf; -} - -static ssize_t store_txlink(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - /* don't change without gpio dynamic switching */ - return -EINVAL; -} - -static struct device_attribute attr_txlink = - __ATTR(txlink, S_IRUGO | S_IWUSR, show_txlink, store_txlink); - -/** - * rx_check_frame_cfg - * @cfg: configuration field of a link layer header - * @frm: pointer to the sipc5_frame_data buffer - * - * 1) Checks whether or not an extended field exists - * 2) Calculates the length of a link layer header - * - * Returns the size of a link layer header - * - * Must be invoked only when the configuration field of the link layer header - * is validated with sipc5_start_valid() function - */ -static int rx_check_frame_cfg(u8 cfg, struct sipc5_frame_data *frm) -{ - frm->config = cfg; - - if (likely(cfg & SIPC5_PADDING_EXIST)) - frm->padding = true; - - if (unlikely(cfg & SIPC5_EXT_FIELD_EXIST)) { - if (cfg & SIPC5_CTL_FIELD_EXIST) { - frm->ctl_fld = true; - frm->hdr_len = SIPC5_HEADER_SIZE_WITH_CTL_FLD; - } else { - frm->ext_len = true; - frm->hdr_len = SIPC5_HEADER_SIZE_WITH_EXT_LEN; - } - } else { - frm->hdr_len = SIPC5_MIN_HEADER_SIZE; - } - - return frm->hdr_len; -} - -/** - * rx_build_meta_data - * @ld: pointer to the link device - * @frm: pointer to the sipc5_frame_data buffer - * - * Fills each field of sipc5_frame_data from a link layer header - * 1) Extracts the channel ID - * 2) Calculates the length of a link layer frame - * 3) Extracts a control field if exists - * 4) Calculates the length of an IPC message packet in the link layer frame - * - */ -static void rx_build_meta_data(struct link_device *ld, - struct sipc5_frame_data *frm) -{ - u16 *sz16 = (u16 *)(frm->hdr + SIPC5_LEN_OFFSET); - u32 *sz32 = (u32 *)(frm->hdr + SIPC5_LEN_OFFSET); - - frm->ch_id = frm->hdr[SIPC5_CH_ID_OFFSET]; - - if (unlikely(frm->ext_len)) - frm->len = *sz32; - else - frm->len = *sz16; - - if (unlikely(frm->ctl_fld)) - frm->control = frm->hdr[SIPC5_CTL_OFFSET]; - - frm->data_len = frm->len - frm->hdr_len; - - mif_debug("%s: FRM ch:%d len:%d ctl:%02X data.len:%d\n", - ld->name, frm->ch_id, frm->len, frm->control, frm->data_len); -} - -/** - * tx_build_link_header - * @frm: pointer to the sipc5_frame_data buffer - * @iod: pointer to the IO device - * @ld: pointer to the link device - * @count: length of the data to be transmitted - * - * Builds the meta data for an SIPC5 frame and the link layer header of it - * Returns the link layer header length for an SIPC5 frame or 0 for other frame - */ -static unsigned tx_build_link_header(struct sipc5_frame_data *frm, - struct io_device *iod, struct link_device *ld, ssize_t count) -{ - u8 *buff = frm->hdr; - u16 *sz16 = (u16 *)(buff + SIPC5_LEN_OFFSET); - u32 *sz32 = (u32 *)(buff + SIPC5_LEN_OFFSET); - - memset(frm, 0, sizeof(struct sipc5_frame_data)); - - if (iod->format == IPC_CMD || - iod->format == IPC_BOOT || - iod->format == IPC_RAMDUMP) { - frm->len = count; - return 0; - } - - frm->config = SIPC5_START_MASK; - - if (iod->format == IPC_FMT && count > 2048) { - frm->ctl_fld = true; - frm->config |= SIPC5_EXT_FIELD_EXIST; - frm->config |= SIPC5_CTL_FIELD_EXIST; - } - - if (iod->id >= SIPC5_CH_ID_RFS_0 && count > 0xFFFF) { - frm->ext_len = true; - frm->config |= SIPC5_EXT_FIELD_EXIST; - } - - if (ld->aligned) - frm->config |= SIPC5_PADDING_EXIST; - - frm->ch_id = iod->id; - - frm->hdr_len = sipc5_get_hdr_len(frm->config); - frm->data_len = count; - frm->len = frm->hdr_len + frm->data_len; - - buff[SIPC5_CONFIG_OFFSET] = frm->config; - buff[SIPC5_CH_ID_OFFSET] = frm->ch_id; - - if (unlikely(frm->ext_len)) - *sz32 = (u32)frm->len; - else - *sz16 = (u16)frm->len; - - if (unlikely(frm->ctl_fld)) - buff[SIPC5_CTL_OFFSET] = frm->control; - - return frm->hdr_len; -} - -static inline int enqueue_skb_to_iod(struct sk_buff *skb, struct io_device *iod) -{ - struct sk_buff_head *rxq = &iod->sk_rx_q; - struct sk_buff *victim; - - skb_queue_tail(rxq, skb); - if (unlikely(rxq->qlen > MAX_IOD_RXQ_LEN)) { - mif_info("%s: %s application may be dead (rxq->qlen %d > %d)\n", - iod->name, iod->app ? iod->app : "corresponding", - rxq->qlen, MAX_IOD_RXQ_LEN); - victim = skb_dequeue(rxq); - if (victim) - dev_kfree_skb_any(victim); - return -ENOSPC; - } else { - mif_debug("%s: rxq->qlen = %d\n", iod->name, rxq->qlen); - return 0; - } -} - -static int rx_fmt_frame(struct sk_buff *skb) -{ - struct io_device *iod = skbpriv(skb)->iod; - struct link_device *ld = skbpriv(skb)->ld; - struct sipc_fmt_hdr *fh; - struct sk_buff *rx_skb; - u8 ctrl = skbpriv(skb)->control; - unsigned id = ctrl & 0x7F; - - if (iod->skb[id] == NULL) { - /* - ** There has been no multiple frame with this ID. - */ - if ((ctrl & 0x80) == 0) { - /* - ** It is a single frame because the "more" bit is 0. - */ - enqueue_skb_to_iod(skb, iod); - wake_up(&iod->wq); - return 0; - } - - /* - ** The start of multiple frames - */ - fh = (struct sipc_fmt_hdr *)skb->data; - mif_debug("%s: start multi-frame (ID:%d len:%d)\n", - iod->name, id, fh->len); - - rx_skb = rx_alloc_skb(fh->len, iod, ld); - if (!rx_skb) { - mif_info("%s: ERR! rx_alloc_skb fail\n", iod->name); - return -ENOMEM; - } - - iod->skb[id] = rx_skb; - } else { - rx_skb = iod->skb[id]; - } - - /* - ** Start multi-frame processing - */ - memcpy(skb_put(rx_skb, skb->len), skb->data, skb->len); - dev_kfree_skb_any(skb); - - if (ctrl & 0x80) { - /* The last frame has not arrived yet. */ - mif_debug("%s: recv multi-frame (ID:%d rcvd:%d)\n", - iod->name, id, rx_skb->len); - } else { - /* It is the last frame because the "more" bit is 0. */ - mif_debug("%s: end multi-frame (ID:%d rcvd:%d)\n", - iod->name, id, rx_skb->len); - enqueue_skb_to_iod(rx_skb, iod); - iod->skb[id] = NULL; - wake_up(&iod->wq); - } - - return 0; -} - -static int rx_raw_misc(struct sk_buff *skb) -{ - struct io_device *iod = skbpriv(skb)->iod; /* same with real_iod */ - - enqueue_skb_to_iod(skb, iod); - wake_up(&iod->wq); - - return 0; -} - -static int rx_multi_pdp(struct sk_buff *skb) -{ - struct io_device *iod = skbpriv(skb)->iod; /* same with real_iod */ - struct net_device *ndev; - struct iphdr *iphdr; - struct ethhdr *ehdr; - int ret; - const char source[ETH_ALEN] = SOURCE_MAC_ADDR; - - ndev = iod->ndev; - if (!ndev) { - mif_info("%s: ERR! no iod->ndev\n", iod->name); - return -ENODEV; - } - - skb->dev = ndev; - ndev->stats.rx_packets++; - ndev->stats.rx_bytes += skb->len; - - /* check the version of IP */ - iphdr = (struct iphdr *)skb->data; - if (iphdr->version == IP6VERSION) - skb->protocol = htons(ETH_P_IPV6); - else - skb->protocol = htons(ETH_P_IP); - - if (iod->use_handover) { - skb_push(skb, sizeof(struct ethhdr)); - ehdr = (void *)skb->data; - memcpy(ehdr->h_dest, ndev->dev_addr, ETH_ALEN); - memcpy(ehdr->h_source, source, ETH_ALEN); - ehdr->h_proto = skb->protocol; - skb->ip_summed = CHECKSUM_UNNECESSARY; - skb_reset_mac_header(skb); - - skb_pull(skb, sizeof(struct ethhdr)); - } - - if (in_interrupt()) - ret = netif_rx(skb); - else - ret = netif_rx_ni(skb); - - if (ret != NET_RX_SUCCESS) - mif_info("%s: ERR! netif_rx fail (err %d)\n", iod->name, ret); - - return ret; -} - -static int rx_loopback(struct sk_buff *skb) -{ - struct io_device *iod = skbpriv(skb)->iod; - struct link_device *ld = get_current_link(iod); - struct sipc5_frame_data frm; - unsigned headroom; - unsigned tailroom = 0; - int ret; - - headroom = tx_build_link_header(&frm, iod, ld, skb->len); - - if (ld->aligned) - tailroom = sipc5_calc_padding_size(headroom + skb->len); - - /* We need not to expand skb in here. dev_alloc_skb (in rx_alloc_skb) - * already alloc 32bytes padding in headroom. 32bytes are enough. - */ - - /* store IPC link header to start of skb - * this is skb_push not skb_put. different with misc_write. - */ - memcpy(skb_push(skb, headroom), frm.hdr, headroom); - - /* store padding */ - if (tailroom) - skb_put(skb, tailroom); - - /* forward */ - ret = ld->send(ld, iod, skb); - if (ret < 0) - mif_err("%s->%s: ld->send fail: %d\n", iod->name, - ld->name, ret); - return ret; -} - -static int rx_netif_flow_ctrl(struct link_device *ld, struct sk_buff *skb) -{ - u8 cmd = skb->data[0]; - - if (cmd == FLOW_CTRL_SUSPEND) { - if (ld->suspend_netif_tx) - goto exit; - ld->suspend_netif_tx = true; - mif_netif_stop(ld); - mif_info("%s: FLOW_CTRL_SUSPEND\n", ld->name); - } else if (cmd == FLOW_CTRL_RESUME) { - if (!ld->suspend_netif_tx) - goto exit; - ld->suspend_netif_tx = false; - mif_netif_wake(ld); - mif_info("%s: FLOW_CTRL_RESUME\n", ld->name); - } else { - mif_info("%s: ERR! invalid command %02X\n", ld->name, cmd); - } - -exit: - dev_kfree_skb_any(skb); - return 0; -} - -static int rx_demux(struct link_device *ld, struct sk_buff *skb) -{ - struct io_device *iod = NULL; - char *link = ld->name; - u8 ch = skbpriv(skb)->ch_id; - - if (unlikely(ch == 0)) { - mif_info("%s: ERR! invalid ch# %d\n", link, ch); - return -ENODEV; - } - - if (unlikely(ch == SIPC5_CH_ID_FLOW_CTRL)) - return rx_netif_flow_ctrl(ld, skb); - - /* IP loopback */ - if (ch == DATA_LOOPBACK_CHANNEL && ld->msd->loopback_ipaddr) - ch = RMNET0_CH_ID; - - iod = link_get_iod_with_channel(ld, ch); - if (unlikely(!iod)) { - mif_info("%s: ERR! no iod for ch# %d\n", link, ch); - return -ENODEV; - } - - skbpriv(skb)->ld = ld; - skbpriv(skb)->iod = iod; - skbpriv(skb)->real_iod = iod; - - /* don't care about CP2AP_LOOPBACK_CHANNEL is opened */ - if (unlikely(iod->id == CP2AP_LOOPBACK_CHANNEL)) - return rx_loopback(skb); - - if (atomic_read(&iod->opened) <= 0) { - mif_info("%s: ERR! %s is not opened\n", link, iod->name); - return -ENODEV; - } - - if (ch >= SIPC5_CH_ID_RFS_0) - return rx_raw_misc(skb); - else if (ch >= SIPC5_CH_ID_FMT_0) - return rx_fmt_frame(skb); - else if (iod->io_typ == IODEV_MISC) - return rx_raw_misc(skb); - else - return rx_multi_pdp(skb); -} - -/* Check and store link layer header, then alloc an skb */ -static int rx_header_from_serial(struct io_device *iod, struct link_device *ld, - u8 *buff, unsigned size, struct sipc5_frame_data *frm) -{ - char *link = ld->name; - struct sk_buff *skb; - int len; - u8 cfg = buff[0]; - - mif_debug("%s: size %d\n", link, size); - - if (!frm->config) { - if (unlikely(!sipc5_start_valid(cfg))) { - mif_info("%s: ERR! wrong start (0x%02x)\n", link, cfg); - return -EBADMSG; - } - rx_check_frame_cfg(cfg, frm); - - /* Copy the link layer header to the header buffer */ - len = min(frm->hdr_len, size); - memcpy(frm->hdr, buff, len); - } else { - /* Copy the link layer header to the header buffer */ - len = min((frm->hdr_len - frm->hdr_rcvd), size); - memcpy((frm->hdr + frm->hdr_rcvd), buff, len); - } - - frm->hdr_rcvd += len; - - mif_debug("%s: FRM hdr_len:%d, hdr_rcvd:%d\n", - link, frm->hdr_len, frm->hdr_rcvd); - - if (frm->hdr_rcvd >= frm->hdr_len) { - rx_build_meta_data(ld, frm); - skb = rx_alloc_skb(frm->data_len, iod, ld); - fragdata(iod, ld)->skb_recv = skb; - skbpriv(skb)->ch_id = frm->ch_id; - skbpriv(skb)->control = frm->control; - } - - return len; -} - -/* copy data to skb */ -static int rx_payload_from_serial(struct io_device *iod, struct link_device *ld, - u8 *buff, unsigned size, struct sipc5_frame_data *frm) -{ - struct sk_buff *skb = fragdata(iod, ld)->skb_recv; - char *link = ld->name; - unsigned rest = frm->data_len - frm->data_rcvd; - unsigned len; - - /* rest == (frm->data_len - frm->data_rcvd) == tailroom of skb */ - rest = frm->data_len - frm->data_rcvd; - mif_debug("%s: FRM data.len:%d data.rcvd:%d rest:%d size:%d\n", - link, frm->data_len, frm->data_rcvd, rest, size); - - /* If there is no skb, data must be dropped. */ - len = min(rest, size); - if (skb) - memcpy(skb_put(skb, len), buff, len); - - frm->data_rcvd += len; - - mif_debug("%s: FRM data_len:%d, data_rcvd:%d\n", - link, frm->data_len, frm->data_rcvd); - - return len; -} - -static int rx_frame_from_serial(struct io_device *iod, struct link_device *ld, - const char *data, unsigned size) -{ - struct sipc5_frame_data *frm = &fragdata(iod, ld)->f_data; - struct sk_buff *skb; - char *link = ld->name; - u8 *buff = (u8 *)data; - int rest = (int)size; - int err = 0; - int done = 0; - - mif_debug("%s: size = %d\n", link, size); - - if (frm->hdr_rcvd >= frm->hdr_len && frm->data_rcvd < frm->data_len) { - /* - ** There is an skb that is waiting for more SIPC5 data. - ** In this case, rx_header_from_serial() must be skipped. - */ - mif_debug("%s: FRM data.len:%d data.rcvd:%d -> recv_data\n", - link, frm->data_len, frm->data_rcvd); - goto recv_data; - } - -next_frame: - /* Receive and analyze header, then prepare an akb */ - err = done = rx_header_from_serial(iod, ld, buff, rest, frm); - if (err < 0) - goto err_exit; - - buff += done; - rest -= done; - mif_debug("%s: rx_header() -> done:%d rest:%d\n", link, done, rest); - if (rest < 0) - goto err_range; - - if (rest == 0) - return size; - -recv_data: - err = 0; - - mif_debug("%s: done:%d rest:%d -> rx_payload()\n", link, done, rest); - - done = rx_payload_from_serial(iod, ld, buff, rest, frm); - buff += done; - rest -= done; - - mif_debug("%s: rx_payload() -> done:%d rest:%d\n", link, done, rest); - - if (rest == 0 && frm->data_rcvd < frm->data_len) { - /* - Data is being received and more data will come within the next - frame from the link device. - */ - return size; - } - - /* At this point, one complete link layer frame has been received. */ - - /* A padding size is applied to access the next IPC frame. */ - if (frm->padding) { - done = sipc5_calc_padding_size(frm->len); - if (done > rest) { - mif_info("%s: ERR! padding %d > rest %d\n", - link, done, rest); - goto err_exit; - } - - buff += done; - rest -= done; - - mif_debug("%s: padding:%d -> rest:%d\n", link, done, rest); - - if (rest < 0) - goto err_range; - - } - - skb = fragdata(iod, ld)->skb_recv; - if (likely(skb)) { - mif_debug("%s: len:%d -> rx_demux()\n", link, skb->len); - err = rx_demux(ld, skb); - if (err < 0) - dev_kfree_skb_any(skb); - } else { - mif_debug("%s: len:%d -> drop\n", link, skb->len); - } - - /* initialize the skb_recv and the frame_data buffer */ - fragdata(iod, ld)->skb_recv = NULL; - memset(frm, 0, sizeof(struct sipc5_frame_data)); - - if (rest > 0) - goto next_frame; - - if (rest <= 0) - return size; - -err_exit: - if (fragdata(iod, ld)->skb_recv && - frm->hdr_rcvd >= frm->hdr_len && frm->data_rcvd >= frm->data_len) { - dev_kfree_skb_any(fragdata(iod, ld)->skb_recv); - memset(frm, 0, sizeof(struct sipc5_frame_data)); - fragdata(iod, ld)->skb_recv = NULL; - mif_info("%s: ERR! clear frag\n", link); - } - return err; - -err_range: - mif_info("%s: ERR! size:%d vs. rest:%d\n", link, size, rest); - return size; -} - -/** - * rx_header_from_mem - * @ld: pointer to the link device - * @buff: pointer to the frame - * @rest: size of the frame - * @frm: pointer to the sipc5_frame_data buffer - * - * 1) Verifies a link layer header configuration of a frame - * 2) Stores the link layer header to the header buffer - * 3) Builds and stores the meta data of the frame into a meta data buffer - * 4) Verifies the length of the frame - * - * Returns SIPC5 header length - */ -static int rx_header_from_mem(struct link_device *ld, u8 *buff, unsigned rest, - struct sipc5_frame_data *frm) -{ - char *link = ld->name; - u8 cfg = buff[0]; - - /* Verify link layer header configuration */ - if (unlikely(!sipc5_start_valid(cfg))) { - mif_info("%s: ERR! wrong start (0x%02x)\n", link, cfg); - return -EBADMSG; - } - rx_check_frame_cfg(cfg, frm); - - /* Store the link layer header to the header buffer */ - memcpy(frm->hdr, buff, frm->hdr_len); - frm->hdr_rcvd = frm->hdr_len; - - /* Build and store the meta data of this frame */ - rx_build_meta_data(ld, frm); - - /* Verify frame length */ - if (unlikely(frm->len > rest)) { - mif_info("%s: ERR! frame length %d > rest %d\n", - link, frm->len, rest); - return -EBADMSG; - } - - return frm->hdr_rcvd; -} - -/* copy data to skb */ -static int rx_payload_from_mem(struct sk_buff *skb, u8 *buff, unsigned len) -{ - /* If there is no skb, data must be dropped. */ - if (skb) - memcpy(skb_put(skb, len), buff, len); - return len; -} - -static int rx_frame_from_mem(struct io_device *iod, struct link_device *ld, - const char *data, unsigned size) -{ - struct sipc5_frame_data *frm = &fragdata(iod, ld)->f_data; - struct sk_buff *skb; - char *link = ld->name; - u8 *buff = (u8 *)data; - int rest = (int)size; - int len; - int done; - - mif_debug("%s: size = %d\n", link, size); - - while (rest > 0) { - /* Initialize the frame data buffer */ - memset(frm, 0, sizeof(struct sipc5_frame_data)); - skb = NULL; - - /* Receive and analyze link layer header */ - done = rx_header_from_mem(ld, buff, rest, frm); - if (unlikely(done < 0)) - return -EBADMSG; - - /* Verify rest size */ - rest -= done; - if (rest < 0) { - mif_info("%s: ERR! rx_header -> rest %d\n", link, rest); - return -ERANGE; - } - - /* Move buff pointer to the payload */ - buff += done; - - /* Prepare an akb */ - len = frm->data_len; - skb = rx_alloc_skb(len, iod, ld); - - /* Store channel ID and control fields to the CB of the skb */ - skbpriv(skb)->ch_id = frm->ch_id; - skbpriv(skb)->control = frm->control; - - /* Receive payload */ - mif_debug("%s: done:%d rest:%d len:%d -> rx_payload()\n", - link, done, rest, len); - done = rx_payload_from_mem(skb, buff, len); - rest -= done; - if (rest < 0) { - mif_info("%s: ERR! rx_payload() -> rest %d\n", - link, rest); - if (skb) - dev_kfree_skb_any(skb); - return -ERANGE; - } - buff += done; - - /* A padding size is applied to access the next IPC frame. */ - if (frm->padding) { - done = sipc5_calc_padding_size(frm->len); - if (done > rest) { - mif_info("%s: ERR! padding %d > rest %d\n", - link, done, rest); - if (skb) - dev_kfree_skb_any(skb); - return -ERANGE; - } - buff += done; - rest -= done; - } - - if (likely(skb)) { - mif_debug("%s: len:%d -> rx_demux()\n", link, skb->len); - if (rx_demux(ld, skb) < 0) - dev_kfree_skb_any(skb); - } else { - mif_debug("%s: len:%d -> drop\n", link, skb->len); - } - } - - return 0; -} - -/* called from link device when a packet arrives for this io device */ -static int io_dev_recv_data_from_link_dev(struct io_device *iod, - struct link_device *ld, const char *data, unsigned int len) -{ - struct sk_buff *skb; - char *link = ld->name; - int err; - - if (!data) { - mif_info("%s: ERR! !data\n", link); - return -EINVAL; - } - - if (len <= 0) { - mif_info("%s: ERR! len %d <= 0\n", link, len); - return -EINVAL; - } - - switch (iod->format) { - case IPC_FMT: - case IPC_RAW: - case IPC_RFS: - case IPC_MULTI_RAW: - if (iod->waketime) - wake_lock_timeout(&iod->wakelock, iod->waketime); - - if (ld->link_type == LINKDEV_DPRAM && ld->aligned) - err = rx_frame_from_mem(iod, ld, data, len); - else - err = rx_frame_from_serial(iod, ld, data, len); - - if (err < 0) - mif_info("%s: ERR! rx_frame_from_link fail (err %d)\n", - link, err); - - return err; - - case IPC_CMD: - case IPC_BOOT: - case IPC_RAMDUMP: - /* save packet to sk_buff */ - skb = rx_alloc_skb(len, iod, ld); - if (!skb) { - mif_info("%s: ERR! rx_alloc_skb fail\n", link); - return -ENOMEM; - } - - mif_debug("%s: len:%d -> iod:%s\n", link, len, iod->name); - - memcpy(skb_put(skb, len), data, len); - - enqueue_skb_to_iod(skb, iod); - wake_up(&iod->wq); - - return len; - - default: - mif_info("%s: ERR! unknown format %d\n", link, iod->format); - return -EINVAL; - } -} - -static int rx_frame_from_skb(struct io_device *iod, struct link_device *ld, - struct sk_buff *skb) -{ - struct sipc5_frame_data *frm = &fragdata(iod, ld)->f_data; - u8 cfg = skb->data[0]; - - /* Initialize the frame data buffer */ - memset(frm, 0, sizeof(struct sipc5_frame_data)); - - /* - ** The start of a link layer header has already been checked in the - ** link device. - */ - - /* Analyze the configuration of the link layer header */ - rx_check_frame_cfg(cfg, frm); - - /* Store the link layer header to the header buffer */ - memcpy(frm->hdr, skb->data, frm->hdr_len); - frm->hdr_rcvd = frm->hdr_len; - - /* Build and store the meta data of this frame */ - rx_build_meta_data(ld, frm); - - /* - ** The length of the frame has already been checked in the link device. - */ - - /* Trim the link layer header off the frame */ - skb_pull(skb, frm->hdr_len); - - /* Store channel ID and control fields to the CB of the skb */ - skbpriv(skb)->ch_id = frm->ch_id; - skbpriv(skb)->control = frm->control; - - /* Demux the frame */ - if (rx_demux(ld, skb) < 0) { - mif_info("%s: ERR! rx_demux fail\n", ld->name); - return -EINVAL; - } - - return 0; -} - -/* called from link device when a packet arrives for this io device */ -static int io_dev_recv_skb_from_link_dev(struct io_device *iod, - struct link_device *ld, struct sk_buff *skb) -{ - char *link = ld->name; - enum dev_format dev = iod->format; - int err; - - switch (dev) { - case IPC_FMT: - case IPC_RAW: - case IPC_RFS: - case IPC_MULTI_RAW: - if (iod->waketime) - wake_lock_timeout(&iod->wakelock, iod->waketime); - - err = rx_frame_from_skb(iod, ld, skb); - if (err < 0) { - dev_kfree_skb_any(skb); - mif_info("%s: ERR! rx_frame_from_skb fail (err %d)\n", - link, err); - } - - return err; - - default: - mif_info("%s: ERR! unknown device %d\n", link, dev); - return -EINVAL; - } -} - -/* inform the IO device that the modem is now online or offline or - * crashing or whatever... - */ -static void io_dev_modem_state_changed(struct io_device *iod, - enum modem_state state) -{ - mif_info("%s: %s state changed (state %d)\n", - iod->name, iod->mc->name, state); - - iod->mc->phone_state = state; - - if (state == STATE_CRASH_RESET || state == STATE_CRASH_EXIT || - state == STATE_NV_REBUILDING) - wake_up(&iod->wq); -} - -/** - * io_dev_sim_state_changed - * @iod: IPC's io_device - * @sim_online: SIM is online? - */ -static void io_dev_sim_state_changed(struct io_device *iod, bool sim_online) -{ - if (atomic_read(&iod->opened) == 0) { - mif_info("%s: ERR! not opened\n", iod->name); - } else if (iod->mc->sim_state.online == sim_online) { - mif_info("%s: SIM state not changed\n", iod->name); - } else { - iod->mc->sim_state.online = sim_online; - iod->mc->sim_state.changed = true; - mif_info("%s: SIM state changed {online %d, changed %d}\n", - iod->name, iod->mc->sim_state.online, - iod->mc->sim_state.changed); - wake_up(&iod->wq); - } -} - -static void iodev_dump_status(struct io_device *iod, void *args) -{ - if (iod->format == IPC_RAW && iod->io_typ == IODEV_NET) { - struct link_device *ld = get_current_link(iod); - mif_com_log(iod->mc->msd, "%s: %s\n", iod->name, ld->name); - } -} - -static int misc_open(struct inode *inode, struct file *filp) -{ - struct io_device *iod = to_io_device(filp->private_data); - struct modem_shared *msd = iod->msd; - struct link_device *ld; - int ret; - filp->private_data = (void *)iod; - - atomic_inc(&iod->opened); - - list_for_each_entry(ld, &msd->link_dev_list, list) { - if (IS_CONNECTED(iod, ld) && ld->init_comm) { - ret = ld->init_comm(ld, iod); - if (ret < 0) { - mif_info("%s: init_comm fail(%d)\n", - ld->name, ret); - return ret; - } - } - } - - mif_err("%s (opened %d)\n", iod->name, atomic_read(&iod->opened)); - - return 0; -} - -static int misc_release(struct inode *inode, struct file *filp) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - struct modem_shared *msd = iod->msd; - struct link_device *ld; - - atomic_dec(&iod->opened); - skb_queue_purge(&iod->sk_rx_q); - - list_for_each_entry(ld, &msd->link_dev_list, list) { - if (IS_CONNECTED(iod, ld) && ld->terminate_comm) - ld->terminate_comm(ld, iod); - } - - mif_err("%s (opened %d)\n", iod->name, atomic_read(&iod->opened)); - - return 0; -} - -static unsigned int misc_poll(struct file *filp, struct poll_table_struct *wait) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - - poll_wait(filp, &iod->wq, wait); - - if (!skb_queue_empty(&iod->sk_rx_q) && - iod->mc->phone_state != STATE_OFFLINE) { - return POLLIN | POLLRDNORM; - } else if ((iod->mc->phone_state == STATE_CRASH_RESET) || - (iod->mc->phone_state == STATE_CRASH_EXIT) || - (iod->mc->phone_state == STATE_NV_REBUILDING) || - (iod->mc->sim_state.changed)) { - if (iod->format == IPC_RAW) { - msleep(20); - return 0; - } - return POLLHUP; - } else { - return 0; - } -} - -static long misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - int p_state; - struct io_device *iod = (struct io_device *)filp->private_data; - struct link_device *ld = get_current_link(iod); - char cpinfo_buf[530] = "CP Crash "; - unsigned long size; - int ret; - - switch (cmd) { - case IOCTL_MODEM_ON: - mif_info("%s: IOCTL_MODEM_ON\n", iod->name); - return iod->mc->ops.modem_on(iod->mc); - - case IOCTL_MODEM_OFF: - mif_info("%s: IOCTL_MODEM_OFF\n", iod->name); - return iod->mc->ops.modem_off(iod->mc); - - case IOCTL_MODEM_RESET: - mif_info("%s: IOCTL_MODEM_RESET\n", iod->name); - return iod->mc->ops.modem_reset(iod->mc); - - case IOCTL_MODEM_BOOT_ON: - mif_info("%s: IOCTL_MODEM_BOOT_ON\n", iod->name); - return iod->mc->ops.modem_boot_on(iod->mc); - - case IOCTL_MODEM_BOOT_OFF: - mif_info("%s: IOCTL_MODEM_BOOT_OFF\n", iod->name); - return iod->mc->ops.modem_boot_off(iod->mc); - - case IOCTL_MODEM_BOOT_DONE: - mif_err("%s: IOCTL_MODEM_BOOT_DONE\n", iod->name); - if (iod->mc->ops.modem_boot_done) - return iod->mc->ops.modem_boot_done(iod->mc); - else - return 0; - - case IOCTL_MODEM_STATUS: - mif_debug("%s: IOCTL_MODEM_STATUS\n", iod->name); - - p_state = iod->mc->phone_state; - if ((p_state == STATE_CRASH_RESET) || - (p_state == STATE_CRASH_EXIT)) { - mif_info("%s: IOCTL_MODEM_STATUS (state %d)\n", - iod->name, p_state); - } else if (iod->mc->sim_state.changed) { - int s_state = iod->mc->sim_state.online ? - STATE_SIM_ATTACH : STATE_SIM_DETACH; - iod->mc->sim_state.changed = false; - return s_state; - } else if (p_state == STATE_NV_REBUILDING) { - mif_info("%s: IOCTL_MODEM_STATUS (state %d)\n", - iod->name, p_state); - iod->mc->phone_state = STATE_ONLINE; - } - return p_state; - - case IOCTL_MODEM_PROTOCOL_SUSPEND: - mif_debug("%s: IOCTL_MODEM_PROTOCOL_SUSPEND\n", - iod->name); - - if (iod->format != IPC_MULTI_RAW) - return -EINVAL; - - iodevs_for_each(iod->msd, iodev_netif_stop, 0); - return 0; - - case IOCTL_MODEM_PROTOCOL_RESUME: - mif_info("%s: IOCTL_MODEM_PROTOCOL_RESUME\n", - iod->name); - - if (iod->format != IPC_MULTI_RAW) - return -EINVAL; - - iodevs_for_each(iod->msd, iodev_netif_wake, 0); - return 0; - - case IOCTL_MODEM_DUMP_START: - mif_info("%s: IOCTL_MODEM_DUMP_START\n", iod->name); - return ld->dump_start(ld, iod); - - case IOCTL_MODEM_DUMP_UPDATE: - mif_debug("%s: IOCTL_MODEM_DUMP_UPDATE\n", iod->name); - return ld->dump_update(ld, iod, arg); - - case IOCTL_MODEM_FORCE_CRASH_EXIT: - mif_info("%s: IOCTL_MODEM_FORCE_CRASH_EXIT\n", iod->name); - if (iod->mc->ops.modem_force_crash_exit) - return iod->mc->ops.modem_force_crash_exit(iod->mc); - return -EINVAL; - - case IOCTL_MODEM_CP_UPLOAD: - mif_info("%s: IOCTL_MODEM_CP_UPLOAD\n", iod->name); - if (copy_from_user(cpinfo_buf + strlen(cpinfo_buf), - (void __user *)arg, MAX_CPINFO_SIZE) != 0) - return -EFAULT; - panic(cpinfo_buf); - return 0; - - case IOCTL_MODEM_DUMP_RESET: - mif_info("%s: IOCTL_MODEM_DUMP_RESET\n", iod->name); - return iod->mc->ops.modem_dump_reset(iod->mc); - - case IOCTL_MIF_LOG_DUMP: - iodevs_for_each(iod->msd, iodev_dump_status, 0); - size = MAX_MIF_BUFF_SIZE; - ret = copy_to_user((void __user *)arg, &size, - sizeof(unsigned long)); - if (ret < 0) - return -EFAULT; - - mif_dump_log(iod->mc->msd, iod); - return 0; - - case IOCTL_MIF_DPRAM_DUMP: -#ifdef CONFIG_LINK_DEVICE_DPRAM - if (iod->mc->mdm_data->link_types & LINKTYPE(LINKDEV_DPRAM)) { - size = iod->mc->mdm_data->dpram_ctl->dp_size; - ret = copy_to_user((void __user *)arg, &size, - sizeof(unsigned long)); - if (ret < 0) - return -EFAULT; - mif_dump_dpram(iod); - return 0; - } -#endif - return -EINVAL; - - default: - /* If you need to handle the ioctl for specific link device, - * then assign the link ioctl handler to ld->ioctl - * It will be call for specific link ioctl */ - if (ld->ioctl) - return ld->ioctl(ld, iod, cmd, arg); - - mif_info("%s: ERR! cmd 0x%X not defined.\n", iod->name, cmd); - return -EINVAL; - } - return 0; -} - -static ssize_t misc_write(struct file *filp, const char __user *data, - size_t count, loff_t *fpos) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - struct link_device *ld = get_current_link(iod); - struct sk_buff *skb; - int ret; - unsigned headroom = 0; - unsigned tailroom = 0; - size_t tx_size; - struct sipc5_frame_data frm; - - if (iod->format <= IPC_RFS && iod->id == 0) - return -EINVAL; - - headroom = tx_build_link_header(&frm, iod, ld, count); - - if (ld->aligned) - tailroom = sipc5_calc_padding_size(headroom + count); - - tx_size = headroom + count + tailroom; - - skb = alloc_skb(tx_size, GFP_KERNEL); - if (!skb) { - mif_info("%s: ERR! alloc_skb fail (tx_size:%d)\n", - iod->name, tx_size); - return -ENOMEM; - } - - /* store IPC link header*/ - memcpy(skb_put(skb, headroom), frm.hdr, headroom); - - /* store IPC message */ - if (copy_from_user(skb_put(skb, count), data, count) != 0) { - if (skb) - dev_kfree_skb_any(skb); - return -EFAULT; - } - - if (iod->format == IPC_FMT) { - struct timespec epoch; - u8 *msg = (skb->data + headroom); -#if 0 - char str[MIF_MAX_STR_LEN]; - snprintf(str, MIF_MAX_STR_LEN, "%s: RL2MIF", iod->mc->name); - pr_ipc(str, msg, (count > 16 ? 16 : count)); -#endif - getnstimeofday(&epoch); - mif_time_log(iod->mc->msd, epoch, NULL, 0); - mif_ipc_log(MIF_IPC_RL2AP, iod->mc->msd, msg, count); - } - - /* store padding */ - if (tailroom) - skb_put(skb, tailroom); - - /* send data with sk_buff, link device will put sk_buff - * into the specific sk_buff_q and run work-q to send data - */ - skbpriv(skb)->iod = iod; - skbpriv(skb)->ld = ld; - - ret = ld->send(ld, iod, skb); - if (ret < 0) { - mif_info("%s: ERR! ld->send fail (err %d)\n", iod->name, ret); - return ret; - } - - if (ret != tx_size) - mif_info("%s: wrong tx size (count:%d tx_size:%d ret:%d)\n", - iod->name, count, tx_size, ret); - - return count; -} - -static ssize_t misc_read(struct file *filp, char *buf, size_t count, - loff_t *fpos) -{ - struct io_device *iod = (struct io_device *)filp->private_data; - struct sk_buff_head *rxq = &iod->sk_rx_q; - struct sk_buff *skb; - int copied = 0; - - skb = skb_dequeue(rxq); - if (!skb) { - mif_info("%s: ERR! no data in rxq\n", iod->name); - return 0; - } - - if (iod->format == IPC_FMT) { - struct timespec epoch; -#if 0 - char str[MIF_MAX_STR_LEN]; - snprintf(str, MIF_MAX_STR_LEN, "%s: MIF2RL", iod->mc->name); - pr_ipc(str, skb->data, (skb->len > 16 ? 16 : skb->len)); -#endif - getnstimeofday(&epoch); - mif_time_log(iod->mc->msd, epoch, NULL, 0); - mif_ipc_log(MIF_IPC_AP2RL, iod->mc->msd, skb->data, skb->len); - } - - copied = skb->len > count ? count : skb->len; - - if (copy_to_user(buf, skb->data, copied)) { - mif_info("%s: ERR! copy_to_user fail\n", iod->name); - dev_kfree_skb_any(skb); - return -EFAULT; - } - - mif_debug("%s: data:%d copied:%d qlen:%d\n", - iod->name, skb->len, copied, rxq->qlen); - - if (skb->len > count) { - skb_pull(skb, count); - skb_queue_head(rxq, skb); - } else { - dev_kfree_skb_any(skb); - } - - return copied; -} - -#ifdef CONFIG_LINK_DEVICE_C2C -static int misc_mmap(struct file *filp, struct vm_area_struct *vma) -{ - int r = 0; - unsigned long size = 0; - unsigned long pfn = 0; - unsigned long offset = 0; - struct io_device *iod = (struct io_device *)filp->private_data; - - if (!vma) - return -EFAULT; - - size = vma->vm_end - vma->vm_start; - offset = vma->vm_pgoff << PAGE_SHIFT; - if (offset + size > (C2C_CP_RGN_SIZE + C2C_SH_RGN_SIZE)) { - mif_info("ERR: offset + size > C2C_CP_RGN_SIZE\n"); - return -EINVAL; - } - - /* Set the noncacheable property to the region */ - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - vma->vm_flags |= VM_RESERVED | VM_IO; - - pfn = __phys_to_pfn(C2C_CP_RGN_ADDR + offset); - r = remap_pfn_range(vma, vma->vm_start, pfn, size, vma->vm_page_prot); - if (r) { - mif_info("ERR: Failed in remap_pfn_range()!!!\n"); - return -EAGAIN; - } - - mif_info("%s: VA = 0x%08lx, offset = 0x%lx, size = %lu\n", - iod->name, vma->vm_start, offset, size); - - return 0; -} -#endif - -static const struct file_operations misc_io_fops = { - .owner = THIS_MODULE, - .open = misc_open, - .release = misc_release, - .poll = misc_poll, - .unlocked_ioctl = misc_ioctl, - .write = misc_write, - .read = misc_read, -#ifdef CONFIG_LINK_DEVICE_C2C - .mmap = misc_mmap, -#endif -}; - -static int vnet_open(struct net_device *ndev) -{ - struct vnet *vnet = netdev_priv(ndev); - - mif_err("%s\n", vnet->iod->name); - - netif_start_queue(ndev); - atomic_inc(&vnet->iod->opened); - return 0; -} - -static int vnet_stop(struct net_device *ndev) -{ - struct vnet *vnet = netdev_priv(ndev); - - mif_err("%s\n", vnet->iod->name); - - atomic_dec(&vnet->iod->opened); - netif_stop_queue(ndev); - skb_queue_purge(&vnet->iod->sk_rx_q); - return 0; -} - -static int vnet_xmit(struct sk_buff *skb, struct net_device *ndev) -{ - struct vnet *vnet = netdev_priv(ndev); - struct io_device *iod = vnet->iod; - struct link_device *ld = get_current_link(iod); - struct sk_buff *skb_new; - int ret; - unsigned headroom = 0; - unsigned tailroom = 0; - unsigned long tx_bytes = skb->len; - struct iphdr *ip_header = NULL; - struct sipc5_frame_data frm; - - /* When use `handover' with Network Bridge, - * user -> bridge device(rmnet0) -> real rmnet(xxxx_rmnet0) -> here. - * bridge device is ethernet device unlike xxxx_rmnet(net device). - * We remove the an ethernet header of skb before using skb->len, - * because bridge device added an ethernet header to skb. - */ - if (iod->use_handover) { - if (iod->id >= PS_DATA_CH_0 && iod->id <= PS_DATA_CH_LAST) - skb_pull(skb, sizeof(struct ethhdr)); - } - - headroom = tx_build_link_header(&frm, iod, ld, skb->len); - - /* ip loop-back */ - ip_header = (struct iphdr *)skb->data; - if (iod->msd->loopback_ipaddr && - ip_header->daddr == iod->msd->loopback_ipaddr) { - swap(ip_header->saddr, ip_header->daddr); - frm.ch_id = DATA_LOOPBACK_CHANNEL; - frm.hdr[SIPC5_CH_ID_OFFSET] = DATA_LOOPBACK_CHANNEL; - } - - if (ld->aligned) - tailroom = sipc5_calc_padding_size(frm.len); - - if (skb_headroom(skb) < headroom || skb_tailroom(skb) < tailroom) { - mif_debug("%s: skb_copy_expand needed\n", iod->name); - skb_new = skb_copy_expand(skb, headroom, tailroom, GFP_ATOMIC); - /* skb_copy_expand success or not, free old skb from caller */ - dev_kfree_skb_any(skb); - if (!skb_new) { - mif_info("%s: ERR! skb_copy_expand fail\n", iod->name); - return NETDEV_TX_BUSY; - } - } else { - skb_new = skb; - } - - memcpy(skb_push(skb_new, headroom), frm.hdr, headroom); - if (tailroom) - skb_put(skb_new, tailroom); - - skbpriv(skb_new)->iod = iod; - skbpriv(skb_new)->ld = ld; - - ret = ld->send(ld, iod, skb_new); - if (ret < 0) { - netif_stop_queue(ndev); - mif_info("%s: ERR! ld->send fail (err %d)\n", iod->name, ret); - return NETDEV_TX_BUSY; - } - - ndev->stats.tx_packets++; - ndev->stats.tx_bytes += tx_bytes; - - return NETDEV_TX_OK; -} - -static struct net_device_ops vnet_ops = { - .ndo_open = vnet_open, - .ndo_stop = vnet_stop, - .ndo_start_xmit = vnet_xmit, -}; - -static void vnet_setup(struct net_device *ndev) -{ - ndev->netdev_ops = &vnet_ops; - ndev->type = ARPHRD_PPP; - ndev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; - ndev->addr_len = 0; - ndev->hard_header_len = 0; - ndev->tx_queue_len = 1000; - ndev->mtu = ETH_DATA_LEN; - ndev->watchdog_timeo = 5 * HZ; -} - -static void vnet_setup_ether(struct net_device *ndev) -{ - ndev->netdev_ops = &vnet_ops; - ndev->type = ARPHRD_ETHER; - ndev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST | IFF_SLAVE; - ndev->addr_len = ETH_ALEN; - random_ether_addr(ndev->dev_addr); - ndev->hard_header_len = 0; - ndev->tx_queue_len = 1000; - ndev->mtu = ETH_DATA_LEN; - ndev->watchdog_timeo = 5 * HZ; -} - -int sipc5_init_io_device(struct io_device *iod) -{ - int ret = 0; - struct vnet *vnet; - - /* Get modem state from modem control device */ - iod->modem_state_changed = io_dev_modem_state_changed; - - iod->sim_state_changed = io_dev_sim_state_changed; - - /* Get data from link device */ - mif_debug("%s: SIPC version = %d\n", iod->name, iod->ipc_version); - iod->recv = io_dev_recv_data_from_link_dev; - iod->recv_skb = io_dev_recv_skb_from_link_dev; - - /* Register misc or net device */ - switch (iod->io_typ) { - case IODEV_MISC: - init_waitqueue_head(&iod->wq); - skb_queue_head_init(&iod->sk_rx_q); - - iod->miscdev.minor = MISC_DYNAMIC_MINOR; - iod->miscdev.name = iod->name; - iod->miscdev.fops = &misc_io_fops; - - ret = misc_register(&iod->miscdev); - if (ret) - mif_info("%s: ERR! misc_register failed\n", iod->name); - - break; - - case IODEV_NET: - skb_queue_head_init(&iod->sk_rx_q); - if (iod->use_handover) - iod->ndev = alloc_netdev(0, iod->name, - vnet_setup_ether); - else - iod->ndev = alloc_netdev(0, iod->name, vnet_setup); - - if (!iod->ndev) { - mif_info("%s: ERR! alloc_netdev fail\n", iod->name); - return -ENOMEM; - } - - ret = register_netdev(iod->ndev); - if (ret) { - mif_info("%s: ERR! register_netdev fail\n", iod->name); - free_netdev(iod->ndev); - } - - mif_debug("iod 0x%p\n", iod); - vnet = netdev_priv(iod->ndev); - mif_debug("vnet 0x%p\n", vnet); - vnet->iod = iod; - - break; - - case IODEV_DUMMY: - skb_queue_head_init(&iod->sk_rx_q); - - iod->miscdev.minor = MISC_DYNAMIC_MINOR; - iod->miscdev.name = iod->name; - iod->miscdev.fops = &misc_io_fops; - - ret = misc_register(&iod->miscdev); - if (ret) - mif_info("%s: ERR! misc_register fail\n", iod->name); - ret = device_create_file(iod->miscdev.this_device, - &attr_waketime); - if (ret) - mif_info("%s: ERR! device_create_file fail\n", - iod->name); - ret = device_create_file(iod->miscdev.this_device, - &attr_loopback); - if (ret) - mif_err("failed to create `loopback file' : %s\n", - iod->name); - ret = device_create_file(iod->miscdev.this_device, - &attr_txlink); - if (ret) - mif_err("failed to create `txlink file' : %s\n", - iod->name); - break; - - default: - mif_info("%s: ERR! wrong io_type %d\n", iod->name, iod->io_typ); - return -EINVAL; - } - - return ret; -} - diff --git a/drivers/misc/modem_if_u1/sipc5_modem.c b/drivers/misc/modem_if_u1/sipc5_modem.c deleted file mode 100644 index 9a66b97..0000000 --- a/drivers/misc/modem_if_u1/sipc5_modem.c +++ /dev/null @@ -1,385 +0,0 @@ -/* linux/drivers/modem/modem.c - * - * Copyright (C) 2010 Google, Inc. - * Copyright (C) 2010 Samsung Electronics. - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "modem_prj.h" -#include "modem_variation.h" -#include "modem_utils.h" - -#define FMT_WAKE_TIME (HZ/2) -#define RAW_WAKE_TIME (HZ*6) - -static struct modem_shared *create_modem_shared_data(void) -{ - struct modem_shared *msd; - int size = MAX_MIF_BUFF_SIZE; - - msd = kzalloc(sizeof(struct modem_shared), GFP_KERNEL); - if (!msd) - return NULL; - - /* initialize link device list */ - INIT_LIST_HEAD(&msd->link_dev_list); - - /* initialize tree of io devices */ - msd->iodevs_tree_chan = RB_ROOT; - msd->iodevs_tree_fmt = RB_ROOT; - - msd->storage.cnt = 0; - msd->storage.addr = kzalloc(MAX_MIF_BUFF_SIZE + - (MAX_MIF_SEPA_SIZE * 2), GFP_KERNEL); - if (!msd->storage.addr) { - mif_err("IPC logger buff alloc failed!!\n"); - return NULL; - } - memset(msd->storage.addr, 0, size + (MAX_MIF_SEPA_SIZE * 2)); - memcpy(msd->storage.addr, MIF_SEPARATOR, MAX_MIF_SEPA_SIZE); - msd->storage.addr += MAX_MIF_SEPA_SIZE; - memcpy(msd->storage.addr, &size, MAX_MIF_SEPA_SIZE); - msd->storage.addr += MAX_MIF_SEPA_SIZE; - spin_lock_init(&msd->lock); - - return msd; -} - -static struct modem_ctl *create_modemctl_device(struct platform_device *pdev, - struct modem_shared *msd) -{ - int ret = 0; - struct modem_data *pdata; - struct modem_ctl *modemctl; - struct device *dev = &pdev->dev; - - /* create modem control device */ - modemctl = kzalloc(sizeof(struct modem_ctl), GFP_KERNEL); - if (!modemctl) - return NULL; - - modemctl->msd = msd; - modemctl->dev = dev; - modemctl->phone_state = STATE_OFFLINE; - - pdata = pdev->dev.platform_data; - modemctl->mdm_data = pdata; - modemctl->name = pdata->name; - - /* init modemctl device for getting modemctl operations */ - ret = call_modem_init_func(modemctl, pdata); - if (ret) { - kfree(modemctl); - return NULL; - } - - mif_info("%s is created!!!\n", pdata->name); - - return modemctl; -} - -static struct io_device *create_io_device(struct modem_io_t *io_t, - struct modem_shared *msd, struct modem_ctl *modemctl, - struct modem_data *pdata) -{ - int ret = 0; - struct io_device *iod = NULL; - - iod = kzalloc(sizeof(struct io_device), GFP_KERNEL); - if (!iod) { - mif_err("iod == NULL\n"); - return NULL; - } - - rb_init_node(&iod->node_chan); - rb_init_node(&iod->node_fmt); - - iod->name = io_t->name; - iod->id = io_t->id; - iod->format = io_t->format; - iod->io_typ = io_t->io_type; - iod->link_types = io_t->links; - iod->app = io_t->app; - iod->net_typ = pdata->modem_net; - iod->use_handover = pdata->use_handover; - iod->ipc_version = pdata->ipc_version; - atomic_set(&iod->opened, 0); - - /* link between io device and modem control */ - iod->mc = modemctl; - if (iod->format == IPC_FMT) - modemctl->iod = iod; - if (iod->format == IPC_BOOT) { - modemctl->bootd = iod; - mif_info("Bood device = %s\n", iod->name); - } - - /* link between io device and modem shared */ - iod->msd = msd; - - /* add iod to rb_tree */ - if (iod->format != IPC_RAW) - insert_iod_with_format(msd, iod->format, iod); - - if (sipc5_is_not_reserved_channel(iod->id)) - insert_iod_with_channel(msd, iod->id, iod); - - /* register misc device or net device */ - ret = sipc5_init_io_device(iod); - if (ret) { - kfree(iod); - mif_err("sipc5_init_io_device fail (%d)\n", ret); - return NULL; - } - - mif_debug("%s is created!!!\n", iod->name); - return iod; -} - -static int attach_devices(struct io_device *iod, enum modem_link tx_link) -{ - struct modem_shared *msd = iod->msd; - struct link_device *ld; - unsigned ch; - - /* find link type for this io device */ - list_for_each_entry(ld, &msd->link_dev_list, list) { - if (IS_CONNECTED(iod, ld)) { - /* The count 1 bits of iod->link_types is count - * of link devices of this iod. - * If use one link device, - * or, 2+ link devices and this link is tx_link, - * set iod's link device with ld - */ - if ((countbits(iod->link_types) <= 1) || - (tx_link == ld->link_type)) { - mif_debug("set %s->%s\n", iod->name, ld->name); - set_current_link(iod, ld); - } - } - } - - /* if use rx dynamic switch, set tx_link at modem_io_t of - * board-*-modems.c - */ - if (!get_current_link(iod)) { - mif_err("%s->link == NULL\n", iod->name); - BUG(); - } - - switch (iod->format) { - case IPC_FMT: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = FMT_WAKE_TIME; - break; - - case IPC_RAW: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = RAW_WAKE_TIME; - break; - - case IPC_RFS: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = RAW_WAKE_TIME; - break; - - case IPC_MULTI_RAW: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = RAW_WAKE_TIME; - break; - - case IPC_BOOT: - wake_lock_init(&iod->wakelock, WAKE_LOCK_SUSPEND, iod->name); - iod->waketime = RAW_WAKE_TIME; - break; - - default: - break; - } - - return 0; -} - -static int __devinit modem_probe(struct platform_device *pdev) -{ - int i; - struct modem_data *pdata = pdev->dev.platform_data; - struct modem_shared *msd = NULL; - struct modem_ctl *modemctl = NULL; - struct io_device *iod[pdata->num_iodevs]; - struct link_device *ld; - - mif_err("%s\n", pdev->name); - memset(iod, 0, sizeof(iod)); - - msd = create_modem_shared_data(); - if (!msd) { - mif_err("msd == NULL\n"); - goto err_free_modemctl; - } - - modemctl = create_modemctl_device(pdev, msd); - if (!modemctl) { - mif_err("modemctl == NULL\n"); - goto err_free_modemctl; - } - - /* create link device */ - /* support multi-link device */ - for (i = 0; i < LINKDEV_MAX ; i++) { - /* find matching link type */ - if (pdata->link_types & LINKTYPE(i)) { - ld = call_link_init_func(pdev, i); - if (!ld) - goto err_free_modemctl; - - mif_err("link created: %s\n", ld->name); - ld->link_type = i; - ld->mc = modemctl; - ld->msd = msd; - list_add(&ld->list, &msd->link_dev_list); - } - } - - /* create io deivces and connect to modemctl device */ - for (i = 0; i < pdata->num_iodevs; i++) { - iod[i] = create_io_device(&pdata->iodevs[i], msd, modemctl, - pdata); - if (!iod[i]) { - mif_err("iod[%d] == NULL\n", i); - goto err_free_modemctl; - } - - attach_devices(iod[i], pdata->iodevs[i].tx_link); - } - - platform_set_drvdata(pdev, modemctl); - - mif_err("Complete!!!\n"); - - return 0; - -err_free_modemctl: - for (i = 0; i < pdata->num_iodevs; i++) - if (iod[i] != NULL) - kfree(iod[i]); - - if (modemctl != NULL) - kfree(modemctl); - - if (msd != NULL) - kfree(msd); - - return -ENOMEM; -} - -static void modem_shutdown(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct modem_ctl *mc = dev_get_drvdata(dev); - struct utc_time utc; - - mc->ops.modem_off(mc); - mc->phone_state = STATE_OFFLINE; - - get_utc_time(&utc); - mif_info("%s: at [%02d:%02d:%02d.%03d]\n", - mc->name, utc.hour, utc.min, utc.sec, utc.msec); -} - -static int modem_suspend(struct device *pdev) -{ -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - struct utc_time utc; -#endif - -#ifndef CONFIG_LINK_DEVICE_HSIC - struct modem_ctl *mc = dev_get_drvdata(pdev); - - if (mc->gpio_pda_active) { - gpio_set_value(mc->gpio_pda_active, 0); -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - get_utc_time(&utc); - mif_info("%s: at [%02d:%02d:%02d.%03d]\n", - mc->name, utc.hour, utc.min, utc.sec, utc.msec); -#endif - } -#endif - - return 0; -} - -static int modem_resume(struct device *pdev) -{ -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - struct utc_time utc; -#endif - -#ifndef CONFIG_LINK_DEVICE_HSIC - struct modem_ctl *mc = dev_get_drvdata(pdev); - - if (mc->gpio_pda_active) { - gpio_set_value(mc->gpio_pda_active, 1); -#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP - get_utc_time(&utc); - mif_info("%s: at [%02d:%02d:%02d.%03d]\n", - mc->name, utc.hour, utc.min, utc.sec, utc.msec); -#endif - } -#endif - - return 0; -} - -static const struct dev_pm_ops modem_pm_ops = { - .suspend = modem_suspend, - .resume = modem_resume, -}; - -static struct platform_driver modem_driver = { - .probe = modem_probe, - .shutdown = modem_shutdown, - .driver = { - .name = "mif_sipc5", - .pm = &modem_pm_ops, - }, -}; - -static int __init modem_init(void) -{ - return platform_driver_register(&modem_driver); -} - -module_init(modem_init); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Samsung Modem Interface Driver"); diff --git a/drivers/misc/mpu3050/Kconfig b/drivers/misc/mpu3050/Kconfig deleted file mode 100755 index 933aa33..0000000 --- a/drivers/misc/mpu3050/Kconfig +++ /dev/null @@ -1,147 +0,0 @@ - -menu "Motion Sensors Support" - -config MPU_NONE - bool "None" - -config MPU_SENSORS_MPU6000 - tristate "MPU6000" - depends on I2C - -choice - prompt "Accelerometer Type" - depends on MPU_SENSORS_MPU3050 - default MPU_SENSORS_ACCELEROMETER_NONE - -config MPU_SENSORS_ACCELEROMETER_NONE - bool "NONE" - depends on MPU_SENSORS_MPU3050 || MPU_SENSORS_MPU6000 - -config MPU_SENSORS_ADXL346 - bool "ADI adxl346" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_BMA150 - bool "Bosch BMA150" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_BMA222 - bool "Bosch BMA222" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_KXSD9 - bool "Kionix KXSD9" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_KXUD9 - bool "Kionix KXUD9" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_KXTF9 - bool "Kionix KXTF9" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_LIS331DLH - bool "ST lis331dlh" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_LIS3DH - bool "ST lis3dh" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_LSM303DLHA - bool "ST lsm303dlh" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_MMA8450 - bool "Freescale mma8450" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_MMA845X - bool "Freescale mma8451/8452/8453" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_KXTF9_LIS3DH - bool "Kionix KXTF9+ ST LIS3DH" - depends on MPU_SENSORS_MPU3050 - -endchoice - -choice - prompt "Compass Type" - depends on MPU_SENSORS_MPU6000 || MPU_SENSORS_MPU3050 - default MPU_SENSORS_COMPASS_NONE - -config MPU_SENSORS_COMPASS_NONE - bool "NONE" - depends on MPU_SENSORS_MPU6000 || MPU_SENSORS_MPU3050 - -config MPU_SENSORS_AK8975 - bool "AKM ak8975" - depends on MPU_SENSORS_MPU6000 || MPU_SENSORS_MPU3050 - -config MPU_SENSORS_MMC314X - bool "MEMSIC mmc314x" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_MMC328X - bool "MEMSIC mmc328x" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_AMI30X - bool "Aichi Steel ami30X" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_HMC5883 - bool "Honeywell hmc5883" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_LSM303DLHM - bool "ST lsm303dlh" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_MMC314X - bool "MEMSIC mmc314xMS" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_YAS529 - bool "Yamaha yas529" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_HSCDTD002B - bool "Alps hscdtd002b" - depends on MPU_SENSORS_MPU3050 - -config MPU_SENSORS_HSCDTD004A - bool "Alps hscdtd004a" - depends on MPU_SENSORS_MPU3050 - -endchoice - -choice - prompt "Pressure Type" - depends on MPU_SENSORS_MPU6000 || MPU_SENSORS_MPU3050 - default MPU_SENSORS_PRESSURE_NONE - -config MPU_SENSORS_PRESSURE_NONE - bool "NONE" - depends on MPU_SENSORS_MPU6000 || MPU_SENSORS_MPU3050 - -config MPU_SENSORS_BMA085 - bool "Bosch BMA085" - depends on MPU_SENSORS_MPU6000 || MPU_SENSORS_MPU3050 - -endchoice - - -config MPU_SENSORS_CORE - tristate "Sensors core" - -config MPU_SENSORS_TIMERIRQ - tristate "Timer IRQ" - -config MPU_SENSORS_DEBUG - bool "MPU debug" - depends on MPU_SENSORS_MPU3050 || MPU_SENSORS_MPU6000 || MPU_SENSORS_TIMERIRQ - -endmenu diff --git a/drivers/misc/mpu3050/Makefile b/drivers/misc/mpu3050/Makefile deleted file mode 100755 index 7432122..0000000 --- a/drivers/misc/mpu3050/Makefile +++ /dev/null @@ -1,145 +0,0 @@ -# -# Kernel makefile for motions sensors -# -# - -# MPU -obj-$(CONFIG_MPU_SENSORS_MPU3050) += mpu3050.o -mpu3050-objs += mpuirq.o \ - slaveirq.o \ - mpu-dev.o \ - mpu-i2c.o \ - mlsl-kernel.o \ - mlos-kernel.o \ - mpu-accel.o \ - $(MLLITE_DIR)mldl_cfg.o - -# -# Accel options -# -ifdef CONFIG_MPU_SENSORS_ADXL346 -mpu3050-objs += $(MLLITE_DIR)accel/adxl346.o -endif - -ifdef CONFIG_MPU_SENSORS_BMA150 -mpu3050-objs += $(MLLITE_DIR)accel/bma150.o -endif - -ifdef CONFIG_MPU_SENSORS_BMA222 -mpu3050-objs += $(MLLITE_DIR)accel/bma222.o -endif - -ifdef CONFIG_MPU_SENSORS_KXSD9 -mpu3050-objs += $(MLLITE_DIR)accel/kxsd9.o -endif - -ifdef CONFIG_MACH_BOSE_ATT - mpu3050-objs += $(MLLITE_DIR)accel/kxud9.o - mpu3050-objs += $(MLLITE_DIR)accel/kxtf9.o -else -ifdef CONFIG_MPU_SENSORS_KXUD9 -mpu3050-objs += $(MLLITE_DIR)accel/kxud9.o -endif - -ifdef CONFIG_MPU_SENSORS_KXTF9 -mpu3050-objs += $(MLLITE_DIR)accel/kxtf9.o -endif -endif - -ifdef CONFIG_MPU_SENSORS_LIS331DLH -mpu3050-objs += $(MLLITE_DIR)accel/lis331.o -endif - -ifdef CONFIG_MPU_SENSORS_LIS3DH -mpu3050-objs += $(MLLITE_DIR)accel/lis3dh.o -endif - -ifdef CONFIG_MPU_SENSORS_LSM303DLHA -mpu3050-objs += $(MLLITE_DIR)accel/lsm303a.o -endif - -ifdef CONFIG_MPU_SENSORS_MMA8450 -mpu3050-objs += $(MLLITE_DIR)accel/mma8450.o -endif - -ifdef CONFIG_MPU_SENSORS_MMA845X -mpu3050-objs += $(MLLITE_DIR)accel/mma845x.o -endif - -ifdef CONFIG_MPU_SENSORS_KXTF9_LIS3DH -mpu3050-objs += $(MLLITE_DIR)accel/kxtf9.o -mpu3050-objs += $(MLLITE_DIR)accel/lis3dh.o -endif - -# -# Compass options -# -ifdef CONFIG_MPU_SENSORS_AK8975 -mpu3050-objs += $(MLLITE_DIR)compass/mpuak8975.o -endif - -ifdef CONFIG_MPU_SENSORS_AMI30X -mpu3050-objs += $(MLLITE_DIR)compass/ami30x.o -endif - -ifdef CONFIG_MPU_SENSORS_HMC5883 -mpu3050-objs += $(MLLITE_DIR)compass/hmc5883.o -endif - -ifdef CONFIG_MPU_SENSORS_LSM303DLHM -mpu3050-objs += $(MLLITE_DIR)compass/lsm303m.o -endif - -ifdef CONFIG_MPU_SENSORS_MMC314X -mpu3050-objs += $(MLLITE_DIR)compass/mmc314x.o -endif - -ifdef CONFIG_MPU_SENSORS_MMC328X -mpu3050-objs += $(MLLITE_DIR)compass/mmc328x.o -endif - -ifdef CONFIG_MPU_SENSORS_YAS529 -mpu3050-objs += $(MLLITE_DIR)compass/yas529-kernel.o -endif - -ifdef CONFIG_MPU_SENSORS_HSCDTD002B -mpu3050-objs += $(MLLITE_DIR)compass/hscdtd002b.o -endif - -ifdef CONFIG_MPU_SENSORS_HSCDTD004A -mpu3050-objs += $(MLLITE_DIR)compass/hscdtd004a.o -endif - -# -# Pressure options -# -ifdef CONFIG_MPU_SENSORS_BMA085 -mpu3050-objs += $(MLLITE_DIR)pressure/bma085.o -endif - -ccflags-y += -I$(M)/$(MLLITE_DIR) \ - -I$(M)/../../include \ - -Idrivers/misc/mpu3050 \ - -Iinclude/linux - -obj-$(CONFIG_MPU_SENSORS_MPU6000)+= mpu6000.o -mpu6000-objs += mpuirq.o \ - slaveirq.o \ - mpu-dev.o \ - mpu-i2c.o \ - mlsl-kernel.o \ - mlos-kernel.o \ - $(MLLITE_DIR)mldl_cfg.o \ - $(MLLITE_DIR)accel/mantis.o - -ifdef CONFIG_MPU_SENSORS_MPU6000 -ccflags-y += -DM_HW -endif - -obj-$(CONFIG_MPU_SENSORS_CORE) += sensors_core.o -obj-$(CONFIG_MPU_SENSORS_TIMERIRQ)+= timerirq.o - -ifdef CONFIG_MPU_SENSORS_DEBUG -ccflags-y += -DDEBUG -endif - diff --git a/drivers/misc/mpu3050/README b/drivers/misc/mpu3050/README deleted file mode 100755 index 2734dc1..0000000 --- a/drivers/misc/mpu3050/README +++ /dev/null @@ -1,250 +0,0 @@ -Kernel driver mpu -===================== - -Supported chips: - * InvenSense IMU3050 - Prefix: 'mpu3050' - Datasheet: - PS-MPU-3000A-00.2.4b.pdf - - * InvenSense IMU6000 - Prefix: 'mpu6000' - Datasheet: - MPU-6000A-00 v1.0.pdf - -Author: InvenSense - -Description ------------ -The mpu is a motion processor unit that controls the mpu3050 gyroscope, a slave -accelerometer, a compass and a pressure sensor, or the mpu6000 and slave -compass. This document describes how to install the driver into a Linux kernel -and a small note about how to set up the file permissions in an android file -system. - -Sysfs entries -------------- -/dev/mpu -/dev/mpuirq -/dev/accelirq -/dev/compassirq -/dev/pressureirq - -General Remarks MPU3050 ------------------------ -* Valid addresses for the MPU3050 is 0x68. -* Accelerometer must be on the secondary I2C bus for MPU3050, the - magnetometer must be on the primary bus and pressure sensor must - be on the primary bus. - -General Remarks MPU6000 ------------------------ -* Valid addresses for the MPU6000 is 0x68. -* Magnetometer must be on the secondary I2C bus for the MPU6000. -* Accelerometer slave address must be set to 0x68 -* Gyro and Accel orientation matrices should be the same - -Programming the chip using /dev/mpu ----------------------------------- -Programming of MPU3050 or MPU6000 is done by first opening the /dev/mpu file and -then performing a series of IOCTLS on the handle returned. The IOCTL codes can -be found in mpu.h. Typically this is done by the mllite library in user -space. - -Adding to a Kernel -================== - -The mpu driver is designed to be inserted in the drivers/misc part of the -kernel. Extracting the tarball from the root kernel dir will place the -contents of the tarball here: - - /drivers/misc/mpu3050 - /include/linux/mpu.h - /include/linux/mpu3050.h - /include/linux/mpu6000.h - -After this is done the drivers/misc/Kconfig must be edited to add the line: - - source "drivers/misc/mpu3050/Kconfig" - -Similarly drivers/misc/Makefile must be edited to add the line: - - obj-y += mpu3050/ - -Configuration can then be done as normal. - -NOTE: This driver depends on a kernel patch to drivers/char/char.c. This patch -started to be included in most 2.6.35 based kernels. -drivers: misc: pass miscdevice pointer via file private data -https://patchwork.kernel.org/patch/96412/ - ---- - drivers/char/misc.c | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - - -diff --git a/drivers/char/misc.c b/drivers/char/misc.c -index 92ab03d..cd650ca 100644 ---- a/drivers/char/misc.c -+++ b/drivers/char/misc.c -@@ -144,6 +144,7 @@ static int misc_open(struct inode * inode, struct file * file) - old_fops = file->f_op; - file->f_op = new_fops; - if (file->f_op->open) { -+ file->private_data = c; - err=file->f_op->open(inode,file); - if (err) { - fops_put(file->f_op); ---- - -Board and Platform Data ------------------------ - -In order for the driver to work, board and platform data specific to the device -needs to be added to the board file. A mpu3050_platform_data structure must -be created and populated and set in the i2c_board_info_structure. For details -of each structure member see mpu.h. All values below are simply an example and -should be modified for your platform. - -#include - -#if defined(CONFIG_SENSORS_MPU3050) || defined(CONFIG_SENSORS_MPU3050_MODULE) - -#define SENSOR_MPU_NAME "mpu3050" - -static struct mpu3050_platform_data mpu_data = { - .int_config = 0x10, - .orientation = { -1, 0, 0, - 0, 1, 0, - 0, 0, -1 }, - /* accel */ - .accel = { -#ifdef CONFIG_SENSORS_MPU3050_MODULE - .get_slave_descr = NULL, -#else - .get_slave_descr = get_accel_slave_descr, -#endif - .adapt_num = 2, - .bus = EXT_SLAVE_BUS_SECONDARY, - .address = 0x0F, - .orientation = { -1, 0, 0, - 0, 1, 0, - 0, 0, -1 }, - }, - /* compass */ - .compass = { -#ifdef CONFIG_SENSORS_MPU3050_MODULE - .get_slave_descr = NULL, -#else - .get_slave_descr = get_compass_slave_descr, -#endif - .adapt_num = 2, - .bus = EXT_SLAVE_BUS_PRIMARY, - .address = 0x0E, - .orientation = { 1, 0, 0, - 0, 1, 0, - 0, 0, 1 }, - }, - /* pressure */ - .pressure = { -#ifdef CONFIG_SENSORS_MPU3050_MODULE - .get_slave_descr = NULL, -#else - .get_slave_descr = get_pressure_slave_descr, -#endif - .adapt_num = 2, - .bus = EXT_SLAVE_BUS_PRIMARY, - .address = 0x77, - .orientation = { 1, 0, 0, - 0, 1, 0, - 0, 0, 1 }, - }, -}; -#endif - -#if defined(CONFIG_SENSORS_MPU6000) || defined(CONFIG_SENSORS_MPU6000_MODULE) - -#define SENSOR_MPU_NAME "mpu6000" - -static struct mpu3050_platform_data mpu_data = { - .int_config = 0x10, - .orientation = { -1, 0, 0, - 0, 1, 0, - 0, 0, -1 }, - /* accel */ - .accel = { -#ifdef CONFIG_SENSORS_MPU6000_MODULE - .get_slave_descr = NULL, -#else - .get_slave_descr = get_accel_slave_descr, -#endif - .adapt_num = 2, - .bus = EXT_SLAVE_BUS_PRIMARY, - .address = 0x68, - .orientation = { -1, 0, 0, - 0, 1, 0, - 0, 0, -1 }, - }, - /* compass */ - .compass = { -#ifdef CONFIG_SENSORS_MPU6000_MODULE - .get_slave_descr = NULL, -#else - .get_slave_descr = get_compass_slave_descr, -#endif - .adapt_num = 2, - .bus = EXT_SLAVE_BUS_SECONDARY, - .address = 0x0E, - .orientation = { 1, 0, 0, - 0, 1, 0, - 0, 0, 1 }, - }, - /* pressure */ - .pressure = { -#ifdef CONFIG_SENSORS_MPU6000_MODULE - .get_slave_descr = NULL, -#else - .get_slave_descr = get_pressure_slave_descr, -#endif - .adapt_num = 2, - .bus = EXT_SLAVE_BUS_PRIMARY, - .address = 0x77, - .orientation = { 1, 0, 0, - 0, 1, 0, - 0, 0, 1 }, - }, - -}; -#endif - -static struct i2c_board_info __initdata beagle_i2c_2_boardinfo[] = { - { - I2C_BOARD_INFO(SENSOR_MPU_NAME, 0x68), - .irq = (IH_GPIO_BASE + MPU_GPIO_IRQ), - .platform_data = &mpu_data, - }, -}; - -Typically the IRQ is a GPIO input pin and needs to be configured properly. If -in the above example GPIO 168 corresponds to IRQ 299, the following should be -done as well: - -#define MPU_GPIO_IRQ 168 - - gpio_request(MPU_GPIO_IRQ,"MPUIRQ"); - gpio_direction_input(MPU_GPIO_IRQ) - - -Android File Permissions -======================== - -To set up the file permissions on an android system, the /dev/mpu and -/dev/mpuirq files needs to be added to the system/core/init/devices.c file -inside the perms_ structure. - -static struct perms_ devperms[] = { - { "/dev/mpu" ,0640, AID_SYSTEM, AID_SYSTEM, 1 }, -}; - -Sufficient file permissions need to be give to read and write it by the system. - diff --git a/drivers/misc/mpu3050/accel/adxl346.c b/drivers/misc/mpu3050/accel/adxl346.c deleted file mode 100755 index 14cb38a..0000000 --- a/drivers/misc/mpu3050/accel/adxl346.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file adxl346.c - * @brief Accelerometer setup and handling methods for AD adxl346. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -#define ACCEL_ADI346_SLEEP_REG (0x2D) -#define ACCEL_ADI346_SLEEP_MASK (0x04) - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int adxl346_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg; - result = - MLSLSerialRead(mlsl_handle, pdata->address, - ACCEL_ADI346_SLEEP_REG, 1, ®); - ERROR_CHECK(result); - reg |= ACCEL_ADI346_SLEEP_MASK; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_ADI346_SLEEP_REG, reg); - ERROR_CHECK(result); - return result; -} - -/* full scale setting - register & mask */ -#define ACCEL_ADI346_CTRL_REG (0x31) -#define ACCEL_ADI346_CTRL_MASK (0x03) - -int adxl346_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg; - - result = - MLSLSerialRead(mlsl_handle, pdata->address, - ACCEL_ADI346_SLEEP_REG, 1, ®); - ERROR_CHECK(result); - reg &= ~ACCEL_ADI346_SLEEP_MASK; - /*wake up if sleeping */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_ADI346_SLEEP_REG, reg); - ERROR_CHECK(result); - /*MLOSSleep(10) */ - - /* Full Scale */ - reg = 0x04; - reg &= ~ACCEL_ADI346_CTRL_MASK; - if (slave->range.mantissa == 4) - reg |= 0x1; - else if (slave->range.mantissa == 8) - reg |= 0x2; - else if (slave->range.mantissa == 16) - reg |= 0x3; - else { - slave->range.mantissa = 2; - reg |= 0x0; - } - slave->range.fraction = 0; - - /* DATA_FORMAT: full resolution of +/-2g; data is left justified */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x31, reg); - ERROR_CHECK(result); - /* BW_RATE: normal power operation with output data rate of 200Hz */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x2C, 0x0B); - ERROR_CHECK(result); - /* POWER_CTL: power on in measurement mode */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x2D, 0x28); - ERROR_CHECK(result); - /*--- after wake up, it takes at least [1/(data rate) + 1.1]ms ==> - 6.1ms to get valid sensor data ---*/ - MLOSSleep(10); - - return result; -} - -int adxl346_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -struct ext_slave_descr adxl346_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ adxl346_suspend, - /*.resume = */ adxl346_resume, - /*.read = */ adxl346_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "adx1346", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_ADI346, - /*.reg = */ 0x32, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {2, 0}, -}; - -struct ext_slave_descr *adxl346_get_slave_descr(void) -{ - return &adxl346_descr; -} -EXPORT_SYMBOL(adxl346_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/accel/bma150.c b/drivers/misc/mpu3050/accel/bma150.c deleted file mode 100755 index 30fed15..0000000 --- a/drivers/misc/mpu3050/accel/bma150.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file bma150.c - * @brief Accelerometer setup and handling methods. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlos.h" -#include "mlsl.h" - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/********************************************* - Accelerometer Initialization Functions -**********************************************/ - -static int bma150_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x0a, 0x01); - MLOSSleep(3); /* 3 ms powerup time maximum */ - ERROR_CHECK(result); - return result; -} - -/* full scale setting - register and mask */ -#define ACCEL_BOSCH_CTRL_REG (0x14) -#define ACCEL_BOSCH_CTRL_MASK (0x18) - -static int bma150_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg = 0; - - /* Soft reset */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x0a, 0x02); - ERROR_CHECK(result); - MLOSSleep(3); - - result = - MLSLSerialRead(mlsl_handle, pdata->address, 0x14, 1, ®); - ERROR_CHECK(result); - - /* Bandwidth */ - reg &= 0xc0; - reg |= 3; /* 3=190 Hz */ - - /* Full Scale */ - reg &= ~ACCEL_BOSCH_CTRL_MASK; - if (slave->range.mantissa == 4) - reg |= 0x08; - else if (slave->range.mantissa == 8) - reg |= 0x10; - else { - slave->range.mantissa = 2; - reg |= 0x00; - } - slave->range.fraction = 0; - - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x14, reg); - ERROR_CHECK(result); - - return result; -} - -static int bma150_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -static struct ext_slave_descr bma150_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ bma150_suspend, - /*.resume = */ bma150_resume, - /*.read = */ bma150_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "bma150", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_BMA150, - /*.reg = */ 0x02, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {2, 0}, -}; - -struct ext_slave_descr *bma150_get_slave_descr(void) -{ - return &bma150_descr; -} -EXPORT_SYMBOL(bma150_get_slave_descr); - -#ifdef __KERNEL__ -MODULE_AUTHOR("Invensense"); -MODULE_DESCRIPTION("User space IRQ handler for MPU3xxx devices"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("bma"); -#endif - -/** - * @} - */ diff --git a/drivers/misc/mpu3050/accel/bma222.c b/drivers/misc/mpu3050/accel/bma222.c deleted file mode 100755 index 534a1e5..0000000 --- a/drivers/misc/mpu3050/accel/bma222.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/* - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file bma222.c - * @brief Accelerometer setup and handling methods. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlos.h" -#include "mlsl.h" - -#define ACCEL_BMA222_RANGE_REG (0x0F) -#define ACCEL_BMA222_BW_REG (0x10) -#define ACCEL_BMA222_SUSPEND_REG (0x11) -#define ACCEL_BMA222_SFT_RST_REG (0x14) - -/********************************************* - Accelerometer Initialization Functions -**********************************************/ - -static int bma222_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_BMA222_SUSPEND_REG, 0x80); - ERROR_CHECK(result); - - return result; -} - -static int bma222_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg = 0; - - /* Soft reset */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_BMA222_SFT_RST_REG, 0xB6); - ERROR_CHECK(result); - MLOSSleep(10); - - /*Bandwidth */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_BMA222_BW_REG, 0x0C); - ERROR_CHECK(result); - - /* Full Scale */ - if (slave->range.mantissa == 4) - reg |= 0x05; - else if (slave->range.mantissa == 8) - reg |= 0x08; - else if (slave->range.mantissa == 16) - reg |= 0x0C; - else { - slave->range.mantissa = 2; - reg |= 0x03; - } - slave->range.fraction = 0; - - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_BMA222_RANGE_REG, reg); - ERROR_CHECK(result); - - return result; -} - -static int bma222_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -static struct ext_slave_descr bma222_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ bma222_suspend, - /*.resume = */ bma222_resume, - /*.read = */ bma222_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "bma222", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_BMA222, - /*.reg = */ 0x02, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {2, 0}, -}; - -struct ext_slave_descr *bma222_get_slave_descr(void) -{ - return &bma222_descr; -} -EXPORT_SYMBOL(bma222_get_slave_descr); - -/* - * @} - */ diff --git a/drivers/misc/mpu3050/accel/cma3000.c b/drivers/misc/mpu3050/accel/cma3000.c deleted file mode 100755 index 0592595..0000000 --- a/drivers/misc/mpu3050/accel/cma3000.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file cma3000.c - * @brief Accelerometer setup and handling methods for VTI CMA3000 - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" -#include "accel.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int cma3000_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - /* RAM reset */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x1d, 0xcd); - return result; -} - -int cma3000_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - - - return ML_SUCCESS; -} - -int cma3000_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -struct ext_slave_descr cma3000_descr = { - /*.suspend = */ cma3000_suspend, - /*.resume = */ cma3000_resume, - /*.read = */ cma3000_read, - /*.name = */ "cma3000", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ID_INVALID, - /* fixme - id to added when support becomes available */ - /*.reg = */ 0x06, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ 65536, -}; - -struct ext_slave_descr *cma3000_get_slave_descr(void) -{ - return &cma3000_descr; -} -EXPORT_SYMBOL(cma3000_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/accel/kxsd9.c b/drivers/misc/mpu3050/accel/kxsd9.c deleted file mode 100755 index 77bc52c..0000000 --- a/drivers/misc/mpu3050/accel/kxsd9.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file kxsd9.c - * @brief Accelerometer setup and handling methods. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -static int kxsd9_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - /* CTRL_REGB: low-power standby mode */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x0d, 0x0); - ERROR_CHECK(result); - return result; -} - -/* full scale setting - register and mask */ -#define ACCEL_KIONIX_CTRL_REG (0x0C) -#define ACCEL_KIONIX_CTRL_MASK (0x3) - -static int kxsd9_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg; - - /* Full Scale */ - reg = 0x0; - reg &= ~ACCEL_KIONIX_CTRL_MASK; - reg |= 0x00; - if (slave->range.mantissa == 4) { /* 4g scale = 4.9951 */ - reg |= 0x2; - slave->range.fraction = 9951; - } else if (slave->range.mantissa == 7) { /* 6g scale = 7.5018 */ - reg |= 0x1; - slave->range.fraction = 5018; - } else if (slave->range.mantissa == 9) { /* 8g scale = 9.9902 */ - reg |= 0x0; - slave->range.fraction = 9902; - } else { - slave->range.mantissa = 2; /* 2g scale = 2.5006 */ - slave->range.fraction = 5006; - reg |= 0x3; - } - reg |= 0xC0; /* 100Hz LPF */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_KIONIX_CTRL_REG, reg); - ERROR_CHECK(result); - /* normal operation */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x0d, 0x40); - ERROR_CHECK(result); - - return ML_SUCCESS; -} - -static int kxsd9_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -static struct ext_slave_descr kxsd9_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ kxsd9_suspend, - /*.resume = */ kxsd9_resume, - /*.read = */ kxsd9_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "kxsd9", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_KXSD9, - /*.reg = */ 0x00, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {2, 5006}, -}; - -struct ext_slave_descr *kxsd9_get_slave_descr(void) -{ - return &kxsd9_descr; -} -EXPORT_SYMBOL(kxsd9_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/accel/kxtf9.c b/drivers/misc/mpu3050/accel/kxtf9.c deleted file mode 100644 index 8069f3c..0000000 --- a/drivers/misc/mpu3050/accel/kxtf9.c +++ /dev/null @@ -1,641 +0,0 @@ -/* - * $License: - * Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - - * 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. - - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file kxtf9.c - * @brief Accelerometer setup and handling methods. -*/ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#undef MPL_LOG_NDEBUG -#define MPL_LOG_NDEBUG 1 - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -#define KXTF9_XOUT_HPF_L (0x00) /* 0000 0000 */ -#define KXTF9_XOUT_HPF_H (0x01) /* 0000 0001 */ -#define KXTF9_YOUT_HPF_L (0x02) /* 0000 0010 */ -#define KXTF9_YOUT_HPF_H (0x03) /* 0000 0011 */ -#define KXTF9_ZOUT_HPF_L (0x04) /* 0001 0100 */ -#define KXTF9_ZOUT_HPF_H (0x05) /* 0001 0101 */ -#define KXTF9_XOUT_L (0x06) /* 0000 0110 */ -#define KXTF9_XOUT_H (0x07) /* 0000 0111 */ -#define KXTF9_YOUT_L (0x08) /* 0000 1000 */ -#define KXTF9_YOUT_H (0x09) /* 0000 1001 */ -#define KXTF9_ZOUT_L (0x0A) /* 0001 1010 */ -#define KXTF9_ZOUT_H (0x0B) /* 0001 1011 */ -#define KXTF9_ST_RESP (0x0C) /* 0000 1100 */ -#define KXTF9_WHO_AM_I (0x0F) /* 0000 1111 */ -#define KXTF9_TILT_POS_CUR (0x10) /* 0001 0000 */ -#define KXTF9_TILT_POS_PRE (0x11) /* 0001 0001 */ -#define KXTF9_INT_SRC_REG1 (0x15) /* 0001 0101 */ -#define KXTF9_INT_SRC_REG2 (0x16) /* 0001 0110 */ -#define KXTF9_STATUS_REG (0x18) /* 0001 1000 */ -#define KXTF9_INT_REL (0x1A) /* 0001 1010 */ -#define KXTF9_CTRL_REG1 (0x1B) /* 0001 1011 */ -#define KXTF9_CTRL_REG2 (0x1C) /* 0001 1100 */ -#define KXTF9_CTRL_REG3 (0x1D) /* 0001 1101 */ -#define KXTF9_INT_CTRL_REG1 (0x1E) /* 0001 1110 */ -#define KXTF9_INT_CTRL_REG2 (0x1F) /* 0001 1111 */ -#define KXTF9_INT_CTRL_REG3 (0x20) /* 0010 0000 */ -#define KXTF9_DATA_CTRL_REG (0x21) /* 0010 0001 */ -#define KXTF9_TILT_TIMER (0x28) /* 0010 1000 */ -#define KXTF9_WUF_TIMER (0x29) /* 0010 1001 */ -#define KXTF9_TDT_TIMER (0x2B) /* 0010 1011 */ -#define KXTF9_TDT_H_THRESH (0x2C) /* 0010 1100 */ -#define KXTF9_TDT_L_THRESH (0x2D) /* 0010 1101 */ -#define KXTF9_TDT_TAP_TIMER (0x2E) /* 0010 1110 */ -#define KXTF9_TDT_TOTAL_TIMER (0x2F) /* 0010 1111 */ -#define KXTF9_TDT_LATENCY_TIMER (0x30) /* 0011 0000 */ -#define KXTF9_TDT_WINDOW_TIMER (0x31) /* 0011 0001 */ -#define KXTF9_WUF_THRESH (0x5A) /* 0101 1010 */ -#define KXTF9_TILT_ANGLE (0x5C) /* 0101 1100 */ -#define KXTF9_HYST_SET (0x5F) /* 0101 1111 */ - -#define KXTF9_MAX_DUR (0xFF) -#define KXTF9_MAX_THS (0xFF) -#define KXTF9_THS_COUNTS_P_G (32) - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -struct kxtf9_config { - unsigned int odr; /* Output data rate mHz */ - unsigned int fsr; /* full scale range mg */ - unsigned int ths; /* Motion no-motion thseshold mg */ - unsigned int dur; /* Motion no-motion duration ms */ - unsigned int irq_type; - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char reg_odr; - unsigned char reg_int_cfg1; - unsigned char reg_int_cfg2; - unsigned char ctrl_reg1; -}; - -struct kxtf9_private_data { - struct kxtf9_config suspend; - struct kxtf9_config resume; -}; - -extern struct acc_data cal_data; -/* - * Accelerometer Initialization Functions - */ - -static int kxtf9_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long ths) -{ - int result = ML_SUCCESS; - if ((ths * KXTF9_THS_COUNTS_P_G / 1000) > KXTF9_MAX_THS) - ths = (KXTF9_MAX_THS * 1000) / KXTF9_THS_COUNTS_P_G; - - if (ths < 0) - ths = 0; - - config->ths = ths; - config->reg_ths = (unsigned char) - ((long)(ths * KXTF9_THS_COUNTS_P_G) / 1000); - MPL_LOGV("THS: %d, 0x%02x\n", config->ths, (int)config->reg_ths); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_WUF_THRESH, - config->reg_ths); - return result; -} - -static int kxtf9_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long dur) -{ - int result = ML_SUCCESS; - long reg_dur = (dur * config->odr) / 1000000; - config->dur = dur; - - if (reg_dur > KXTF9_MAX_DUR) - reg_dur = KXTF9_MAX_DUR; - - config->reg_dur = (unsigned char)reg_dur; - MPL_LOGV("DUR: %d, 0x%02x\n", config->dur, (int)config->reg_dur); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_WUF_TIMER, - (unsigned char)reg_dur); - return result; -} - -/** - * Sets the IRQ to fire when one of the IRQ events occur. Threshold and - * duration will not be used uless the type is MOT or NMOT. - * - * @param config configuration to apply to, suspend or resume - * @param irq_type The type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - */ -static int kxtf9_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long irq_type) -{ - int result = ML_SUCCESS; - struct kxtf9_private_data *private_data = pdata->private_data; - - config->irq_type = (unsigned char)irq_type; - config->ctrl_reg1 &= ~0x22; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - config->ctrl_reg1 |= 0x20; - config->reg_int_cfg1 = 0x38; - config->reg_int_cfg2 = 0x00; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - config->ctrl_reg1 |= 0x02; - if ((unsigned long)config == - (unsigned long)&private_data->suspend) - config->reg_int_cfg1 = 0x34; - else - config->reg_int_cfg1 = 0x24; - config->reg_int_cfg2 = 0xE0; - } else { - config->reg_int_cfg1 = 0x00; - config->reg_int_cfg2 = 0x00; - } - - if (apply) { - /* Must clear bit 7 before writing new configuration */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_INT_CTRL_REG1, - config->reg_int_cfg1); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_INT_CTRL_REG2, - config->reg_int_cfg2); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - config->ctrl_reg1); - } - MPL_LOGV("CTRL_REG1: %lx, INT_CFG1: %lx, INT_CFG2: %lx\n", - (unsigned long)config->ctrl_reg1, - (unsigned long)config->reg_int_cfg1, - (unsigned long)config->reg_int_cfg2); - - return result; -} - -/** - * Set the Output data rate for the particular configuration - * - * @param config Config to modify with new ODR - * @param odr Output data rate in units of 1/1000Hz - */ -static int kxtf9_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long odr) -{ - unsigned char bits; - int result = ML_SUCCESS; - - /* Data sheet says there is 12.5 hz, but that seems to produce a single - * correct data value, thus we remove it from the table */ - if (odr > 400000) { - config->odr = 800000; - bits = 0x06; - } else if (odr > 200000) { - config->odr = 400000; - bits = 0x05; - } else if (odr > 100000) { - config->odr = 200000; - bits = 0x04; - } else if (odr > 50000) { - config->odr = 100000; - bits = 0x03; - } else if (odr > 25000) { - config->odr = 50000; - bits = 0x02; - } else if (odr != 0) { - config->odr = 25000; - bits = 0x01; - } else { - config->odr = 0; - bits = 0; - } - - if (odr != 0) - config->ctrl_reg1 |= 0x80; - - config->reg_odr = bits; - kxtf9_set_dur(mlsl_handle, pdata, config, apply, config->dur); - MPL_LOGV("ODR: %d, 0x%02x\n", config->odr, (int)config->ctrl_reg1); - if (apply) { - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_DATA_CTRL_REG, - config->reg_odr); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - config->ctrl_reg1); - } - return result; -} - -/** - * Set the full scale range of the accels - * - * @param config pointer to configuration - * @param fsr requested full scale range - */ -static int kxtf9_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct kxtf9_config *config, int apply, long fsr) -{ - int result = ML_SUCCESS; - - config->ctrl_reg1 = (config->ctrl_reg1 & 0xE7); - if (fsr <= 2000) { - config->fsr = 2000; - config->ctrl_reg1 |= 0x00; - } else if (fsr <= 4000) { - config->fsr = 4000; - config->ctrl_reg1 |= 0x08; - } else { - config->fsr = 8000; - config->ctrl_reg1 |= 0x10; - } - - MPL_LOGV("FSR: %d\n", config->fsr); - if (apply) { - /* Must clear bit 7 before writing new configuration */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - config->ctrl_reg1); - } - return result; -} - -static int kxtf9_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x0); - ERROR_CHECK(result); - return result; -} - -/* full scale setting - register and mask */ -#define ACCEL_KIONIX_CTRL_REG (0x1b) -#define ACCEL_KIONIX_CTRL_MASK (0x18) - -static int kxtf9_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char data; - struct kxtf9_private_data *private_data = pdata->private_data; - - /* Wake up */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - ERROR_CHECK(result); - /* INT_CTRL_REG1: */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_INT_CTRL_REG1, - private_data->resume.reg_int_cfg1); - ERROR_CHECK(result); - /* WUF_THRESH: */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_WUF_THRESH, - private_data->resume.reg_ths); - ERROR_CHECK(result); - /* DATA_CTRL_REG */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_DATA_CTRL_REG, - private_data->resume.reg_odr); - ERROR_CHECK(result); - /* WUF_TIMER */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_WUF_TIMER, - private_data->resume.reg_dur); - ERROR_CHECK(result); - - /* Normal operation */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, - private_data->resume.ctrl_reg1); - ERROR_CHECK(result); - MLOSSleep(20); - - result = MLSLSerialRead(mlsl_handle, pdata->address, - KXTF9_INT_REL, 1, &data); - ERROR_CHECK(result); - - return ML_SUCCESS; -} - -static int kxtf9_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - - struct kxtf9_private_data *private_data; - unsigned char i, buf; - unsigned char tf9_addr[] = { 0x0F, 0x0E, 0x0D, 0x0C }; - unsigned char tmp_addr = 0; - - int result = ML_SUCCESS; - - private_data = (struct kxtf9_private_data *) - MLOSMalloc(sizeof(struct kxtf9_private_data)); - - if (!private_data) - return ML_ERROR_MEMORY_EXAUSTED; - - for (i = 0; i < 4; i++) { - pr_info("%s: #%d: try to access with 0x%02x slave address", - __func__, i, tf9_addr[i]); - - /* Check Device ID */ - result = MLSLSerialRead(mlsl_handle, - tf9_addr[i], KXTF9_WHO_AM_I, 1, &buf); - - pr_info("%s : WHO_AM_I = 0x%02x", __func__, buf); - if (result == ML_SUCCESS) { - tmp_addr = tf9_addr[i]; - pr_info("%s : slave addr = 0x%02x", __func__, tmp_addr); - break; - } - } - - /* RAM reset */ - result = MLSLSerialWriteSingle(mlsl_handle, tmp_addr, - KXTF9_CTRL_REG3, 0xcd); - ERROR_CHECK(result); - MLOSSleep(100); - - /* Set ODR(Output Data Rate) */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_DATA_CTRL_REG, 0x36); - ERROR_CHECK(result); - - /* Set Main feature as 2g(Bit4/3=00) - 12-bit(Bit-6=1) and turn on standby mode(Bit-7=0) - */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - KXTF9_CTRL_REG1, 0x40); - ERROR_CHECK(result); - - pdata->private_data = private_data; - - private_data->resume.ctrl_reg1 = 0xC0; - private_data->suspend.ctrl_reg1 = 0x40; - - result = kxtf9_set_dur(mlsl_handle, pdata, &private_data->suspend, - FALSE, 1000); - ERROR_CHECK(result); - result = kxtf9_set_dur(mlsl_handle, pdata, &private_data->resume, - FALSE, 2540); - ERROR_CHECK(result); - - result = kxtf9_set_odr(mlsl_handle, pdata, &private_data->suspend, - FALSE, 50000); - ERROR_CHECK(result); - result = kxtf9_set_odr(mlsl_handle, pdata, &private_data->resume, - FALSE, 200000); - - result = kxtf9_set_fsr(mlsl_handle, pdata, &private_data->suspend, - FALSE, 2000); - ERROR_CHECK(result); - result = kxtf9_set_fsr(mlsl_handle, pdata, &private_data->resume, - FALSE, 2000); - ERROR_CHECK(result); - - result = kxtf9_set_ths(mlsl_handle, pdata, &private_data->suspend, - FALSE, 80); - ERROR_CHECK(result); - result = kxtf9_set_ths(mlsl_handle, pdata, &private_data->resume, - FALSE, 40); - ERROR_CHECK(result); - - result = kxtf9_set_irq(mlsl_handle, pdata, &private_data->suspend, - FALSE, MPU_SLAVE_IRQ_TYPE_NONE); - ERROR_CHECK(result); - result = kxtf9_set_irq(mlsl_handle, pdata, &private_data->resume, - FALSE, MPU_SLAVE_IRQ_TYPE_NONE); - ERROR_CHECK(result); - return result; -} - -static int kxtf9_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - if (pdata->private_data) - return MLOSFree(pdata->private_data); - else - return ML_SUCCESS; -} - -static int kxtf9_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct kxtf9_private_data *private_data = pdata->private_data; - if (!data->data) - return ML_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return kxtf9_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return kxtf9_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return kxtf9_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return kxtf9_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return kxtf9_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return kxtf9_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return kxtf9_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return kxtf9_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return kxtf9_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return kxtf9_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, *((long *)data->data)); - default: - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return ML_SUCCESS; -} - -static int kxtf9_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct kxtf9_private_data *private_data = pdata->private_data; - if (!data->data) - return ML_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long)private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long)private_data->resume.irq_type; - break; - default: - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return ML_SUCCESS; -} - -static int kxtf9_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - int x, y, z; - - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - - if (slave->len == 6) { - x = (s16) ((data[1] << 4) | (data[0] >> 4)) + cal_data.x; - y = (s16) ((data[3] << 4) | (data[2] >> 4)) + cal_data.y; - z = (s16) ((data[5] << 4) | (data[4] >> 4)) + cal_data.z; - - data[0] = (x & 0xf) << 4; - data[1] = (x & 0xff0) >> 4; - data[2] = (y & 0xf) << 4; - data[3] = (y & 0xff0) >> 4; - data[4] = (z & 0xf) << 4; - data[5] = (z & 0xff0) >> 4; - } - - ERROR_CHECK(result); - return result; -} - -static struct ext_slave_descr kxtf9_descr = { - /*.init = */ kxtf9_init, - /*.exit = */ kxtf9_exit, - /*.suspend = */ kxtf9_suspend, - /*.resume = */ kxtf9_resume, - /*.read = */ kxtf9_read, - /*.config = */ kxtf9_config, - /*.get_config = */ kxtf9_get_config, - /*.name = */ "kxtf9", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_KXTF9, - /*.reg = */ 0x06, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {2, 0}, -}; - -struct ext_slave_descr *kxtf9_get_slave_descr(void) -{ - return &kxtf9_descr; -} -EXPORT_SYMBOL(kxtf9_get_slave_descr); diff --git a/drivers/misc/mpu3050/accel/kxud9.c b/drivers/misc/mpu3050/accel/kxud9.c deleted file mode 100755 index 651219e..0000000 --- a/drivers/misc/mpu3050/accel/kxud9.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file kxud9.c - * @brief Accelerometer setup and handling methods. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions - *****************************************/ - -static int kxud9_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - /* CTRL_REGB: low-power standby mode */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x0d, 0x0); - ERROR_CHECK(result); - return result; -} - -/* full scale setting - register and mask */ -#define ACCEL_KIONIX_CTRL_REG (0x0C) -#define ACCEL_KIONIX_CTRL_MASK (0x3) - -static int kxud9_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg; - - /* Full Scale */ - reg = 0x0; - reg &= ~ACCEL_KIONIX_CTRL_MASK; - reg |= 0x00; - if (slave->range.mantissa == 4) { /* 4g scale = 4.9951 */ - reg |= 0x2; - slave->range.fraction = 9951; - } else if (slave->range.mantissa == 7) { /* 6g scale = 7.5018 */ - reg |= 0x1; - slave->range.fraction = 5018; - } else if (slave->range.mantissa == 9) { /* 8g scale = 9.9902 */ - reg |= 0x0; - slave->range.fraction = 9902; - } else { - slave->range.mantissa = 2; /* 2g scale = 2.5006 */ - slave->range.fraction = 5006; - reg |= 0x3; - } - reg |= 0xC0; /* 100Hz LPF */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_KIONIX_CTRL_REG, reg); - ERROR_CHECK(result); - /* normal operation */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x0d, 0x40); - ERROR_CHECK(result); - - return ML_SUCCESS; -} - -static int kxud9_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -static struct ext_slave_descr kxud9_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ kxud9_suspend, - /*.resume = */ kxud9_resume, - /*.read = */ kxud9_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "kxud9", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ /* ACCEL_ID_KXUD9, */ ACCEL_ID_KXSD9, - /*.reg = */ 0x00, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {2, 5006}, -}; - -struct ext_slave_descr *kxud9_get_slave_descr(void) -{ - return &kxud9_descr; -} -EXPORT_SYMBOL(kxud9_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/accel/lis331.c b/drivers/misc/mpu3050/accel/lis331.c deleted file mode 100755 index 53c599b..0000000 --- a/drivers/misc/mpu3050/accel/lis331.c +++ /dev/null @@ -1,617 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file lis331.c - * @brief Accelerometer setup and handling methods for ST LIS331 - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#undef MPL_LOG_NDEBUG -#define MPL_LOG_NDEBUG 1 - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* full scale setting - register & mask */ -#define LIS331_CTRL_REG1 (0x20) -#define LIS331_CTRL_REG2 (0x21) -#define LIS331_CTRL_REG3 (0x22) -#define LIS331_CTRL_REG4 (0x23) -#define LIS331_CTRL_REG5 (0x24) -#define LIS331_HP_FILTER_RESET (0x25) -#define LIS331_REFERENCE (0x26) -#define LIS331_STATUS_REG (0x27) -#define LIS331_OUT_X_L (0x28) -#define LIS331_OUT_X_H (0x29) -#define LIS331_OUT_Y_L (0x2a) -#define LIS331_OUT_Y_H (0x2b) -#define LIS331_OUT_Z_L (0x2b) -#define LIS331_OUT_Z_H (0x2d) - -#define LIS331_INT1_CFG (0x30) -#define LIS331_INT1_SRC (0x31) -#define LIS331_INT1_THS (0x32) -#define LIS331_INT1_DURATION (0x33) - -#define LIS331_INT2_CFG (0x34) -#define LIS331_INT2_SRC (0x35) -#define LIS331_INT2_THS (0x36) -#define LIS331_INT2_DURATION (0x37) - -#define LIS331_CTRL_MASK (0x30) -#define LIS331_SLEEP_MASK (0x20) - -#define LIS331_MAX_DUR (0x7F) - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -struct lis331dlh_config { - unsigned int odr; - unsigned int fsr; /* full scale range mg */ - unsigned int ths; /* Motion no-motion thseshold mg */ - unsigned int dur; /* Motion no-motion duration ms */ - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char ctrl_reg1; - unsigned char irq_type; - unsigned char mot_int1_cfg; -}; - -struct lis331dlh_private_data { - struct lis331dlh_config suspend; - struct lis331dlh_config resume; -}; - - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -static int lis331dlh_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, - long ths) -{ - int result = ML_SUCCESS; - if ((unsigned int) ths >= config->fsr) - ths = (long) config->fsr - 1; - - if (ths < 0) - ths = 0; - - config->ths = ths; - config->reg_ths = (unsigned char)(long)((ths * 128L) / (config->fsr)); - MPL_LOGV("THS: %d, 0x%02x\n", config->ths, (int)config->reg_ths); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_THS, - config->reg_ths); - return result; -} - -static int lis331dlh_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, - long dur) -{ - int result = ML_SUCCESS; - long reg_dur = (dur * config->odr) / 1000000L; - config->dur = dur; - - if (reg_dur > LIS331_MAX_DUR) - reg_dur = LIS331_MAX_DUR; - - config->reg_dur = (unsigned char) reg_dur; - MPL_LOGV("DUR: %d, 0x%02x\n", config->dur, (int)config->reg_dur); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_DURATION, - (unsigned char)reg_dur); - return result; -} - -/** - * Sets the IRQ to fire when one of the IRQ events occur. Threshold and - * duration will not be used uless the type is MOT or NMOT. - * - * @param config configuration to apply to, suspend or resume - * @param irq_type The type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - */ -static int lis331dlh_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, - long irq_type) -{ - int result = ML_SUCCESS; - unsigned char reg1; - unsigned char reg2; - - config->irq_type = (unsigned char)irq_type; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = config->mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - - if (apply) { - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG3, reg1); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_CFG, reg2); - } - - return result; -} - -/** - * Set the Output data rate for the particular configuration - * - * @param config Config to modify with new ODR - * @param odr Output data rate in units of 1/1000Hz - */ -static int lis331dlh_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, - long odr) -{ - unsigned char bits; - int result = ML_SUCCESS; - - if (odr > 400000) { - config->odr = 1000000; - bits = 0x38; - } else if (odr > 100000) { - config->odr = 400000; - bits = 0x30; - } else if (odr > 50000) { - config->odr = 100000; - bits = 0x28; - } else if (odr > 10000) { - config->odr = 50000; - bits = 0x20; - } else if (odr > 5000) { - config->odr = 10000; - bits = 0xC0; - } else if (odr > 2000) { - config->odr = 5000; - bits = 0xB0; - } else if (odr > 1000) { - config->odr = 2000; - bits = 0x80; - } else if (odr > 500) { - config->odr = 1000; - bits = 0x60; - } else if (odr > 0) { - config->odr = 500; - bits = 0x40; - } else { - config->odr = 0; - bits = 0; - } - - config->ctrl_reg1 = bits | (config->ctrl_reg1 & 0x7); - lis331dlh_set_dur(mlsl_handle, pdata, - config, apply, config->dur); - MPL_LOGV("ODR: %d, 0x%02x\n", config->odr, (int)config->ctrl_reg1); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG1, - config->ctrl_reg1); - return result; -} - -/** - * Set the full scale range of the accels - * - * @param config pointer to configuration - * @param fsr requested full scale range - */ -static int lis331dlh_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis331dlh_config *config, - int apply, - long fsr) -{ - unsigned char reg1 = 0x40; - int result = ML_SUCCESS; - - if (fsr <= 2048) { - config->fsr = 2048; - } else if (fsr <= 4096) { - reg1 |= 0x30; - config->fsr = 4096; - } else { - reg1 |= 0x10; - config->fsr = 8192; - } - - lis331dlh_set_ths(mlsl_handle, pdata, - config, apply, config->ths); - MPL_LOGV("FSR: %d\n", config->fsr); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG4, reg1); - - return result; -} - -static int lis331dlh_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg1; - unsigned char reg2; - struct lis331dlh_private_data *private_data = pdata->private_data; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG1, - private_data->suspend.ctrl_reg1); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG2, 0x0f); - reg1 = 0x40; - if (private_data->suspend.fsr == 8192) - reg1 |= 0x30; - else if (private_data->suspend.fsr == 4096) - reg1 |= 0x10; - /* else bits [4..5] are already zero */ - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG4, reg1); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_THS, - private_data->suspend.reg_ths); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_DURATION, - private_data->suspend.reg_dur); - - if (private_data->suspend.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (private_data->suspend.irq_type == - MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = private_data->suspend.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG3, reg1); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_CFG, reg2); - result = MLSLSerialRead(mlsl_handle, pdata->address, - LIS331_HP_FILTER_RESET, 1, ®1); - return result; -} - -static int lis331dlh_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg1; - unsigned char reg2; - struct lis331dlh_private_data *private_data = pdata->private_data; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG1, - private_data->resume.ctrl_reg1); - ERROR_CHECK(result); - MLOSSleep(6); - - /* Full Scale */ - reg1 = 0x40; - if (private_data->resume.fsr == 8192) - reg1 |= 0x30; - else if (private_data->resume.fsr == 4096) - reg1 |= 0x10; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG4, reg1); - ERROR_CHECK(result); - - /* Configure high pass filter */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG2, 0x0F); - ERROR_CHECK(result); - - if (private_data->resume.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x02; - reg2 = 0x00; - } else if (private_data->resume.irq_type == - MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x00; - reg2 = private_data->resume.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_CTRL_REG3, reg1); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_THS, - private_data->resume.reg_ths); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_DURATION, - private_data->resume.reg_dur); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS331_INT1_CFG, reg2); - ERROR_CHECK(result); - result = MLSLSerialRead(mlsl_handle, pdata->address, - LIS331_HP_FILTER_RESET, 1, ®1); - ERROR_CHECK(result); - return result; -} - -static int lis331dlh_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = ML_SUCCESS; - result = MLSLSerialRead(mlsl_handle, pdata->address, - LIS331_STATUS_REG, 1, data); - if (data[0] & 0x0F) { - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; - } else - return ML_ERROR_ACCEL_DATA_NOT_READY; -} - -static int lis331dlh_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - struct lis331dlh_private_data *private_data; - private_data = (struct lis331dlh_private_data *) - MLOSMalloc(sizeof(struct lis331dlh_private_data)); - - if (!private_data) - return ML_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - private_data->resume.ctrl_reg1 = 0x37; - private_data->suspend.ctrl_reg1 = 0x47; - private_data->resume.mot_int1_cfg = 0x95; - private_data->suspend.mot_int1_cfg = 0x2a; - - lis331dlh_set_odr(mlsl_handle, pdata, &private_data->suspend, - FALSE, 0); - lis331dlh_set_odr(mlsl_handle, pdata, &private_data->resume, - FALSE, 200000); - lis331dlh_set_fsr(mlsl_handle, pdata, &private_data->suspend, - FALSE, 2048); - lis331dlh_set_fsr(mlsl_handle, pdata, &private_data->resume, - FALSE, 2048); - lis331dlh_set_ths(mlsl_handle, pdata, &private_data->suspend, - FALSE, 80); - lis331dlh_set_ths(mlsl_handle, pdata, &private_data->resume, - FALSE, 40); - lis331dlh_set_dur(mlsl_handle, pdata, &private_data->suspend, - FALSE, 1000); - lis331dlh_set_dur(mlsl_handle, pdata, &private_data->resume, - FALSE, 2540); - lis331dlh_set_irq(mlsl_handle, pdata, &private_data->suspend, - FALSE, - MPU_SLAVE_IRQ_TYPE_NONE); - lis331dlh_set_irq(mlsl_handle, pdata, &private_data->resume, - FALSE, - MPU_SLAVE_IRQ_TYPE_NONE); - return ML_SUCCESS; -} - -static int lis331dlh_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - if (pdata->private_data) - return MLOSFree(pdata->private_data); - else - return ML_SUCCESS; -} - -static int lis331dlh_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lis331dlh_private_data *private_data = pdata->private_data; - if (!data->data) - return ML_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return lis331dlh_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return lis331dlh_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return lis331dlh_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return lis331dlh_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return lis331dlh_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return lis331dlh_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return lis331dlh_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return lis331dlh_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return lis331dlh_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return lis331dlh_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - default: - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return ML_SUCCESS; -} - -static int lis331dlh_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lis331dlh_private_data *private_data = pdata->private_data; - if (!data->data) - return ML_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.irq_type; - break; - default: - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return ML_SUCCESS; -} - -static struct ext_slave_descr lis331dlh_descr = { - /*.init = */ lis331dlh_init, - /*.exit = */ lis331dlh_exit, - /*.suspend = */ lis331dlh_suspend, - /*.resume = */ lis331dlh_resume, - /*.read = */ lis331dlh_read, - /*.config = */ lis331dlh_config, - /*.get_config = */ lis331dlh_get_config, - /*.name = */ "lis331dlh", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_LIS331, - /*.reg = */ (0x28 | 0x80), /* 0x80 for burst reads */ - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {2, 480}, -}; - -struct ext_slave_descr *lis331dlh_get_slave_descr(void) -{ - return &lis331dlh_descr; -} -EXPORT_SYMBOL(lis331dlh_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/accel/lis3dh.c b/drivers/misc/mpu3050/accel/lis3dh.c deleted file mode 100755 index 594cd42..0000000 --- a/drivers/misc/mpu3050/accel/lis3dh.c +++ /dev/null @@ -1,625 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file lis3dh.c - * @brief Accelerometer setup and handling methods for ST LIS3DH - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#undef MPL_LOG_NDEBUG -#define MPL_LOG_NDEBUG 0 - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* full scale setting - register & mask */ -#define LIS3DH_CTRL_REG1 (0x20) -#define LIS3DH_CTRL_REG2 (0x21) -#define LIS3DH_CTRL_REG3 (0x22) -#define LIS3DH_CTRL_REG4 (0x23) -#define LIS3DH_CTRL_REG5 (0x24) -#define LIS3DH_CTRL_REG6 (0x25) -#define LIS3DH_REFERENCE (0x26) -#define LIS3DH_STATUS_REG (0x27) -#define LIS3DH_OUT_X_L (0x28) -#define LIS3DH_OUT_X_H (0x29) -#define LIS3DH_OUT_Y_L (0x2a) -#define LIS3DH_OUT_Y_H (0x2b) -#define LIS3DH_OUT_Z_L (0x2b) -#define LIS3DH_OUT_Z_H (0x2d) - -#define LIS3DH_INT1_CFG (0x30) -#define LIS3DH_INT1_SRC (0x31) -#define LIS3DH_INT1_THS (0x32) -#define LIS3DH_INT1_DURATION (0x33) - -#define LIS3DH_MAX_DUR (0x7F) - - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -struct lis3dh_config { - unsigned int odr; - unsigned int fsr; /* full scale range mg */ - unsigned int ths; /* Motion no-motion thseshold mg */ - unsigned int dur; /* Motion no-motion duration ms */ - unsigned char reg_ths; - unsigned char reg_dur; - unsigned char ctrl_reg1; - unsigned char irq_type; - unsigned char mot_int1_cfg; -}; - -struct lis3dh_private_data { - struct lis3dh_config suspend; - struct lis3dh_config resume; -}; - - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -static int lis3dh_set_ths(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, - int apply, - long ths) -{ - int result = ML_SUCCESS; - if ((unsigned int) ths > 1000 * config->fsr) - ths = (long) 1000 * config->fsr; - - if (ths < 0) - ths = 0; - - config->ths = ths; - config->reg_ths = (unsigned char)(long)((ths * 128L) / (config->fsr)); - MPL_LOGV("THS: %d, 0x%02x\n", config->ths, (int)config->reg_ths); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_THS, - config->reg_ths); - return result; -} - -static int lis3dh_set_dur(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, - int apply, - long dur) -{ - int result = ML_SUCCESS; - long reg_dur = (dur * config->odr) / 1000000L; - config->dur = dur; - - if (reg_dur > LIS3DH_MAX_DUR) - reg_dur = LIS3DH_MAX_DUR; - - config->reg_dur = (unsigned char) reg_dur; - MPL_LOGV("DUR: %d, 0x%02x\n", config->dur, (int)config->reg_dur); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_DURATION, - (unsigned char)reg_dur); - return result; -} - -/** - * Sets the IRQ to fire when one of the IRQ events occur. Threshold and - * duration will not be used uless the type is MOT or NMOT. - * - * @param config configuration to apply to, suspend or resume - * @param irq_type The type of IRQ. Valid values are - * - MPU_SLAVE_IRQ_TYPE_NONE - * - MPU_SLAVE_IRQ_TYPE_MOTION - * - MPU_SLAVE_IRQ_TYPE_DATA_READY - */ -static int lis3dh_set_irq(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, - int apply, - long irq_type) -{ - int result = ML_SUCCESS; - unsigned char reg1; - unsigned char reg2; - - config->irq_type = (unsigned char)irq_type; - if (irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x10; - reg2 = 0x00; - } else if (irq_type == MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x40; - reg2 = config->mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - - if (apply) { - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG3, reg1); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_CFG, reg2); - } - - return result; -} - -/** - * Set the Output data rate for the particular configuration - * - * @param config Config to modify with new ODR - * @param odr Output data rate in units of 1/1000Hz - */ -static int lis3dh_set_odr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, - int apply, - long odr) -{ - unsigned char bits; - int result = ML_SUCCESS; - - if (odr > 400000) { - config->odr = 1250000; - bits = 0x90; - } else if (odr > 200000) { - config->odr = 400000; - bits = 0x70; - } else if (odr > 100000) { - config->odr = 200000; - bits = 0x60; - } else if (odr > 50000) { - config->odr = 100000; - bits = 0x50; - } else if (odr > 25000) { - config->odr = 50000; - bits = 0x40; - } else if (odr > 10000) { - config->odr = 25000; - bits = 0x30; - } else if (odr > 1000) { - config->odr = 10000; - bits = 0x20; - } else if (odr > 500) { - config->odr = 1000; - bits = 0x10; - } else { - config->odr = 0; - bits = 0; - } - - config->ctrl_reg1 = bits | (config->ctrl_reg1 & 0xf); - lis3dh_set_dur(mlsl_handle, pdata, - config, apply, config->dur); - MPL_LOGV("ODR: %d, 0x%02x\n", config->odr, (int)config->ctrl_reg1); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG1, - config->ctrl_reg1); - return result; -} - -/** - * Set the full scale range of the accels - * - * @param config pointer to configuration - * @param fsr requested full scale range - */ -static int lis3dh_set_fsr(void *mlsl_handle, - struct ext_slave_platform_data *pdata, - struct lis3dh_config *config, - int apply, - long fsr) -{ - int result = ML_SUCCESS; - unsigned char reg1 = 0x48; - - if (fsr <= 2048) { - config->fsr = 2048; - } else if (fsr <= 4096) { - reg1 |= 0x10; - config->fsr = 4096; - } else if (fsr <= 8192) { - reg1 |= 0x20; - config->fsr = 8192; - } else { - reg1 |= 0x30; - config->fsr = 16348; - } - - lis3dh_set_ths(mlsl_handle, pdata, - config, apply, config->ths); - MPL_LOGV("FSR: %d\n", config->fsr); - if (apply) - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG4, reg1); - - return result; -} - -static int lis3dh_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg1; - unsigned char reg2; - struct lis3dh_private_data *private_data = pdata->private_data; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG1, - private_data->suspend.ctrl_reg1); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG2, 0x31); - reg1 = 0x48; - if (private_data->suspend.fsr == 16384) - reg1 |= 0x30; - else if (private_data->suspend.fsr == 8192) - reg1 |= 0x20; - else if (private_data->suspend.fsr == 4096) - reg1 |= 0x10; - else if (private_data->suspend.fsr == 2048) - reg1 |= 0x00; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG4, reg1); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_THS, - private_data->suspend.reg_ths); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_DURATION, - private_data->suspend.reg_dur); - - if (private_data->suspend.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x10; - reg2 = 0x00; - } else if (private_data->suspend.irq_type == - MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x40; - reg2 = private_data->suspend.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG3, reg1); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_CFG, reg2); - result = MLSLSerialRead(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG6, 1, ®1); - - return result; - -} - -static int lis3dh_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - tMLError result; - unsigned char reg1; - unsigned char reg2; - struct lis3dh_private_data *private_data = pdata->private_data; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG1, - private_data->resume.ctrl_reg1); - ERROR_CHECK(result); - MLOSSleep(6); - - /* Full Scale */ - reg1 = 0x48; - if (private_data->suspend.fsr == 16384) - reg1 |= 0x30; - else if (private_data->suspend.fsr == 8192) - reg1 |= 0x20; - else if (private_data->suspend.fsr == 4096) - reg1 |= 0x10; - else if (private_data->suspend.fsr == 2048) - reg1 |= 0x00; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG4, reg1); - ERROR_CHECK(result); - - /* Configure high pass filter */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG2, 0x31); - ERROR_CHECK(result); - - if (private_data->resume.irq_type == MPU_SLAVE_IRQ_TYPE_DATA_READY) { - reg1 = 0x10; - reg2 = 0x00; - } else if (private_data->resume.irq_type == - MPU_SLAVE_IRQ_TYPE_MOTION) { - reg1 = 0x40; - reg2 = private_data->resume.mot_int1_cfg; - } else { - reg1 = 0x00; - reg2 = 0x00; - } - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG3, reg1); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_THS, - private_data->resume.reg_ths); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_DURATION, - private_data->resume.reg_dur); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_INT1_CFG, reg2); - ERROR_CHECK(result); - result = MLSLSerialRead(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG6, 1, ®1); - ERROR_CHECK(result); - return result; -} - -static int lis3dh_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result = ML_SUCCESS; - result = MLSLSerialRead(mlsl_handle, pdata->address, - LIS3DH_STATUS_REG, 1, data); - if (data[0] & 0x0F) { - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; - } else - return ML_ERROR_ACCEL_DATA_NOT_READY; -} - -static int lis3dh_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - tMLError result; - - struct lis3dh_private_data *private_data; - private_data = (struct lis3dh_private_data *) - MLOSMalloc(sizeof(struct lis3dh_private_data)); - - if (!private_data) - return ML_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - private_data->resume.ctrl_reg1 = 0x67; - private_data->suspend.ctrl_reg1 = 0x18; - private_data->resume.mot_int1_cfg = 0x95; - private_data->suspend.mot_int1_cfg = 0x2a; - - lis3dh_set_odr(mlsl_handle, pdata, &private_data->suspend, - FALSE, 0); - lis3dh_set_odr(mlsl_handle, pdata, &private_data->resume, - FALSE, 200000); - lis3dh_set_fsr(mlsl_handle, pdata, &private_data->suspend, - FALSE, 2048); - lis3dh_set_fsr(mlsl_handle, pdata, &private_data->resume, - FALSE, 2048); - lis3dh_set_ths(mlsl_handle, pdata, &private_data->suspend, - FALSE, 80); - lis3dh_set_ths(mlsl_handle, pdata, &private_data->resume, - FALSE, 40); - lis3dh_set_dur(mlsl_handle, pdata, &private_data->suspend, - FALSE, 1000); - lis3dh_set_dur(mlsl_handle, pdata, &private_data->resume, - FALSE, 2540); - lis3dh_set_irq(mlsl_handle, pdata, &private_data->suspend, - FALSE, - MPU_SLAVE_IRQ_TYPE_NONE); - lis3dh_set_irq(mlsl_handle, pdata, &private_data->resume, - FALSE, - MPU_SLAVE_IRQ_TYPE_NONE); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LIS3DH_CTRL_REG1, 0x07); - MLOSSleep(6); - - return ML_SUCCESS; -} - -static int lis3dh_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - if (pdata->private_data) - return MLOSFree(pdata->private_data); - else - return ML_SUCCESS; -} - -static int lis3dh_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lis3dh_private_data *private_data = pdata->private_data; - if (!data->data) - return ML_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - return lis3dh_set_odr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_ODR_RESUME: - return lis3dh_set_odr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - return lis3dh_set_fsr(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_FSR_RESUME: - return lis3dh_set_fsr(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_THS: - return lis3dh_set_ths(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_THS: - return lis3dh_set_ths(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_MOT_DUR: - return lis3dh_set_dur(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_NMOT_DUR: - return lis3dh_set_dur(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - return lis3dh_set_irq(mlsl_handle, pdata, - &private_data->suspend, - data->apply, - *((long *)data->data)); - case MPU_SLAVE_CONFIG_IRQ_RESUME: - return lis3dh_set_irq(mlsl_handle, pdata, - &private_data->resume, - data->apply, - *((long *)data->data)); - default: - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - return ML_SUCCESS; -} - -static int lis3dh_get_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct lis3dh_private_data *private_data = pdata->private_data; - if (!data->data) - return ML_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.odr; - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.odr; - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.fsr; - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.fsr; - break; - case MPU_SLAVE_CONFIG_MOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.ths; - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.ths; - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.dur; - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.dur; - break; - case MPU_SLAVE_CONFIG_IRQ_SUSPEND: - (*(unsigned long *)data->data) = - (unsigned long) private_data->suspend.irq_type; - break; - case MPU_SLAVE_CONFIG_IRQ_RESUME: - (*(unsigned long *)data->data) = - (unsigned long) private_data->resume.irq_type; - break; - default: - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return ML_SUCCESS; -} - -static struct ext_slave_descr lis3dh_descr = { - /*.init = */ lis3dh_init, - /*.exit = */ lis3dh_exit, - /*.suspend = */ lis3dh_suspend, - /*.resume = */ lis3dh_resume, - /*.read = */ lis3dh_read, - /*.config = */ lis3dh_config, - /*.get_config = */ lis3dh_get_config, - /*.name = */ "lis3dh", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_LIS3DH, - /*.reg = */ 0x28 | 0x80, /* 0x80 for burst reads */ - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {2, 480}, -}; - -struct ext_slave_descr *lis3dh_get_slave_descr(void) -{ - return &lis3dh_descr; -} -EXPORT_SYMBOL(lis3dh_get_slave_descr); - -/* - * @} -*/ diff --git a/drivers/misc/mpu3050/accel/lsm303a.c b/drivers/misc/mpu3050/accel/lsm303a.c deleted file mode 100755 index b849496..0000000 --- a/drivers/misc/mpu3050/accel/lsm303a.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file lsm303a.c - * @brief Accelerometer setup and handling methods for ST LSM303 - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -#define ACCEL_ST_SLEEP_REG (0x20) -#define ACCEL_ST_SLEEP_MASK (0x20) - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int lsm303dlha_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg; - - result = - MLSLSerialRead(mlsl_handle, pdata->address, ACCEL_ST_SLEEP_REG, - 1, ®); - ERROR_CHECK(result); - reg &= ~(0x27); - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_ST_SLEEP_REG, reg); - ERROR_CHECK(result); - return result; -} - -/* full scale setting - register & mask */ -#define ACCEL_ST_CTRL_REG (0x23) -#define ACCEL_ST_CTRL_MASK (0x30) - -int lsm303dlha_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg; - - result = - MLSLSerialRead(mlsl_handle, pdata->address, ACCEL_ST_SLEEP_REG, - 1, ®); - ERROR_CHECK(result); - reg |= 0x27; - /*wake up if sleeping */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_ST_SLEEP_REG, reg); - ERROR_CHECK(result); - - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x20, 0x37); - ERROR_CHECK(result); - MLOSSleep(500); - - reg = 0x40; - - /* Full Scale */ - reg &= ~ACCEL_ST_CTRL_MASK; - if (slave->range.mantissa == 4) { - slave->range.fraction = 960; - reg |= 0x10; - } else if (slave->range.mantissa == 8) { - slave->range.fraction = 1920; - reg |= 0x30; - } else { - slave->range.mantissa = 2; - slave->range.fraction = 480; - reg |= 0x00; - } - - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x23, reg); - ERROR_CHECK(result); - - /* Configure high pass filter */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x21, 0x0F); - ERROR_CHECK(result); - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x32, 0x00); - ERROR_CHECK(result); - /* Configure INT1_DURATION */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x33, 0x7F); - ERROR_CHECK(result); - /* Configure INT1_CFG */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x30, 0x95); - ERROR_CHECK(result); - MLOSSleep(50); - return result; -} - -int lsm303dlha_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -struct ext_slave_descr lsm303dlha_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ lsm303dlha_suspend, - /*.resume = */ lsm303dlha_resume, - /*.read = */ lsm303dlha_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "lsm303dlha", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_LSM303, - /*.reg = */ (0x28 | 0x80), /* 0x80 for burst reads */ - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {2, 480}, -}; - -struct ext_slave_descr *lsm303dlha_get_slave_descr(void) -{ - return &lsm303dlha_descr; -} -EXPORT_SYMBOL(lsm303dlha_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/accel/mantis.c b/drivers/misc/mpu3050/accel/mantis.c deleted file mode 100755 index 1cb9847..0000000 --- a/drivers/misc/mpu3050/accel/mantis.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file lis331.c - * @brief Accelerometer setup and handling methods for Invensense MANTIS - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -struct mantis_config { - unsigned int odr; /* output data rate 1/1000 Hz*/ - unsigned int fsr; /* full scale range mg */ - unsigned int ths; /* Motion no-motion thseshold mg */ - unsigned int dur; /* Motion no-motion duration ms */ -}; - -struct mantis_private_data { - struct mantis_config suspend; - struct mantis_config resume; -}; - - -/***************************************** - *Accelerometer Initialization Functions - *****************************************/ -/** - * Record the odr for use in computing duration values. - * - * @param config Config to set, suspend or resume structure - * @param odr output data rate in 1/1000 hz - */ -void mantis_set_odr(struct mantis_config *config, - long odr) -{ - config->odr = odr; -} - -void mantis_set_ths(struct mantis_config *config, - long ths) -{ - if (ths < 0) - ths = 0; - - config->ths = ths; - MPL_LOGV("THS: %d\n", config->ths); -} - -void mantis_set_dur(struct mantis_config *config, - long dur) -{ - if (dur < 0) - dur = 0; - - config->dur = dur; - MPL_LOGV("DUR: %d\n", config->dur); -} - -static void mantis_set_fsr( - struct mantis_config *config, - long fsr) -{ - if (fsr <= 2000) - config->fsr = 2000; - else if (fsr <= 4000) - config->fsr = 4000; - else - config->fsr = 8000; - - MPL_LOGV("FSR: %d\n", config->fsr); -} - -static int mantis_init(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - struct mantis_private_data *private_data; - private_data = (struct mantis_private_data *) - MLOSMalloc(sizeof(struct mantis_private_data)); - - if (!private_data) - return ML_ERROR_MEMORY_EXAUSTED; - - pdata->private_data = private_data; - - mantis_set_odr(&private_data->suspend, 0); - mantis_set_odr(&private_data->resume, 200000); - mantis_set_fsr(&private_data->suspend, 2000); - mantis_set_fsr(&private_data->resume, 2000); - mantis_set_ths(&private_data->suspend, 80); - mantis_set_ths(&private_data->resume, 40); - mantis_set_dur(&private_data->suspend, 1000); - mantis_set_dur(&private_data->resume, 2540); - return ML_SUCCESS; -} - -static int mantis_exit(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - if (pdata->private_data) - return MLOSFree(pdata->private_data); - else - return ML_SUCCESS; -} - -int mantis_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - unsigned char reg; - int result; - - result = MLSLSerialRead(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, 1, ®); - ERROR_CHECK(result); - reg |= (BIT_STBY_XA | BIT_STBY_YA | BIT_STBY_ZA); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, reg); - ERROR_CHECK(result); - - return ML_SUCCESS; -} - -int mantis_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg; - struct mantis_private_data *private_data; - - private_data = (struct mantis_private_data *) pdata->private_data; - - MLSLSerialRead(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, 1, ®); - - reg &= ~(BIT_STBY_XA | BIT_STBY_YA | BIT_STBY_ZA); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MPUREG_PWR_MGMT_2, reg); - ERROR_CHECK(result); - - if (slave->range.mantissa == 2) - reg = 0; - else if (slave->range.mantissa == 4) - reg = 1 << 3; - else if (slave->range.mantissa == 8) - reg = 2 << 3; - else if (slave->range.mantissa == 16) - reg = 3 << 3; - else - return ML_ERROR; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MPUREG_ACCEL_CONFIG, reg); - ERROR_CHECK(result); - - reg = (unsigned char) private_data->suspend.ths / ACCEL_MOT_THR_LSB; - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MPUREG_ACCEL_MOT_THR, reg); - ERROR_CHECK(result); - - reg = (unsigned char) - ACCEL_ZRMOT_THR_LSB_CONVERSION(private_data->resume.ths); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MPUREG_ACCEL_ZRMOT_THR, reg); - ERROR_CHECK(result); - - reg = (unsigned char) private_data->suspend.ths / ACCEL_MOT_DUR_LSB; - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MPUREG_ACCEL_MOT_DUR, reg); - ERROR_CHECK(result); - - reg = (unsigned char) private_data->resume.ths / ACCEL_ZRMOT_DUR_LSB; - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MPUREG_ACCEL_ZRMOT_DUR, reg); - ERROR_CHECK(result); - return result; -} - -int mantis_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - int result; - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, slave->len, data); - return result; -} - -static int mantis_config(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - struct ext_slave_config *data) -{ - struct mantis_private_data *private_data = pdata->private_data; - if (!data->data) - return ML_ERROR_INVALID_PARAMETER; - - switch (data->key) { - case MPU_SLAVE_CONFIG_ODR_SUSPEND: - mantis_set_odr(&private_data->suspend, - *((long *)data->data)); - break; - case MPU_SLAVE_CONFIG_ODR_RESUME: - mantis_set_odr(&private_data->resume, - *((long *)data->data)); - break; - case MPU_SLAVE_CONFIG_FSR_SUSPEND: - mantis_set_fsr(&private_data->suspend, - *((long *)data->data)); - break; - case MPU_SLAVE_CONFIG_FSR_RESUME: - mantis_set_fsr(&private_data->resume, - *((long *)data->data)); - break; - case MPU_SLAVE_CONFIG_MOT_THS: - mantis_set_ths(&private_data->suspend, - (*((long *)data->data))); - break; - case MPU_SLAVE_CONFIG_NMOT_THS: - mantis_set_ths(&private_data->resume, - (*((long *)data->data))); - break; - case MPU_SLAVE_CONFIG_MOT_DUR: - mantis_set_dur(&private_data->suspend, - (*((long *)data->data))); - break; - case MPU_SLAVE_CONFIG_NMOT_DUR: - mantis_set_dur(&private_data->resume, - (*((long *)data->data))); - break; - default: - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - }; - - return ML_SUCCESS; -} - -struct ext_slave_descr mantis_descr = { - /*.init = */ mantis_init, - /*.exit = */ mantis_exit, - /*.suspend = */ mantis_suspend, - /*.resume = */ mantis_resume, - /*.read = */ mantis_read, - /*.config = */ mantis_config, - /*.get_config = */ NULL, - /*.name = */ "mantis", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_MPU6000, - /*.reg = */ 0xA8, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {2, 0}, -}; - -struct ext_slave_descr *mantis_get_slave_descr(void) -{ - return &mantis_descr; -} -EXPORT_SYMBOL(mantis_get_slave_descr); - -/** - * @} - */ - diff --git a/drivers/misc/mpu3050/accel/mma8450.c b/drivers/misc/mpu3050/accel/mma8450.c deleted file mode 100755 index b5b3728..0000000 --- a/drivers/misc/mpu3050/accel/mma8450.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file mma8450.c - * @brief Accelerometer setup and handling methods for Freescale MMA8450 - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#include -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" -#include - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -#define ACCEL_MMA8450_SLEEP_REG (0x38) -#define ACCEL_MMA8450_SLEEP_MASK (0x3) - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int mma8450_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg; - result = - MLSLSerialRead(mlsl_handle, pdata->address, - ACCEL_MMA8450_SLEEP_REG, 1, ®); - ERROR_CHECK(result); - reg &= ~ACCEL_MMA8450_SLEEP_MASK; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_MMA8450_SLEEP_REG, reg); - ERROR_CHECK(result); - return result; -} - -/* full scale setting - register & mask */ -#define ACCEL_MMA8450_CTRL_REG (0x38) -#define ACCEL_MMA8450_CTRL_MASK (0x3) - -int mma8450_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg; - - result = - MLSLSerialRead(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG, 1, ®); - ERROR_CHECK(result); - - /* data rate = 200Hz */ - reg &= 0xE3; - reg |= 0x4; - - /* Full Scale */ - reg &= ~ACCEL_MMA8450_CTRL_MASK; - if (slave->range.mantissa == 4) - reg |= 0x2; - else if (slave->range.mantissa == 8) - reg |= 0x3; - else { - slave->range.mantissa = 2; - reg |= 0x1; - } - slave->range.fraction = 0; - - /* XYZ_DATA_CFG: event flag enabled on all axis */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, 0x16, 0x05); - ERROR_CHECK(result); - /* CTRL_REG1: rate + scale config + wakeup */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_MMA8450_CTRL_REG, reg); - ERROR_CHECK(result); - - return result; -} - -int mma8450_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - int result; - unsigned char local_data[4]; /* Status register + 3 bytes data */ - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, sizeof(local_data), local_data); - ERROR_CHECK(result); - memcpy(data, &local_data[1], (slave->len) - 1); - return result; -} - -struct ext_slave_descr mma8450_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ mma8450_suspend, - /*.resume = */ mma8450_resume, - /*.read = */ mma8450_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "mma8450", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_MMA8450, - /*.reg = */ 0x00, - /*.len = */ 4, - /*.endian = */ EXT_SLAVE_FS8_BIG_ENDIAN, - /*.range = */ {2, 0}, -}; - -struct ext_slave_descr *mma8450_get_slave_descr(void) -{ - return &mma8450_descr; -} - -EXPORT_SYMBOL(mma8450_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/accel/mma845x.c b/drivers/misc/mpu3050/accel/mma845x.c deleted file mode 100755 index 27150ad..0000000 --- a/drivers/misc/mpu3050/accel/mma845x.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file mma845x.c - * @brief Accelerometer setup and handling methods for Freescale MMA845X - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" -#include - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -#define ACCEL_MMA845X_CTRL_REG1 (0x2A) -#define ACCEL_MMA845X_SLEEP_MASK (0x01) - -/* full scale setting - register & mask */ -#define ACCEL_MMA845X_CFG_REG (0x0E) -#define ACCEL_MMA845X_CTRL_MASK (0x03) - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int mma845x_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg; - result = - MLSLSerialRead(mlsl_handle, pdata->address, - ACCEL_MMA845X_CTRL_REG1, 1, ®); - ERROR_CHECK(result); - reg &= ~ACCEL_MMA845X_SLEEP_MASK; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_MMA845X_CTRL_REG1, reg); - ERROR_CHECK(result); - return result; -} - - -int mma845x_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - unsigned char reg; - - result = MLSLSerialRead(mlsl_handle, pdata->address, - ACCEL_MMA845X_CFG_REG, 1, ®); - ERROR_CHECK(result); - - /* data rate = 200Hz */ - - /* Full Scale */ - reg &= ~ACCEL_MMA845X_CTRL_MASK; - if (slave->range.mantissa == 4) - reg |= 0x1; - else if (slave->range.mantissa == 8) - reg |= 0x2; - else { - slave->range.mantissa = 2; - reg |= 0x0; - } - slave->range.fraction = 0; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_MMA845X_CFG_REG, reg); - ERROR_CHECK(result); - /* 200Hz + active mode */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - ACCEL_MMA845X_CTRL_REG1, 0x11); - ERROR_CHECK(result); - - return result; -} - -int mma845x_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result; - unsigned char local_data[7]; /* Status register + 6 bytes data */ - result = MLSLSerialRead(mlsl_handle, pdata->address, - slave->reg, sizeof(local_data), local_data); - ERROR_CHECK(result); - memcpy(data, &local_data[1], slave->len); - return result; -} - -struct ext_slave_descr mma845x_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ mma845x_suspend, - /*.resume = */ mma845x_resume, - /*.read = */ mma845x_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "mma845x", - /*.type = */ EXT_SLAVE_TYPE_ACCELEROMETER, - /*.id = */ ACCEL_ID_MMA845X, - /*.reg = */ 0x00, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_FS16_BIG_ENDIAN, - /*.range = */ {2, 0}, -}; - -struct ext_slave_descr *mma845x_get_slave_descr(void) -{ - return &mma845x_descr; -} -EXPORT_SYMBOL(mma845x_get_slave_descr); - -/** - * @} - */ diff --git a/drivers/misc/mpu3050/compass/ami304.c b/drivers/misc/mpu3050/compass/ami304.c deleted file mode 100755 index 5c33861..0000000 --- a/drivers/misc/mpu3050/compass/ami304.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup COMPASSDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file ami304.c - * @brief Magnetometer setup and handling methods for Aichi ami304 compass. -*/ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -#define AMI304_REG_DATAX (0x10) -#define AMI304_REG_STAT1 (0x18) -#define AMI304_REG_CNTL1 (0x1B) -#define AMI304_REG_CNTL2 (0x1C) -#define AMI304_REG_CNTL3 (0x1D) - -#define AMI304_BIT_CNTL1_PC1 (0x80) -#define AMI304_BIT_CNTL1_ODR1 (0x10) -#define AMI304_BIT_CNTL1_FS1 (0x02) - -#define AMI304_BIT_CNTL2_IEN (0x10) -#define AMI304_BIT_CNTL2_DREN (0x08) -#define AMI304_BIT_CNTL2_DRP (0x04) -#define AMI304_BIT_CNTL3_F0RCE (0x40) - -int ami304_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg; - result = - MLSLSerialRead(mlsl_handle, pdata->address, AMI304_REG_CNTL1, - 1, ®); - ERROR_CHECK(result); - - reg &= ~(AMI304_BIT_CNTL1_PC1|AMI304_BIT_CNTL1_FS1); - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI304_REG_CNTL1, reg); - ERROR_CHECK(result); - - return result; -} - -int ami304_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - /* Set CNTL1 reg to power model active */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI304_REG_CNTL1, - AMI304_BIT_CNTL1_PC1|AMI304_BIT_CNTL1_FS1); - ERROR_CHECK(result); - /* Set CNTL2 reg to DRDY active high and enabled */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI304_REG_CNTL2, - AMI304_BIT_CNTL2_DREN | - AMI304_BIT_CNTL2_DRP); - ERROR_CHECK(result); - /* Set CNTL3 reg to forced measurement period */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI304_REG_CNTL3, AMI304_BIT_CNTL3_F0RCE); - - return result; -} - -int ami304_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - unsigned char stat; - int result = ML_SUCCESS; - - /* Read status reg and check if data ready (DRDY) */ - result = - MLSLSerialRead(mlsl_handle, pdata->address, AMI304_REG_STAT1, - 1, &stat); - ERROR_CHECK(result); - - if (stat & 0x40) { - result = - MLSLSerialRead(mlsl_handle, pdata->address, - AMI304_REG_DATAX, 6, - (unsigned char *) data); - ERROR_CHECK(result); - /* start another measurement */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI304_REG_CNTL3, - AMI304_BIT_CNTL3_F0RCE); - ERROR_CHECK(result); - - return ML_SUCCESS; - } - - return ML_ERROR_COMPASS_DATA_NOT_READY; -} - -struct ext_slave_descr ami304_descr = { - /*.suspend = */ ami304_suspend, - /*.resume = */ ami304_resume, - /*.read = */ ami304_read, - /*.name = */ "ami304", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_AICHI, - /*.reg = */ 0x06, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {5461, 3333} -}; - -struct ext_slave_descr *ami304_get_slave_descr(void) -{ - return &ami304_descr; -} - -#ifdef __KERNEL__ -EXPORT_SYMBOL(ami304_get_slave_descr); -#endif - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/compass/ami30x.c b/drivers/misc/mpu3050/compass/ami30x.c deleted file mode 100755 index 5e4a33e..0000000 --- a/drivers/misc/mpu3050/compass/ami30x.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup COMPASSDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file ami30x.c - * @brief Magnetometer setup and handling methods for Aichi AMI304/AMI305 - * compass. -*/ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -#define AMI30X_REG_DATAX (0x10) -#define AMI30X_REG_STAT1 (0x18) -#define AMI30X_REG_CNTL1 (0x1B) -#define AMI30X_REG_CNTL2 (0x1C) -#define AMI30X_REG_CNTL3 (0x1D) - -#define AMI30X_BIT_CNTL1_PC1 (0x80) -#define AMI30X_BIT_CNTL1_ODR1 (0x10) -#define AMI30X_BIT_CNTL1_FS1 (0x02) - -#define AMI30X_BIT_CNTL2_IEN (0x10) -#define AMI30X_BIT_CNTL2_DREN (0x08) -#define AMI30X_BIT_CNTL2_DRP (0x04) -#define AMI30X_BIT_CNTL3_F0RCE (0x40) - -int ami30x_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result; - unsigned char reg; - result = - MLSLSerialRead(mlsl_handle, pdata->address, AMI30X_REG_CNTL1, - 1, ®); - ERROR_CHECK(result); - - reg &= ~(AMI30X_BIT_CNTL1_PC1|AMI30X_BIT_CNTL1_FS1); - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI30X_REG_CNTL1, reg); - ERROR_CHECK(result); - - return result; -} - -int ami30x_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - /* Set CNTL1 reg to power model active */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI30X_REG_CNTL1, - AMI30X_BIT_CNTL1_PC1|AMI30X_BIT_CNTL1_FS1); - ERROR_CHECK(result); - /* Set CNTL2 reg to DRDY active high and enabled */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI30X_REG_CNTL2, - AMI30X_BIT_CNTL2_DREN | - AMI30X_BIT_CNTL2_DRP); - ERROR_CHECK(result); - /* Set CNTL3 reg to forced measurement period */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI30X_REG_CNTL3, AMI30X_BIT_CNTL3_F0RCE); - - return result; -} - -int ami30x_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - unsigned char stat; - int result = ML_SUCCESS; - - /* Read status reg and check if data ready (DRDY) */ - result = - MLSLSerialRead(mlsl_handle, pdata->address, AMI30X_REG_STAT1, - 1, &stat); - ERROR_CHECK(result); - - if (stat & 0x40) { - result = - MLSLSerialRead(mlsl_handle, pdata->address, - AMI30X_REG_DATAX, 6, - (unsigned char *) data); - ERROR_CHECK(result); - /* start another measurement */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AMI30X_REG_CNTL3, - AMI30X_BIT_CNTL3_F0RCE); - ERROR_CHECK(result); - - return ML_SUCCESS; - } - - return ML_ERROR_COMPASS_DATA_NOT_READY; -} - -struct ext_slave_descr ami30x_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ ami30x_suspend, - /*.resume = */ ami30x_resume, - /*.read = */ ami30x_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "ami30x", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_AMI30X, - /*.reg = */ 0x06, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {5461, 3333} - /* For AMI305,the range field needs to be modified to {9830.4f}*/ -}; - -struct ext_slave_descr *ami30x_get_slave_descr(void) -{ - return &ami30x_descr; -} -EXPORT_SYMBOL(ami30x_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/compass/hmc5883.c b/drivers/misc/mpu3050/compass/hmc5883.c deleted file mode 100755 index 051b071..0000000 --- a/drivers/misc/mpu3050/compass/hmc5883.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @brief Provides the interface to setup and handle a compass - * connected to the primary I2C interface of the gyroscope. - * - * @{ - * @file hmc5883.c - * @brief Magnetometer setup and handling methods for honeywell hmc5883 - * compass. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/*-----HONEYWELL HMC5883 Registers ------*/ -enum HMC_REG { - HMC_REG_CONF_A = 0x0, - HMC_REG_CONF_B = 0x1, - HMC_REG_MODE = 0x2, - HMC_REG_X_M = 0x3, - HMC_REG_X_L = 0x4, - HMC_REG_Z_M = 0x5, - HMC_REG_Z_L = 0x6, - HMC_REG_Y_M = 0x7, - HMC_REG_Y_L = 0x8, - HMC_REG_STATUS = 0x9, - HMC_REG_ID_A = 0xA, - HMC_REG_ID_B = 0xB, - HMC_REG_ID_C = 0xC -}; - -enum HMC_CONF_A { - HMC_CONF_A_DRATE_MASK = 0x1C, - HMC_CONF_A_DRATE_0_75 = 0x00, - HMC_CONF_A_DRATE_1_5 = 0x04, - HMC_CONF_A_DRATE_3 = 0x08, - HMC_CONF_A_DRATE_7_5 = 0x0C, - HMC_CONF_A_DRATE_15 = 0x10, - HMC_CONF_A_DRATE_30 = 0x14, - HMC_CONF_A_DRATE_75 = 0x18, - HMC_CONF_A_MEAS_MASK = 0x3, - HMC_CONF_A_MEAS_NORM = 0x0, - HMC_CONF_A_MEAS_POS = 0x1, - HMC_CONF_A_MEAS_NEG = 0x2 -}; - -enum HMC_CONF_B { - HMC_CONF_B_GAIN_MASK = 0xE0, - HMC_CONF_B_GAIN_0_9 = 0x00, - HMC_CONF_B_GAIN_1_2 = 0x20, - HMC_CONF_B_GAIN_1_9 = 0x40, - HMC_CONF_B_GAIN_2_5 = 0x60, - HMC_CONF_B_GAIN_4_0 = 0x80, - HMC_CONF_B_GAIN_4_6 = 0xA0, - HMC_CONF_B_GAIN_5_5 = 0xC0, - HMC_CONF_B_GAIN_7_9 = 0xE0 -}; - -enum HMC_MODE { - HMC_MODE_MASK = 0x3, - HMC_MODE_CONT = 0x0, - HMC_MODE_SINGLE = 0x1, - HMC_MODE_IDLE = 0x2, - HMC_MODE_SLEEP = 0x3 -}; - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int hmc5883_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - HMC_REG_MODE, HMC_MODE_SLEEP); - ERROR_CHECK(result); - MLOSSleep(3); - - return result; -} - -int hmc5883_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - /* Use single measurement mode. Start at sleep state. */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - HMC_REG_MODE, HMC_MODE_SLEEP); - ERROR_CHECK(result); - /* Config normal measurement */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - HMC_REG_CONF_A, 0); - ERROR_CHECK(result); - /* Adjust gain to 307 LSB/Gauss */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - HMC_REG_CONF_B, HMC_CONF_B_GAIN_5_5); - ERROR_CHECK(result); - - return result; -} - -int hmc5883_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - unsigned char stat; - tMLError result = ML_SUCCESS; - unsigned char tmp; - short axisFixed; - - /* Read status reg. to check if data is ready */ - result = - MLSLSerialRead(mlsl_handle, pdata->address, HMC_REG_STATUS, 1, - &stat); - ERROR_CHECK(result); - if (stat & 0x01) { - result = - MLSLSerialRead(mlsl_handle, pdata->address, - HMC_REG_X_M, 6, (unsigned char *) data); - ERROR_CHECK(result); - - /* switch YZ axis to proper position */ - tmp = data[2]; - data[2] = data[4]; - data[4] = tmp; - tmp = data[3]; - data[3] = data[5]; - data[5] = tmp; - - /*drop data if overflows */ - if ((data[0] == 0xf0) || (data[2] == 0xf0) - || (data[4] == 0xf0)) { - /* trigger next measurement read */ - result = - MLSLSerialWriteSingle(mlsl_handle, - pdata->address, - HMC_REG_MODE, - HMC_MODE_SINGLE); - ERROR_CHECK(result); - return ML_ERROR_COMPASS_DATA_OVERFLOW; - } - /* convert to fixed point and apply sensitivity correction for - Z-axis */ - axisFixed = - (short) ((unsigned short) data[5] + - (unsigned short) data[4] * 256); - /* scale up by 1.125 (36/32) */ - axisFixed = (short) (axisFixed * 36); - data[4] = axisFixed >> 8; - data[5] = axisFixed & 0xFF; - - axisFixed = - (short) ((unsigned short) data[3] + - (unsigned short) data[2] * 256); - axisFixed = (short) (axisFixed * 32); - data[2] = axisFixed >> 8; - data[3] = axisFixed & 0xFF; - - axisFixed = - (short) ((unsigned short) data[1] + - (unsigned short) data[0] * 256); - axisFixed = (short) (axisFixed * 32); - data[0] = axisFixed >> 8; - data[1] = axisFixed & 0xFF; - - /* trigger next measurement read */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - HMC_REG_MODE, HMC_MODE_SINGLE); - ERROR_CHECK(result); - - return ML_SUCCESS; - } else { - /* trigger next measurement read */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - HMC_REG_MODE, HMC_MODE_SINGLE); - ERROR_CHECK(result); - - return ML_ERROR_COMPASS_DATA_NOT_READY; - } -} - -struct ext_slave_descr hmc5883_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ hmc5883_suspend, - /*.resume = */ hmc5883_resume, - /*.read = */ hmc5883_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "hmc5883", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_HMC5883, - /*.reg = */ 0x06, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {10673, 6156}, -}; - -struct ext_slave_descr *hmc5883_get_slave_descr(void) -{ - return &hmc5883_descr; -} -EXPORT_SYMBOL(hmc5883_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/compass/hscdtd002b.c b/drivers/misc/mpu3050/compass/hscdtd002b.c deleted file mode 100755 index bf26cae..0000000 --- a/drivers/misc/mpu3050/compass/hscdtd002b.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @brief Provides the interface to setup and handle a compass - * connected to the primary I2C interface of the gyroscope. - * - * @{ - * @file hscdtd002b.c - * @brief Magnetometer setup and handling methods for Alps hscdtd002b - * compass. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/*----- ALPS HSCDTD002B Registers ------*/ -#define COMPASS_HSCDTD002B_STAT (0x18) -#define COMPASS_HSCDTD002B_CTRL1 (0x1B) -#define COMPASS_HSCDTD002B_CTRL2 (0x1C) -#define COMPASS_HSCDTD002B_CTRL3 (0x1D) -#define COMPASS_HSCDTD002B_DATAX (0x10) - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Compass Initialization Functions -*****************************************/ - -int hscdtd002b_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - /* Power mode: stand-by */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL1, 0x00); - ERROR_CHECK(result); - MLOSSleep(1); /* turn-off time */ - - return result; -} - -int hscdtd002b_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - /* Soft reset */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL3, 0x80); - ERROR_CHECK(result); - /* Force state; Power mode: active */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL1, 0x82); - ERROR_CHECK(result); - /* Data ready enable */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL2, 0x08); - ERROR_CHECK(result); - MLOSSleep(1); /* turn-on time */ - - return result; -} - -int hscdtd002b_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - unsigned char stat; - tMLError result = ML_SUCCESS; - int status = ML_SUCCESS; - - /* Read status reg. to check if data is ready */ - result = - MLSLSerialRead(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_STAT, 1, &stat); - ERROR_CHECK(result); - if (stat & 0x40) { - result = - MLSLSerialRead(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_DATAX, 6, - (unsigned char *) data); - ERROR_CHECK(result); - status = ML_SUCCESS; - } else if (stat & 0x20) { - status = ML_ERROR_COMPASS_DATA_OVERFLOW; - } else { - status = ML_ERROR_COMPASS_DATA_NOT_READY; - } - /* trigger next measurement read */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD002B_CTRL3, 0x40); - ERROR_CHECK(result); - - return status; -} - -struct ext_slave_descr hscdtd002b_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ hscdtd002b_suspend, - /*.resume = */ hscdtd002b_resume, - /*.read = */ hscdtd002b_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "hscdtd002b", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_HSCDTD002B, - /*.reg = */ 0x10, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {9830, 4000}, -}; - -struct ext_slave_descr *hscdtd002b_get_slave_descr(void) -{ - return &hscdtd002b_descr; -} -EXPORT_SYMBOL(hscdtd002b_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/compass/hscdtd004a.c b/drivers/misc/mpu3050/compass/hscdtd004a.c deleted file mode 100755 index 43fc14a..0000000 --- a/drivers/misc/mpu3050/compass/hscdtd004a.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @brief Provides the interface to setup and handle a compass - * connected to the primary I2C interface of the gyroscope. - * - * @{ - * @file hscdtd004a.c - * @brief Magnetometer setup and handling methods for Alps hscdtd004a - * compass. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/*----- ALPS HSCDTD004A Registers ------*/ -#define COMPASS_HSCDTD004A_STAT (0x18) -#define COMPASS_HSCDTD004A_CTRL1 (0x1B) -#define COMPASS_HSCDTD004A_CTRL2 (0x1C) -#define COMPASS_HSCDTD004A_CTRL3 (0x1D) -#define COMPASS_HSCDTD004A_DATAX (0x10) - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Compass Initialization Functions -*****************************************/ - -int hscdtd004a_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - /* Power mode: stand-by */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL1, 0x00); - ERROR_CHECK(result); - MLOSSleep(1); /* turn-off time */ - - return result; -} - -int hscdtd004a_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - /* Soft reset */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL3, 0x80); - ERROR_CHECK(result); - /* Normal state; Power mode: active */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL1, 0x82); - ERROR_CHECK(result); - /* Data ready enable */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL2, 0x7C); - ERROR_CHECK(result); - MLOSSleep(1); /* turn-on time */ - return result; -} - -int hscdtd004a_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - unsigned char stat; - tMLError result = ML_SUCCESS; - int status = ML_SUCCESS; - - /* Read status reg. to check if data is ready */ - result = - MLSLSerialRead(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_STAT, 1, &stat); - ERROR_CHECK(result); - if (stat & 0x48) { - result = - MLSLSerialRead(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_DATAX, 6, - (unsigned char *) data); - ERROR_CHECK(result); - status = ML_SUCCESS; - } else if (stat & 0x68) { - status = ML_ERROR_COMPASS_DATA_OVERFLOW; - } else { - status = ML_ERROR_COMPASS_DATA_NOT_READY; - } - /* trigger next measurement read */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - COMPASS_HSCDTD004A_CTRL3, 0x40); - ERROR_CHECK(result); - return status; - -} - -struct ext_slave_descr hscdtd004a_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ hscdtd004a_suspend, - /*.resume = */ hscdtd004a_resume, - /*.read = */ hscdtd004a_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "hscdtd004a", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_HSCDTD004A, - /*.reg = */ 0x10, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {9830, 4000}, -}; - -struct ext_slave_descr *hscdtd004a_get_slave_descr(void) -{ - return &hscdtd004a_descr; -} -EXPORT_SYMBOL(hscdtd004a_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/compass/lsm303m.c b/drivers/misc/mpu3050/compass/lsm303m.c deleted file mode 100755 index 871d002..0000000 --- a/drivers/misc/mpu3050/compass/lsm303m.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @brief Provides the interface to setup and handle a compass - * connected to the primary I2C interface of the gyroscope. - * - * @{ - * @file lsm303m.c - * @brief Magnetometer setup and handling methods for ST LSM303. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/*----- ST LSM303 Registers ------*/ -enum LSM_REG { - LSM_REG_CONF_A = 0x0, - LSM_REG_CONF_B = 0x1, - LSM_REG_MODE = 0x2, - LSM_REG_X_M = 0x3, - LSM_REG_X_L = 0x4, - LSM_REG_Z_M = 0x5, - LSM_REG_Z_L = 0x6, - LSM_REG_Y_M = 0x7, - LSM_REG_Y_L = 0x8, - LSM_REG_STATUS = 0x9, - LSM_REG_ID_A = 0xA, - LSM_REG_ID_B = 0xB, - LSM_REG_ID_C = 0xC -}; - -enum LSM_CONF_A { - LSM_CONF_A_DRATE_MASK = 0x1C, - LSM_CONF_A_DRATE_0_75 = 0x00, - LSM_CONF_A_DRATE_1_5 = 0x04, - LSM_CONF_A_DRATE_3 = 0x08, - LSM_CONF_A_DRATE_7_5 = 0x0C, - LSM_CONF_A_DRATE_15 = 0x10, - LSM_CONF_A_DRATE_30 = 0x14, - LSM_CONF_A_DRATE_75 = 0x18, - LSM_CONF_A_MEAS_MASK = 0x3, - LSM_CONF_A_MEAS_NORM = 0x0, - LSM_CONF_A_MEAS_POS = 0x1, - LSM_CONF_A_MEAS_NEG = 0x2 -}; - -enum LSM_CONF_B { - LSM_CONF_B_GAIN_MASK = 0xE0, - LSM_CONF_B_GAIN_0_9 = 0x00, - LSM_CONF_B_GAIN_1_2 = 0x20, - LSM_CONF_B_GAIN_1_9 = 0x40, - LSM_CONF_B_GAIN_2_5 = 0x60, - LSM_CONF_B_GAIN_4_0 = 0x80, - LSM_CONF_B_GAIN_4_6 = 0xA0, - LSM_CONF_B_GAIN_5_5 = 0xC0, - LSM_CONF_B_GAIN_7_9 = 0xE0 -}; - -enum LSM_MODE { - LSM_MODE_MASK = 0x3, - LSM_MODE_CONT = 0x0, - LSM_MODE_SINGLE = 0x1, - LSM_MODE_IDLE = 0x2, - LSM_MODE_SLEEP = 0x3 -}; - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int lsm303dlhm_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LSM_REG_MODE, LSM_MODE_SLEEP); - ERROR_CHECK(result); - MLOSSleep(3); - - return result; -} - -int lsm303dlhm_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - /* Use single measurement mode. Start at sleep state. */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LSM_REG_MODE, LSM_MODE_SLEEP); - ERROR_CHECK(result); - /* Config normal measurement */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LSM_REG_CONF_A, 0); - ERROR_CHECK(result); - /* Adjust gain to 320 LSB/Gauss */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LSM_REG_CONF_B, LSM_CONF_B_GAIN_5_5); - ERROR_CHECK(result); - - return result; -} - -int lsm303dlhm_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - unsigned char stat; - tMLError result = ML_SUCCESS; - short axisFixed; - - /* Read status reg. to check if data is ready */ - result = - MLSLSerialRead(mlsl_handle, pdata->address, LSM_REG_STATUS, 1, - &stat); - ERROR_CHECK(result); - if (stat & 0x01) { - result = - MLSLSerialRead(mlsl_handle, pdata->address, - LSM_REG_X_M, 6, (unsigned char *) data); - ERROR_CHECK(result); - - /*drop data if overflows */ - if ((data[0] == 0xf0) || (data[2] == 0xf0) - || (data[4] == 0xf0)) { - /* trigger next measurement read */ - result = - MLSLSerialWriteSingle(mlsl_handle, - pdata->address, - LSM_REG_MODE, - LSM_MODE_SINGLE); - ERROR_CHECK(result); - return ML_ERROR_COMPASS_DATA_OVERFLOW; - } - /* convert to fixed point and apply sensitivity correction for - Z-axis */ - axisFixed = - (short) ((unsigned short) data[5] + - (unsigned short) data[4] * 256); - /* scale up by 1.125 (36/32) approximate of 1.122 (320/285) */ - axisFixed = (short) (axisFixed * 36); - data[4] = axisFixed >> 8; - data[5] = axisFixed & 0xFF; - - axisFixed = - (short) ((unsigned short) data[3] + - (unsigned short) data[2] * 256); - axisFixed = (short) (axisFixed * 32); - data[2] = axisFixed >> 8; - data[3] = axisFixed & 0xFF; - - axisFixed = - (short) ((unsigned short) data[1] + - (unsigned short) data[0] * 256); - axisFixed = (short) (axisFixed * 32); - data[0] = axisFixed >> 8; - data[1] = axisFixed & 0xFF; - - /* trigger next measurement read */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LSM_REG_MODE, LSM_MODE_SINGLE); - ERROR_CHECK(result); - - return ML_SUCCESS; - } else { - /* trigger next measurement read */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - LSM_REG_MODE, LSM_MODE_SINGLE); - ERROR_CHECK(result); - - return ML_ERROR_COMPASS_DATA_NOT_READY; - } -} - -struct ext_slave_descr lsm303dlhm_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ lsm303dlhm_suspend, - /*.resume = */ lsm303dlhm_resume, - /*.read = */ lsm303dlhm_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "lsm303dlhm", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_LSM303, - /*.reg = */ 0x06, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {10240, 0}, -}; - -struct ext_slave_descr *lsm303dlhm_get_slave_descr(void) -{ - return &lsm303dlhm_descr; -} -EXPORT_SYMBOL(lsm303dlhm_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/compass/mmc314x.c b/drivers/misc/mpu3050/compass/mmc314x.c deleted file mode 100755 index 010d7a7..0000000 --- a/drivers/misc/mpu3050/compass/mmc314x.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file mmc314x.c - * @brief Magnetometer setup and handling methods for ???? compass. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -static int reset_int = 1000; -static int read_count = 1; -static char reset_mode; /* in Z-init section */ - -#define MMC314X_REG_ST (0x00) -#define MMC314X_REG_X_MSB (0x01) - -#define MMC314X_CNTL_MODE_WAKE_UP (0x01) -#define MMC314X_CNTL_MODE_SET (0x02) -#define MMC314X_CNTL_MODE_RESET (0x04) - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int mmc314x_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - return result; -} - -int mmc314x_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - - int result; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MMC314X_REG_ST, MMC314X_CNTL_MODE_RESET); - ERROR_CHECK(result); - MLOSSleep(10); - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MMC314X_REG_ST, MMC314X_CNTL_MODE_SET); - ERROR_CHECK(result); - MLOSSleep(10); - read_count = 1; - return ML_SUCCESS; -} - -int mmc314x_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, - unsigned char *data) -{ - int result, ii; - short tmp[3]; - unsigned char tmpdata[6]; - - - if (read_count > 1000) - read_count = 1; - - result = - MLSLSerialRead(mlsl_handle, pdata->address, MMC314X_REG_X_MSB, - 6, (unsigned char *) data); - ERROR_CHECK(result); - - for (ii = 0; ii < 6; ii++) - tmpdata[ii] = data[ii]; - - for (ii = 0; ii < 3; ii++) { - tmp[ii] = - (short) ((tmpdata[2 * ii] << 8) + tmpdata[2 * ii + 1]); - tmp[ii] = tmp[ii] - 4096; - tmp[ii] = tmp[ii] * 16; - } - - for (ii = 0; ii < 3; ii++) { - data[2 * ii] = (unsigned char) (tmp[ii] >> 8); - data[2 * ii + 1] = (unsigned char) (tmp[ii]); - } - - if (read_count % reset_int == 0) { - if (reset_mode) { - result = - MLSLSerialWriteSingle(mlsl_handle, - pdata->address, - MMC314X_REG_ST, - MMC314X_CNTL_MODE_RESET); - ERROR_CHECK(result); - reset_mode = 0; - return ML_ERROR_COMPASS_DATA_NOT_READY; - } else { - result = - MLSLSerialWriteSingle(mlsl_handle, - pdata->address, - MMC314X_REG_ST, - MMC314X_CNTL_MODE_SET); - ERROR_CHECK(result); - reset_mode = 1; - read_count++; - return ML_ERROR_COMPASS_DATA_NOT_READY; - } - } - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - MMC314X_REG_ST, - MMC314X_CNTL_MODE_WAKE_UP); - ERROR_CHECK(result); - read_count++; - - return ML_SUCCESS; -} - -struct ext_slave_descr mmc314x_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ mmc314x_suspend, - /*.resume = */ mmc314x_resume, - /*.read = */ mmc314x_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "mmc314x", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_MMC314X, - /*.reg = */ 0x01, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {400, 0}, -}; - -struct ext_slave_descr *mmc314x_get_slave_descr(void) -{ - return &mmc314x_descr; -} -EXPORT_SYMBOL(mmc314x_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/compass/mmc328x.c b/drivers/misc/mpu3050/compass/mmc328x.c deleted file mode 100755 index d2914f3..0000000 --- a/drivers/misc/mpu3050/compass/mmc328x.c +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) 2010 MEMSIC, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include - -#define MMC328X_I2C_ADDR 0x30 - -#define MMC328X_REG_CTRL 0x07 -#define MMC328X_REG_DATA 0x00 -#define MMC328X_REG_DS 0x06 - -#define MMC328X_CTRL_TM 0x01 -#define MMC328X_CTRL_RM 0x20 - -#define MMC328X_DELAY_TM 10 /* ms */ -#define MMC328X_DELAY_RM 10 /* ms */ -#define MMC328X_DELAY_STDN 1 /* ms */ - -static int mmc328x_i2c_rx_data(void *mlsl_handle, - struct ext_slave_platform_data *pdata, char *buf, int len) -{ - uint8_t i; - struct i2c_msg msgs[2] = { 0, }; - - if (NULL == buf || NULL == mlsl_handle) - return -EINVAL; - - msgs[0].addr = pdata->address; - msgs[0].flags = 0; - msgs[0].len = 1; - msgs[0].buf = buf; - - msgs[1].addr = pdata->address; - msgs[1].flags = I2C_M_RD; - msgs[1].len = len; - msgs[1].buf = buf; - - if (i2c_transfer(mlsl_handle, msgs, 2) >= 0) - return -1; - - return 0; -} - -static int mmc328x_i2c_tx_data(void *mlsl_handle, - struct ext_slave_platform_data *pdata, char *buf, int len) -{ - struct i2c_msg msgs[1]; - int res; - - if (NULL == buf || NULL == mlsl_handle) - return -EINVAL; - - msgs[0].addr = pdata->address; - msgs[0].flags = 0; /* write */ - msgs[0].buf = (unsigned char *)buf; - msgs[0].len = len; - - res = i2c_transfer(mlsl_handle, msgs, 1); - if (res < 1) - return res; - else - return 0; -} - -int memsic_api_resume(void *mlsl_handle, - struct ext_slave_platform_data *pdata) -{ -#if 0 - unsigned char data[2] = { 0 }; - - data[0] = MMC328X_REG_CTRL; - data[1] = MMC328X_CTRL_RM; - if (mmc328x_i2c_tx_data(mlsl_handle, pdata, data, 2) < 0) - return -1; - - msleep(MMC328X_DELAY_RM); -#endif - return 0; -} - -int memsic_api_suspend(void *mlsl_handle, - struct ext_slave_platform_data *pdata) -{ -#if 0 - unsigned char data[2] = { 0 }; - - data[0] = MMC328X_REG_CTRL; - data[1] = 0; - if (mmc328x_i2c_tx_data(mlsl_handle, pdata, data, 2) < 0) - return -1; - msleep(MMC328X_DELAY_RM); - - data[0] = MMC328X_REG_CTRL; - data[1] = 0; - mmc328x_i2c_tx_data(mlsl_handle, pdata, data, 2); - msleep(MMC328X_DELAY_TM); -#endif - return 0; -} - -int memsic_api_read(void *mlsl_handle, struct ext_slave_platform_data *pdata, - unsigned char *raw_data, int *accuracy) -{ - unsigned char data[6] = { 0 }; - int MD_times = 0; - - data[0] = MMC328X_REG_CTRL; - data[1] = MMC328X_CTRL_TM; - mmc328x_i2c_tx_data(mlsl_handle, pdata, data, 2); - msleep(MMC328X_DELAY_TM); - - data[0] = MMC328X_REG_DS; - if (mmc328x_i2c_rx_data(mlsl_handle, pdata, data, 1) < 0) - return -EFAULT; - - while (!(data[0] & 0x01)) { - msleep(20); - data[0] = MMC328X_REG_DS; - - if (mmc328x_i2c_rx_data(mlsl_handle, pdata, data, 1) < 0) - return -EFAULT; - - if (data[0] & 0x01) - break; - - MD_times++; - - if (MD_times > 2) - return -EFAULT; - } - - data[0] = MMC328X_REG_DATA; - if (mmc328x_i2c_rx_data(mlsl_handle, pdata, data, 6) < 0) - return -EFAULT; - - memcpy(raw_data, data, sizeof(unsigned char) * 6); - - *accuracy = 0; - - return 0; -} - -int mmc328x_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - int xyz[3] = { 0, }; - int accuracy = 0; - - memsic_api_read(mlsl_handle, pdata, data, &accuracy); - - return ML_SUCCESS; -} - -int mmc328x_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - memsic_api_suspend(mlsl_handle, pdata); - return result; -} - -int mmc328x_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - - memsic_api_resume(mlsl_handle, pdata); - return ML_SUCCESS; -} - -struct ext_slave_descr mmc328x_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ mmc328x_suspend, - /*.resume = */ mmc328x_resume, - /*.read = */ mmc328x_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "mmc328x", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_MMC328X, - /*.reg = */ 0x01, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {400, 0}, -}; - -struct ext_slave_descr *mmc328x_get_slave_descr(void) -{ - return &mmc328x_descr; -} -EXPORT_SYMBOL(mmc328x_get_slave_descr); - -/** - * @} -**/ diff --git a/drivers/misc/mpu3050/compass/mpuak8975.c b/drivers/misc/mpu3050/compass/mpuak8975.c deleted file mode 100755 index 991de77..0000000 --- a/drivers/misc/mpu3050/compass/mpuak8975.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup COMPASSDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file AK8975.c - * @brief Magnetometer setup and handling methods for AKM 8975 compass. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#include - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mlsl.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-compass" - - -#define AK8975_REG_ST1 (0x02) -#define AK8975_REG_HXL (0x03) -#define AK8975_REG_ST2 (0x09) - -#define AK8975_REG_CNTL (0x0A) - -#define AK8975_CNTL_MODE_POWER_DOWN (0x00) -#define AK8975_CNTL_MODE_SINGLE_MEASUREMENT (0x01) - -int ak8975_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AK8975_REG_CNTL, - AK8975_CNTL_MODE_POWER_DOWN); - MLOSSleep(1); /* wait at least 100us */ - ERROR_CHECK(result); - return result; -} - -int ak8975_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AK8975_REG_CNTL, - AK8975_CNTL_MODE_SINGLE_MEASUREMENT); - ERROR_CHECK(result); - return result; -} - -int ak8975_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - unsigned char regs[8]; - unsigned char *stat = ®s[0]; - unsigned char *stat2 = ®s[7]; - int result = ML_SUCCESS; - int status = ML_SUCCESS; - - result = - MLSLSerialRead(mlsl_handle, pdata->address, AK8975_REG_ST1, - 8, regs); - ERROR_CHECK(result); - - /* - * ST : data ready - - * Measurement has been completed and data is ready to be read. - */ - if (*stat & 0x01) { - memcpy(data, ®s[1], 6); - status = ML_SUCCESS; - } - - /* - * ST2 : data error - - * occurs when data read is started outside of a readable period; - * data read would not be correct. - * Valid in continuous measurement mode only. - * In single measurement mode this error should not occour but we - * stil account for it and return an error, since the data would be - * corrupted. - * DERR bit is self-clearing when ST2 register is read. - */ - if (*stat2 & 0x04) - status = ML_ERROR_COMPASS_DATA_ERROR; - /* - * ST2 : overflow - - * the sum of the absolute values of all axis |X|+|Y|+|Z| < 2400uT. - * This is likely to happen in presence of an external magnetic - * disturbance; it indicates, the sensor data is incorrect and should - * be ignored. - * An error is returned. - * HOFL bit clears when a new measurement starts. - */ - if (*stat2 & 0x08) - status = ML_ERROR_COMPASS_DATA_OVERFLOW; - /* - * ST : overrun - - * the previous sample was not fetched and lost. - * Valid in continuous measurement mode only. - * In single measurement mode this error should not occour and we - * don't consider this condition an error. - * DOR bit is self-clearing when ST2 or any meas. data register is - * read. - */ - if (*stat & 0x02) { - /* status = ML_ERROR_COMPASS_DATA_UNDERFLOW; */ - status = ML_SUCCESS; - } - - /* - * trigger next measurement if: - * - stat is non zero; - * - if stat is zero and stat2 is non zero. - * Won't trigger if data is not ready and there was no error. - */ - if (*stat != 0x00 || *stat2 != 0x00) { - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->address, - AK8975_REG_CNTL, - AK8975_CNTL_MODE_SINGLE_MEASUREMENT); - ERROR_CHECK(result); - } - - return status; -} - -struct ext_slave_descr ak8975_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ ak8975_suspend, - /*.resume = */ ak8975_resume, - /*.read = */ ak8975_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "ak8975", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_AKM, - /*.reg = */ 0x01, - /*.len = */ 9, - /*.endian = */ EXT_SLAVE_LITTLE_ENDIAN, - /*.range = */ {9830, 4000} -}; - -struct ext_slave_descr *ak8975_get_slave_descr(void) -{ - return &ak8975_descr; -} -EXPORT_SYMBOL(ak8975_get_slave_descr); - -/** - * @} - */ diff --git a/drivers/misc/mpu3050/compass/yas529-kernel.c b/drivers/misc/mpu3050/compass/yas529-kernel.c deleted file mode 100755 index 239ab66..0000000 --- a/drivers/misc/mpu3050/compass/yas529-kernel.c +++ /dev/null @@ -1,477 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -/** - * @defgroup ACCELDL (Motion Library - Accelerometer Driver Layer) - * @brief Provides the interface to setup and handle an accelerometers - * connected to the secondary I2C interface of the gyroscope. - * - * @{ - * @file yas529.c - * @brief Magnetometer setup and handling methods for Yamaha yas529 - * compass. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#ifdef __KERNEL__ -#include -#include -#endif - -#include "mpu.h" -#include "mlos.h" - -#include -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "MPL-acc" - -/*----- YAMAHA YAS529 Registers ------*/ -enum YAS_REG { - YAS_REG_CMDR = 0x00, /* 000 < 5 */ - YAS_REG_XOFFSETR = 0x20, /* 001 < 5 */ - YAS_REG_Y1OFFSETR = 0x40, /* 010 < 5 */ - YAS_REG_Y2OFFSETR = 0x60, /* 011 < 5 */ - YAS_REG_ICOILR = 0x80, /* 100 < 5 */ - YAS_REG_CAL = 0xA0, /* 101 < 5 */ - YAS_REG_CONFR = 0xC0, /* 110 < 5 */ - YAS_REG_DOUTR = 0xE0 /* 111 < 5 */ -}; - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -static long a1; -static long a2; -static long a3; -static long a4; -static long a5; -static long a6; -static long a7; -static long a8; -static long a9; - -/***************************************** - Yamaha I2C access functions -*****************************************/ - -static int yas529_sensor_i2c_write(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned int len, unsigned char *data) -{ - struct i2c_msg msgs[1]; - int res; - - if (NULL == data || NULL == i2c_adap) - return -EINVAL; - - msgs[0].addr = address; - msgs[0].flags = 0; /* write */ - msgs[0].buf = (unsigned char *) data; - msgs[0].len = len; - - res = i2c_transfer(i2c_adap, msgs, 1); - if (res < 1) - return res; - else - return 0; -} - -static int yas529_sensor_i2c_read(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned char reg, - unsigned int len, unsigned char *data) -{ - struct i2c_msg msgs[2]; - int res; - - if (NULL == data || NULL == i2c_adap) - return -EINVAL; - - msgs[0].addr = address; - msgs[0].flags = I2C_M_RD; - msgs[0].buf = data; - msgs[0].len = len; - - res = i2c_transfer(i2c_adap, msgs, 1); - if (res < 1) - return res; - else - return 0; -} - -/***************************************** - Accelerometer Initialization Functions -*****************************************/ - -int yas529_suspend(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - return result; -} - -int yas529_resume(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata) -{ - int result = ML_SUCCESS; - - unsigned char dummyData[1] = { 0 }; - unsigned char dummyRegister = 0; - unsigned char rawData[6]; - unsigned char calData[9]; - - short xoffset, y1offset, y2offset; - short d2, d3, d4, d5, d6, d7, d8, d9; - - /* YAS529 Application Manual MS-3C - Section 4.4.5 */ - /* =============================================== */ - /* Step 1 - register initialization */ - /* zero initialization coil register - "100 00 000" */ - dummyData[0] = YAS_REG_ICOILR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - /* zero config register - "110 00 000" */ - dummyData[0] = YAS_REG_CONFR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - - /* Step 2 - initialization coil operation */ - dummyData[0] = YAS_REG_ICOILR | 0x11; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x01; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x12; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x02; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x13; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x03; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x14; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x04; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x15; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x05; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x16; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x06; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x17; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x07; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x10; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_ICOILR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - - /* Step 3 - rough offset measurement */ - /* Config register - Measurements results - "110 00 000" */ - dummyData[0] = YAS_REG_CONFR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - /* Measurements command register - Rough offset measurement - - "000 00001" */ - dummyData[0] = YAS_REG_CMDR | 0x01; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - MLOSSleep(2); /* wait at least 1.5ms */ - - /* Measurement data read */ - result = - yas529_sensor_i2c_read(mlsl_handle, pdata->address, - dummyRegister, 6, rawData); - ERROR_CHECK(result); - xoffset = - (short) ((unsigned short) rawData[5] + - ((unsigned short) rawData[4] & 0x7) * 256) - 5; - if (xoffset < 0) - xoffset = 0; - y1offset = - (short) ((unsigned short) rawData[3] + - ((unsigned short) rawData[2] & 0x7) * 256) - 5; - if (y1offset < 0) - y1offset = 0; - y2offset = - (short) ((unsigned short) rawData[1] + - ((unsigned short) rawData[0] & 0x7) * 256) - 5; - if (y2offset < 0) - y2offset = 0; - - /* Step 4 - rough offset setting */ - /* Set rough offset register values */ - dummyData[0] = YAS_REG_XOFFSETR | xoffset; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_Y1OFFSETR | y1offset; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - dummyData[0] = YAS_REG_Y2OFFSETR | y2offset; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - - /* CAL matrix read (first read is invalid) */ - /* Config register - CAL register read - "110 01 000" */ - dummyData[0] = YAS_REG_CONFR | 0x08; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - /* CAL data read */ - result = - yas529_sensor_i2c_read(mlsl_handle, pdata->address, - dummyRegister, 9, calData); - ERROR_CHECK(result); - /* Config register - CAL register read - "110 01 000" */ - dummyData[0] = YAS_REG_CONFR | 0x08; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - /* CAL data read */ - result = - yas529_sensor_i2c_read(mlsl_handle, pdata->address, - dummyRegister, 9, calData); - ERROR_CHECK(result); - - /* Calculate coefficients of the sensitivity corrcetion matrix */ -#if 1 /* production sensor */ - a1 = 100; - d2 = (calData[0] & 0xFC) >> 2; /* [71..66] 6bit */ - a2 = (short) (d2 - 32); - /* [65..62] 4bit */ - d3 = ((calData[0] & 0x03) << 2) | ((calData[1] & 0xC0) >> 6); - a3 = (short) (d3 - 8); - d4 = (calData[1] & 0x3F); /* [61..56] 6bit */ - a4 = (short) (d4 - 32); - d5 = (calData[2] & 0xFC) >> 2; /* [55..50] 6bit */ - a5 = (short) (d5 - 32) + 70; - /* [49..44] 6bit */ - d6 = ((calData[2] & 0x03) << 4) | ((calData[3] & 0xF0) >> 4); - a6 = (short) (d6 - 32); - /* [43..38] 6bit */ - d7 = ((calData[3] & 0x0F) << 2) | ((calData[4] & 0xC0) >> 6); - a7 = (short) (d7 - 32); - d8 = (calData[4] & 0x3F); /* [37..32] 6bit */ - a8 = (short) (d8 - 32); - d9 = (calData[5] & 0xFE) >> 1; /* [31..25] 7bit */ - a9 = (short) (d9 - 64) + 130; -#else /* evaluation sensor */ - a1 = 1.0f; - /* [71..66] 6bit */ - d2 = (calData[0] & 0xFC) >> 2; - a2 = (short) d2; - /* [65..60] 6bit */ - d3 = ((calData[0] & 0x03) << 4) | ((calData[1] & 0xF0) >> 4); - a3 = (short) d3; - /* [59..54] 6bit */ - d4 = ((calData[1] & 0x0F) << 2) | ((calData[2] & 0xC0) >> 6); - a4 = (short) d4; - /* [53..48] 6bit */ - d5 = (calData[2] & 0x3F); - a5 = (short) (d5 + 70); - /* [47..42] 6bit */ - d6 = ((calData[3] & 0xFC) >> 2); - a6 = (short) d6; - /* [41..36] 6bit */ - d7 = ((calData[3] & 0x03) << 4) | ((calData[4] & 0xF0) >> 4); - a7 = (short) d7; - /* [35..30] 6bit */ - d8 = ((calData[4] & 0x0F) << 2) | ((calData[5] & 0xC0) >> 6); - a8 = (short) d8; - /* [29..24] 6bit */ - d9 = (calData[5] & 0x3F); - a9 = (short) (d9 + 150); -#endif - - return result; -} - -int yas529_read(void *mlsl_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *pdata, unsigned char *data) -{ - unsigned char stat; - unsigned char rawData[6]; - unsigned char dummyData[1] = { 0 }; - unsigned char dummyRegister = 0; - tMLError result = ML_SUCCESS; - short SX, SY1, SY2, SY, SZ; - short row1fixed, row2fixed, row3fixed; - - /* Config register - Measurements results - "110 00 000" */ - dummyData[0] = YAS_REG_CONFR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - /* Measurements command register - Normal magnetic field measurement - - "000 00000" */ - dummyData[0] = YAS_REG_CMDR | 0x00; - result = - yas529_sensor_i2c_write(mlsl_handle, pdata->address, 1, - dummyData); - ERROR_CHECK(result); - MLOSSleep(10); - /* Measurement data read */ - result = - yas529_sensor_i2c_read(mlsl_handle, pdata->address, - dummyRegister, 6, - (unsigned char *) &rawData); - ERROR_CHECK(result); - - stat = rawData[0] & 0x80; - if (stat == 0x00) { - /* Extract raw data */ - SX = (short) ((unsigned short) rawData[5] + - ((unsigned short) rawData[4] & 0x7) * 256); - SY1 = - (short) ((unsigned short) rawData[3] + - ((unsigned short) rawData[2] & 0x7) * 256); - SY2 = - (short) ((unsigned short) rawData[1] + - ((unsigned short) rawData[0] & 0x7) * 256); - if ((SX <= 1) || (SY1 <= 1) || (SY2 <= 1)) - return ML_ERROR_COMPASS_DATA_UNDERFLOW; - if ((SX >= 1024) || (SY1 >= 1024) || (SY2 >= 1024)) - return ML_ERROR_COMPASS_DATA_OVERFLOW; - /* Convert to XYZ axis */ - SX = -1 * SX; - SY = SY2 - SY1; - SZ = SY1 + SY2; - - /* Apply sensitivity correction matrix */ - row1fixed = - (short) ((a1 * SX + a2 * SY + a3 * SZ) >> 7) * 41; - row2fixed = - (short) ((a4 * SX + a5 * SY + a6 * SZ) >> 7) * 41; - row3fixed = - (short) ((a7 * SX + a8 * SY + a9 * SZ) >> 7) * 41; - - data[0] = row1fixed >> 8; - data[1] = row1fixed & 0xFF; - data[2] = row2fixed >> 8; - data[3] = row2fixed & 0xFF; - data[4] = row3fixed >> 8; - data[5] = row3fixed & 0xFF; - - return ML_SUCCESS; - } else { - return ML_ERROR_COMPASS_DATA_NOT_READY; - } -} - -struct ext_slave_descr yas529_descr = { - /*.init = */ NULL, - /*.exit = */ NULL, - /*.suspend = */ yas529_suspend, - /*.resume = */ yas529_resume, - /*.read = */ yas529_read, - /*.config = */ NULL, - /*.get_config = */ NULL, - /*.name = */ "yas529", - /*.type = */ EXT_SLAVE_TYPE_COMPASS, - /*.id = */ COMPASS_ID_YAS529, - /*.reg = */ 0x06, - /*.len = */ 6, - /*.endian = */ EXT_SLAVE_BIG_ENDIAN, - /*.range = */ {19660, 8000}, -}; - -struct ext_slave_descr *yas529_get_slave_descr(void) -{ - return &yas529_descr; -} -EXPORT_SYMBOL(yas529_get_slave_descr); - -/** - * @} - */ diff --git a/drivers/misc/mpu3050/log.h b/drivers/misc/mpu3050/log.h deleted file mode 100755 index 197b774..0000000 --- a/drivers/misc/mpu3050/log.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - Copyright (C) 1995-97 Simon G. Vogl - Copyright (C) 1998-99 Frodo Looijaard - Copyright (C) 2003 Greg Kroah-Hartman - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * C/C++ logging functions. See the logging documentation for API details. - * - * We'd like these to be available from C code (in case we import some from - * somewhere), so this has a C interface. - * - * The output will be correct when the log file is shared between multiple - * threads and/or multiple processes so long as the operating system - * supports O_APPEND. These calls have mutex-protected data structures - * and so are NOT reentrant. Do not use MPL_LOG in a signal handler. - */ -#ifndef _LIBS_CUTILS_MPL_LOG_H -#define _LIBS_CUTILS_MPL_LOG_H - -#include - -#ifdef ANDROID -#include /* For the LOG macro */ -#endif - -#ifdef __KERNEL__ -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* --------------------------------------------------------------------- */ - -/* - * Normally we strip MPL_LOGV (VERBOSE messages) from release builds. - * You can modify this (for example with "#define MPL_LOG_NDEBUG 0" - * at the top of your source file) to change that behavior. - */ -#ifndef MPL_LOG_NDEBUG -#ifdef NDEBUG -#define MPL_LOG_NDEBUG 1 -#else -#define MPL_LOG_NDEBUG 0 -#endif -#endif - -#ifdef __KERNEL__ -#define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE -#define MPL_LOG_DEFAULT KERN_DEFAULT -#define MPL_LOG_VERBOSE KERN_CONT -#define MPL_LOG_DEBUG KERN_NOTICE -#define MPL_LOG_INFO KERN_INFO -#define MPL_LOG_WARN KERN_WARNING -#define MPL_LOG_ERROR KERN_ERR -#define MPL_LOG_SILENT MPL_LOG_VERBOSE - -#else - /* Based off the log priorities in android - /system/core/include/android/log.h */ -#define MPL_LOG_UNKNOWN (0) -#define MPL_LOG_DEFAULT (1) -#define MPL_LOG_VERBOSE (2) -#define MPL_LOG_DEBUG (3) -#define MPL_LOG_INFO (4) -#define MPL_LOG_WARN (5) -#define MPL_LOG_ERROR (6) -#define MPL_LOG_SILENT (8) -#endif - - -/* - * This is the local tag used for the following simplified - * logging macros. You can change this preprocessor definition - * before using the other macros to change the tag. - */ -#ifndef MPL_LOG_TAG -#ifdef __KERNEL__ -#define MPL_LOG_TAG -#else -#define MPL_LOG_TAG NULL -#endif -#endif - -/* --------------------------------------------------------------------- */ - -/* - * Simplified macro to send a verbose log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGV -#if MPL_LOG_NDEBUG -#define MPL_LOGV(...) ((void)0) -#else -#define MPL_LOGV(...) ((void)MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, __VA_ARGS__)) -#endif -#endif - -#ifndef CONDITION -#define CONDITION(cond) ((cond) != 0) -#endif - -#ifndef MPL_LOGV_IF -#if MPL_LOG_NDEBUG -#define MPL_LOGV_IF(cond, ...) ((void)0) -#else -#define MPL_LOGV_IF(cond, ...) \ - ((CONDITION(cond)) \ - ? ((void)MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, __VA_ARGS__)) \ - : (void)0) -#endif -#endif - -/* - * Simplified macro to send a debug log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGD -#define MPL_LOGD(...) ((void)MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef MPL_LOGD_IF -#define MPL_LOGD_IF(cond, ...) \ - ((CONDITION(cond)) \ - ? ((void)MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, __VA_ARGS__)) \ - : (void)0) -#endif - -/* - * Simplified macro to send an info log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGI -#define MPL_LOGI(...) ((void)MPL_LOG(LOG_INFO, MPL_LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef MPL_LOGI_IF -#define MPL_LOGI_IF(cond, ...) \ - ((CONDITION(cond)) \ - ? ((void)MPL_LOG(LOG_INFO, MPL_LOG_TAG, __VA_ARGS__)) \ - : (void)0) -#endif - -/* - * Simplified macro to send a warning log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGW -#define MPL_LOGW(...) ((void)MPL_LOG(LOG_WARN, MPL_LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef MPL_LOGW_IF -#define MPL_LOGW_IF(cond, ...) \ - ((CONDITION(cond)) \ - ? ((void)MPL_LOG(LOG_WARN, MPL_LOG_TAG, __VA_ARGS__)) \ - : (void)0) -#endif - -/* - * Simplified macro to send an error log message using the current MPL_LOG_TAG. - */ -#ifndef MPL_LOGE -#define MPL_LOGE(...) ((void)MPL_LOG(LOG_ERROR, MPL_LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef MPL_LOGE_IF -#define MPL_LOGE_IF(cond, ...) \ - ((CONDITION(cond)) \ - ? ((void)MPL_LOG(LOG_ERROR, MPL_LOG_TAG, __VA_ARGS__)) \ - : (void)0) -#endif - -/* --------------------------------------------------------------------- */ - -/* - * Log a fatal error. If the given condition fails, this stops program - * execution like a normal assertion, but also generating the given message. - * It is NOT stripped from release builds. Note that the condition test - * is -inverted- from the normal assert() semantics. - */ -#define MPL_LOG_ALWAYS_FATAL_IF(cond, ...) \ - ((CONDITION(cond)) \ - ? ((void)android_printAssert(#cond, MPL_LOG_TAG, __VA_ARGS__)) \ - : (void)0) - -#define MPL_LOG_ALWAYS_FATAL(...) \ - (((void)android_printAssert(NULL, MPL_LOG_TAG, __VA_ARGS__))) - -/* - * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that - * are stripped out of release builds. - */ -#if MPL_LOG_NDEBUG - -#define MPL_LOG_FATAL_IF(cond, ...) ((void)0) -#define MPL_LOG_FATAL(...) ((void)0) - -#else - -#define MPL_LOG_FATAL_IF(cond, ...) MPL_LOG_ALWAYS_FATAL_IF(cond, __VA_ARGS__) -#define MPL_LOG_FATAL(...) MPL_LOG_ALWAYS_FATAL(__VA_ARGS__) - -#endif - -/* - * Assertion that generates a log message when the assertion fails. - * Stripped out of release builds. Uses the current MPL_LOG_TAG. - */ -#define MPL_LOG_ASSERT(cond, ...) MPL_LOG_FATAL_IF(!(cond), __VA_ARGS__) - -/* --------------------------------------------------------------------- */ - -/* - * Basic log message macro. - * - * Example: - * MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno); - * - * The second argument may be NULL or "" to indicate the "global" tag. - */ -#ifndef MPL_LOG -#define MPL_LOG(priority, tag, ...) \ - MPL_LOG_PRI(priority, tag, __VA_ARGS__) -#endif - -/* - * Log macro that allows you to specify a number for the priority. - */ -#ifndef MPL_LOG_PRI -#ifdef ANDROID -#define MPL_LOG_PRI(priority, tag, ...) \ - LOG(priority, tag, __VA_ARGS__) -#elif defined __KERNEL__ -#define MPL_LOG_PRI(priority, tag, ...) \ - printk(MPL_##priority tag __VA_ARGS__) -#else -#define MPL_LOG_PRI(priority, tag, ...) \ - _MLPrintLog(MPL_##priority, tag, __VA_ARGS__) -#endif -#endif - -/* - * Log macro that allows you to pass in a varargs ("args" is a va_list). - */ -#ifndef MPL_LOG_PRI_VA -#ifdef ANDROID -#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \ - android_vprintLog(priority, NULL, tag, fmt, args) -#elif defined __KERNEL__ -#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \ - vprintk(MPL_##priority tag fmt, args) -#else -#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \ - _MLPrintVaLog(priority, NULL, tag, fmt, args) -#endif -#endif - -/* --------------------------------------------------------------------- */ - -/* - * =========================================================================== - * - * The stuff in the rest of this file should not be used directly. - */ - -#ifndef ANDROID - int _MLPrintLog(int priority, const char *tag, const char *fmt, - ...); - int _MLPrintVaLog(int priority, const char *tag, const char *fmt, - va_list args); -/* Final implementation of actual writing to a character device */ - int _MLWriteLog(const char *buf, int buflen); -#endif - -#ifdef __cplusplus -} -#endif -#endif /* _LIBS_CUTILS_MPL_LOG_H */ diff --git a/drivers/misc/mpu3050/mldl_cfg.c b/drivers/misc/mpu3050/mldl_cfg.c deleted file mode 100755 index 6ce2c98..0000000 --- a/drivers/misc/mpu3050/mldl_cfg.c +++ /dev/null @@ -1,1742 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup MLDL - * - * @{ - * @file mldl_cfg.c - * @brief The Motion Library Driver Layer. - */ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#include - -#include "mldl_cfg.h" -#include "mpu.h" - -#include "mlsl.h" -#include "mlos.h" - -#include "log.h" -#include "mpu-accel.h" - -#undef MPL_LOG_TAG -#define MPL_LOG_TAG "mldl_cfg:" - -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ -#ifdef M_HW -#define SLEEP 0 -#define WAKE_UP 7 -#define RESET 1 -#define STANDBY 1 -#else -/* licteral significance of all parameters used in MLDLPowerMgmtMPU */ -#define SLEEP 1 -#define WAKE_UP 0 -#define RESET 1 -#define STANDBY 1 -#endif - -/*---------------------*/ -/*- Prototypes. -*/ -/*---------------------*/ - -/*----------------------*/ -/*- Static Functions. -*/ -/*----------------------*/ - -static int dmp_stop(struct mldl_cfg *mldl_cfg, void *gyro_handle) -{ - unsigned char userCtrlReg; - int result; - - if (!mldl_cfg->dmp_is_running) - return ML_SUCCESS; - - result = MLSLSerialRead(gyro_handle, mldl_cfg->addr, - MPUREG_USER_CTRL, 1, &userCtrlReg); - ERROR_CHECK(result); - userCtrlReg = (userCtrlReg & (~BIT_FIFO_EN)) | BIT_FIFO_RST; - userCtrlReg = (userCtrlReg & (~BIT_DMP_EN)) | BIT_DMP_RST; - - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_USER_CTRL, userCtrlReg); - ERROR_CHECK(result); - mldl_cfg->dmp_is_running = 0; - - return result; - -} -/** - * @brief Starts the DMP running - * - * @return ML_SUCCESS or non-zero error code - */ -static int dmp_start(struct mldl_cfg *pdata, void *mlsl_handle) -{ - unsigned char userCtrlReg; - int result; - - if (pdata->dmp_is_running == pdata->dmp_enable) - return ML_SUCCESS; - - result = MLSLSerialRead(mlsl_handle, pdata->addr, - MPUREG_USER_CTRL, 1, &userCtrlReg); - ERROR_CHECK(result); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_USER_CTRL, - ((userCtrlReg & (~BIT_FIFO_EN)) - | BIT_FIFO_RST)); - ERROR_CHECK(result); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_USER_CTRL, userCtrlReg); - ERROR_CHECK(result); - - result = MLSLSerialRead(mlsl_handle, pdata->addr, - MPUREG_USER_CTRL, 1, &userCtrlReg); - ERROR_CHECK(result); - - if (pdata->dmp_enable) - userCtrlReg |= BIT_DMP_EN; - else - userCtrlReg &= ~BIT_DMP_EN; - - if (pdata->fifo_enable) - userCtrlReg |= BIT_FIFO_EN; - else - userCtrlReg &= ~BIT_FIFO_EN; - - userCtrlReg |= BIT_DMP_RST; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_USER_CTRL, userCtrlReg); - ERROR_CHECK(result); - pdata->dmp_is_running = pdata->dmp_enable; - - return result; -} - -/** - * @brief enables/disables the I2C bypass to an external device - * connected to MPU's secondary I2C bus. - * @param enable - * Non-zero to enable pass through. - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -static int MLDLSetI2CBypass(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - unsigned char enable) -{ - unsigned char b; - int result; - - if ((mldl_cfg->gyro_is_bypassed && enable) || - (!mldl_cfg->gyro_is_bypassed && !enable)) - return ML_SUCCESS; - - /*---- get current 'USER_CTRL' into b ----*/ - result = MLSLSerialRead(mlsl_handle, mldl_cfg->addr, - MPUREG_USER_CTRL, 1, &b); - ERROR_CHECK(result); - - b &= ~BIT_AUX_IF_EN; - - if (!enable) { - result = MLSLSerialWriteSingle(mlsl_handle, mldl_cfg->addr, - MPUREG_USER_CTRL, - (b | BIT_AUX_IF_EN)); - ERROR_CHECK(result); - } else { - /* Coming out of I2C is tricky due to several erratta. Do not - * modify this algorithm - */ - /* - * 1) wait for the right time and send the command to change - * the aux i2c slave address to an invalid address that will - * get nack'ed - * - * 0x00 is broadcast. 0x7F is unlikely to be used by any aux. - */ - result = MLSLSerialWriteSingle(mlsl_handle, mldl_cfg->addr, - MPUREG_AUX_SLV_ADDR, 0x7F); - ERROR_CHECK(result); - /* - * 2) wait enough time for a nack to occur, then go into - * bypass mode: - */ - MLOSSleep(2); - result = MLSLSerialWriteSingle(mlsl_handle, mldl_cfg->addr, - MPUREG_USER_CTRL, (b)); - ERROR_CHECK(result); - /* - * 3) wait for up to one MPU cycle then restore the slave - * address - */ - MLOSSleep(SAMPLING_PERIOD_US(mldl_cfg) / 1000); - result = MLSLSerialWriteSingle(mlsl_handle, mldl_cfg->addr, - MPUREG_AUX_SLV_ADDR, - mldl_cfg->pdata-> - accel.address); - ERROR_CHECK(result); - - /* - * 4) reset the ime interface - */ -#ifdef M_HW - result = MLSLSerialWriteSingle(mlsl_handle, mldl_cfg->addr, - MPUREG_USER_CTRL, - (b | BIT_I2C_MST_RST)); - -#else - result = MLSLSerialWriteSingle(mlsl_handle, mldl_cfg->addr, - MPUREG_USER_CTRL, - (b | BIT_AUX_IF_RST)); -#endif - ERROR_CHECK(result); - MLOSSleep(2); - } - mldl_cfg->gyro_is_bypassed = enable; - - return result; -} - -struct tsProdRevMap { - unsigned char siliconRev; - unsigned short sensTrim; -}; - -#define NUM_OF_PROD_REVS (DIM(prodRevsMap)) - -/* NOTE : 'npp' is a non production part */ -#ifdef M_HW -#define OLDEST_PROD_REV_SUPPORTED 1 -static struct tsProdRevMap prodRevsMap[] = { - {0, 0}, - {MPU_SILICON_REV_A1, 131}, /* 1 A1 (npp) */ - {MPU_SILICON_REV_A1, 131}, /* 2 A1 (npp) */ - {MPU_SILICON_REV_A1, 131}, /* 3 A1 (npp) */ - {MPU_SILICON_REV_A1, 131}, /* 4 A1 (npp) */ - {MPU_SILICON_REV_A1, 131}, /* 5 A1 (npp) */ - {MPU_SILICON_REV_A1, 131}, /* 6 A1 (npp) */ - {MPU_SILICON_REV_A1, 131}, /* 7 A1 (npp) */ - {MPU_SILICON_REV_A1, 131}, /* 8 A1 (npp) */ -}; - -#else /* !M_HW */ -#define OLDEST_PROD_REV_SUPPORTED 11 - -static struct tsProdRevMap prodRevsMap[] = { - {0, 0}, - {MPU_SILICON_REV_A4, 131}, /* 1 A? OBSOLETED */ - {MPU_SILICON_REV_A4, 131}, /* 2 | */ - {MPU_SILICON_REV_A4, 131}, /* 3 V */ - {MPU_SILICON_REV_A4, 131}, /* 4 */ - {MPU_SILICON_REV_A4, 131}, /* 5 */ - {MPU_SILICON_REV_A4, 131}, /* 6 */ - {MPU_SILICON_REV_A4, 131}, /* 7 */ - {MPU_SILICON_REV_A4, 131}, /* 8 */ - {MPU_SILICON_REV_A4, 131}, /* 9 */ - {MPU_SILICON_REV_A4, 131}, /* 10 */ - {MPU_SILICON_REV_B1, 131}, /* 11 B1 */ - {MPU_SILICON_REV_B1, 131}, /* 12 | */ - {MPU_SILICON_REV_B1, 131}, /* 13 V */ - {MPU_SILICON_REV_B1, 131}, /* 14 B4 */ - {MPU_SILICON_REV_B4, 131}, /* 15 | */ - {MPU_SILICON_REV_B4, 131}, /* 16 V */ - {MPU_SILICON_REV_B4, 131}, /* 17 */ - {MPU_SILICON_REV_B4, 131}, /* 18 */ - {MPU_SILICON_REV_B4, 115}, /* 19 */ - {MPU_SILICON_REV_B4, 115}, /* 20 */ - {MPU_SILICON_REV_B6, 131}, /* 21 B6 (B6/A9) */ - {MPU_SILICON_REV_B4, 115}, /* 22 B4 (B7/A10) */ - {MPU_SILICON_REV_B6, 0}, /* 23 B6 (npp) */ - {MPU_SILICON_REV_B6, 0}, /* 24 | (npp) */ - {MPU_SILICON_REV_B6, 0}, /* 25 V (npp) */ - {MPU_SILICON_REV_B6, 131}, /* 26 (B6/A11) */ -}; -#endif /* !M_HW */ - -/** - * @internal - * @brief Get the silicon revision ID from OTP. - * The silicon revision number is in read from OTP bank 0, - * ADDR6[7:2]. The corresponding ID is retrieved by lookup - * in a map. - * @return The silicon revision ID (0 on error). - */ -static int MLDLGetSiliconRev(struct mldl_cfg *pdata, - void *mlsl_handle) -{ - int result; - unsigned char index = 0x00; - unsigned char bank = - (BIT_PRFTCH_EN | BIT_CFG_USER_BANK | MPU_MEM_OTP_BANK_0); - unsigned short memAddr = ((bank << 8) | 0x06); - - result = MLSLSerialReadMem(mlsl_handle, pdata->addr, - memAddr, 1, &index); - ERROR_CHECK(result) - if (result) - return result; - index >>= 2; - - /* clean the prefetch and cfg user bank bits */ - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_BANK_SEL, 0); - ERROR_CHECK(result) - if (result) - return result; - - if (index < OLDEST_PROD_REV_SUPPORTED || NUM_OF_PROD_REVS <= index) { - pdata->silicon_revision = 0; - pdata->trim = 0; - MPL_LOGE("Unsupported Product Revision Detected : %d\n", index); - return ML_ERROR_INVALID_MODULE; - } - - pdata->silicon_revision = prodRevsMap[index].siliconRev; - pdata->trim = prodRevsMap[index].sensTrim; - - if (pdata->trim == 0) { - MPL_LOGE("sensitivity trim is 0" - " - unsupported non production part.\n"); - return ML_ERROR_INVALID_MODULE; - } - - return result; -} - -/** - * @brief Enable/Disable the use MPU's VDDIO level shifters. - * When enabled the voltage interface with AUX or other external - * accelerometer is using Vlogic instead of VDD (supply). - * - * @note Must be called after MLSerialOpen(). - * @note Typically be called before MLDmpOpen(). - * If called after MLDmpOpen(), must be followed by a call to - * MLDLApplyLevelShifterBit() to write the setting on the hw. - * - * @param[in] enable - * 1 to enable, 0 to disable - * - * @return ML_SUCCESS if successfull, a non-zero error code otherwise. -**/ -static int MLDLSetLevelShifterBit(struct mldl_cfg *pdata, - void *mlsl_handle, - unsigned char enable) -{ -#ifndef M_HW - int result; - unsigned char reg; - unsigned char mask; - unsigned char regval; - - if (0 == pdata->silicon_revision) - return ML_ERROR_INVALID_PARAMETER; - - /*-- on parts before B6 the VDDIO bit is bit 7 of ACCEL_BURST_ADDR -- - NOTE: this is incompatible with ST accelerometers where the VDDIO - bit MUST be set to enable ST's internal logic to autoincrement - the register address on burst reads --*/ - if ((pdata->silicon_revision & 0xf) < MPU_SILICON_REV_B6) { - reg = MPUREG_ACCEL_BURST_ADDR; - mask = 0x80; - } else { - /*-- on B6 parts the VDDIO bit was moved to FIFO_EN2 => - the mask is always 0x04 --*/ - reg = MPUREG_FIFO_EN2; - mask = 0x04; - } - - result = MLSLSerialRead(mlsl_handle, pdata->addr, reg, 1, ®val); - if (result) - return result; - - if (enable) - regval |= mask; - else - regval &= ~mask; - - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->addr, reg, regval); - - return result; -#else - return ML_SUCCESS; -#endif -} - - -#ifdef M_HW -/** - * @internal - * @param reset 1 to reset hardware - */ -static tMLError mpu60xx_pwr_mgmt(struct mldl_cfg *pdata, - void *mlsl_handle, - unsigned char reset, - unsigned char powerselection) -{ - unsigned char b; - tMLError result; - - if (powerselection < 0 || powerselection > 7) - return ML_ERROR_INVALID_PARAMETER; - - result = - MLSLSerialRead(mlsl_handle, pdata->addr, MPUREG_PWR_MGMT_1, 1, - &b); - ERROR_CHECK(result); - - b &= ~(BITS_PWRSEL); - - if (reset) { - /* Current sillicon has an errata where the reset will get - * nacked. Ignore the error code for now. */ - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, b | BIT_H_RESET); -#define M_HW_RESET_ERRATTA -#ifndef M_HW_RESET_ERRATTA - ERROR_CHECK(result); -#else - MLOSSleep(50); -#endif - } - - b |= (powerselection << 4); - - if (b & BITS_PWRSEL) - pdata->gyro_is_suspended = FALSE; - else - pdata->gyro_is_suspended = TRUE; - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, b); - ERROR_CHECK(result); - - return ML_SUCCESS; -} - -/** - * @internal - */ -static tMLError MLDLStandByGyros(struct mldl_cfg *pdata, - void *mlsl_handle, - unsigned char disable_gx, - unsigned char disable_gy, - unsigned char disable_gz) -{ - unsigned char b; - tMLError result; - - result = - MLSLSerialRead(mlsl_handle, pdata->addr, MPUREG_PWR_MGMT_2, 1, - &b); - ERROR_CHECK(result); - - b &= ~(BIT_STBY_XG | BIT_STBY_YG | BIT_STBY_ZG); - b |= (disable_gx << 2 | disable_gy << 1 | disable_gz); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGMT_2, b); - ERROR_CHECK(result); - - return ML_SUCCESS; -} - -/** - * @internal - */ -static tMLError MLDLStandByAccels(struct mldl_cfg *pdata, - void *mlsl_handle, - unsigned char disable_ax, - unsigned char disable_ay, - unsigned char disable_az) -{ - unsigned char b; - tMLError result; - - result = - MLSLSerialRead(mlsl_handle, pdata->addr, MPUREG_PWR_MGMT_2, 1, - &b); - ERROR_CHECK(result); - - b &= ~(BIT_STBY_XA | BIT_STBY_YA | BIT_STBY_ZA); - b |= (disable_ax << 2 | disable_ay << 1 | disable_az); - - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGMT_2, b); - ERROR_CHECK(result); - - return ML_SUCCESS; -} - -#else /* ! M_HW */ - -/** - * @internal - * @brief This function controls the power management on the MPU device. - * The entire chip can be put to low power sleep mode, or individual - * gyros can be turned on/off. - * - * Putting the device into sleep mode depending upon the changing needs - * of the associated applications is a recommended method for reducing - * power consuption. It is a safe opearation in that sleep/wake up of - * gyros while running will not result in any interruption of data. - * - * Although it is entirely allowed to put the device into full sleep - * while running the DMP, it is not recomended because it will disrupt - * the ongoing calculations carried on inside the DMP and consequently - * the sensor fusion algorithm. Furthermore, while in sleep mode - * read & write operation from the app processor on both registers and - * memory are disabled and can only regained by restoring the MPU in - * normal power mode. - * Disabling any of the gyro axis will reduce the associated power - * consuption from the PLL but will not stop the DMP from running - * state. - * - * @param reset - * Non-zero to reset the device. Note that this setting - * is volatile and the corresponding register bit will - * clear itself right after being applied. - * @param sleep - * Non-zero to put device into full sleep. - * @param disable_gx - * Non-zero to disable gyro X. - * @param disable_gy - * Non-zero to disable gyro Y. - * @param disable_gz - * Non-zero to disable gyro Z. - * - * @return ML_SUCCESS if successfull; a non-zero error code otherwise. - */ -static int MLDLPowerMgmtMPU(struct mldl_cfg *pdata, - void *mlsl_handle, - unsigned char reset, - unsigned char sleep, - unsigned char disable_gx, - unsigned char disable_gy, - unsigned char disable_gz) -{ - unsigned char b; - int result; - - result = - MLSLSerialRead(mlsl_handle, pdata->addr, MPUREG_PWR_MGM, 1, - &b); - ERROR_CHECK(result); - - /* If we are awake, we need to put it in bypass before resetting */ - if ((!(b & BIT_SLEEP)) && reset) - result = MLDLSetI2CBypass(pdata, mlsl_handle, 1); - - /* If we are awake, we need stop the dmp sleeping */ - if ((!(b & BIT_SLEEP)) && sleep) - dmp_stop(pdata, mlsl_handle); - - /* Reset if requested */ - if (reset) { - MPL_LOGV("Reset MPU3050\n"); - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, b | BIT_H_RESET); - ERROR_CHECK(result); - MLOSSleep(5); - pdata->gyro_needs_reset = FALSE; - /* Some chips are awake after reset and some are asleep, - * check the status */ - result = MLSLSerialRead(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, 1, &b); - ERROR_CHECK(result); - } - - /* Update the suspended state just in case we return early */ - if (b & BIT_SLEEP) - pdata->gyro_is_suspended = TRUE; - else - pdata->gyro_is_suspended = FALSE; - - /* if power status match requested, nothing else's left to do */ - if ((b & (BIT_SLEEP | BIT_STBY_XG | BIT_STBY_YG | BIT_STBY_ZG)) == - (((sleep != 0) * BIT_SLEEP) | - ((disable_gx != 0) * BIT_STBY_XG) | - ((disable_gy != 0) * BIT_STBY_YG) | - ((disable_gz != 0) * BIT_STBY_ZG))) { - return ML_SUCCESS; - } - - /* - * This specific transition between states needs to be reinterpreted: - * (1,1,1,1) -> (0,1,1,1) has to become - * (1,1,1,1) -> (1,0,0,0) -> (0,1,1,1) - * where - * (1,1,1,1) is (sleep=1,disable_gx=1,disable_gy=1,disable_gz=1) - */ - if ((b & (BIT_SLEEP | BIT_STBY_XG | BIT_STBY_YG | BIT_STBY_ZG)) == - (BIT_SLEEP | BIT_STBY_XG | BIT_STBY_YG | BIT_STBY_ZG) - && ((!sleep) && disable_gx && disable_gy && disable_gz)) { - result = MLDLPowerMgmtMPU(pdata, mlsl_handle, 0, 1, 0, 0, 0); - if (result) - return result; - b |= BIT_SLEEP; - b &= ~(BIT_STBY_XG | BIT_STBY_YG | BIT_STBY_ZG); - } - - if ((b & BIT_SLEEP) != ((sleep != 0) * BIT_SLEEP)) { - if (sleep) { - result = MLDLSetI2CBypass(pdata, mlsl_handle, 1); - ERROR_CHECK(result); - b |= BIT_SLEEP; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, b); - ERROR_CHECK(result); - pdata->gyro_is_suspended = TRUE; - } else { - b &= ~BIT_SLEEP; - result = - MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, b); - ERROR_CHECK(result); - pdata->gyro_is_suspended = FALSE; - MLOSSleep(5); - } - } - /*--- - WORKAROUND FOR PUTTING GYRO AXIS in STAND-BY MODE - 1) put one axis at a time in stand-by - ---*/ - if ((b & BIT_STBY_XG) != ((disable_gx != 0) * BIT_STBY_XG)) { - b ^= BIT_STBY_XG; - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, b); - ERROR_CHECK(result); - } - if ((b & BIT_STBY_YG) != ((disable_gy != 0) * BIT_STBY_YG)) { - b ^= BIT_STBY_YG; - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, b); - ERROR_CHECK(result); - } - if ((b & BIT_STBY_ZG) != ((disable_gz != 0) * BIT_STBY_ZG)) { - b ^= BIT_STBY_ZG; - result = MLSLSerialWriteSingle(mlsl_handle, pdata->addr, - MPUREG_PWR_MGM, b); - ERROR_CHECK(result); - } - - return ML_SUCCESS; -} -#endif /* M_HW */ - - -void mpu_print_cfg(struct mldl_cfg *mldl_cfg) -{ - struct mpu3050_platform_data *pdata = mldl_cfg->pdata; - struct ext_slave_platform_data *accel = &mldl_cfg->pdata->accel; - struct ext_slave_platform_data *compass = - &mldl_cfg->pdata->compass; - struct ext_slave_platform_data *pressure = - &mldl_cfg->pdata->pressure; - - MPL_LOGD("mldl_cfg.addr = %02x\n", mldl_cfg->addr); - MPL_LOGD("mldl_cfg.int_config = %02x\n", - mldl_cfg->int_config); - MPL_LOGD("mldl_cfg.ext_sync = %02x\n", mldl_cfg->ext_sync); - MPL_LOGD("mldl_cfg.full_scale = %02x\n", - mldl_cfg->full_scale); - MPL_LOGD("mldl_cfg.lpf = %02x\n", mldl_cfg->lpf); - MPL_LOGD("mldl_cfg.clk_src = %02x\n", mldl_cfg->clk_src); - MPL_LOGD("mldl_cfg.divider = %02x\n", mldl_cfg->divider); - MPL_LOGD("mldl_cfg.dmp_enable = %02x\n", - mldl_cfg->dmp_enable); - MPL_LOGD("mldl_cfg.fifo_enable = %02x\n", - mldl_cfg->fifo_enable); - MPL_LOGD("mldl_cfg.dmp_cfg1 = %02x\n", mldl_cfg->dmp_cfg1); - MPL_LOGD("mldl_cfg.dmp_cfg2 = %02x\n", mldl_cfg->dmp_cfg2); - MPL_LOGD("mldl_cfg.offset_tc[0] = %02x\n", - mldl_cfg->offset_tc[0]); - MPL_LOGD("mldl_cfg.offset_tc[1] = %02x\n", - mldl_cfg->offset_tc[1]); - MPL_LOGD("mldl_cfg.offset_tc[2] = %02x\n", - mldl_cfg->offset_tc[2]); - MPL_LOGD("mldl_cfg.silicon_revision = %02x\n", - mldl_cfg->silicon_revision); - MPL_LOGD("mldl_cfg.product_id = %02x\n", - mldl_cfg->product_id); - MPL_LOGD("mldl_cfg.trim = %02x\n", mldl_cfg->trim); - MPL_LOGD("mldl_cfg.requested_sensors= %04lx\n", - mldl_cfg->requested_sensors); - - if (mldl_cfg->accel) { - MPL_LOGD("slave_accel->suspend = %02x\n", - (int) mldl_cfg->accel->suspend); - MPL_LOGD("slave_accel->resume = %02x\n", - (int) mldl_cfg->accel->resume); - MPL_LOGD("slave_accel->read = %02x\n", - (int) mldl_cfg->accel->read); - MPL_LOGD("slave_accel->type = %02x\n", - mldl_cfg->accel->type); - MPL_LOGD("slave_accel->reg = %02x\n", - mldl_cfg->accel->reg); - MPL_LOGD("slave_accel->len = %02x\n", - mldl_cfg->accel->len); - MPL_LOGD("slave_accel->endian = %02x\n", - mldl_cfg->accel->endian); - MPL_LOGD("slave_accel->range.mantissa= %02lx\n", - mldl_cfg->accel->range.mantissa); - MPL_LOGD("slave_accel->range.fraction= %02lx\n", - mldl_cfg->accel->range.fraction); - } else { - MPL_LOGD("slave_accel = NULL\n"); - } - - if (mldl_cfg->compass) { - MPL_LOGD("slave_compass->suspend = %02x\n", - (int) mldl_cfg->compass->suspend); - MPL_LOGD("slave_compass->resume = %02x\n", - (int) mldl_cfg->compass->resume); - MPL_LOGD("slave_compass->read = %02x\n", - (int) mldl_cfg->compass->read); - MPL_LOGD("slave_compass->type = %02x\n", - mldl_cfg->compass->type); - MPL_LOGD("slave_compass->reg = %02x\n", - mldl_cfg->compass->reg); - MPL_LOGD("slave_compass->len = %02x\n", - mldl_cfg->compass->len); - MPL_LOGD("slave_compass->endian = %02x\n", - mldl_cfg->compass->endian); - MPL_LOGD("slave_compass->range.mantissa= %02lx\n", - mldl_cfg->compass->range.mantissa); - MPL_LOGD("slave_compass->range.fraction= %02lx\n", - mldl_cfg->compass->range.fraction); - - } else { - MPL_LOGD("slave_compass = NULL\n"); - } - - if (mldl_cfg->pressure) { - MPL_LOGD("slave_pressure->suspend = %02x\n", - (int) mldl_cfg->pressure->suspend); - MPL_LOGD("slave_pressure->resume = %02x\n", - (int) mldl_cfg->pressure->resume); - MPL_LOGD("slave_pressure->read = %02x\n", - (int) mldl_cfg->pressure->read); - MPL_LOGD("slave_pressure->type = %02x\n", - mldl_cfg->pressure->type); - MPL_LOGD("slave_pressure->reg = %02x\n", - mldl_cfg->pressure->reg); - MPL_LOGD("slave_pressure->len = %02x\n", - mldl_cfg->pressure->len); - MPL_LOGD("slave_pressure->endian = %02x\n", - mldl_cfg->pressure->endian); - MPL_LOGD("slave_pressure->range.mantissa= %02lx\n", - mldl_cfg->pressure->range.mantissa); - MPL_LOGD("slave_pressure->range.fraction= %02lx\n", - mldl_cfg->pressure->range.fraction); - - } else { - MPL_LOGD("slave_pressure = NULL\n"); - } - MPL_LOGD("accel->get_slave_descr = %x\n", - (unsigned int) accel->get_slave_descr); - MPL_LOGD("accel->irq = %02x\n", accel->irq); - MPL_LOGD("accel->adapt_num = %02x\n", accel->adapt_num); - MPL_LOGD("accel->bus = %02x\n", accel->bus); - MPL_LOGD("accel->address = %02x\n", accel->address); - MPL_LOGD("accel->orientation =\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n", - accel->orientation[0], accel->orientation[1], - accel->orientation[2], accel->orientation[3], - accel->orientation[4], accel->orientation[5], - accel->orientation[6], accel->orientation[7], - accel->orientation[8]); - MPL_LOGD("compass->get_slave_descr = %x\n", - (unsigned int) compass->get_slave_descr); - MPL_LOGD("compass->irq = %02x\n", compass->irq); - MPL_LOGD("compass->adapt_num = %02x\n", compass->adapt_num); - MPL_LOGD("compass->bus = %02x\n", compass->bus); - MPL_LOGD("compass->address = %02x\n", compass->address); - MPL_LOGD("compass->orientation =\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n", - compass->orientation[0], compass->orientation[1], - compass->orientation[2], compass->orientation[3], - compass->orientation[4], compass->orientation[5], - compass->orientation[6], compass->orientation[7], - compass->orientation[8]); - MPL_LOGD("pressure->get_slave_descr = %x\n", - (unsigned int) pressure->get_slave_descr); - MPL_LOGD("pressure->irq = %02x\n", pressure->irq); - MPL_LOGD("pressure->adapt_num = %02x\n", pressure->adapt_num); - MPL_LOGD("pressure->bus = %02x\n", pressure->bus); - MPL_LOGD("pressure->address = %02x\n", pressure->address); - MPL_LOGD("pressure->orientation =\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n", - pressure->orientation[0], pressure->orientation[1], - pressure->orientation[2], pressure->orientation[3], - pressure->orientation[4], pressure->orientation[5], - pressure->orientation[6], pressure->orientation[7], - pressure->orientation[8]); - - MPL_LOGD("pdata->int_config = %02x\n", pdata->int_config); - MPL_LOGD("pdata->level_shifter = %02x\n", - pdata->level_shifter); - MPL_LOGD("pdata->orientation =\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n" - " %2d %2d %2d\n", - pdata->orientation[0], pdata->orientation[1], - pdata->orientation[2], pdata->orientation[3], - pdata->orientation[4], pdata->orientation[5], - pdata->orientation[6], pdata->orientation[7], - pdata->orientation[8]); - - MPL_LOGD("Struct sizes: mldl_cfg: %d, " - "ext_slave_descr:%d, " - "mpu3050_platform_data:%d: RamOffset: %d\n", - sizeof(struct mldl_cfg), sizeof(struct ext_slave_descr), - sizeof(struct mpu3050_platform_data), - offsetof(struct mldl_cfg, ram)); -} - -int mpu_set_slave(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - struct ext_slave_descr *slave, - struct ext_slave_platform_data *slave_pdata) -{ - int result; - unsigned char reg; - unsigned char slave_reg; - unsigned char slave_len; - unsigned char slave_endian; - unsigned char slave_address; - - result = MLDLSetI2CBypass(mldl_cfg, gyro_handle, TRUE); - - if (NULL == slave || NULL == slave_pdata) { - slave_reg = 0; - slave_len = 0; - slave_endian = 0; - slave_address = 0; - } else { - slave_reg = slave->reg; - slave_len = slave->len; - slave_endian = slave->endian; - slave_address = slave_pdata->address; - } - - /* Address */ - result = MLSLSerialWriteSingle(gyro_handle, - mldl_cfg->addr, - MPUREG_AUX_SLV_ADDR, - slave_address); - ERROR_CHECK(result); - /* Register */ - result = MLSLSerialRead(gyro_handle, mldl_cfg->addr, - MPUREG_ACCEL_BURST_ADDR, 1, - ®); - ERROR_CHECK(result); - reg = ((reg & 0x80) | slave_reg); - result = MLSLSerialWriteSingle(gyro_handle, - mldl_cfg->addr, - MPUREG_ACCEL_BURST_ADDR, - reg); - ERROR_CHECK(result); - -#ifdef M_HW - /* Length, byte swapping, grouping & enable */ - if (slave_len > BITS_SLV_LENG) { - MPL_LOGW("Limiting slave burst read length to " - "the allowed maximum (15B, req. %d)\n", - slave_len); - slave_len = BITS_SLV_LENG; - } - reg = slave_len; - if (slave_endian == EXT_SLAVE_LITTLE_ENDIAN) - reg |= BIT_SLV_BYTE_SW; - reg |= BIT_SLV_GRP; - reg |= BIT_SLV_ENABLE; - - result = MLSLSerialWriteSingle(gyro_handle, - mldl_cfg->addr, - MPUREG_I2C_SLV0_CTRL, - reg); -#else - /* Length */ - result = MLSLSerialRead(gyro_handle, mldl_cfg->addr, - MPUREG_USER_CTRL, 1, ®); - ERROR_CHECK(result); - reg = (reg & ~BIT_AUX_RD_LENG); - result = MLSLSerialWriteSingle(gyro_handle, - mldl_cfg->addr, - MPUREG_USER_CTRL, reg); - ERROR_CHECK(result); -#endif - - if (slave_address) { - result = MLDLSetI2CBypass(mldl_cfg, gyro_handle, FALSE); - ERROR_CHECK(result); - } - return result; -} - -/** - * Check to see if the gyro was reset by testing a couple of registers known - * to change on reset. - * - * @param mldl_cfg mldl configuration structure - * @param gyro_handle handle used to communicate with the gyro - * - * @return ML_SUCCESS or non-zero error code - */ -static int mpu_was_reset(struct mldl_cfg *mldl_cfg, void *gyro_handle) -{ - int result = ML_SUCCESS; - unsigned char reg; - - result = MLSLSerialRead(gyro_handle, mldl_cfg->addr, - MPUREG_DMP_CFG_2, 1, ®); - ERROR_CHECK(result); - - if (mldl_cfg->dmp_cfg2 != reg) - return TRUE; - - if (0 != mldl_cfg->dmp_cfg1) - return FALSE; - - result = MLSLSerialRead(gyro_handle, mldl_cfg->addr, - MPUREG_SMPLRT_DIV, 1, ®); - ERROR_CHECK(result); - if (reg != mldl_cfg->divider) - return TRUE; - - if (0 != mldl_cfg->divider) - return FALSE; - - /* Inconclusive assume it was reset */ - return TRUE; -} - -static int gyro_resume(struct mldl_cfg *mldl_cfg, void *gyro_handle) -{ - int result; - int ii; - int jj; - unsigned char reg; - unsigned char regs[7]; - - /* Wake up the part */ -#ifdef M_HW - result = mpu60xx_pwr_mgmt(mldl_cfg, gyro_handle, RESET, - WAKE_UP); - ERROR_CHECK(result); - - /* Configure the MPU */ - result = MLDLSetI2CBypass(mldl_cfg, gyro_handle, 1); - ERROR_CHECK(result); - /* setting int_config with the propert flag BIT_BYPASS_EN - should be done by the setup functions */ - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_INT_PIN_CFG, - (mldl_cfg->pdata->int_config | - BIT_BYPASS_EN)); - ERROR_CHECK(result); - /* temporary: masking out higher bits to avoid switching - intelligence */ - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_INT_ENABLE, - (mldl_cfg->int_config)); - ERROR_CHECK(result); -#else - result = MLDLPowerMgmtMPU(mldl_cfg, gyro_handle, 0, 0, - mldl_cfg->gyro_power & BIT_STBY_XG, - mldl_cfg->gyro_power & BIT_STBY_YG, - mldl_cfg->gyro_power & BIT_STBY_ZG); - - if (!mldl_cfg->gyro_needs_reset && - !mpu_was_reset(mldl_cfg, gyro_handle)) { - return ML_SUCCESS; - } - - result = MLDLPowerMgmtMPU(mldl_cfg, gyro_handle, 1, 0, - mldl_cfg->gyro_power & BIT_STBY_XG, - mldl_cfg->gyro_power & BIT_STBY_YG, - mldl_cfg->gyro_power & BIT_STBY_ZG); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_INT_CFG, - (mldl_cfg->int_config | - mldl_cfg->pdata->int_config)); - ERROR_CHECK(result); -#endif - - result = MLSLSerialRead(gyro_handle, mldl_cfg->addr, - MPUREG_PWR_MGM, 1, ®); - ERROR_CHECK(result); - reg &= ~BITS_CLKSEL; - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_PWR_MGM, - mldl_cfg->clk_src | reg); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_SMPLRT_DIV, - mldl_cfg->divider); - ERROR_CHECK(result); - -#ifdef M_HW - reg = DLPF_FS_SYNC_VALUE(0, mldl_cfg->full_scale, 0); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_GYRO_CONFIG, reg); - reg = DLPF_FS_SYNC_VALUE(mldl_cfg->ext_sync, 0, mldl_cfg->lpf); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_CONFIG, reg); -#else - reg = DLPF_FS_SYNC_VALUE(mldl_cfg->ext_sync, - mldl_cfg->full_scale, mldl_cfg->lpf); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_DLPF_FS_SYNC, reg); -#endif - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_DMP_CFG_1, - mldl_cfg->dmp_cfg1); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_DMP_CFG_2, - mldl_cfg->dmp_cfg2); - ERROR_CHECK(result); - - /* Write and verify memory */ - for (ii = 0; ii < MPU_MEM_NUM_RAM_BANKS; ii++) { - unsigned char read[MPU_MEM_BANK_SIZE]; - - result = MLSLSerialWriteMem(gyro_handle, - mldl_cfg->addr, - ((ii << 8) | 0x00), - MPU_MEM_BANK_SIZE, - mldl_cfg->ram[ii]); - ERROR_CHECK(result); - result = MLSLSerialReadMem(gyro_handle, mldl_cfg->addr, - ((ii << 8) | 0x00), - MPU_MEM_BANK_SIZE, read); - ERROR_CHECK(result); - -#ifdef M_HW -#define ML_SKIP_CHECK 38 -#else -#define ML_SKIP_CHECK 20 -#endif - for (jj = 0; jj < MPU_MEM_BANK_SIZE; jj++) { - /* skip the register memory locations */ - if (ii == 0 && jj < ML_SKIP_CHECK) - continue; - if (mldl_cfg->ram[ii][jj] != read[jj]) { - result = ML_ERROR_SERIAL_WRITE; - break; - } - } - ERROR_CHECK(result); - } - - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_XG_OFFS_TC, - mldl_cfg->offset_tc[0]); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_YG_OFFS_TC, - mldl_cfg->offset_tc[1]); - ERROR_CHECK(result); - result = MLSLSerialWriteSingle(gyro_handle, mldl_cfg->addr, - MPUREG_ZG_OFFS_TC, - mldl_cfg->offset_tc[2]); - ERROR_CHECK(result); - - regs[0] = MPUREG_X_OFFS_USRH; - for (ii = 0; ii < DIM(mldl_cfg->offset); ii++) { - regs[1 + ii * 2] = - (unsigned char)(mldl_cfg->offset[ii] >> 8) - & 0xff; - regs[1 + ii * 2 + 1] = - (unsigned char)(mldl_cfg->offset[ii] & 0xff); - } - result = MLSLSerialWrite(gyro_handle, mldl_cfg->addr, 7, regs); - ERROR_CHECK(result); - - /* Configure slaves */ - result = MLDLSetLevelShifterBit(mldl_cfg, gyro_handle, - mldl_cfg->pdata->level_shifter); - ERROR_CHECK(result); - return result; -} -/******************************************************************************* - ******************************************************************************* - * Exported functions - ******************************************************************************* - ******************************************************************************/ - -/** - * Initializes the pdata structure to defaults. - * - * Opens the device to read silicon revision, product id and whoami. - * - * @param mldl_cfg - * The internal device configuration data structure. - * @param mlsl_handle - * The serial communication handle. - * - * @return ML_SUCCESS if silicon revision, product id and woami are supported - * by this software. - */ -int mpu3050_open(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle) -{ - int result; - /* Default is Logic HIGH, pushpull, latch disabled, anyread to clear */ - mldl_cfg->int_config = BIT_INT_ANYRD_2CLEAR | BIT_DMP_INT_EN; - mldl_cfg->clk_src = MPU_CLK_SEL_PLLGYROZ; - mldl_cfg->lpf = MPU_FILTER_42HZ; - mldl_cfg->full_scale = MPU_FS_2000DPS; - mldl_cfg->divider = 4; - mldl_cfg->dmp_enable = 1; - mldl_cfg->fifo_enable = 1; - mldl_cfg->ext_sync = 0; - mldl_cfg->dmp_cfg1 = 0; - mldl_cfg->dmp_cfg2 = 0; - mldl_cfg->gyro_power = 0; - mldl_cfg->gyro_is_bypassed = TRUE; - mldl_cfg->dmp_is_running = FALSE; - mldl_cfg->gyro_is_suspended = TRUE; - mldl_cfg->accel_is_suspended = TRUE; - mldl_cfg->compass_is_suspended = TRUE; - mldl_cfg->pressure_is_suspended = TRUE; - mldl_cfg->gyro_needs_reset = FALSE; - if (mldl_cfg->addr == 0) { -#ifdef __KERNEL__ - return ML_ERROR_INVALID_PARAMETER; -#else - mldl_cfg->addr = 0x68; -#endif - } - - /* - * Reset, - * Take the DMP out of sleep, and - * read the product_id, sillicon rev and whoami - */ -#ifdef M_HW - result = mpu60xx_pwr_mgmt(mldl_cfg, mlsl_handle, - RESET, WAKE_UP); -#else - result = MLDLPowerMgmtMPU(mldl_cfg, mlsl_handle, RESET, 0, 0, 0, 0); -#endif - ERROR_CHECK(result); - - result = MLDLGetSiliconRev(mldl_cfg, mlsl_handle); - ERROR_CHECK(result); -#ifndef M_HW - result = MLSLSerialRead(mlsl_handle, mldl_cfg->addr, - MPUREG_PRODUCT_ID, 1, - &mldl_cfg->product_id); - ERROR_CHECK(result); -#endif - - /* Get the factory temperature compensation offsets */ - result = MLSLSerialRead(mlsl_handle, mldl_cfg->addr, - MPUREG_XG_OFFS_TC, 1, - &mldl_cfg->offset_tc[0]); - ERROR_CHECK(result); - result = MLSLSerialRead(mlsl_handle, mldl_cfg->addr, - MPUREG_YG_OFFS_TC, 1, - &mldl_cfg->offset_tc[1]); - ERROR_CHECK(result); - result = MLSLSerialRead(mlsl_handle, mldl_cfg->addr, - MPUREG_ZG_OFFS_TC, 1, - &mldl_cfg->offset_tc[2]); - ERROR_CHECK(result); - - /* Configure the MPU */ -#ifdef M_HW - result = mpu60xx_pwr_mgmt(mldl_cfg, mlsl_handle, - FALSE, SLEEP); -#else - result = - MLDLPowerMgmtMPU(mldl_cfg, mlsl_handle, 0, SLEEP, 0, 0, 0); -#endif - ERROR_CHECK(result); - - if (mldl_cfg->accel && mldl_cfg->accel->init) { - result = mldl_cfg->accel->init(accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel); - ERROR_CHECK(result); - } - - if (mldl_cfg->compass && mldl_cfg->compass->init) { - result = mldl_cfg->compass->init(compass_handle, - mldl_cfg->compass, - &mldl_cfg->pdata->compass); - if (ML_SUCCESS != result) { - MPL_LOGE("mldl_cfg->compass->init returned %d\n", - result); - goto out_accel; - } - } - if (mldl_cfg->pressure && mldl_cfg->pressure->init) { - result = mldl_cfg->pressure->init(pressure_handle, - mldl_cfg->pressure, - &mldl_cfg->pdata->pressure); - if (ML_SUCCESS != result) { - MPL_LOGE("mldl_cfg->pressure->init returned %d\n", - result); - goto out_compass; - } - } - - mldl_cfg->requested_sensors = ML_THREE_AXIS_GYRO; - if (mldl_cfg->accel && mldl_cfg->accel->resume) - mldl_cfg->requested_sensors |= ML_THREE_AXIS_ACCEL; - - if (mldl_cfg->compass && mldl_cfg->compass->resume) - mldl_cfg->requested_sensors |= ML_THREE_AXIS_COMPASS; - - if (mldl_cfg->pressure && mldl_cfg->pressure->resume) - mldl_cfg->requested_sensors |= ML_THREE_AXIS_PRESSURE; - - return result; - -out_compass: - if (mldl_cfg->compass->init) - mldl_cfg->compass->exit(compass_handle, - mldl_cfg->compass, - &mldl_cfg->pdata->compass); -out_accel: - if (mldl_cfg->accel->init) - mldl_cfg->accel->exit(accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel); - return result; - -} - -/** - * Close the mpu3050 interface - * - * @param mldl_cfg pointer to the configuration structure - * @param mlsl_handle pointer to the serial layer handle - * - * @return ML_SUCCESS or non-zero error code - */ -int mpu3050_close(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle) -{ - int result = ML_SUCCESS; - int ret_result = ML_SUCCESS; - - if (mldl_cfg->accel && mldl_cfg->accel->exit) { - result = mldl_cfg->accel->exit(accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel); - if (ML_SUCCESS != result) - MPL_LOGE("Accel exit failed %d\n", result); - ret_result = result; - } - if (ML_SUCCESS == ret_result) - ret_result = result; - - if (mldl_cfg->compass && mldl_cfg->compass->exit) { - result = mldl_cfg->compass->exit(compass_handle, - mldl_cfg->compass, - &mldl_cfg->pdata->compass); - if (ML_SUCCESS != result) - MPL_LOGE("Compass exit failed %d\n", result); - } - if (ML_SUCCESS == ret_result) - ret_result = result; - - if (mldl_cfg->pressure && mldl_cfg->pressure->exit) { - result = mldl_cfg->pressure->exit(pressure_handle, - mldl_cfg->pressure, - &mldl_cfg->pdata->pressure); - if (ML_SUCCESS != result) - MPL_LOGE("Pressure exit failed %d\n", result); - } - if (ML_SUCCESS == ret_result) - ret_result = result; - - return ret_result; -} - -/** - * @brief resume the MPU3050 device and all the other sensor - * devices from their low power state. - * - * @param mldl_cfg - * pointer to the configuration structure - * @param gyro_handle - * the main file handle to the MPU3050 device. - * @param accel_handle - * an handle to the accelerometer device, if sitting - * onto a separate bus. Can match mlsl_handle if - * the accelerometer device operates on the same - * primary bus of MPU. - * @param compass_handle - * an handle to the compass device, if sitting - * onto a separate bus. Can match mlsl_handle if - * the compass device operates on the same - * primary bus of MPU. - * @param pressure_handle - * an handle to the pressure sensor device, if sitting - * onto a separate bus. Can match mlsl_handle if - * the pressure sensor device operates on the same - * primary bus of MPU. - * @param resume_gyro - * whether resuming the gyroscope device is - * actually needed (if the device supports low power - * mode of some sort). - * @param resume_accel - * whether resuming the accelerometer device is - * actually needed (if the device supports low power - * mode of some sort). - * @param resume_compass - * whether resuming the compass device is - * actually needed (if the device supports low power - * mode of some sort). - * @param resume_pressure - * whether resuming the pressure sensor device is - * actually needed (if the device supports low power - * mode of some sort). - * @return ML_SUCCESS or a non-zero error code. - */ -int mpu3050_resume(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle, - bool resume_gyro, - bool resume_accel, - bool resume_compass, - bool resume_pressure) -{ - int result = ML_SUCCESS; - -#ifdef CONFIG_MPU_SENSORS_DEBUG - mpu_print_cfg(mldl_cfg); -#endif - - if (resume_accel && - ((!mldl_cfg->accel) || (!mldl_cfg->accel->resume))) - return ML_ERROR_INVALID_PARAMETER; - if (resume_compass && - ((!mldl_cfg->compass) || (!mldl_cfg->compass->resume))) - return ML_ERROR_INVALID_PARAMETER; - if (resume_pressure && - ((!mldl_cfg->pressure) || (!mldl_cfg->pressure->resume))) - return ML_ERROR_INVALID_PARAMETER; - - if (resume_gyro && mldl_cfg->gyro_is_suspended) { - result = gyro_resume(mldl_cfg, gyro_handle); - ERROR_CHECK(result); - } - - if (resume_accel && mldl_cfg->accel_is_suspended) { - if (!mldl_cfg->gyro_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->accel.bus) { - result = MLDLSetI2CBypass(mldl_cfg, gyro_handle, TRUE); - ERROR_CHECK(result); - } - -#if 0 - result = mldl_cfg->accel->resume(accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel); -#else - result = mpu_accel_resume(mldl_cfg); -#endif - ERROR_CHECK(result); - mldl_cfg->accel_is_suspended = FALSE; - } - - if (!mldl_cfg->gyro_is_suspended && !mldl_cfg->accel_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->accel.bus) { - result = mpu_set_slave(mldl_cfg, - gyro_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel); - ERROR_CHECK(result); - } - - if (resume_compass && mldl_cfg->compass_is_suspended) { - if (!mldl_cfg->gyro_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->compass.bus) { - result = MLDLSetI2CBypass(mldl_cfg, gyro_handle, TRUE); - ERROR_CHECK(result); - } - result = mldl_cfg->compass->resume(compass_handle, - mldl_cfg->compass, - &mldl_cfg->pdata-> - compass); - ERROR_CHECK(result); - mldl_cfg->compass_is_suspended = FALSE; - } - - if (!mldl_cfg->gyro_is_suspended && !mldl_cfg->compass_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->compass.bus) { - result = mpu_set_slave(mldl_cfg, - gyro_handle, - mldl_cfg->compass, - &mldl_cfg->pdata->compass); - ERROR_CHECK(result); - } - - if (resume_pressure && mldl_cfg->pressure_is_suspended) { - if (!mldl_cfg->gyro_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->pressure.bus) { - result = MLDLSetI2CBypass(mldl_cfg, gyro_handle, TRUE); - ERROR_CHECK(result); - } - result = mldl_cfg->pressure->resume(pressure_handle, - mldl_cfg->pressure, - &mldl_cfg->pdata-> - pressure); - ERROR_CHECK(result); - mldl_cfg->pressure_is_suspended = FALSE; - } - - if (!mldl_cfg->gyro_is_suspended && !mldl_cfg->pressure_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->pressure.bus) { - result = mpu_set_slave(mldl_cfg, - gyro_handle, - mldl_cfg->pressure, - &mldl_cfg->pdata->pressure); - ERROR_CHECK(result); - } - - /* Now start */ - if (resume_gyro) { - result = dmp_start(mldl_cfg, gyro_handle); - ERROR_CHECK(result); - } - - return result; -} - -/** - * @brief suspend the MPU3050 device and all the other sensor - * devices into their low power state. - * @param gyro_handle - * the main file handle to the MPU3050 device. - * @param accel_handle - * an handle to the accelerometer device, if sitting - * onto a separate bus. Can match gyro_handle if - * the accelerometer device operates on the same - * primary bus of MPU. - * @param compass_handle - * an handle to the compass device, if sitting - * onto a separate bus. Can match gyro_handle if - * the compass device operates on the same - * primary bus of MPU. - * @param pressure_handle - * an handle to the pressure sensor device, if sitting - * onto a separate bus. Can match gyro_handle if - * the pressure sensor device operates on the same - * primary bus of MPU. - * @param accel - * whether suspending the accelerometer device is - * actually needed (if the device supports low power - * mode of some sort). - * @param compass - * whether suspending the compass device is - * actually needed (if the device supports low power - * mode of some sort). - * @param pressure - * whether suspending the pressure sensor device is - * actually needed (if the device supports low power - * mode of some sort). - * @return ML_SUCCESS or a non-zero error code. - */ -int mpu3050_suspend(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle, - bool suspend_gyro, - bool suspend_accel, - bool suspend_compass, - bool suspend_pressure) -{ - int result = ML_SUCCESS; - - if (suspend_gyro && !mldl_cfg->gyro_is_suspended) { -#ifdef M_HW - return ML_SUCCESS; - /* This puts the bus into bypass mode */ - result = MLDLSetI2CBypass(mldl_cfg, gyro_handle, 1); - ERROR_CHECK(result); - result = mpu60xx_pwr_mgmt(mldl_cfg, gyro_handle, 0, SLEEP); -#else - result = MLDLPowerMgmtMPU(mldl_cfg, gyro_handle, - 0, SLEEP, 0, 0, 0); -#endif - ERROR_CHECK(result); - } - - if (!mldl_cfg->accel_is_suspended && suspend_accel && - mldl_cfg->accel && mldl_cfg->accel->suspend) { - if (!mldl_cfg->gyro_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->accel.bus) { - result = mpu_set_slave(mldl_cfg, gyro_handle, - NULL, NULL); - ERROR_CHECK(result); - } - -#if 0 - result = mldl_cfg->accel->suspend(accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel); -#else - result = mpu_accel_suspend(mldl_cfg); -#endif - ERROR_CHECK(result); - mldl_cfg->accel_is_suspended = TRUE; - } - - if (!mldl_cfg->compass_is_suspended && suspend_compass && - mldl_cfg->compass && mldl_cfg->compass->suspend) { - if (!mldl_cfg->gyro_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->compass.bus) { - result = mpu_set_slave(mldl_cfg, gyro_handle, - NULL, NULL); - ERROR_CHECK(result); - } - result = mldl_cfg->compass->suspend(compass_handle, - mldl_cfg->compass, - &mldl_cfg-> - pdata->compass); - ERROR_CHECK(result); - mldl_cfg->compass_is_suspended = TRUE; - } - - if (!mldl_cfg->pressure_is_suspended && suspend_pressure && - mldl_cfg->pressure && mldl_cfg->pressure->suspend) { - if (!mldl_cfg->gyro_is_suspended && - EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->pressure.bus) { - result = mpu_set_slave(mldl_cfg, gyro_handle, - NULL, NULL); - ERROR_CHECK(result); - } - result = mldl_cfg->pressure->suspend(pressure_handle, - mldl_cfg->pressure, - &mldl_cfg-> - pdata->pressure); - ERROR_CHECK(result); - mldl_cfg->pressure_is_suspended = TRUE; - } - return result; -} - - -/** - * @brief read raw sensor data from the accelerometer device - * in use. - * @param mldl_cfg - * A pointer to the struct mldl_cfg data structure. - * @param accel_handle - * The handle to the device the accelerometer is connected to. - * @param data - * a buffer to store the raw sensor data. - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -int mpu3050_read_accel(struct mldl_cfg *mldl_cfg, - void *accel_handle, unsigned char *data) -{ - if (NULL != mldl_cfg->accel && NULL != mldl_cfg->accel->read) - if ((EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->accel.bus) - && (!mldl_cfg->gyro_is_bypassed)) - return ML_ERROR_FEATURE_NOT_ENABLED; - else - return mldl_cfg->accel->read(accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -/** - * @brief read raw sensor data from the compass device - * in use. - * @param mldl_cfg - * A pointer to the struct mldl_cfg data structure. - * @param compass_handle - * The handle to the device the compass is connected to. - * @param data - * a buffer to store the raw sensor data. - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -int mpu3050_read_compass(struct mldl_cfg *mldl_cfg, - void *compass_handle, unsigned char *data) -{ - if (NULL != mldl_cfg->compass && NULL != mldl_cfg->compass->read) - if ((EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->compass.bus) - && (!mldl_cfg->gyro_is_bypassed)) - return ML_ERROR_FEATURE_NOT_ENABLED; - else - return mldl_cfg->compass->read(compass_handle, - mldl_cfg->compass, - &mldl_cfg->pdata->compass, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -/** - * @brief read raw sensor data from the pressure device - * in use. - * @param mldl_cfg - * A pointer to the struct mldl_cfg data structure. - * @param pressure_handle - * The handle to the device the pressure sensor is connected to. - * @param data - * a buffer to store the raw sensor data. - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -int mpu3050_read_pressure(struct mldl_cfg *mldl_cfg, - void *pressure_handle, unsigned char *data) -{ - if (NULL != mldl_cfg->pressure && NULL != mldl_cfg->pressure->read) - if ((EXT_SLAVE_BUS_SECONDARY == mldl_cfg->pdata->pressure.bus) - && (!mldl_cfg->gyro_is_bypassed)) - return ML_ERROR_FEATURE_NOT_ENABLED; - else - return mldl_cfg->pressure->read( - pressure_handle, - mldl_cfg->pressure, - &mldl_cfg->pdata->pressure, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -int mpu3050_config_accel(struct mldl_cfg *mldl_cfg, - void *accel_handle, - struct ext_slave_config *data) -{ - if (NULL != mldl_cfg->accel && NULL != mldl_cfg->accel->config) - return mldl_cfg->accel->config(accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - -} - -int mpu3050_config_compass(struct mldl_cfg *mldl_cfg, - void *compass_handle, - struct ext_slave_config *data) -{ - if (NULL != mldl_cfg->compass && NULL != mldl_cfg->compass->config) - return mldl_cfg->compass->config(compass_handle, - mldl_cfg->compass, - &mldl_cfg->pdata->compass, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - -} - -int mpu3050_config_pressure(struct mldl_cfg *mldl_cfg, - void *pressure_handle, - struct ext_slave_config *data) -{ - if (NULL != mldl_cfg->pressure && NULL != mldl_cfg->pressure->config) - return mldl_cfg->pressure->config(pressure_handle, - mldl_cfg->pressure, - &mldl_cfg->pdata->pressure, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -int mpu3050_get_config_accel(struct mldl_cfg *mldl_cfg, - void *accel_handle, - struct ext_slave_config *data) -{ - if (NULL != mldl_cfg->accel && NULL != mldl_cfg->accel->get_config) - return mldl_cfg->accel->get_config(accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - -} - -int mpu3050_get_config_compass(struct mldl_cfg *mldl_cfg, - void *compass_handle, - struct ext_slave_config *data) -{ - if (NULL != mldl_cfg->compass && NULL != mldl_cfg->compass->get_config) - return mldl_cfg->compass->get_config(compass_handle, - mldl_cfg->compass, - &mldl_cfg->pdata->compass, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; - -} - -int mpu3050_get_config_pressure(struct mldl_cfg *mldl_cfg, - void *pressure_handle, - struct ext_slave_config *data) -{ - if (NULL != mldl_cfg->pressure && - NULL != mldl_cfg->pressure->get_config) - return mldl_cfg->pressure->get_config(pressure_handle, - mldl_cfg->pressure, - &mldl_cfg->pdata->pressure, - data); - else - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - - -/** - *@} - */ diff --git a/drivers/misc/mpu3050/mldl_cfg.h b/drivers/misc/mpu3050/mldl_cfg.h deleted file mode 100755 index b893946..0000000 --- a/drivers/misc/mpu3050/mldl_cfg.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @addtogroup MLDL - * - * @{ - * @file mldl_cfg.h - * @brief The Motion Library Driver Layer Configuration header file. - */ - -#ifndef __MLDL_CFG_H__ -#define __MLDL_CFG_H__ - -/* ------------------ */ -/* - Include Files. - */ -/* ------------------ */ - -#include "mlsl.h" -#include "mpu.h" - -/* --------------------- */ -/* - Defines. - */ -/* --------------------- */ - -/*************************************************************************/ -/* Sensors */ -/*************************************************************************/ - -#define ML_X_GYRO (0x0001) -#define ML_Y_GYRO (0x0002) -#define ML_Z_GYRO (0x0004) -#define ML_DMP_PROCESSOR (0x0008) - -#define ML_X_ACCEL (0x0010) -#define ML_Y_ACCEL (0x0020) -#define ML_Z_ACCEL (0x0040) - -#define ML_X_COMPASS (0x0080) -#define ML_Y_COMPASS (0x0100) -#define ML_Z_COMPASS (0x0200) - -#define ML_X_PRESSURE (0x0300) -#define ML_Y_PRESSURE (0x0800) -#define ML_Z_PRESSURE (0x1000) - -#define ML_TEMPERATURE (0x2000) -#define ML_TIME (0x4000) - -#define ML_THREE_AXIS_GYRO (0x000F) -#define ML_THREE_AXIS_ACCEL (0x0070) -#define ML_THREE_AXIS_COMPASS (0x0380) -#define ML_THREE_AXIS_PRESSURE (0x1C00) - -#define ML_FIVE_AXIS (0x007B) -#define ML_SIX_AXIS_GYRO_ACCEL (0x007F) -#define ML_SIX_AXIS_ACCEL_COMPASS (0x03F0) -#define ML_NINE_AXIS (0x03FF) -#define ML_ALL_SENSORS (0x7FFF) - -#define SAMPLING_RATE_HZ(mldl_cfg) \ - ((((((mldl_cfg)->lpf) == 0) || (((mldl_cfg)->lpf) == 7)) \ - ? (8000) \ - : (1000)) \ - / ((mldl_cfg)->divider + 1)) - -#define SAMPLING_PERIOD_US(mldl_cfg) \ - ((1000000L * ((mldl_cfg)->divider + 1)) / \ - (((((mldl_cfg)->lpf) == 0) || (((mldl_cfg)->lpf) == 7)) \ - ? (8000) \ - : (1000))) -/* --------------------- */ -/* - Variables. - */ -/* --------------------- */ - -/*exteded variables for only kernel*/ -struct mldl_ext_cfg { - void *mpuacc_data; /*Mpu-Accel Data*/ -}; - - -/* Platform data for the MPU */ -struct mldl_cfg { - /* MPU related configuration */ - unsigned long requested_sensors; - unsigned char addr; - unsigned char int_config; - unsigned char ext_sync; - unsigned char full_scale; - unsigned char lpf; - unsigned char clk_src; - unsigned char divider; - unsigned char dmp_enable; - unsigned char fifo_enable; - unsigned char dmp_cfg1; - unsigned char dmp_cfg2; - unsigned char gyro_power; - unsigned char offset_tc[MPU_NUM_AXES]; - unsigned short offset[MPU_NUM_AXES]; - unsigned char ram[MPU_MEM_NUM_RAM_BANKS][MPU_MEM_BANK_SIZE]; - - /* MPU Related stored status and info */ - unsigned char silicon_revision; - unsigned char product_id; - unsigned short trim; - - /* Driver/Kernel related state information */ - int gyro_is_bypassed; - int dmp_is_running; - int gyro_is_suspended; - int accel_is_suspended; - int compass_is_suspended; - int pressure_is_suspended; - int gyro_needs_reset; - - /* Slave related information */ - struct ext_slave_descr *accel; - struct ext_slave_descr *compass; - struct ext_slave_descr *pressure; - - /* Platform Data */ - struct mpu3050_platform_data *pdata; - - /*---------------------------------------------------*/ - /*KERNEL ONLY VARIABLES */ - /*---------------------------------------------------*/ - struct mldl_ext_cfg ext; -}; - - -int mpu3050_open(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle); -int mpu3050_close(struct mldl_cfg *mldl_cfg, - void *mlsl_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle); -int mpu3050_resume(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle, - bool resume_gyro, - bool resume_accel, - bool resume_compass, - bool resume_pressure); -int mpu3050_suspend(struct mldl_cfg *mldl_cfg, - void *gyro_handle, - void *accel_handle, - void *compass_handle, - void *pressure_handle, - bool suspend_gyro, - bool suspend_accel, - bool suspend_compass, - bool suspend_pressure); -int mpu3050_read_accel(struct mldl_cfg *mldl_cfg, - void *accel_handle, - unsigned char *data); -int mpu3050_read_compass(struct mldl_cfg *mldl_cfg, - void *compass_handle, - unsigned char *data); -int mpu3050_read_pressure(struct mldl_cfg *mldl_cfg, void *mlsl_handle, - unsigned char *data); - -int mpu3050_config_accel(struct mldl_cfg *mldl_cfg, - void *accel_handle, - struct ext_slave_config *data); -int mpu3050_config_compass(struct mldl_cfg *mldl_cfg, - void *compass_handle, - struct ext_slave_config *data); -int mpu3050_config_pressure(struct mldl_cfg *mldl_cfg, - void *pressure_handle, - struct ext_slave_config *data); - -int mpu3050_get_config_accel(struct mldl_cfg *mldl_cfg, - void *accel_handle, - struct ext_slave_config *data); -int mpu3050_get_config_compass(struct mldl_cfg *mldl_cfg, - void *compass_handle, - struct ext_slave_config *data); -int mpu3050_get_config_pressure(struct mldl_cfg *mldl_cfg, - void *pressure_handle, - struct ext_slave_config *data); - - -#endif /* __MLDL_CFG_H__ */ - -/** - *@} - */ diff --git a/drivers/misc/mpu3050/mlos-kernel.c b/drivers/misc/mpu3050/mlos-kernel.c deleted file mode 100755 index 02f1843..0000000 --- a/drivers/misc/mpu3050/mlos-kernel.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -/** - * @defgroup - * @brief - * - * @{ - * @file mlos-kernel.c - * @brief - * - * - */ - -#include "mlos.h" -#include -#include -#include - -void *MLOSMalloc(unsigned int numBytes) -{ - return kmalloc(numBytes, GFP_KERNEL); -} - -tMLError MLOSFree(void *ptr) -{ - kfree(ptr); - return ML_SUCCESS; -} - -tMLError MLOSCreateMutex(HANDLE *mutex) -{ - /* @todo implement if needed */ - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -tMLError MLOSLockMutex(HANDLE mutex) -{ - /* @todo implement if needed */ - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -tMLError MLOSUnlockMutex(HANDLE mutex) -{ - /* @todo implement if needed */ - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -tMLError MLOSDestroyMutex(HANDLE handle) -{ - /* @todo implement if needed */ - return ML_ERROR_FEATURE_NOT_IMPLEMENTED; -} - -FILE *MLOSFOpen(char *filename) -{ - /* @todo implement if needed */ - return NULL; -} - -void MLOSFClose(FILE *fp) -{ - /* @todo implement if needed */ -} - -void MLOSSleep(int mSecs) -{ - msleep(mSecs); -} - -unsigned long MLOSGetTickCount(void) -{ - struct timespec now; - - getnstimeofday(&now); - - return (long)(now.tv_sec * 1000L + now.tv_nsec / 1000000L); -} diff --git a/drivers/misc/mpu3050/mlos.h b/drivers/misc/mpu3050/mlos.h deleted file mode 100755 index 4ebb86c..0000000 --- a/drivers/misc/mpu3050/mlos.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef _MLOS_H -#define _MLOS_H - -#ifndef __KERNEL__ -#include -#endif - -#include "mltypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - - /* ------------ */ - /* - Defines. - */ - /* ------------ */ - - /* - MLOSCreateFile defines. - */ - -#define MLOS_GENERIC_READ ((unsigned int)0x80000000) -#define MLOS_GENERIC_WRITE ((unsigned int)0x40000000) -#define MLOS_FILE_SHARE_READ ((unsigned int)0x00000001) -#define MLOS_FILE_SHARE_WRITE ((unsigned int)0x00000002) -#define MLOS_OPEN_EXISTING ((unsigned int)0x00000003) - - /* ---------- */ - /* - Enums. - */ - /* ---------- */ - - /* --------------- */ - /* - Structures. - */ - /* --------------- */ - - /* --------------------- */ - /* - Function p-types. - */ - /* --------------------- */ - - void *MLOSMalloc(unsigned int numBytes); - tMLError MLOSFree(void *ptr); - tMLError MLOSCreateMutex(HANDLE *mutex); - tMLError MLOSLockMutex(HANDLE mutex); - tMLError MLOSUnlockMutex(HANDLE mutex); - FILE *MLOSFOpen(char *filename); - void MLOSFClose(FILE *fp); - - tMLError MLOSDestroyMutex(HANDLE handle); - - void MLOSSleep(int mSecs); - unsigned long MLOSGetTickCount(void); - -#ifdef __cplusplus -} -#endif -#endif /* _MLOS_H */ diff --git a/drivers/misc/mpu3050/mlsl-kernel.c b/drivers/misc/mpu3050/mlsl-kernel.c deleted file mode 100755 index 908b16f..0000000 --- a/drivers/misc/mpu3050/mlsl-kernel.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#include "mlsl.h" -#include "mpu-i2c.h" - -/* ------------ */ -/* - Defines. - */ -/* ------------ */ - -/* ---------------------- */ -/* - Types definitions. - */ -/* ---------------------- */ - -/* --------------------- */ -/* - Function p-types. - */ -/* --------------------- */ - -/** - * @brief used to open the I2C or SPI serial port. - * This port is used to send and receive data to the MPU device. - * @param portNum - * The COM port number associated with the device in use. - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -tMLError MLSLSerialOpen(char const *port, void **sl_handle) -{ - return ML_SUCCESS; -} - -/** - * @brief used to reset any buffering the driver may be doing - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -tMLError MLSLSerialReset(void *sl_handle) -{ - return ML_SUCCESS; -} - -/** - * @brief used to close the I2C or SPI serial port. - * This port is used to send and receive data to the MPU device. - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -tMLError MLSLSerialClose(void *sl_handle) -{ - return ML_SUCCESS; -} - -/** - * @brief used to read a single byte of data. - * This should be sent by I2C or SPI. - * - * @param slaveAddr I2C slave address of device. - * @param registerAddr Register address to read. - * @param data Single byte of data to read. - * - * @return ML_SUCCESS if the command is successful, an error code otherwise. - */ -tMLError MLSLSerialWriteSingle(void *sl_handle, - unsigned char slaveAddr, - unsigned char registerAddr, - unsigned char data) -{ - return sensor_i2c_write_register((struct i2c_adapter *) sl_handle, - slaveAddr, registerAddr, data); -} - - -/** - * @brief used to write multiple bytes of data from registers. - * This should be sent by I2C. - * - * @param slaveAddr I2C slave address of device. - * @param registerAddr Register address to write. - * @param length Length of burst of data. - * @param data Pointer to block of data. - * - * @return ML_SUCCESS if successful, a non-zero error code otherwise. - */ -tMLError MLSLSerialWrite(void *sl_handle, - unsigned char slaveAddr, - unsigned short length, unsigned char const *data) -{ - tMLError result; - const unsigned short dataLength = length - 1; - const unsigned char startRegAddr = data[0]; - unsigned char i2cWrite[SERIAL_MAX_TRANSFER_SIZE + 1]; - unsigned short bytesWritten = 0; - - while (bytesWritten < dataLength) { - unsigned short thisLen = min(SERIAL_MAX_TRANSFER_SIZE, - dataLength - bytesWritten); - if (bytesWritten == 0) { - result = sensor_i2c_write((struct i2c_adapter *) - sl_handle, slaveAddr, - 1 + thisLen, data); - } else { - /* manually increment register addr between chunks */ - i2cWrite[0] = startRegAddr + bytesWritten; - memcpy(&i2cWrite[1], &data[1 + bytesWritten], - thisLen); - result = sensor_i2c_write((struct i2c_adapter *) - sl_handle, slaveAddr, - 1 + thisLen, i2cWrite); - } - if (ML_SUCCESS != result) - return result; - bytesWritten += thisLen; - } - return ML_SUCCESS; -} - - -/** - * @brief used to read multiple bytes of data from registers. - * This should be sent by I2C. - * - * @param slaveAddr I2C slave address of device. - * @param registerAddr Register address to read. - * @param length Length of burst of data. - * @param data Pointer to block of data. - * - * @return Zero if successful; an error code otherwise - */ -tMLError MLSLSerialRead(void *sl_handle, - unsigned char slaveAddr, - unsigned char registerAddr, - unsigned short length, unsigned char *data) -{ - tMLError result; - unsigned short bytesRead = 0; - - if (registerAddr == MPUREG_FIFO_R_W - || registerAddr == MPUREG_MEM_R_W) { - return ML_ERROR_INVALID_PARAMETER; - } - while (bytesRead < length) { - unsigned short thisLen = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytesRead); - result = - sensor_i2c_read((struct i2c_adapter *) sl_handle, - slaveAddr, registerAddr + bytesRead, - thisLen, &data[bytesRead]); - if (ML_SUCCESS != result) - return result; - bytesRead += thisLen; - } - return ML_SUCCESS; -} - - -/** - * @brief used to write multiple bytes of data to the memory. - * This should be sent by I2C. - * - * @param slaveAddr I2C slave address of device. - * @param memAddr The location in the memory to write to. - * @param length Length of burst data. - * @param data Pointer to block of data. - * - * @return Zero if successful; an error code otherwise - */ -tMLError MLSLSerialWriteMem(void *sl_handle, - unsigned char slaveAddr, - unsigned short memAddr, - unsigned short length, - unsigned char const *data) -{ - tMLError result; - unsigned short bytesWritten = 0; - - if ((memAddr & 0xFF) + length > MPU_MEM_BANK_SIZE) { - printk - ("memory read length (%d B) extends beyond its limits (%d) " - "if started at location %d\n", length, - MPU_MEM_BANK_SIZE, memAddr & 0xFF); - return ML_ERROR_INVALID_PARAMETER; - } - while (bytesWritten < length) { - unsigned short thisLen = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytesWritten); - result = - mpu_memory_write((struct i2c_adapter *) sl_handle, - slaveAddr, memAddr + bytesWritten, - thisLen, &data[bytesWritten]); - if (ML_SUCCESS != result) - return result; - bytesWritten += thisLen; - } - return ML_SUCCESS; -} - - -/** - * @brief used to read multiple bytes of data from the memory. - * This should be sent by I2C. - * - * @param slaveAddr I2C slave address of device. - * @param memAddr The location in the memory to read from. - * @param length Length of burst data. - * @param data Pointer to block of data. - * - * @return Zero if successful; an error code otherwise - */ -tMLError MLSLSerialReadMem(void *sl_handle, - unsigned char slaveAddr, - unsigned short memAddr, - unsigned short length, unsigned char *data) -{ - tMLError result; - unsigned short bytesRead = 0; - - if ((memAddr & 0xFF) + length > MPU_MEM_BANK_SIZE) { - printk - ("memory read length (%d B) extends beyond its limits (%d) " - "if started at location %d\n", length, - MPU_MEM_BANK_SIZE, memAddr & 0xFF); - return ML_ERROR_INVALID_PARAMETER; - } - while (bytesRead < length) { - unsigned short thisLen = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytesRead); - result = - mpu_memory_read((struct i2c_adapter *) sl_handle, - slaveAddr, memAddr + bytesRead, - thisLen, &data[bytesRead]); - if (ML_SUCCESS != result) - return result; - bytesRead += thisLen; - } - return ML_SUCCESS; -} - - -/** - * @brief used to write multiple bytes of data to the fifo. - * This should be sent by I2C. - * - * @param slaveAddr I2C slave address of device. - * @param length Length of burst of data. - * @param data Pointer to block of data. - * - * @return Zero if successful; an error code otherwise - */ -tMLError MLSLSerialWriteFifo(void *sl_handle, - unsigned char slaveAddr, - unsigned short length, - unsigned char const *data) -{ - tMLError result; - unsigned char i2cWrite[SERIAL_MAX_TRANSFER_SIZE + 1]; - unsigned short bytesWritten = 0; - - if (length > FIFO_HW_SIZE) { - printk(KERN_ERR - "maximum fifo write length is %d\n", FIFO_HW_SIZE); - return ML_ERROR_INVALID_PARAMETER; - } - while (bytesWritten < length) { - unsigned short thisLen = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytesWritten); - i2cWrite[0] = MPUREG_FIFO_R_W; - memcpy(&i2cWrite[1], &data[bytesWritten], thisLen); - result = sensor_i2c_write((struct i2c_adapter *) sl_handle, - slaveAddr, thisLen + 1, - i2cWrite); - if (ML_SUCCESS != result) - return result; - bytesWritten += thisLen; - } - return ML_SUCCESS; -} - - -/** - * @brief used to read multiple bytes of data from the fifo. - * This should be sent by I2C. - * - * @param slaveAddr I2C slave address of device. - * @param length Length of burst of data. - * @param data Pointer to block of data. - * - * @return Zero if successful; an error code otherwise - */ -tMLError MLSLSerialReadFifo(void *sl_handle, - unsigned char slaveAddr, - unsigned short length, unsigned char *data) -{ - tMLError result; - unsigned short bytesRead = 0; - - if (length > FIFO_HW_SIZE) { - printk(KERN_ERR - "maximum fifo read length is %d\n", FIFO_HW_SIZE); - return ML_ERROR_INVALID_PARAMETER; - } - while (bytesRead < length) { - unsigned short thisLen = - min(SERIAL_MAX_TRANSFER_SIZE, length - bytesRead); - result = - sensor_i2c_read((struct i2c_adapter *) sl_handle, - slaveAddr, MPUREG_FIFO_R_W, thisLen, - &data[bytesRead]); - if (ML_SUCCESS != result) - return result; - bytesRead += thisLen; - } - - return ML_SUCCESS; -} - -/** - * @} - */ diff --git a/drivers/misc/mpu3050/mlsl.h b/drivers/misc/mpu3050/mlsl.h deleted file mode 100755 index 51fe401..0000000 --- a/drivers/misc/mpu3050/mlsl.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef __MSSL_H__ -#define __MSSL_H__ - -#include "mltypes.h" -#include "mpu.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* ------------ */ -/* - Defines. - */ -/* ------------ */ -/* acceleration data */ -struct acc_data { - s16 x; - s16 y; - s16 z; -}; - - -/* - * NOTE : to properly support Yamaha compass reads, - * the max transfer size should be at least 9 B. - * Length in bytes, typically a power of 2 >= 2 - */ -#define SERIAL_MAX_TRANSFER_SIZE 128 - -/* ---------------------- */ -/* - Types definitions. - */ -/* ---------------------- */ - -/* --------------------- */ -/* - Function p-types. - */ -/* --------------------- */ - - tMLError MLSLSerialOpen(char const *port, - void **sl_handle); - tMLError MLSLSerialReset(void *sl_handle); - tMLError MLSLSerialClose(void *sl_handle); - - tMLError MLSLSerialWriteSingle(void *sl_handle, - unsigned char slaveAddr, - unsigned char registerAddr, - unsigned char data); - - tMLError MLSLSerialRead(void *sl_handle, - unsigned char slaveAddr, - unsigned char registerAddr, - unsigned short length, - unsigned char *data); - - tMLError MLSLSerialWrite(void *sl_handle, - unsigned char slaveAddr, - unsigned short length, - unsigned char const *data); - - tMLError MLSLSerialReadMem(void *sl_handle, - unsigned char slaveAddr, - unsigned short memAddr, - unsigned short length, - unsigned char *data); - - tMLError MLSLSerialWriteMem(void *sl_handle, - unsigned char slaveAddr, - unsigned short memAddr, - unsigned short length, - unsigned char const *data); - - tMLError MLSLSerialReadFifo(void *sl_handle, - unsigned char slaveAddr, - unsigned short length, - unsigned char *data); - - tMLError MLSLSerialWriteFifo(void *sl_handle, - unsigned char slaveAddr, - unsigned short length, - unsigned char const *data); - - tMLError MLSLWriteCal(unsigned char *cal, unsigned int len); - tMLError MLSLReadCal(unsigned char *cal, unsigned int len); - tMLError MLSLGetCalLength(unsigned int *len); - -#ifdef __cplusplus -} -#endif - -/** - * @} - */ -#endif /* MLSL_H */ diff --git a/drivers/misc/mpu3050/mltypes.h b/drivers/misc/mpu3050/mltypes.h deleted file mode 100755 index 5c1b684..0000000 --- a/drivers/misc/mpu3050/mltypes.h +++ /dev/null @@ -1,227 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup MLERROR - * @brief Motion Library - Error definitions. - * Definition of the error codes used within the MPL and returned - * to the user. - * Every function tries to return a meaningful error code basing - * on the occuring error condition. The error code is numeric. - * - * The available error codes and their associated values are: - * - (0) ML_SUCCESS - * - (1) ML_ERROR - * - (2) ML_ERROR_INVALID_PARAMETER - * - (3) ML_ERROR_FEATURE_NOT_ENABLED - * - (4) ML_ERROR_FEATURE_NOT_IMPLEMENTED - * - (6) ML_ERROR_DMP_NOT_STARTED - * - (7) ML_ERROR_DMP_STARTED - * - (8) ML_ERROR_NOT_OPENED - * - (9) ML_ERROR_OPENED - * - (10) ML_ERROR_INVALID_MODULE - * - (11) ML_ERROR_MEMORY_EXAUSTED - * - (12) ML_ERROR_DIVIDE_BY_ZERO - * - (13) ML_ERROR_ASSERTION_FAILURE - * - (14) ML_ERROR_FILE_OPEN - * - (15) ML_ERROR_FILE_READ - * - (16) ML_ERROR_FILE_WRITE - * - (20) ML_ERROR_SERIAL_CLOSED - * - (21) ML_ERROR_SERIAL_OPEN_ERROR - * - (22) ML_ERROR_SERIAL_READ - * - (23) ML_ERROR_SERIAL_WRITE - * - (24) ML_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED - * - (25) ML_ERROR_SM_TRANSITION - * - (26) ML_ERROR_SM_IMPROPER_STATE - * - (30) ML_ERROR_FIFO_OVERFLOW - * - (31) ML_ERROR_FIFO_FOOTER - * - (32) ML_ERROR_FIFO_READ_COUNT - * - (33) ML_ERROR_FIFO_READ_DATA - * - (40) ML_ERROR_MEMORY_SET - * - (50) ML_ERROR_LOG_MEMORY_ERROR - * - (51) ML_ERROR_LOG_OUTPUT_ERROR - * - (60) ML_ERROR_OS_BAD_PTR - * - (61) ML_ERROR_OS_BAD_HANDLE - * - (62) ML_ERROR_OS_CREATE_FAILED - * - (63) ML_ERROR_OS_LOCK_FAILED - * - (70) ML_ERROR_COMPASS_DATA_OVERFLOW - * - (71) ML_ERROR_COMPASS_DATA_UNDERFLOW - * - (72) ML_ERROR_COMPASS_DATA_NOT_READY - * - (73) ML_ERROR_COMPASS_DATA_ERROR - * - (75) ML_ERROR_CALIBRATION_LOAD - * - (76) ML_ERROR_CALIBRATION_STORE - * - (77) ML_ERROR_CALIBRATION_LEN - * - (78) ML_ERROR_CALIBRATION_CHECKSUM - * - * @{ - * @file mltypes.h - * @} - */ - -#ifndef MLTYPES_H -#define MLTYPES_H - -#ifdef __KERNEL__ -#include -#else -#include "stdint_invensense.h" -#endif -#include "log.h" - -/*--------------------------- - ML Types ----------------------------*/ - -/** - * @struct tMLError mltypes.h "mltypes" - * @brief The MPL Error Code return type. - * - * @code - * typedef unsigned char tMLError; - * @endcode - */ -typedef unsigned char tMLError; - -#if defined(LINUX) || defined(__KERNEL__) -typedef unsigned int HANDLE; -#endif - -#ifdef __KERNEL__ -typedef HANDLE FILE; -#endif - -#ifndef __cplusplus -#ifndef __KERNEL__ -typedef int_fast8_t bool; -#endif -#endif - -/*--------------------------- - ML Defines ----------------------------*/ - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -/* Dimension of an array */ -#ifndef DIM -#define DIM(array) (sizeof(array)/sizeof((array)[0])) -#endif - -/* - ML Errors. - */ -#define ERROR_NAME(x) (#x) -#define ERROR_CHECK(x) \ - { \ - if (ML_SUCCESS != x) { \ - MPL_LOGE("%s|%s|%d returning %d\n", \ - __FILE__, __func__, __LINE__, x); \ - return x; \ - } \ - } - -#define ERROR_CHECK_FIRST(first, x) \ - { if (ML_SUCCESS == first) first = x; } - -#define ML_SUCCESS (0) -/* Generic Error code. Proprietary Error Codes only */ -#define ML_ERROR (1) - -/* Compatibility and other generic error codes */ -#define ML_ERROR_INVALID_PARAMETER (2) -#define ML_ERROR_FEATURE_NOT_ENABLED (3) -#define ML_ERROR_FEATURE_NOT_IMPLEMENTED (4) -#define ML_ERROR_DMP_NOT_STARTED (6) -#define ML_ERROR_DMP_STARTED (7) -#define ML_ERROR_NOT_OPENED (8) -#define ML_ERROR_OPENED (9) -#define ML_ERROR_INVALID_MODULE (10) -#define ML_ERROR_MEMORY_EXAUSTED (11) -#define ML_ERROR_DIVIDE_BY_ZERO (12) -#define ML_ERROR_ASSERTION_FAILURE (13) -#define ML_ERROR_FILE_OPEN (14) -#define ML_ERROR_FILE_READ (15) -#define ML_ERROR_FILE_WRITE (16) -#define ML_ERROR_INVALID_CONFIGURATION (17) - -/* Serial Communication */ -#define ML_ERROR_SERIAL_CLOSED (20) -#define ML_ERROR_SERIAL_OPEN_ERROR (21) -#define ML_ERROR_SERIAL_READ (22) -#define ML_ERROR_SERIAL_WRITE (23) -#define ML_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED (24) - -/* SM = State Machine */ -#define ML_ERROR_SM_TRANSITION (25) -#define ML_ERROR_SM_IMPROPER_STATE (26) - -/* Fifo */ -#define ML_ERROR_FIFO_OVERFLOW (30) -#define ML_ERROR_FIFO_FOOTER (31) -#define ML_ERROR_FIFO_READ_COUNT (32) -#define ML_ERROR_FIFO_READ_DATA (33) - -/* Memory & Registers, Set & Get */ -#define ML_ERROR_MEMORY_SET (40) - -#define ML_ERROR_LOG_MEMORY_ERROR (50) -#define ML_ERROR_LOG_OUTPUT_ERROR (51) - -/* OS interface errors */ -#define ML_ERROR_OS_BAD_PTR (60) -#define ML_ERROR_OS_BAD_HANDLE (61) -#define ML_ERROR_OS_CREATE_FAILED (62) -#define ML_ERROR_OS_LOCK_FAILED (63) - -/* Compass errors */ -#define ML_ERROR_COMPASS_DATA_OVERFLOW (70) -#define ML_ERROR_COMPASS_DATA_UNDERFLOW (71) -#define ML_ERROR_COMPASS_DATA_NOT_READY (72) -#define ML_ERROR_COMPASS_DATA_ERROR (73) - -/* Load/Store calibration */ -#define ML_ERROR_CALIBRATION_LOAD (75) -#define ML_ERROR_CALIBRATION_STORE (76) -#define ML_ERROR_CALIBRATION_LEN (77) -#define ML_ERROR_CALIBRATION_CHECKSUM (78) - -/* Accel errors */ -#define ML_ERROR_ACCEL_DATA_OVERFLOW (79) -#define ML_ERROR_ACCEL_DATA_UNDERFLOW (80) -#define ML_ERROR_ACCEL_DATA_NOT_READY (81) -#define ML_ERROR_ACCEL_DATA_ERROR (82) - -/* For Linux coding compliance */ -#ifndef __KERNEL__ -#define EXPORT_SYMBOL(x) -#endif - -/*--------------------------- - p-Types ----------------------------*/ - -#endif /* MLTYPES_H */ diff --git a/drivers/misc/mpu3050/mpu-accel.c b/drivers/misc/mpu3050/mpu-accel.c deleted file mode 100755 index 4b5c641..0000000 --- a/drivers/misc/mpu3050/mpu-accel.c +++ /dev/null @@ -1,679 +0,0 @@ -/* - mpu-accel.c - mpu3050 input device interface - - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "mpuirq.h" -#include "slaveirq.h" -#include "mlsl.h" -#include "mpu-i2c.h" -#include "mldl_cfg.h" -#include "mpu.h" -#include "mpu-accel.h" - -#define MPUACC_DEBUG 0 -#define MPUACC_DEBUG_CFG 0 - -#define MPUACCEL_INPUT_NAME "mpu-accel" - -struct mpuaccel_data { - struct input_dev *input_data; - struct delayed_work work; - struct mutex data_mutex; - - struct mldl_cfg *mldl_cfg; - void *accel_handle; - - atomic_t enable; - atomic_t poll_delay; - int device_is_on; -#ifdef MPUACC_USES_CACHED_DATA - unsigned char cached_data[6]; -#endif /* MPUACC_USES_CACHED_DATA */ -}; - -static struct mpuaccel_data *pThisData; -extern struct acc_data cal_data; - -static void mpu_accel_print_mldl_cfg(struct mldl_cfg *mldl_cfg) -{ - if (MPUACC_DEBUG_CFG) { - pr_info("requested_sensors:%ld\n", mldl_cfg->requested_sensors); -/* pr_info("ignore_system_suspend:%d\n", mldl_cfg->ignore_system_suspend); */ - pr_info("addr:%d\n", mldl_cfg->addr); - pr_info("int_config:%d\n", mldl_cfg->int_config); - pr_info("ext_sync:%d\n", mldl_cfg->ext_sync); - pr_info("full_scale:%d\n", mldl_cfg->full_scale); - pr_info("dmp_enable:%d\n", mldl_cfg->dmp_enable); - pr_info("fifo_enable:%d\n", mldl_cfg->fifo_enable); - pr_info("dmp_cfg1:%d\n", mldl_cfg->dmp_cfg1); - pr_info("dmp_cfg2:%d\n", mldl_cfg->dmp_cfg2); - pr_info("gyro_power:%d\n", mldl_cfg->gyro_power); - pr_info("gyro_is_bypassed:%d\n", mldl_cfg->gyro_is_bypassed); - pr_info("dmp_is_running:%d\n", mldl_cfg->dmp_is_running); - pr_info("gyro_is_suspended:%d\n", mldl_cfg->gyro_is_suspended); - pr_info("accel_is_suspended:%d\n", - mldl_cfg->accel_is_suspended); - pr_info("compass_is_suspended:%d\n", - mldl_cfg->compass_is_suspended); - pr_info("pressure_is_suspended:%d\n", - mldl_cfg->pressure_is_suspended); - pr_info("gyro_needs_reset:%d\n", mldl_cfg->gyro_needs_reset); - } -} - -static int mpu_accel_mutex_lock(struct mpuaccel_data *data) -{ - mutex_lock(&data->data_mutex); - - return ML_SUCCESS; -} - -static int mpu_accel_mutex_unlock(struct mpuaccel_data *data) -{ - mutex_unlock(&data->data_mutex); - - return ML_SUCCESS; -} - -static int mpu_accel_activate_device(struct mpuaccel_data *data, int enable) -{ - int result = ML_SUCCESS; - struct mldl_cfg *mldl_cfg = data->mldl_cfg; - - if (enable) { - /*turn on accel */ - if (NULL != mldl_cfg->accel - && NULL != mldl_cfg->accel->resume) { - result = mldl_cfg->accel->resume(data->accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata-> - accel); - } - } else { - /*turn off accel */ - if (NULL != mldl_cfg->accel - && NULL != mldl_cfg->accel->suspend) { - result = mldl_cfg->accel->suspend(data->accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata-> - accel); - } - } - - if (result == ML_SUCCESS) - data->device_is_on = enable; - - if (MPUACC_DEBUG) - pr_info("activate device:%d, result=%d\n", enable, result); - - return result; -} - -static int mpu_accel_get_data_from_device(struct mpuaccel_data *data, - unsigned char *buffer) -{ - int result = ML_SUCCESS; - struct mldl_cfg *mldl_cfg = data->mldl_cfg; - - if (NULL != mldl_cfg->accel && NULL != mldl_cfg->accel->read) { - result = mldl_cfg->accel->read(data->accel_handle, - mldl_cfg->accel, - &mldl_cfg->pdata->accel, buffer); - } - - return result; -} - -static int mpu_accel_get_data_from_mpu(struct mpuaccel_data *data, unsigned char *buffer) -{ - int result = ML_SUCCESS; - struct mldl_cfg *mldl_cfg = data->mldl_cfg; - result = - MLSLSerialRead(data->accel_handle, mldl_cfg->addr, 0x23, 6, buffer); - return result; -} - -static int mpu_accel_get_data(struct mpuaccel_data *data, unsigned char *buffer, - int *from_mpu) -{ - int res = ML_SUCCESS; - struct mldl_cfg *mldl_cfg = data->mldl_cfg; - - if (mldl_cfg->accel_is_suspended == 1 || - (mldl_cfg->dmp_is_running == 0 - && mldl_cfg->accel_is_suspended == 0)) { - - if (from_mpu != NULL) - *from_mpu = 0; - - /* - Retrieve accel data from accel device driver directly. - */ - res = mpu_accel_get_data_from_device(data, buffer); - } else if (mldl_cfg->dmp_is_running && - mldl_cfg->accel_is_suspended == 0) { - - if (from_mpu != NULL) - *from_mpu = 1; - - /* - Retrieve accel data from MPU registers(0x23 to 0x28). - */ - res = mpu_accel_get_data_from_mpu(data, buffer); - } - - return res; -} - -static int mpu_accel_build_data(struct mpuaccel_data *data, - const unsigned char *buffer, s16 *val) -{ - struct mldl_cfg *mldl_cfg = data->mldl_cfg; - int endian = mldl_cfg->accel->endian; - int dev_id = mldl_cfg->accel->id; - - if (endian == EXT_SLAVE_LITTLE_ENDIAN) { - if (dev_id == ACCEL_ID_BMA150) - *val = (*(s16 *)&buffer[0]) >> 6; - else if (dev_id == ACCEL_ID_KXTF9) { - *val = - (short)(((signed char)buffer[1] << 4) | - (buffer[0] >> 4)); - } else - *val = (buffer[1] << 8) | buffer[0]; - } else if (endian == EXT_SLAVE_BIG_ENDIAN) { - *val = (buffer[0] << 8) | buffer[1]; - } - - return ML_SUCCESS; -} - -static void mpu_accel_input_work_func(struct work_struct *work) -{ - int res = 0; - int poll_time = 0; - int enable = 0; - int i = 0; - - struct mpuaccel_data *data = container_of((struct delayed_work *)work, - struct mpuaccel_data, work); - - struct mldl_cfg *mldl_cfg = data->mldl_cfg; - - poll_time = atomic_read(&data->poll_delay); - - if (MPUACC_DEBUG) - pr_info("________________START____________________\n"); - if (MPUACC_DEBUG_CFG) - mpu_accel_print_mldl_cfg(mldl_cfg); - - mpu_accel_mutex_lock(data); - enable = atomic_read(&data->enable); - mpu_accel_mutex_unlock(data); - - if (enable) { - unsigned char buffer[6] = { 0, }; - s16 raw[3] = { 0, }; - int data_is_avail = 0; - int data_is_from_mpu = 0; - - mpu_accel_mutex_lock(data); - mpu_accel_get_data(data, buffer, &data_is_from_mpu); - mpu_accel_mutex_unlock(data); - - if (res == ML_SUCCESS) - data_is_avail = 1; - - if (data_is_avail) { - int data_is_valid = 0; - - for (i = 0; i < 3; i++) { - mpu_accel_build_data(data, &buffer[i * 2], - &raw[i]); - } - raw[0] += cal_data.x; - raw[1] += cal_data.y; - raw[2] += cal_data.z; - - if (raw[0] && raw[1] && raw[2]) - data_is_valid = 1; - - if (data_is_valid) { - int accel[3] = { 0, }; - - /*apply mounting matrix */ - for (i = 0; i < 3; i++) { -#ifdef MPUACC_USES_MOUNTING_MATRIX - int j = 0; - for (j = 0; j < 3; j++) { - accel[i] += - mldl_cfg->pdata->accel. - orientation[i * 3 + - j] * raw[j]; - } -#else - accel[i] = raw[i]; -#endif - } - - if (MPUACC_DEBUG) { - if (data_is_from_mpu == 1) - pr_info - ("MPU_ACCEL:[%d][%d][%d]\n", - accel[0], accel[1], - accel[2]); - else - pr_info("ACCEL:[%d][%d][%d]\n", - accel[0], accel[1], - accel[2]); - } -#ifdef MPUACC_USES_CACHED_DATA - memcpy(data->cached_data, buffer, - sizeof(unsigned char) * 6); -#endif /* #ifdef MPUACC_USES_CACHED_DATA */ - input_report_rel(data->input_data, REL_X, - accel[0]); - input_report_rel(data->input_data, REL_Y, - accel[1]); - input_report_rel(data->input_data, REL_Z, - accel[2]); - input_sync(data->input_data); - - if (MPUACC_DEBUG) - pr_info("input device is updated\n"); - } - } - } - - if (MPUACC_DEBUG) - pr_info("________________END____________________\n"); - - mpu_accel_mutex_lock(data); - enable = atomic_read(&data->enable); - mpu_accel_mutex_unlock(data); - - if (enable) { - if (poll_time > 0) { - schedule_delayed_work(&data->work, - msecs_to_jiffies(poll_time) - /*+ 1 */); - } else { - schedule_delayed_work(&data->work, 0); - } - - } - -} - -static int mpu_accel_enable(struct mpuaccel_data *data) -{ - int res = ML_SUCCESS; - struct mldl_cfg *mldl_cfg = data->mldl_cfg; - - if (MPUACC_DEBUG) - pr_info("mpu_accel_enable : %d\n", atomic_read(&data->enable)); - - if (atomic_read(&data->enable) != 1) { - - if (MPUACC_DEBUG) - pr_info("mpu_accel_enable : enabled\n"); - - if (mldl_cfg->accel_is_suspended == 1) { - if (MPUACC_DEBUG) - pr_info("mpu_accel_enable : turn on accel\n"); - mpu_accel_activate_device(data, 1); - } - - atomic_set(&data->enable, 1); - schedule_delayed_work(&data->work, 0); - - } - - return res; -} - -static int mpu_accel_disable(struct mpuaccel_data *data) -{ - int res = ML_SUCCESS; - struct mldl_cfg *mldl_cfg = data->mldl_cfg; - - if (MPUACC_DEBUG) - pr_info("mpu_accel_disable : %d\n", atomic_read(&data->enable)); - - if (atomic_read(&data->enable) != 0) { - atomic_set(&data->enable, 0); - cancel_delayed_work(&data->work); - - if (MPUACC_DEBUG) - pr_info("mpu_accel_disable : disabled\n"); - - if (mldl_cfg->accel_is_suspended == 1) { - if (MPUACC_DEBUG) - pr_info("mpu_accel_disable : turn off accel\n"); - - /*turn off accel */ - mpu_accel_activate_device(data, 0); - } - } - - return res; -} - -static ssize_t mpu_accel_delay_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct input_dev *input_data = to_input_dev(dev); - struct mpuaccel_data *data = input_get_drvdata(input_data); - - return sprintf(buf, "%d\n", atomic_read(&data->poll_delay)); -} - -static ssize_t mpu_accel_delay_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct input_dev *input_data = to_input_dev(dev); - struct mpuaccel_data *data = input_get_drvdata(input_data); - int value = simple_strtoul(buf, NULL, 10); - - atomic_set(&data->poll_delay, value); - return count; -} - -static ssize_t mpu_accel_enable_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct input_dev *input_data = to_input_dev(dev); - struct mpuaccel_data *data = input_get_drvdata(input_data); - - return sprintf(buf, "%d\n", atomic_read(&data->enable)); -} - -static ssize_t -mpu_accel_enable_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct input_dev *input_data = to_input_dev(dev); - struct mpuaccel_data *data = input_get_drvdata(input_data); - int value; - - value = simple_strtoul(buf, NULL, 10); - if (value != 0 && value != 1) - return count; - - mpu_accel_mutex_lock(data); - - if (value) - mpu_accel_enable(data); - else - mpu_accel_disable(data); - - mpu_accel_mutex_unlock(data); - - return count; -} - -int mpu_accel_is_active_device(void) -{ - int is_active = 0; - - if (pThisData != NULL) { - mpu_accel_mutex_lock(pThisData); - is_active = pThisData->device_is_on; - mpu_accel_mutex_unlock(pThisData); - } - - return is_active; -} - -#ifdef MPUACC_USES_CACHED_DATA -int mpu_accel_get_cached_data(unsigned char *cache) -{ - int res = ML_ERROR; - - if (pThisData != NULL) { - if (pThisData->device_is_on == 1) { - memcpy(cache, pThisData->cached_data, - sizeof(unsigned char) * 6); - pr_info("cached data:[%d][%d][%d][%d][%d][%d]\n", - cache[0], cache[1], - cache[2], cache[3], - cache[4], cache[5]); - res = ML_SUCCESS; - } - - } - - return res; -} -#endif /* MPUACC_USES_CACHED_DATA */ - -static DEVICE_ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP, - mpu_accel_delay_show, mpu_accel_delay_store); -static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP, - mpu_accel_enable_show, mpu_accel_enable_store); - -static struct attribute *mpuaccel_attributes[] = { - &dev_attr_poll_delay.attr, - &dev_attr_enable.attr, - NULL -}; - -static struct attribute_group mpuaccel_attribute_group = { - .attrs = mpuaccel_attributes -}; - -int mpu_accel_init(struct mldl_cfg *mldl_cfg, void *accel_handle) -{ - struct input_dev *input_data = NULL; - struct mpuaccel_data *data = NULL; - int res = 0; - - data = kzalloc(sizeof(struct mpuaccel_data), GFP_KERNEL); - if (data == NULL) { - res = -ENOMEM; - goto err; - } - - data->mldl_cfg = mldl_cfg; - data->accel_handle = accel_handle; - atomic_set(&data->enable, 0); - atomic_set(&data->poll_delay, 20); /* set 20ms to polling time */ - - mutex_init(&data->data_mutex); - - INIT_DELAYED_WORK(&data->work, mpu_accel_input_work_func); - - input_data = input_allocate_device(); - if (input_data == NULL) { - res = -ENOMEM; - pr_err( - "mpu_accel_probe: Failed to allocate input_data device\n"); - goto err; - } - - input_data->name = MPUACCEL_INPUT_NAME; - input_data->id.bustype = BUS_I2C; - - set_bit(EV_REL, input_data->evbit); - input_set_capability(input_data, EV_REL, REL_X); - input_set_capability(input_data, EV_REL, REL_Y); - input_set_capability(input_data, EV_REL, REL_Z); - - data->input_data = input_data; - - res = input_register_device(input_data); - if (res) { - pr_err( - "mpu_accel_init: Unable to register input_data device: %s\n", - input_data->name); - goto err; - } - - input_set_drvdata(input_data, data); - mldl_cfg->ext.mpuacc_data = (void *)data; - - pThisData = data; - - res = sysfs_create_group(&input_data->dev.kobj, - &mpuaccel_attribute_group); - if (res) { - pr_err( - "mpu_accel_init: sysfs_create_group failed[%s]\n", - input_data->name); - goto err; - } - - return res; - -err: - sysfs_remove_group(&input_data->dev.kobj, &mpuaccel_attribute_group); - input_free_device(input_data); - kfree(data); - return res; - -} - -int mpu_accel_exit(struct mldl_cfg *mldl_cfg) -{ - struct mpuaccel_data *data = NULL; - - if (mldl_cfg == NULL) - return ML_ERROR; - - data = (struct mpuaccel_data *)mldl_cfg->ext.mpuacc_data; - - if (data != NULL) { - sysfs_remove_group(&(data->input_data->dev.kobj), - &mpuaccel_attribute_group); - input_free_device(data->input_data); - - kfree(data); - data = NULL; - - mldl_cfg->ext.mpuacc_data = NULL; - } - - return ML_SUCCESS; -} - -int mpu_accel_suspend(struct mldl_cfg *mldl_cfg) -{ - int result = ML_SUCCESS; - int enable = 0; - struct mpuaccel_data *data = NULL; - - if (mldl_cfg == NULL) - return ML_ERROR; - - data = (struct mpuaccel_data *)mldl_cfg->ext.mpuacc_data; - - mpu_accel_mutex_lock(data); - enable = atomic_read(&data->enable); - - pr_info("%s: device_is_on = %d, enable = %d\n", - __func__, data->device_is_on, enable); - - if (data->device_is_on == 1 && enable == 0) { - pr_info("%s: mpu_accel_activate_device 0\n", __func__); - result = mpu_accel_activate_device(data, 0); - } - - mpu_accel_mutex_unlock(data); - - return result; -} - -int mpu_accel_resume(struct mldl_cfg *mldl_cfg) -{ - int result = ML_SUCCESS; - int enable = 0; - struct mpuaccel_data *data = NULL; - - if (mldl_cfg == NULL) - return ML_ERROR; - - data = (struct mpuaccel_data *)mldl_cfg->ext.mpuacc_data; - - mpu_accel_mutex_lock(data); - enable = atomic_read(&data->enable); - - pr_info("%s: device_is_on = %d, enable = %d\n", - __func__, data->device_is_on, enable); - - if (data->device_is_on == 0 && enable == 0) { - pr_info("%s: mpu_accel_activate_device 1\n", __func__); - result = mpu_accel_activate_device(data, 1); - } - - mpu_accel_mutex_unlock(data); - - return result; -} - -int mpu_accel_read(struct mldl_cfg *mldl_cfg, unsigned char *buffer) -{ - int result = ML_SUCCESS; - int enable = 0; - struct mpuaccel_data *data = NULL; - - if (mldl_cfg == NULL) - return ML_ERROR; - - data = (struct mpuaccel_data *)mldl_cfg->ext.mpuacc_data; - - mpu_accel_mutex_lock(data); - enable = atomic_read(&data->enable); -#ifdef MPUACC_USES_CACHED_DATA - if (enable == 1) - memcpy(buffer, data->cached_data, sizeof(unsigned char) * 6); - else -#endif /* MPUACC_USES_CACHED_DATA */ - result = mpu_accel_get_data_from_device(data, buffer); - mpu_accel_mutex_unlock(data); - - return result; -} diff --git a/drivers/misc/mpu3050/mpu-accel.h b/drivers/misc/mpu3050/mpu-accel.h deleted file mode 100755 index 5dd57c9..0000000 --- a/drivers/misc/mpu3050/mpu-accel.h +++ /dev/null @@ -1,8 +0,0 @@ -#undef MPUACC_USES_CACHED_DATA -#define MPUACC_USES_MOUNTING_MATRIX - -int mpu_accel_init(struct mldl_cfg *mldl_cfg, void *accel_handle); -int mpu_accel_exit(struct mldl_cfg *mldl_cfg); -int mpu_accel_suspend(struct mldl_cfg *mldl_cfg); -int mpu_accel_resume(struct mldl_cfg *mldl_cfg); -int mpu_accel_read(struct mldl_cfg *mldl_cfg, unsigned char *buffer); diff --git a/drivers/misc/mpu3050/mpu-dev.c b/drivers/misc/mpu3050/mpu-dev.c deleted file mode 100755 index ef04ed7..0000000 --- a/drivers/misc/mpu3050/mpu-dev.c +++ /dev/null @@ -1,2280 +0,0 @@ -/* - mpu-dev.c - mpu3050 char device interface - - Copyright (C) 1995-97 Simon G. Vogl - Copyright (C) 1998-99 Frodo Looijaard - Copyright (C) 2003 Greg Kroah-Hartman - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* Code inside mpudev_ioctl_rdrw is copied from i2c-dev.c - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_HAS_EARLYSUSPEND -#include -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "mpuirq.h" -#include "slaveirq.h" -#include "mlsl.h" -#include "mlos.h" -#include "mpu-i2c.h" -#include "mldl_cfg.h" -#include "mpu-accel.h" - -#include "mpu.h" - -#define ACCEL_VENDOR_NAME "KIONIX" -#define ACCEL_CHIP_NAME "KXTF9" - -#define GYRO_VENDOR_NAME "INVENSENSE" -#define GYRO_CHIP_NAME "MPU-3050" - -#define MPU3050_EARLY_SUSPEND_IN_DRIVER 1 - -#define CALIBRATION_FILE_PATH "/efs/calibration_data" -#define CALIBRATION_DATA_AMOUNT 100 - -struct acc_data cal_data; - -/* Platform data for the MPU */ -struct mpu_private_data { - struct mldl_cfg mldl_cfg; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct early_suspend early_suspend; -#endif -}; - -static int is_lis3dh; - -#define IDEAL_X 0 -#define IDEAL_Y 0 -#define IDEAL_Z 1024 - -static int pid; - -static struct i2c_client *this_client; - -int read_accel_raw_xyz(struct acc_data *acc) -{ - unsigned char acc_data[6]; - s32 temp; - struct mldl_cfg *mldl_cfg; - - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(this_client); - - if (!mpu) { - pr_info("%s : mpu data is NULL, mpu3050 Init error", __func__); - return 0; - } - - mldl_cfg = &mpu->mldl_cfg; - - if (mldl_cfg->accel_is_suspended == 1 || - (mldl_cfg->dmp_is_running == 0 - && mldl_cfg->accel_is_suspended == 0)) { - if (is_lis3dh) { - if (mldl_cfg->accel_is_suspended == 1) { - sensor_i2c_write_register(this_client->adapter, - 0x19, 0x20, 0x67); - MLOSSleep(1); - } - sensor_i2c_read(this_client->adapter, - 0x19, 0x28 | 0x80, 6, acc_data); - if (mldl_cfg->accel_is_suspended == 1) { - sensor_i2c_write_register(this_client->adapter, - 0x19, 0x20, 0x18); - MLOSSleep(1); - } - } else - sensor_i2c_read(this_client->adapter, - 0x0F, 0x06, 6, acc_data); - } else if (mldl_cfg->dmp_is_running && - mldl_cfg->accel_is_suspended == 0) { - if (sensor_i2c_read(this_client->adapter, - DEFAULT_MPU_SLAVEADDR, - 0x23, 6, acc_data) != 0) - return -1; - } else - return -1; - - if (is_lis3dh) { - acc->x = ((acc_data[0] << 8) | acc_data[1]); - acc->x = (acc->x >> 4); - acc->y = ((acc_data[2] << 8) | acc_data[3]); - acc->y = (acc->y >> 4); - acc->z = ((acc_data[4] << 8) | acc_data[5]); - acc->z = (acc->z >> 4); - } else { - temp = ((acc_data[1] << 4) | (acc_data[0] >> 4)); - if (temp < 2048) - acc->x = (s16) (-temp); - else - acc->x = (s16) (4096 - temp); - - temp = ((acc_data[3] << 4) | (acc_data[2] >> 4)); - if (temp < 2048) - acc->y = (s16) (-temp); - else - acc->y = (s16) (4096 - temp); - - temp = ((acc_data[5] << 4) | (acc_data[4] >> 4)); - if (temp < 2048) - acc->z = (s16) (1024 - temp); - else - acc->z = (s16) (3072 - temp); - } - return 0; -} - -static int accel_open_calibration(void) -{ - struct file *cal_filp = NULL; - int err = 0; - mm_segment_t old_fs; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - - cal_filp = filp_open(CALIBRATION_FILE_PATH, O_RDONLY, 0666); - if (IS_ERR(cal_filp)) { - pr_err("%s: Can't open calibration file\n", __func__); - set_fs(old_fs); - err = PTR_ERR(cal_filp); - - cal_data.x = 0; - cal_data.y = 0; - cal_data.z = 0; - - return err; - } - - err = cal_filp->f_op->read(cal_filp, - (char *)&cal_data, 3 * sizeof(s16), - &cal_filp->f_pos); - if (err != 3 * sizeof(s16)) { - pr_err("%s: Can't read the cal data from file\n", __func__); - err = -EIO; - } - - pr_info("%s : (%u,%u,%u)\n", __func__, - cal_data.x, cal_data.y, cal_data.z); - - filp_close(cal_filp, current->files); - set_fs(old_fs); - - return err; -} - -static int accel_do_calibrate(bool do_calib) -{ - struct acc_data data = { 0, }; - struct file *cal_filp = NULL; - int sum[3] = { 0, }; - int err = 0; - int i; - mm_segment_t old_fs; - - if (do_calib) { - for (i = 0; i < CALIBRATION_DATA_AMOUNT; i++) { - err = read_accel_raw_xyz(&data); - if (err < 0) { - pr_err("%s: accel_read_accel_raw_xyz() " - "failed in the %dth loop\n", - __func__, i); - return err; - } - - sum[0] += data.x; - sum[1] += data.y; - sum[2] += data.z; - } - - - if (is_lis3dh) { - cal_data.x = IDEAL_X - cal_data.x; - cal_data.y = IDEAL_Y - cal_data.y; - cal_data.z = IDEAL_Z - cal_data.z; - } else { - cal_data.x = sum[0] / CALIBRATION_DATA_AMOUNT; - cal_data.y = sum[1] / CALIBRATION_DATA_AMOUNT; - cal_data.z = sum[2] / CALIBRATION_DATA_AMOUNT; - } - } else { - cal_data.x = 0; - cal_data.y = 0; - cal_data.z = 0; - } - - pr_info("%s: cal data (%d,%d,%d)\n", __func__, - cal_data.x, cal_data.y, cal_data.z); - - old_fs = get_fs(); - set_fs(KERNEL_DS); - - cal_filp = filp_open(CALIBRATION_FILE_PATH, - O_CREAT | O_TRUNC | O_WRONLY, 0666); - if (IS_ERR(cal_filp)) { - pr_err("%s: Can't open calibration file\n", __func__); - set_fs(old_fs); - err = PTR_ERR(cal_filp); - return err; - } - - err = cal_filp->f_op->write(cal_filp, - (char *)&cal_data, 3 * sizeof(s16), - &cal_filp->f_pos); - if (err != 3 * sizeof(s16)) { - pr_err("%s: Can't write the cal data to file\n", __func__); - err = -EIO; - } - - filp_close(cal_filp, current->files); - set_fs(old_fs); - - return err; -} - -static int mpu_open(struct inode *inode, struct file *file) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(this_client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - - accel_open_calibration(); - - pr_info("%s", __func__); - dev_dbg(&this_client->adapter->dev, "mpu_open\n"); - dev_dbg(&this_client->adapter->dev, "current->pid %d\n", current->pid); - pid = current->pid; - file->private_data = this_client; - - /* we could do some checking on the flags supplied by "open" */ - /* i.e. O_NONBLOCK */ - /* -> set some flag to disable interruptible_sleep_on in mpu_read */ - - /* Reset the sensors to the default */ - mldl_cfg->requested_sensors = ML_THREE_AXIS_GYRO; - if (mldl_cfg->accel && mldl_cfg->accel->resume) - mldl_cfg->requested_sensors |= ML_THREE_AXIS_ACCEL; - - if (mldl_cfg->compass && mldl_cfg->compass->resume) - mldl_cfg->requested_sensors |= ML_THREE_AXIS_COMPASS; - - if (mldl_cfg->pressure && mldl_cfg->pressure->resume) - mldl_cfg->requested_sensors |= ML_THREE_AXIS_PRESSURE; - - return 0; -} - -/* close function - called when the "file" /dev/mpu is closed in userspace */ -static int mpu_release(struct inode *inode, struct file *file) -{ - struct i2c_client *client = (struct i2c_client *)file->private_data; - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - int result = 0; - - pid = 0; - - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - result = mpu3050_suspend(mldl_cfg, client->adapter, - accel_adapter, compass_adapter, - pressure_adapter, TRUE, TRUE, TRUE, TRUE); - pr_info("%s", __func__); - dev_dbg(&this_client->adapter->dev, "mpu_release\n"); - return result; -} - -static noinline int mpudev_ioctl_rdrw(struct i2c_client *client, - unsigned long arg) -{ - struct i2c_rdwr_ioctl_data rdwr_arg; - struct i2c_msg *rdwr_pa; - u8 __user **data_ptrs; - int i, res; - - if (copy_from_user(&rdwr_arg, - (struct i2c_rdwr_ioctl_data __user *)arg, - sizeof(rdwr_arg))) - return -EFAULT; - - /* Put an arbitrary limit on the number of messages that can - * be sent at once */ - if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS) - return -EINVAL; - - rdwr_pa = (struct i2c_msg *) - kmalloc(rdwr_arg.nmsgs * sizeof(struct i2c_msg), GFP_KERNEL); - if (!rdwr_pa) - return -ENOMEM; - - if (copy_from_user(rdwr_pa, rdwr_arg.msgs, - rdwr_arg.nmsgs * sizeof(struct i2c_msg))) { - kfree(rdwr_pa); - return -EFAULT; - } - - data_ptrs = kmalloc(rdwr_arg.nmsgs * sizeof(u8 __user *), GFP_KERNEL); - if (data_ptrs == NULL) { - kfree(rdwr_pa); - return -ENOMEM; - } - - res = 0; - for (i = 0; i < rdwr_arg.nmsgs; i++) { - /* Limit the size of the message to a sane amount; - * and don't let length change either. */ - if ((rdwr_pa[i].len > 8192) || - (rdwr_pa[i].flags & I2C_M_RECV_LEN)) { - res = -EINVAL; - break; - } - data_ptrs[i] = (u8 __user *) rdwr_pa[i].buf; - rdwr_pa[i].buf = kmalloc(rdwr_pa[i].len, GFP_KERNEL); - if (rdwr_pa[i].buf == NULL) { - res = -ENOMEM; - break; - } - if (copy_from_user(rdwr_pa[i].buf, data_ptrs[i], - rdwr_pa[i].len)) { - ++i; /* Needs to be kfreed too */ - res = -EFAULT; - break; - } - } - if (res < 0) { - int j; - for (j = 0; j < i; ++j) - kfree(rdwr_pa[j].buf); - kfree(data_ptrs); - kfree(rdwr_pa); - return res; - } - - res = i2c_transfer(client->adapter, rdwr_pa, rdwr_arg.nmsgs); - while (i-- > 0) { - if (res >= 0 && (rdwr_pa[i].flags & I2C_M_RD)) { - if (copy_to_user(data_ptrs[i], rdwr_pa[i].buf, - rdwr_pa[i].len)) - res = -EFAULT; - } - kfree(rdwr_pa[i].buf); - } - kfree(data_ptrs); - kfree(rdwr_pa); - return res; -} - -/* read function called when from /dev/mpu is read. Read from the FIFO */ -static ssize_t mpu_read(struct file *file, - char __user *buf, size_t count, loff_t *offset) -{ - char *tmp; - int ret; - - struct i2c_client *client = (struct i2c_client *)file->private_data; - - if (count > 8192) - count = 8192; - - tmp = kmalloc(count, GFP_KERNEL); - if (tmp == NULL) - return -ENOMEM; - - pr_info("%s: i2c-dev: i2c-%d reading %zu bytes.\n", __func__, - iminor(file->f_path.dentry->d_inode), count); - -/* @todo fix this to do a i2c trasnfer from the FIFO */ - ret = i2c_master_recv(client, tmp, count); - if (ret >= 0) { - ret = copy_to_user(buf, tmp, count) ? -EFAULT : ret; - if (ret) - ret = -EFAULT; - } - kfree(tmp); - return ret; -} - -static int mpu_ioctl_set_mpu_pdata(struct i2c_client *client, unsigned long arg) -{ - int ii; - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mpu3050_platform_data *pdata = mpu->mldl_cfg.pdata; - struct mpu3050_platform_data local_pdata; - - if (copy_from_user(&local_pdata, (unsigned char __user *)arg, - sizeof(local_pdata))) - return -EFAULT; - - pdata->int_config = local_pdata.int_config; - for (ii = 0; ii < DIM(pdata->orientation); ii++) - pdata->orientation[ii] = local_pdata.orientation[ii]; - pdata->level_shifter = local_pdata.level_shifter; - - pdata->accel.address = local_pdata.accel.address; - for (ii = 0; ii < DIM(pdata->accel.orientation); ii++) - pdata->accel.orientation[ii] = - local_pdata.accel.orientation[ii]; - - pdata->compass.address = local_pdata.compass.address; - for (ii = 0; ii < DIM(pdata->compass.orientation); ii++) - pdata->compass.orientation[ii] = - local_pdata.compass.orientation[ii]; - - pdata->pressure.address = local_pdata.pressure.address; - for (ii = 0; ii < DIM(pdata->pressure.orientation); ii++) - pdata->pressure.orientation[ii] = - local_pdata.pressure.orientation[ii]; - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - return ML_SUCCESS; -} - -static int -mpu_ioctl_set_mpu_config(struct i2c_client *client, unsigned long arg) -{ - int ii; - int result = ML_SUCCESS; - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct mldl_cfg *temp_mldl_cfg; - - dev_dbg(&this_client->adapter->dev, "%s\n", __func__); - - temp_mldl_cfg = kzalloc(sizeof(struct mldl_cfg), GFP_KERNEL); - if (NULL == temp_mldl_cfg) - return -ENOMEM; - - /* - * User space is not allowed to modify accel compass pressure or - * pdata structs, as well as silicon_revision product_id or trim - */ - if (copy_from_user(temp_mldl_cfg, (struct mldl_cfg __user *)arg, - offsetof(struct mldl_cfg, silicon_revision))) { - result = -EFAULT; - goto out; - } - - if (mldl_cfg->gyro_is_suspended) { - if (mldl_cfg->addr != temp_mldl_cfg->addr) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->int_config != temp_mldl_cfg->int_config) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->ext_sync != temp_mldl_cfg->ext_sync) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->full_scale != temp_mldl_cfg->full_scale) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->lpf != temp_mldl_cfg->lpf) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->clk_src != temp_mldl_cfg->clk_src) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->divider != temp_mldl_cfg->divider) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->dmp_enable != temp_mldl_cfg->dmp_enable) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->fifo_enable != temp_mldl_cfg->fifo_enable) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->dmp_cfg1 != temp_mldl_cfg->dmp_cfg1) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->dmp_cfg2 != temp_mldl_cfg->dmp_cfg2) - mldl_cfg->gyro_needs_reset = TRUE; - - if (mldl_cfg->gyro_power != temp_mldl_cfg->gyro_power) - mldl_cfg->gyro_needs_reset = TRUE; - - for (ii = 0; ii < MPU_NUM_AXES; ii++) - if (mldl_cfg->offset_tc[ii] != - temp_mldl_cfg->offset_tc[ii]) - mldl_cfg->gyro_needs_reset = TRUE; - - for (ii = 0; ii < MPU_NUM_AXES; ii++) - if (mldl_cfg->offset[ii] != temp_mldl_cfg->offset[ii]) - mldl_cfg->gyro_needs_reset = TRUE; - - if (memcmp(mldl_cfg->ram, temp_mldl_cfg->ram, - MPU_MEM_NUM_RAM_BANKS * MPU_MEM_BANK_SIZE * - sizeof(unsigned char))) - mldl_cfg->gyro_needs_reset = TRUE; - } - - memcpy(mldl_cfg, temp_mldl_cfg, - offsetof(struct mldl_cfg, silicon_revision)); - -out: - kfree(temp_mldl_cfg); - return result; -} - -static int -mpu_ioctl_get_mpu_config(struct i2c_client *client, unsigned long arg) -{ - /* Have to be careful as there are 3 pointers in the mldl_cfg - * structure */ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct mldl_cfg *local_mldl_cfg; - int retval = 0; - - local_mldl_cfg = kzalloc(sizeof(struct mldl_cfg), GFP_KERNEL); - if (NULL == local_mldl_cfg) - return -ENOMEM; - - retval = - copy_from_user(local_mldl_cfg, (struct mldl_cfg __user *)arg, - sizeof(struct mldl_cfg)); - if (retval) { - dev_err(&this_client->adapter->dev, - "%s|%s:%d: EFAULT on arg\n", - __FILE__, __func__, __LINE__); - retval = -EFAULT; - goto out; - } - - /* Fill in the accel, compass, pressure and pdata pointers */ - if (mldl_cfg->accel) { - retval = copy_to_user((void __user *)local_mldl_cfg->accel, - mldl_cfg->accel, - sizeof(*mldl_cfg->accel)); - if (retval) { - dev_err(&this_client->adapter->dev, - "%s|%s:%d: EFAULT on accel\n", - __FILE__, __func__, __LINE__); - retval = -EFAULT; - goto out; - } - } - - if (mldl_cfg->compass) { - retval = copy_to_user((void __user *)local_mldl_cfg->compass, - mldl_cfg->compass, - sizeof(*mldl_cfg->compass)); - if (retval) { - dev_err(&this_client->adapter->dev, - "%s|%s:%d: EFAULT on compass\n", - __FILE__, __func__, __LINE__); - retval = -EFAULT; - goto out; - } - } - - if (mldl_cfg->pressure) { - retval = copy_to_user((void __user *)local_mldl_cfg->pressure, - mldl_cfg->pressure, - sizeof(*mldl_cfg->pressure)); - if (retval) { - dev_err(&this_client->adapter->dev, - "%s|%s:%d: EFAULT on pressure\n", - __FILE__, __func__, __LINE__); - retval = -EFAULT; - goto out; - } - } - - if (mldl_cfg->pdata) { - retval = copy_to_user((void __user *)local_mldl_cfg->pdata, - mldl_cfg->pdata, - sizeof(*mldl_cfg->pdata)); - if (retval) { - dev_err(&this_client->adapter->dev, - "%s|%s:%d: EFAULT on pdata\n", - __FILE__, __func__, __LINE__); - retval = -EFAULT; - goto out; - } - } - - /* Do not modify the accel, compass, pressure and pdata pointers */ - retval = copy_to_user((struct mldl_cfg __user *)arg, - mldl_cfg, offsetof(struct mldl_cfg, accel)); - - if (retval) - retval = -EFAULT; -out: - kfree(local_mldl_cfg); - return retval; -} - -/** - * Pass a requested slave configuration to the slave sensor - * - * @param adapter the adaptor to use to communicate with the slave - * @param mldl_cfg the mldl configuration structuer - * @param slave pointer to the slave descriptor - * @param usr_config The configuration to pass to the slave sensor - * - * @return 0 or non-zero error code - */ -static int slave_config(void *adapter, - struct mldl_cfg *mldl_cfg, - struct ext_slave_descr *slave, - struct ext_slave_config __user *usr_config) -{ - int retval = ML_SUCCESS; - if ((slave) && (slave->config)) { - struct ext_slave_config config; - retval = copy_from_user(&config, usr_config, sizeof(config)); - if (retval) - return -EFAULT; - - if (config.len && config.data) { - int *data; - data = kzalloc(config.len, GFP_KERNEL); - if (!data) - return ML_ERROR_MEMORY_EXAUSTED; - - retval = copy_from_user(data, - (void __user *)config.data, - config.len); - if (retval) { - retval = -EFAULT; - kfree(data); - return retval; - } - config.data = data; - } - retval = slave->config(adapter, - slave, &mldl_cfg->pdata->accel, &config); - kfree(config.data); - } - return retval; -} - -/** - * Get a requested slave configuration from the slave sensor - * - * @param adapter the adaptor to use to communicate with the slave - * @param mldl_cfg the mldl configuration structuer - * @param slave pointer to the slave descriptor - * @param usr_config The configuration for the slave to fill out - * - * @return 0 or non-zero error code - */ -static int slave_get_config(void *adapter, - struct mldl_cfg *mldl_cfg, - struct ext_slave_descr *slave, - struct ext_slave_config __user *usr_config) -{ - int retval = ML_SUCCESS; - if ((slave) && (slave->get_config)) { - struct ext_slave_config config; - void *user_data; - retval = copy_from_user(&config, usr_config, sizeof(config)); - if (retval) - return -EFAULT; - - user_data = config.data; - if (config.len && config.data) { - int *data; - data = kzalloc(config.len, GFP_KERNEL); - if (!data) - return ML_ERROR_MEMORY_EXAUSTED; - - retval = copy_from_user(data, - (void __user *)config.data, - config.len); - if (retval) { - retval = -EFAULT; - kfree(data); - return retval; - } - config.data = data; - } - retval = slave->get_config(adapter, - slave, - &mldl_cfg->pdata->accel, &config); - if (retval) { - kfree(config.data); - return retval; - } - retval = copy_to_user((unsigned char __user *)user_data, - config.data, config.len); - kfree(config.data); - } - return retval; -} - -/* ioctl - I/O control */ -static long mpu_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct i2c_client *client = (struct i2c_client *)file->private_data; - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - int retval = 0; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - - switch (cmd) { - case I2C_RDWR: - mpudev_ioctl_rdrw(client, arg); - break; - case I2C_SLAVE: - if ((arg & 0x7E) != (client->addr & 0x7E)) { - dev_err(&this_client->adapter->dev, - "%s: Invalid I2C_SLAVE arg %lu\n", - __func__, arg); - } - break; - case MPU_SET_MPU_CONFIG: - retval = mpu_ioctl_set_mpu_config(client, arg); - break; - case MPU_SET_INT_CONFIG: - mldl_cfg->int_config = (unsigned char)arg; - break; - case MPU_SET_EXT_SYNC: - mldl_cfg->ext_sync = (enum mpu_ext_sync)arg; - break; - case MPU_SET_FULL_SCALE: - mldl_cfg->full_scale = (enum mpu_fullscale)arg; - break; - case MPU_SET_LPF: - mldl_cfg->lpf = (enum mpu_filter)arg; - break; - case MPU_SET_CLK_SRC: - mldl_cfg->clk_src = (enum mpu_clock_sel)arg; - break; - case MPU_SET_DIVIDER: - mldl_cfg->divider = (unsigned char)arg; - break; - case MPU_SET_LEVEL_SHIFTER: - mldl_cfg->pdata->level_shifter = (unsigned char)arg; - break; - case MPU_SET_DMP_ENABLE: - mldl_cfg->dmp_enable = (unsigned char)arg; - break; - case MPU_SET_FIFO_ENABLE: - mldl_cfg->fifo_enable = (unsigned char)arg; - break; - case MPU_SET_DMP_CFG1: - mldl_cfg->dmp_cfg1 = (unsigned char)arg; - break; - case MPU_SET_DMP_CFG2: - mldl_cfg->dmp_cfg2 = (unsigned char)arg; - break; - case MPU_SET_OFFSET_TC: - retval = copy_from_user(mldl_cfg->offset_tc, - (unsigned char __user *)arg, - sizeof(mldl_cfg->offset_tc)); - if (retval) - retval = -EFAULT; - break; - case MPU_SET_RAM: - retval = copy_from_user(mldl_cfg->ram, - (unsigned char __user *)arg, - sizeof(mldl_cfg->ram)); - if (retval) - retval = -EFAULT; - break; - case MPU_SET_PLATFORM_DATA: - retval = mpu_ioctl_set_mpu_pdata(client, arg); - break; - case MPU_GET_MPU_CONFIG: - retval = mpu_ioctl_get_mpu_config(client, arg); - break; - case MPU_GET_INT_CONFIG: - retval = put_user(mldl_cfg->int_config, - (unsigned char __user *)arg); - break; - case MPU_GET_EXT_SYNC: - retval = put_user(mldl_cfg->ext_sync, - (unsigned char __user *)arg); - break; - case MPU_GET_FULL_SCALE: - retval = put_user(mldl_cfg->full_scale, - (unsigned char __user *)arg); - break; - case MPU_GET_LPF: - retval = put_user(mldl_cfg->lpf, (unsigned char __user *)arg); - break; - case MPU_GET_CLK_SRC: - retval = put_user(mldl_cfg->clk_src, - (unsigned char __user *)arg); - break; - case MPU_GET_DIVIDER: - retval = put_user(mldl_cfg->divider, - (unsigned char __user *)arg); - break; - case MPU_GET_LEVEL_SHIFTER: - retval = put_user(mldl_cfg->pdata->level_shifter, - (unsigned char __user *)arg); - break; - case MPU_GET_DMP_ENABLE: - retval = put_user(mldl_cfg->dmp_enable, - (unsigned char __user *)arg); - break; - case MPU_GET_FIFO_ENABLE: - retval = put_user(mldl_cfg->fifo_enable, - (unsigned char __user *)arg); - break; - case MPU_GET_DMP_CFG1: - retval = put_user(mldl_cfg->dmp_cfg1, - (unsigned char __user *)arg); - break; - case MPU_GET_DMP_CFG2: - retval = put_user(mldl_cfg->dmp_cfg2, - (unsigned char __user *)arg); - break; - case MPU_GET_OFFSET_TC: - retval = copy_to_user((unsigned char __user *)arg, - mldl_cfg->offset_tc, - sizeof(mldl_cfg->offset_tc)); - if (retval) - retval = -EFAULT; - break; - case MPU_GET_RAM: - retval = copy_to_user((unsigned char __user *)arg, - mldl_cfg->ram, sizeof(mldl_cfg->ram)); - if (retval) - retval = -EFAULT; - break; - case MPU_CONFIG_ACCEL: - retval = slave_config(accel_adapter, mldl_cfg, - mldl_cfg->accel, - (struct ext_slave_config __user *)arg); - break; - case MPU_CONFIG_COMPASS: - retval = slave_config(compass_adapter, mldl_cfg, - mldl_cfg->compass, - (struct ext_slave_config __user *)arg); - break; - case MPU_CONFIG_PRESSURE: - retval = slave_config(pressure_adapter, mldl_cfg, - mldl_cfg->pressure, - (struct ext_slave_config __user *)arg); - break; - case MPU_GET_CONFIG_ACCEL: - retval = slave_get_config(accel_adapter, mldl_cfg, - mldl_cfg->accel, - (struct ext_slave_config __user *) - arg); - break; - case MPU_GET_CONFIG_COMPASS: - retval = slave_get_config(compass_adapter, mldl_cfg, - mldl_cfg->compass, - (struct ext_slave_config __user *) - arg); - break; - case MPU_GET_CONFIG_PRESSURE: - retval = slave_get_config(pressure_adapter, mldl_cfg, - mldl_cfg->pressure, - (struct ext_slave_config __user *) - arg); - break; - case MPU_SUSPEND: - { - unsigned long sensors; - sensors = ~(mldl_cfg->requested_sensors); - retval = mpu3050_suspend(mldl_cfg, - client->adapter, - accel_adapter, - compass_adapter, - pressure_adapter, - ((sensors & ML_THREE_AXIS_GYRO) - == ML_THREE_AXIS_GYRO), - ((sensors & - ML_THREE_AXIS_ACCEL) - == ML_THREE_AXIS_ACCEL), - ((sensors & - ML_THREE_AXIS_COMPASS) - == ML_THREE_AXIS_COMPASS), - ((sensors & - ML_THREE_AXIS_PRESSURE) - == ML_THREE_AXIS_PRESSURE)); - } - break; - case MPU_RESUME: - { - unsigned long sensors; - sensors = mldl_cfg->requested_sensors; - retval = mpu3050_resume(mldl_cfg, - client->adapter, - accel_adapter, - compass_adapter, - pressure_adapter, - sensors & ML_THREE_AXIS_GYRO, - sensors & ML_THREE_AXIS_ACCEL, - sensors & ML_THREE_AXIS_COMPASS, - sensors & - ML_THREE_AXIS_PRESSURE); - } - break; - case MPU_READ_ACCEL: - { - unsigned char data[6]; - retval = mpu3050_read_accel(mldl_cfg, client->adapter, - data); - - if ((ML_SUCCESS == retval) && - (copy_to_user((unsigned char __user *)arg, - data, sizeof(data)))) - retval = -EFAULT; - } - break; - case MPU_READ_COMPASS: - { - unsigned char data[6]; - struct i2c_adapter *compass_adapt = - i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - retval = mpu3050_read_compass(mldl_cfg, compass_adapt, - data); - if ((ML_SUCCESS == retval) && - (copy_to_user((unsigned char *)arg, - data, sizeof(data)))) - retval = -EFAULT; - } - break; - case MPU_READ_PRESSURE: - { - unsigned char data[3]; - struct i2c_adapter *pressure_adapt = - i2c_get_adapter(mldl_cfg->pdata->pressure. - adapt_num); - retval = - mpu3050_read_pressure(mldl_cfg, pressure_adapt, - data); - if ((ML_SUCCESS == retval) - && - (copy_to_user - ((unsigned char __user *)arg, data, sizeof(data)))) - retval = -EFAULT; - } - break; - case MPU_READ_MEMORY: - case MPU_WRITE_MEMORY: - default: - dev_err(&this_client->adapter->dev, - "%s: Unknown cmd %d, arg %lu\n", __func__, cmd, arg); - retval = -EINVAL; - } - - return retval; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -void mpu3050_early_suspend(struct early_suspend *h) -{ - struct mpu_private_data *mpu = container_of(h, - struct mpu_private_data, - early_suspend); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - pr_info("%s", __func__); - - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - - dev_dbg(&this_client->adapter->dev, "%s: %d, %d\n", __func__, - h->level, mpu->mldl_cfg.gyro_is_suspended); - if (MPU3050_EARLY_SUSPEND_IN_DRIVER) - (void)mpu3050_suspend(mldl_cfg, this_client->adapter, - accel_adapter, compass_adapter, - pressure_adapter, TRUE, TRUE, TRUE, TRUE); -} - -void mpu3050_early_resume(struct early_suspend *h) -{ - struct mpu_private_data *mpu = container_of(h, - struct mpu_private_data, - early_suspend); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - - if (MPU3050_EARLY_SUSPEND_IN_DRIVER) { - if (pid) { - unsigned long sensors = mldl_cfg->requested_sensors; - (void)mpu3050_resume(mldl_cfg, - this_client->adapter, - accel_adapter, - compass_adapter, - pressure_adapter, - sensors & ML_THREE_AXIS_GYRO, - sensors & ML_THREE_AXIS_ACCEL, - sensors & ML_THREE_AXIS_COMPASS, - sensors & ML_THREE_AXIS_PRESSURE); - dev_dbg(&this_client->adapter->dev, - "%s for pid %d\n", __func__, pid); - } - } - dev_dbg(&this_client->adapter->dev, "%s: %d\n", __func__, h->level); - pr_info("%s: h->level = %d\n", __func__, h->level); -} -#endif - -void mpu_shutdown(struct i2c_client *client) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - pr_info("%s", __func__); - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - - (void)mpu3050_suspend(mldl_cfg, this_client->adapter, - accel_adapter, compass_adapter, pressure_adapter, - TRUE, TRUE, TRUE, TRUE); - dev_dbg(&this_client->adapter->dev, "%s\n", __func__); -} - -int mpu_suspend(struct i2c_client *client, pm_message_t mesg) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - pr_info("%s", __func__); - if (!mpu->mldl_cfg.gyro_is_suspended) { - dev_dbg(&this_client->adapter->dev, - "%s: suspending on event %d\n", __func__, mesg.event); - (void)mpu3050_suspend(mldl_cfg, this_client->adapter, - accel_adapter, compass_adapter, - pressure_adapter, TRUE, TRUE, TRUE, TRUE); - } else { - dev_dbg(&this_client->adapter->dev, - "%s: Already suspended %d\n", __func__, mesg.event); - } - return 0; -} - -int mpu_resume(struct i2c_client *client) -{ - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - pr_info("%s: accel_adapter = %p\n", __func__, accel_adapter); - - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - - if (pid) { - unsigned long sensors = mldl_cfg->requested_sensors; - (void)mpu3050_resume(mldl_cfg, this_client->adapter, - accel_adapter, - compass_adapter, - pressure_adapter, - sensors & ML_THREE_AXIS_GYRO, - sensors & ML_THREE_AXIS_ACCEL, - sensors & ML_THREE_AXIS_COMPASS, - sensors & ML_THREE_AXIS_PRESSURE); - dev_dbg(&this_client->adapter->dev, - "%s for pid %d\n", __func__, pid); - } - - pr_info("%s: pid = %d\n", __func__, pid); - return 0; -} - -/* define which file operations are supported */ -static const struct file_operations mpu_fops = { - .owner = THIS_MODULE, - .read = mpu_read, -#if HAVE_COMPAT_IOCTL - .compat_ioctl = mpu_ioctl, -#endif -#if HAVE_UNLOCKED_IOCTL - .unlocked_ioctl = mpu_ioctl, -#endif - .open = mpu_open, - .release = mpu_release, -}; - -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -static struct miscdevice i2c_mpu_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = "mpu", /* Same for both 3050 and 6000 */ - .fops = &mpu_fops, -}; - -#define FACTORY_TEST -#ifdef FACTORY_TEST - -static ssize_t mpu3050_power_on(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int count = 0; - - pr_info("%s : this_client = %d\n", __func__, (int)this_client); - count = sprintf(buf, "%d\n", (this_client != NULL ? 1 : 0)); - - return count; -} - -static int mpu3050_factory_on(struct i2c_client *client) -{ - struct mpu_private_data *mpu = i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - int prev_gyro_suspended; - pr_info("%s", __func__); - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - - prev_gyro_suspended = mldl_cfg->gyro_is_suspended; - if (prev_gyro_suspended) { - unsigned long sensors = mldl_cfg->requested_sensors; - (void)mpu3050_resume(mldl_cfg, - client->adapter, - accel_adapter, - compass_adapter, - pressure_adapter, - sensors & ML_THREE_AXIS_GYRO, - sensors & ML_THREE_AXIS_ACCEL, - sensors & ML_THREE_AXIS_COMPASS, - sensors & ML_THREE_AXIS_PRESSURE); - } - - return prev_gyro_suspended; -} - -static void mpu3050_factory_off(struct i2c_client *client) -{ - struct mpu_private_data *mpu = i2c_get_clientdata(client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - pr_info("%s", __func__); - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - - (void)mpu3050_suspend(mldl_cfg, - client->adapter, - accel_adapter, - compass_adapter, - pressure_adapter, TRUE, TRUE, TRUE, TRUE); -} - -static ssize_t mpu3050_get_temp(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int count = 0; - short int temperature = 0; - unsigned char data[2]; - int prev_gyro_suspended; - pr_info("%s", __func__); - prev_gyro_suspended = mpu3050_factory_on(this_client); - - /*MPUREG_TEMP_OUT_H, 27 0x1b */ - /*MPUREG_TEMP_OUT_L, 28 0x1c */ - /* TEMP_OUT_H/L: 16-bit temperature data (2's complement data format) */ - sensor_i2c_read(this_client->adapter, DEFAULT_MPU_SLAVEADDR, - MPUREG_TEMP_OUT_H, 2, data); - temperature = (short)(((data[0]) << 8) | data[1]); - temperature = (((temperature + 13200) / 280) + 35); - pr_info("%s :read temperature = %d\n", __func__, temperature); - - count = sprintf(buf, "%d\n", temperature); - - if (prev_gyro_suspended) - mpu3050_factory_off(this_client); - - return count; -} - -/* - Defines -*/ - -#define DEBUG_OUT 1 - -#define DEF_GYRO_FULLSCALE (2000) /* gyro full scale dps */ -#define DEF_GYRO_SENS (32768.f/DEF_GYRO_FULLSCALE) - /* gyro sensitivity LSB/dps */ -#define DEF_PACKET_THRESH (75) /* 600 ms / 8ms / sample */ -#define DEF_TIMING_TOL (.05f) /* 5% */ -#define DEF_BIAS_THRESH (40*DEF_GYRO_SENS) - /* 40 dps in LSBs */ -#define DEF_RMS_THRESH_SQ (0.4f*0.4f*DEF_GYRO_SENS*DEF_GYRO_SENS) - /* (.2 dps in LSBs ) ^ 2 */ -#define DEF_TEST_TIME_PER_AXIS (600) /* ms of time spent collecting - data for each axis, - multiple of 600ms */ - -/* - Macros -*/ - -#define CHECK_TEST_ERROR(x) \ - if (x) { \ - pr_info("error %d @ %s|%d\n", x, __func__, __LINE__); \ - return -1; \ - } - -#define SHORT_TO_TEMP_C(shrt) (((shrt+13200)/280)+35) -#define CHARS_TO_SHORT(d) ((((short)(d)[0])<<8)+(d)[1]) -#define fabs(x) (((x) < 0) ? -(x) : (x)) - -void mpu3050_usleep(unsigned long t) -{ - unsigned long start = MLOSGetTickCount(); - while (MLOSGetTickCount() - start < t / 1000) { - } -} - -#define X (0) -#define Y (1) -#define Z (2) - -static short mpu3050_selftest_gyro_avg[3]; -static int mpu3050_selftest_result; -static int mpu3050_selftest_bias[3]; -static int mpu3050_selftest_rms[3]; - -int mpu3050_test_gyro(struct i2c_client *client, short gyro_biases[3], - short *temp_avg) -{ - void *mlsl_handle = client->adapter; - int retVal = 0; - tMLError result; - - int total_count = 0; - int total_count_axis[3] = { 0, 0, 0 }; - int packet_count; - unsigned char regs[7]; - - char a_name[3][2] = { "X", "Y", "Z" }; - int temperature; - int Avg[3]; - int RMS[3]; - int i, j, tmp; - unsigned char dataout[20]; - - short *x, *y, *z; - - x = kzalloc(sizeof(*x) * (DEF_TEST_TIME_PER_AXIS / 8 * 4), GFP_KERNEL); - y = kzalloc(sizeof(*y) * (DEF_TEST_TIME_PER_AXIS / 8 * 4), GFP_KERNEL); - z = kzalloc(sizeof(*z) * (DEF_TEST_TIME_PER_AXIS / 8 * 4), GFP_KERNEL); - - temperature = 0; - - /* sample rate = 8ms */ - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_SMPLRT_DIV, 0x07); - - if (result) - goto out_i2c_faild; - - regs[0] = 0x03; /* filter = 42Hz, analog_sample rate = 1 KHz */ - switch (DEF_GYRO_FULLSCALE) { - case 2000: - regs[0] |= 0x18; - break; - case 1000: - regs[0] |= 0x10; - break; - case 500: - regs[0] |= 0x08; - break; - case 250: - default: - regs[0] |= 0x00; - break; - } - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_DLPF_FS_SYNC, regs[0]); - if (result) - goto out_i2c_faild; - - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_INT_CFG, 0x00); - - /* 1st, timing test */ - for (j = 0; j < 3; j++) { - - pr_info("%s :Collecting gyro data from %s gyro PLL\n", - __func__, a_name[j]); - - /* turn on all gyros, use gyro X for clocking - Set to Y and Z for 2nd and 3rd iteration */ - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_PWR_MGM, j + 1); - if (result) - goto out_i2c_faild; - - /* wait for 2 ms after switching clock source */ - mpu3050_usleep(2000); - - /* we will enable XYZ gyro in FIFO and nothing else */ - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_FIFO_EN2, 0x00); - if (result) - goto out_i2c_faild; - /* enable/reset FIFO */ - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_USER_CTRL, 0x42); - - tmp = (int)(DEF_TEST_TIME_PER_AXIS / 600); - - while (tmp-- > 0) { - /* enable XYZ gyro in FIFO and nothing else */ - result = - MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_FIFO_EN1, 0x70); - if (result) - goto out_i2c_faild; - - /* wait for 600 ms for data */ - mpu3050_usleep(600000); - - /* stop storing gyro in the FIFO */ - result = - MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_FIFO_EN1, 0x00); - if (result) - goto out_i2c_faild; - - /* Getting number of bytes in FIFO */ - result = MLSLSerialRead(mlsl_handle, client->addr, - MPUREG_FIFO_COUNTH, 2, dataout); - if (result) - goto out_i2c_faild; - /* number of 6 B packets in the FIFO */ - packet_count = CHARS_TO_SHORT(dataout) / 6; - pr_info("%s :Packet Count: %d - ", - __func__, packet_count); - - if (abs(packet_count - DEF_PACKET_THRESH) - <= /* Within +-5% range */ - (int)(DEF_TIMING_TOL * DEF_PACKET_THRESH + .5)) { - for (i = 0; i < packet_count; i++) { - /* getting FIFO data */ - result = - MLSLSerialReadFifo(mlsl_handle, - client->addr, 6, - dataout); - if (result) - goto out_i2c_faild; - - x[total_count + i] = - CHARS_TO_SHORT(&dataout[0]); - y[total_count + i] = - CHARS_TO_SHORT(&dataout[2]); - z[total_count + i] = - CHARS_TO_SHORT(&dataout[4]); - if (DEBUG_OUT && 0) { - pr_info("%s :Gyros %-4d " \ - ": %+13d %+13d %+13d\n", - __func__, total_count + i, - x[total_count + i], - y[total_count + i], - z[total_count + i]); - } - } - total_count += packet_count; - total_count_axis[j] += packet_count; - pr_info("%s :OK\n", __func__); - } else { - retVal |= 1 << j; - pr_info("%s :NOK - samples ignored\n", - __func__); - } - } - - /* remove gyros from FIFO */ - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_FIFO_EN1, 0x00); - if (result) - goto out_i2c_faild; - - /* Read Temperature */ - result = MLSLSerialRead(mlsl_handle, client->addr, - MPUREG_TEMP_OUT_H, 2, dataout); - temperature += (short)CHARS_TO_SHORT(dataout); - } - - pr_info("%s :\nTotal %d samples\n\n", __func__, total_count); - - /* 2nd, check bias from X and Y PLL clock source */ - tmp = total_count != 0 ? total_count : 1; - for (i = 0, Avg[X] = .0f, Avg[Y] = .0f, Avg[Z] = .0f; - i < total_count; i++) { - Avg[X] += x[i]; - Avg[Y] += y[i]; - Avg[Z] += z[i]; - } - - Avg[X] /= tmp; - Avg[Y] /= tmp; - Avg[Z] /= tmp; - - pr_info("%s :bias : %+13d %+13d %+13d (LSB)\n", - __func__, Avg[X], Avg[Y], Avg[Z]); - if (DEBUG_OUT) { - pr_info("%s : : %+13d %+13d %+13d (dps)\n", - __func__, Avg[X] / 131, Avg[Y] / 131, Avg[Z] / 131); - } - for (j = 0; j < 3; j++) { - if (abs(Avg[j]) > (int)DEF_BIAS_THRESH) { - pr_info("%s :%s-Gyro bias (%.0d) exceeded threshold " - "(threshold = %f)\n", __func__, - a_name[j], Avg[j], DEF_BIAS_THRESH); - retVal |= 1 << (3 + j); - } - } - - /* 3rd and finally, check RMS */ - for (i = 0, RMS[X] = 0.f, RMS[Y] = 0.f, RMS[Z] = 0.f; - i < total_count; i++) { - RMS[X] += (x[i] - Avg[X]) * (x[i] - Avg[X]); - RMS[Y] += (y[i] - Avg[Y]) * (y[i] - Avg[Y]); - RMS[Z] += (z[i] - Avg[Z]) * (z[i] - Avg[Z]); - } - - for (j = 0; j < 3; j++) { - if (RMS[j] > (int)DEF_RMS_THRESH_SQ * total_count) { - pr_info - ("%s :%s-Gyro RMS (%d) exceeded threshold (%.4f)\n", - __func__, a_name[j], RMS[j] / total_count, - DEF_RMS_THRESH_SQ); - retVal |= 1 << (6 + j); - } - } - - pr_info("%s :RMS^2 : %+13d %+13d %+13d (LSB-rms)\n", - __func__, - (RMS[X] / total_count), - (RMS[Y] / total_count), (RMS[Z] / total_count)); - if (RMS[X] == 0 || RMS[Y] == 0 || RMS[Z] == 0) { - /*If any of the RMS noise value returns zero, - then we might have dead gyro or FIFO/register failure, - or the part is sleeping */ - retVal |= 1 << 9; - } - - temperature /= 3; - if (DEBUG_OUT) - pr_info("%s :Temperature : %+13d %13s %13s (deg. C)\n", - __func__, SHORT_TO_TEMP_C(temperature), "", ""); - - /* load into final storage */ - *temp_avg = (short)temperature; - gyro_biases[X] = (short)Avg[X]; - gyro_biases[Y] = (short)Avg[Y]; - gyro_biases[Z] = (short)Avg[Z]; - - mpu3050_selftest_bias[X] = (int)Avg[X]; - mpu3050_selftest_bias[Y] = (int)Avg[Y]; - mpu3050_selftest_bias[Z] = (int)Avg[Z]; - - mpu3050_selftest_rms[X] = RMS[X] / total_count; - mpu3050_selftest_rms[Y] = RMS[Y] / total_count; - mpu3050_selftest_rms[Z] = RMS[Z] / total_count; - -out_i2c_faild: - if (result) - pr_info("%s : error %d", __func__, result); - - kfree(x); - kfree(y); - kfree(z); - - return retVal; -} - -int mpu3050_self_test_once(struct i2c_client *client) -{ - void *mlsl_handle = client->adapter; - int result = 0; - - short temp_avg; - - unsigned char regs[5]; - unsigned long testStart = MLOSGetTickCount(); - - pr_info("%s :Collecting %d groups of 600 ms samples for each axis\n\n", - __func__, DEF_TEST_TIME_PER_AXIS / 600); - - result = MLSLSerialRead(mlsl_handle, client->addr, - MPUREG_PWR_MGM, 1, regs); - CHECK_TEST_ERROR(result); - /* reset */ - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_PWR_MGM, regs[0] | 0x80); - CHECK_TEST_ERROR(result); - MLOSSleep(5); - /* wake up */ - if (regs[0] & 0x40) { - result = MLSLSerialWriteSingle(mlsl_handle, client->addr, - MPUREG_PWR_MGM, 0x00); - CHECK_TEST_ERROR(result); - } - MLOSSleep(60); - - /* collect gyro and temperature data */ - mpu3050_selftest_result = mpu3050_test_gyro(client, - mpu3050_selftest_gyro_avg, - &temp_avg); - - pr_info("%s :\nTest time : %ld ms\n", - __func__, MLOSGetTickCount() - testStart); - - return mpu3050_selftest_result; -} - -static ssize_t mpu3050_self_test(struct device *dev, - struct device_attribute *attr, char *buf) -{ - unsigned char gyro_data[6]; - short int raw[3]; - int count = 0; - int res = 0; - int prev_gyro_suspended; - -/*MPUREG_GYRO_XOUT_H, 29 0x1d */ -/*MPUREG_GYRO_XOUT_L, 30 0x1e */ -/*MPUREG_GYRO_YOUT_H, 31 0x1f */ -/*MPUREG_GYRO_YOUT_L, 32 0x20 */ -/*MPUREG_GYRO_ZOUT_H, 33 0x21 */ -/*MPUREG_GYRO_ZOUT_L, 34 0x22 */ - -/* GYRO_XOUT_H/L: 16-bit X gyro output data (2's complement data format) */ -/* GYRO_YOUT_H/L: 16-bit Y gyro output data (2's complement data format) */ -/* GYRO_ZOUT_H/L: 16-bit Z gyro output data (2's complement data format) */ - - prev_gyro_suspended = mpu3050_factory_on(this_client); - - mpu3050_self_test_once(this_client); - - res = sensor_i2c_read(this_client->adapter, DEFAULT_MPU_SLAVEADDR, - MPUREG_GYRO_XOUT_H, 6, gyro_data); - - if (res) - return 0; - - raw[0] = (short)(((gyro_data[0]) << 8) | gyro_data[1]); - raw[1] = (short)(((gyro_data[2]) << 8) | gyro_data[3]); - raw[2] = (short)(((gyro_data[4]) << 8) | gyro_data[5]); - - pr_info("%s: %s %s, %d, %d, %d, %d, %d, %d\n", __func__, buf, - (!mpu3050_selftest_result ? "OK" : "NG"), - raw[0], raw[1], raw[2], - mpu3050_selftest_gyro_avg[0], - mpu3050_selftest_gyro_avg[1], mpu3050_selftest_gyro_avg[2]); - - count = sprintf(buf, "%s, %d, %d, %d, %d, %d, %d\n", - (!mpu3050_selftest_result ? "OK" : "NG"), - mpu3050_selftest_bias[0], mpu3050_selftest_bias[1], - mpu3050_selftest_bias[2], - mpu3050_selftest_rms[0], - mpu3050_selftest_rms[1], mpu3050_selftest_rms[2]); - - if (prev_gyro_suspended) - mpu3050_factory_off(this_client); - - return count; -} - -static ssize_t mpu3050_acc_read(struct device *dev, - struct device_attribute *attr, char *buf) -{ - unsigned char acc_data[6]; - s16 x, y, z; - s32 temp; - - struct mpu_private_data *mpu = - (struct mpu_private_data *)i2c_get_clientdata(this_client); - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - - if (mldl_cfg->accel_is_suspended == 1 || - (mldl_cfg->dmp_is_running == 0 - && mldl_cfg->accel_is_suspended == 0)) { - if (is_lis3dh) { - if (mldl_cfg->accel_is_suspended == 1) { - sensor_i2c_write_register(this_client->adapter, - 0x19, 0x20, 0x67); - MLOSSleep(1); - } - sensor_i2c_read(this_client->adapter, - 0x19, 0x28 | 0x80, 6, acc_data); - - if (mldl_cfg->accel_is_suspended == 1) { - sensor_i2c_write_register(this_client->adapter, - 0x19, 0x20, 0x18); - MLOSSleep(1); - } - } else - sensor_i2c_read(this_client->adapter, - 0x0F, 0x06, 6, acc_data); - } else if (mldl_cfg->dmp_is_running && - mldl_cfg->accel_is_suspended == 0) { - sensor_i2c_read(this_client->adapter, - DEFAULT_MPU_SLAVEADDR, 0x23, 6, acc_data); - } - - if (is_lis3dh) { - x = ((acc_data[0] << 8) | acc_data[1]); - x = (x >> 4) + cal_data.x; - y = ((acc_data[2] << 8) | acc_data[3]); - y = (y >> 4) + cal_data.y; - z = ((acc_data[4] << 8) | acc_data[5]); - z = (z >> 4) + cal_data.z; - } else { - temp = (s16) ((acc_data[1] << 4) | (acc_data[0] >> 4)) - + cal_data.x; - if (temp < 2048) - x = (s16) (temp); - else - x = (s16) ((4096 - temp)) * (-1); - - temp = (s16) ((acc_data[3] << 4) | (acc_data[2] >> 4)) - + cal_data.y; - if (temp < 2048) - y = (s16) (temp); - else - y = (s16) ((4096 - temp)) * (-1); - - temp = (s16) ((acc_data[5] << 4) | (acc_data[4] >> 4)) - + cal_data.z; - if (temp < 2048) - z = (s16) (temp); - else - z = (s16) ((4096 - temp)) * (-1); - } - -#if defined(CONFIG_MACH_P8) - /* x *= (-1); */ - /* y *= (-1); */ - z *= (-1); - return sprintf(buf, "%d, %d, %d\n", y, x, z); - -#elif defined(CONFIG_MACH_P8LTE) - x *= (-1); - /* y *= (-1); */ - /* z *= (-1); */ - return sprintf(buf, "%d, %d, %d\n", y, x, z); - -#elif defined(CONFIG_MACH_P2) - /* x *= (-1); */ - /* y *= (-1); */ - z *= (-1); - return sprintf(buf, "%d, %d, %d\n", y, x, z); - -#else - x *= (-1); - y *= (-1); - z *= (-1); - return sprintf(buf, "%d, %d, %d\n", y, x, z); - -#endif - -} - -static ssize_t accel_calibration_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int err; - - err = accel_open_calibration(); - if (err < 0) - pr_err("%s: accel_open_calibration() failed\n", __func__); - - pr_info("accel_calibration_show :%d %d %d\n", - cal_data.x, cal_data.y, cal_data.z); - - if (err < 0) - err = 0; - else - err = 1; - - if (cal_data.x == 0 && cal_data.y == 0 && cal_data.z == 0) - err = 0; - - return sprintf(buf, "%d %d %d %d\n", - err, cal_data.x, cal_data.y, cal_data.z); -} - -static ssize_t accel_calibration_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - bool do_calib; - int err; - int count = 0; - char str[11]; - - if (sysfs_streq(buf, "1")) - do_calib = true; - else if (sysfs_streq(buf, "0")) - do_calib = false; - else { - pr_debug("%s: invalid value %d\n", __func__, *buf); - return -EINVAL; - } - - err = accel_do_calibrate(do_calib); - if (err < 0) - pr_err("%s: accel_do_calibrate() failed\n", __func__); - - pr_info("accel_calibration_show :%d %d %d\n", - cal_data.x, cal_data.y, cal_data.z); - if (err > 0) - err = 0; - count = sprintf(str, "%d\n", err); - - strcpy(str, buf); - return count; -} - -static ssize_t get_accel_vendor_name(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%s\n", ACCEL_VENDOR_NAME); -} - -static ssize_t get_accel_chip_name(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%s\n", ACCEL_CHIP_NAME); -} - -static ssize_t get_gyro_vendor_name(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%s\n", GYRO_VENDOR_NAME); -} - -static ssize_t get_gyro_chip_name(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%s\n", GYRO_CHIP_NAME); -} - -static struct device_attribute dev_attr_accel_vendor = - __ATTR(vendor, S_IRUGO, get_accel_vendor_name, NULL); -static struct device_attribute dev_attr_accel_chip = - __ATTR(name, S_IRUGO, get_accel_chip_name, NULL); - -static struct device_attribute dev_attr_gyro_vendor = - __ATTR(vendor, S_IRUGO, get_gyro_vendor_name, NULL); -static struct device_attribute dev_attr_gyro_chip = - __ATTR(name, S_IRUGO, get_gyro_chip_name, NULL); - -static DEVICE_ATTR(calibration, 0664, - accel_calibration_show, accel_calibration_store); -static DEVICE_ATTR(raw_data, S_IRUGO, mpu3050_acc_read, NULL); - -static DEVICE_ATTR(power_on, S_IRUGO | S_IWUSR, mpu3050_power_on, NULL); -static DEVICE_ATTR(temperature, S_IRUGO | S_IWUSR, mpu3050_get_temp, NULL); -static DEVICE_ATTR(selftest, S_IRUGO | S_IWUSR, mpu3050_self_test, NULL); - -static DEVICE_ATTR(gyro_power_on, S_IRUGO | S_IWUSR, mpu3050_power_on, NULL); -static DEVICE_ATTR(gyro_get_temp, S_IRUGO | S_IWUSR, mpu3050_get_temp, NULL); -static DEVICE_ATTR(gyro_selftest, S_IRUGO | S_IWUSR, mpu3050_self_test, NULL); - - -static struct device_attribute *accel_sensor_attrs[] = { - &dev_attr_raw_data, - &dev_attr_calibration, - &dev_attr_accel_vendor, - &dev_attr_accel_chip, - NULL, -}; - -static struct device_attribute *gyro_sensor_attrs[] = { - &dev_attr_power_on, - &dev_attr_temperature, - &dev_attr_selftest, - &dev_attr_gyro_vendor, - &dev_attr_gyro_chip, - NULL, -}; - -extern struct class *sec_class; -extern struct class *sensors_class; - -static struct device *sec_mpu3050_dev; -static struct device *accel_sensor_device; -static struct device *gyro_sensor_device; - -extern int sensors_register(struct device *dev, void *drvdata, - struct device_attribute *attributes[], char *name); -#endif -#define FEATURE_MPU_AUTO_PROBING - -#if defined(CONFIG_MPU_SENSORS_KXTF9_LIS3DH) - -static int mpu350_auto_probe_accel(struct mpu3050_platform_data *pdata) -{ - int ret = ML_SUCCESS; - unsigned char reg = 0; - struct mpu_private_data *mpu; - struct mldl_cfg *mldl_cfg; - struct i2c_adapter *accel_adapter = NULL; - struct ext_slave_descr *slave_descr = NULL; - accel_adapter = i2c_get_adapter(pdata->accel.adapt_num); - - slave_descr = lis3dh_get_slave_descr(); - ret = MLSLSerialRead(accel_adapter, 0x19, 0x0, 1, ®); - if (ret == 0) { - pdata->accel.get_slave_descr = lis3dh_get_slave_descr; - pdata->accel.address = 0x19; - - mpu = (struct mpu_private_data *) - i2c_get_clientdata(this_client); - mldl_cfg = &mpu->mldl_cfg; - mldl_cfg->accel = slave_descr; -/* - printk("auto probe : found %s\n", - pdata->accel.get_slave_descr()->name); -*/ - is_lis3dh = 1; - } - return ret; -} - -#endif - -int mpu3050_probe(struct i2c_client *client, const struct i2c_device_id *devid) -{ - struct mpu3050_platform_data *pdata; - struct mpu_private_data *mpu; - struct mldl_cfg *mldl_cfg; - int res = 0; - int retry = 5; - - struct i2c_adapter *accel_adapter = NULL; - struct i2c_adapter *compass_adapter = NULL; - struct i2c_adapter *pressure_adapter = NULL; - - pr_info("================%s===============\n", __func__); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - res = -ENODEV; - goto out_check_functionality_failed; - } -#ifdef FACTORY_TEST - res = sensors_register(accel_sensor_device, NULL, - accel_sensor_attrs, "accelerometer_sensor"); - if (res) - pr_err("%s: cound not register accelerometer "\ - "sensor device(%d).\n", __func__, res); - - res = sensors_register(gyro_sensor_device, NULL, - gyro_sensor_attrs, "gyro_sensor"); - if (res) - pr_err("%s: cound not register gyro "\ - "sensor device(%d).\n", __func__, res); - - sec_mpu3050_dev = device_create(sec_class, NULL, 0, NULL, - "sec_mpu3050"); - if (IS_ERR(sec_mpu3050_dev)) - pr_info("%s :Failed to create device!", __func__); - - if (device_create_file(sec_mpu3050_dev, &dev_attr_gyro_power_on) < 0) { - pr_info("%s :Failed to create device file(%s)!\n", __func__, - dev_attr_gyro_power_on.attr.name); - return -1; - } - if (device_create_file(sec_mpu3050_dev, &dev_attr_gyro_get_temp) < 0) { - pr_info("%s :Failed to create device file(%s)!\n", __func__, - dev_attr_gyro_get_temp.attr.name); - device_remove_file(sec_mpu3050_dev, &dev_attr_gyro_power_on); - return -1; - } - if (device_create_file(sec_mpu3050_dev, &dev_attr_gyro_selftest) < 0) { - pr_info("%s :Failed to create device file(%s)!\n", __func__, - dev_attr_gyro_selftest.attr.name); - device_remove_file(sec_mpu3050_dev, &dev_attr_gyro_power_on); - device_remove_file(sec_mpu3050_dev, &dev_attr_gyro_get_temp); - return -1; - } -#endif - mpu = kzalloc(sizeof(struct mpu_private_data), GFP_KERNEL); - if (!mpu) { - res = -ENOMEM; - goto out_alloc_data_failed; - } - - i2c_set_clientdata(client, mpu); - this_client = client; - mldl_cfg = &mpu->mldl_cfg; - pdata = (struct mpu3050_platform_data *)client->dev.platform_data; - if (!pdata) { - dev_warn(&this_client->adapter->dev, - "Warning no platform data for mpu3050\n"); - } else { - mldl_cfg->pdata = pdata; - - pdata->accel.get_slave_descr = get_accel_slave_descr; - pdata->compass.get_slave_descr = get_compass_slave_descr; - pdata->pressure.get_slave_descr = get_pressure_slave_descr; - - is_lis3dh = 0; -#if defined(CONFIG_MPU_SENSORS_KXTF9_LIS3DH) - mpu350_auto_probe_accel(pdata); - if (pdata->accel.get_slave_descr && !is_lis3dh) { - mldl_cfg->accel = pdata->accel.get_slave_descr(); - dev_info(&this_client->adapter->dev, - "%s: +%s\n", MPU_NAME, mldl_cfg->accel->name); - accel_adapter = i2c_get_adapter(pdata->accel.adapt_num); - - if (!accel_adapter) { - pr_info("%s : accel_adapter i2c get fail", - __func__); - goto out_accel_failed; - } - - if (pdata->accel.irq > 0) { - dev_info(&this_client->adapter->dev, - "Installing Accel irq using %d\n", - pdata->accel.irq); - res = slaveirq_init(accel_adapter, - &pdata->accel, "accelirq"); - if (res) - goto out_accelirq_failed; - } else { - dev_warn(&this_client->adapter->dev, - "WARNING: Accel irq not assigned\n"); - } - } else -#else - if (pdata->accel.get_slave_descr) { - mldl_cfg->accel = pdata->accel.get_slave_descr(); - dev_info(&this_client->adapter->dev, - "%s: +%s\n", MPU_NAME, mldl_cfg->accel->name); - accel_adapter = i2c_get_adapter(pdata->accel.adapt_num); - - if (!accel_adapter) { - pr_info("%s : accel_adapter i2c get fail", - __func__); - goto out_accel_failed; - } - - if (pdata->accel.irq > 0) { - dev_info(&this_client->adapter->dev, - "Installing Accel irq using %d\n", - pdata->accel.irq); - res = slaveirq_init(accel_adapter, - &pdata->accel, "accelirq"); - if (res) - goto out_accelirq_failed; - } else { - dev_warn(&this_client->adapter->dev, - "WARNING: Accel irq not assigned\n"); - } - } else -#endif - { - dev_warn(&this_client->adapter->dev, - "%s: No Accel Present\n", MPU_NAME); - } - - if (pdata->compass.get_slave_descr) { - mldl_cfg->compass = pdata->compass.get_slave_descr(); - dev_info(&this_client->adapter->dev, - "%s: +%s\n", MPU_NAME, - mldl_cfg->compass->name); - compass_adapter = - i2c_get_adapter(pdata->compass.adapt_num); - - if (!compass_adapter) { - pr_info("%s : compass_adapter i2c get fail", - __func__); - goto out_compass_failed; - } - - if (pdata->compass.irq > 0) { - dev_info(&this_client->adapter->dev, - "Installing Compass irq using %d\n", - pdata->compass.irq); - res = slaveirq_init(compass_adapter, - &pdata->compass, - "compassirq"); - if (res) - goto out_compassirq_failed; - } else { - dev_warn(&this_client->adapter->dev, - "WARNING: Compass irq not assigned\n"); - } - } else { - dev_warn(&this_client->adapter->dev, - "%s: No Compass Present\n", MPU_NAME); - } - - if (pdata->pressure.get_slave_descr) { - mldl_cfg->pressure = pdata->pressure.get_slave_descr(); - dev_info(&this_client->adapter->dev, - "%s: +%s\n", MPU_NAME, - mldl_cfg->pressure->name); - pressure_adapter = - i2c_get_adapter(pdata->pressure.adapt_num); - - if (!pressure_adapter) { - pr_info("%s : pressure_adapter i2c get fail", - __func__); - goto out_pressure_failed; - } - - if (pdata->pressure.irq > 0) { - dev_info(&this_client->adapter->dev, - "Installing Pressure irq using %d\n", - pdata->pressure.irq); - res = slaveirq_init(pressure_adapter, - &pdata->pressure, - "pressureirq"); - if (res) - goto out_pressureirq_failed; - } else { - dev_warn(&this_client->adapter->dev, - "WARNING: Pressure irq not assigned\n"); - } - } else { - dev_warn(&this_client->adapter->dev, - "%s: No Pressure Present\n", MPU_NAME); - } - } - - mldl_cfg->addr = client->addr; - - do { - res = mpu3050_open(&mpu->mldl_cfg, client->adapter, - accel_adapter, compass_adapter, - pressure_adapter); - if (res) { - dev_err(&this_client->adapter->dev, - "%s i2c Init Error, ret = %d\n", MPU_NAME, res); - mpu3050_usleep(5000); - } - } while (retry-- && res); - - if (res) { - dev_err(&this_client->adapter->dev, - "Unable to open %s %d\n", MPU_NAME, res); - res = -ENODEV; - goto out_whoami_failed; - } - - res = misc_register(&i2c_mpu_device); - if (res < 0) { - dev_err(&this_client->adapter->dev, - "ERROR: misc_register returned %d\n", res); - goto out_misc_register_failed; - } - - if (this_client->irq > 0) { - dev_info(&this_client->adapter->dev, - "Installing irq using %d\n", this_client->irq); - res = mpuirq_init(this_client); - if (res) - goto out_mpuirq_failed; - } else { - dev_warn(&this_client->adapter->dev, - "WARNING: %s irq not assigned\n", MPU_NAME); - } - - mpu_accel_init(&mpu->mldl_cfg, client->adapter); - -#ifdef CONFIG_HAS_EARLYSUSPEND - mpu->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; - mpu->early_suspend.suspend = mpu3050_early_suspend; - mpu->early_suspend.resume = mpu3050_early_resume; - register_early_suspend(&mpu->early_suspend); -#endif - return res; - -out_mpuirq_failed: - misc_deregister(&i2c_mpu_device); -out_misc_register_failed: - mpu3050_close(&mpu->mldl_cfg, client->adapter, - accel_adapter, compass_adapter, pressure_adapter); -out_whoami_failed: - if (pdata && pdata->pressure.get_slave_descr && pdata->pressure.irq) - slaveirq_exit(&pdata->pressure); -out_pressureirq_failed: -out_pressure_failed: - if (pdata && pdata->compass.get_slave_descr && pdata->compass.irq) - slaveirq_exit(&pdata->compass); -out_compassirq_failed: -out_compass_failed: - if (pdata && pdata->accel.get_slave_descr && pdata->accel.irq) - slaveirq_exit(&pdata->accel); -out_accelirq_failed: -out_accel_failed: - kfree(mpu); -out_alloc_data_failed: -out_check_functionality_failed: - dev_err(&this_client->adapter->dev, "%s failed %d\n", __func__, res); - return res; -} - -static int mpu3050_remove(struct i2c_client *client) -{ - struct mpu_private_data *mpu = i2c_get_clientdata(client); - struct i2c_adapter *accel_adapter; - struct i2c_adapter *compass_adapter; - struct i2c_adapter *pressure_adapter; - struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg; - struct mpu3050_platform_data *pdata = mldl_cfg->pdata; - - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - compass_adapter = i2c_get_adapter(mldl_cfg->pdata->compass.adapt_num); - pressure_adapter = i2c_get_adapter(mldl_cfg->pdata->pressure.adapt_num); - - dev_dbg(&client->adapter->dev, "%s\n", __func__); - -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&mpu->early_suspend); -#endif - mpu3050_close(mldl_cfg, client->adapter, - accel_adapter, compass_adapter, pressure_adapter); - - if (client->irq) - mpuirq_exit(); - - if (pdata && pdata->pressure.get_slave_descr && pdata->pressure.irq) - slaveirq_exit(&pdata->pressure); - - if (pdata && pdata->compass.get_slave_descr && pdata->compass.irq) - slaveirq_exit(&pdata->compass); - - if (pdata && pdata->accel.get_slave_descr && pdata->accel.irq) - slaveirq_exit(&pdata->accel); - - misc_deregister(&i2c_mpu_device); - kfree(mpu); - - mpu_accel_exit(mldl_cfg); - - return 0; -} - -static const struct i2c_device_id mpu3050_id[] = { - {MPU_NAME, 0}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, mpu3050_id); - -static struct i2c_driver mpu3050_driver = { - .class = I2C_CLASS_HWMON, - .probe = mpu3050_probe, - .remove = mpu3050_remove, - .id_table = mpu3050_id, - .driver = { - .owner = THIS_MODULE, - .name = MPU_NAME, - }, - .address_list = normal_i2c, - .shutdown = mpu_shutdown, /* optional */ - .suspend = mpu_suspend, /* optional */ - .resume = mpu_resume, /* optional */ -}; - -static int __init mpu_init(void) -{ - int res = i2c_add_driver(&mpu3050_driver); - pid = 0; - - pr_info("%s res=%d\n", __func__, res); - if (res) - dev_err(&this_client->adapter->dev, "%s failed\n", __func__); - return res; -} - -static void __exit mpu_exit(void) -{ - pr_info(KERN_DEBUG "%s\n", __func__); - i2c_del_driver(&mpu3050_driver); -} - -module_init(mpu_init); -module_exit(mpu_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("User space character device interface for MPU3050"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS(MPU_NAME); diff --git a/drivers/misc/mpu3050/mpu-i2c.c b/drivers/misc/mpu3050/mpu-i2c.c deleted file mode 100755 index b1298d3..0000000 --- a/drivers/misc/mpu3050/mpu-i2c.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -/** - * @defgroup - * @brief - * - * @{ - * @file mpu-i2c.c - * @brief - * - */ - -#include -#include "mpu.h" - -int sensor_i2c_write(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned int len, unsigned char const *data) -{ - struct i2c_msg msgs[1]; - int res; - - if (NULL == data || NULL == i2c_adap) - return -EINVAL; - - msgs[0].addr = address; - msgs[0].flags = 0; /* write */ - msgs[0].buf = (unsigned char *) data; - msgs[0].len = len; - - res = i2c_transfer(i2c_adap, msgs, 1); - if (res < 1) - return res; - else - return 0; -} - -int sensor_i2c_write_register(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned char reg, unsigned char value) -{ - unsigned char data[2]; - - data[0] = reg; - data[1] = value; - return sensor_i2c_write(i2c_adap, address, 2, data); -} - -int sensor_i2c_read(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned char reg, - unsigned int len, unsigned char *data) -{ - struct i2c_msg msgs[2]; - int res; - - if (NULL == data || NULL == i2c_adap) - return -EINVAL; - - msgs[0].addr = address; - msgs[0].flags = 0; /* write */ - msgs[0].buf = ® - msgs[0].len = 1; - - msgs[1].addr = address; - msgs[1].flags = I2C_M_RD; - msgs[1].buf = data; - msgs[1].len = len; - - res = i2c_transfer(i2c_adap, msgs, 2); - if (res < 2) - return res; - else - return 0; -} - -int mpu_memory_read(struct i2c_adapter *i2c_adap, - unsigned char mpu_addr, - unsigned short mem_addr, - unsigned int len, unsigned char *data) -{ - unsigned char bank[2]; - unsigned char addr[2]; - unsigned char buf; - - struct i2c_msg msgs[4]; - int ret; - - if (NULL == data || NULL == i2c_adap) - return -EINVAL; - - bank[0] = MPUREG_BANK_SEL; - bank[1] = mem_addr >> 8; - - addr[0] = MPUREG_MEM_START_ADDR; - addr[1] = mem_addr & 0xFF; - - buf = MPUREG_MEM_R_W; - - /* Write Message */ - msgs[0].addr = mpu_addr; - msgs[0].flags = 0; - msgs[0].buf = bank; - msgs[0].len = sizeof(bank); - - msgs[1].addr = mpu_addr; - msgs[1].flags = 0; - msgs[1].buf = addr; - msgs[1].len = sizeof(addr); - - msgs[2].addr = mpu_addr; - msgs[2].flags = 0; - msgs[2].buf = &buf; - msgs[2].len = 1; - - msgs[3].addr = mpu_addr; - msgs[3].flags = I2C_M_RD; - msgs[3].buf = data; - msgs[3].len = len; - - ret = i2c_transfer(i2c_adap, msgs, 4); - if (ret != 4) - return ret; - else - return 0; -} - -int mpu_memory_write(struct i2c_adapter *i2c_adap, - unsigned char mpu_addr, - unsigned short mem_addr, - unsigned int len, unsigned char const *data) -{ - unsigned char bank[2]; - unsigned char addr[2]; - unsigned char buf[513]; - - struct i2c_msg msgs[3]; - int ret; - - if (NULL == data || NULL == i2c_adap) - return -EINVAL; - if (len >= (sizeof(buf) - 1)) - return -ENOMEM; - - bank[0] = MPUREG_BANK_SEL; - bank[1] = mem_addr >> 8; - - addr[0] = MPUREG_MEM_START_ADDR; - addr[1] = mem_addr & 0xFF; - - buf[0] = MPUREG_MEM_R_W; - memcpy(buf + 1, data, len); - - /* Write Message */ - msgs[0].addr = mpu_addr; - msgs[0].flags = 0; - msgs[0].buf = bank; - msgs[0].len = sizeof(bank); - - msgs[1].addr = mpu_addr; - msgs[1].flags = 0; - msgs[1].buf = addr; - msgs[1].len = sizeof(addr); - - msgs[2].addr = mpu_addr; - msgs[2].flags = 0; - msgs[2].buf = (unsigned char *) buf; - msgs[2].len = len + 1; - - ret = i2c_transfer(i2c_adap, msgs, 3); - if (ret != 3) - return ret; - else - return 0; -} - -/** - * @} - */ diff --git a/drivers/misc/mpu3050/mpu-i2c.h b/drivers/misc/mpu3050/mpu-i2c.h deleted file mode 100755 index 0bbc8c6..0000000 --- a/drivers/misc/mpu3050/mpu-i2c.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -/** - * @defgroup - * @brief - * - * @{ - * @file mpu-i2c.c - * @brief - * - * - */ - -#ifndef __MPU_I2C_H__ -#define __MPU_I2C_H__ - -#include - -int sensor_i2c_write(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned int len, unsigned char const *data); - -int sensor_i2c_write_register(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned char reg, unsigned char value); - -int sensor_i2c_read(struct i2c_adapter *i2c_adap, - unsigned char address, - unsigned char reg, - unsigned int len, unsigned char *data); - -int mpu_memory_read(struct i2c_adapter *i2c_adap, - unsigned char mpu_addr, - unsigned short mem_addr, - unsigned int len, unsigned char *data); - -int mpu_memory_write(struct i2c_adapter *i2c_adap, - unsigned char mpu_addr, - unsigned short mem_addr, - unsigned int len, unsigned char const *data); - -#endif /* __MPU_I2C_H__ */ diff --git a/drivers/misc/mpu3050/mpuirq.c b/drivers/misc/mpu3050/mpuirq.c deleted file mode 100755 index 8623855..0000000 --- a/drivers/misc/mpu3050/mpuirq.c +++ /dev/null @@ -1,448 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "mpu.h" -#include "mpuirq.h" -#include "mldl_cfg.h" -#include "mpu-i2c.h" -#include "mpu-accel.h" - -#ifdef FEATURE_GYRO_SELFTEST_INTERRUPT -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#endif -#define MPUIRQ_NAME "mpuirq" - -/* function which gets accel data and sends it to MPU */ - -DECLARE_WAIT_QUEUE_HEAD(mpuirq_wait); - -struct mpuirq_dev_data { - struct work_struct work; - struct i2c_client *mpu_client; - struct miscdevice *dev; - int irq; - int pid; - int accel_divider; - int data_ready; - int timeout; -}; - -static struct mpuirq_dev_data mpuirq_dev_data; -static struct mpuirq_data mpuirq_data; -static char *interface = MPUIRQ_NAME; - -static void mpu_accel_data_work_fcn(struct work_struct *work); - -#ifdef FEATURE_GYRO_SELFTEST_INTERRUPT -static irqreturn_t mpuirq_selftest_handler(int irq, void *dev_id); -unsigned long long selftest_get_times[10]; -#endif - -static int mpuirq_open(struct inode *inode, struct file *file); -static int mpuirq_release(struct inode *inode, struct file *file); -static ssize_t mpuirq_read(struct file *file, char *buf, size_t count, - loff_t *ppos); -unsigned int mpuirq_poll(struct file *file, struct poll_table_struct *poll); -static long mpuirq_ioctl(struct file *file, unsigned int cmd, - unsigned long arg); -static irqreturn_t mpuirq_handler(int irq, void *dev_id); - -static int mpuirq_open(struct inode *inode, struct file *file) -{ - dev_dbg(mpuirq_dev_data.dev->this_device, - "%s current->pid %d\n", __func__, current->pid); - mpuirq_dev_data.pid = current->pid; - file->private_data = &mpuirq_dev_data; - /* we could do some checking on the flags supplied by "open" */ - /* i.e. O_NONBLOCK */ - /* -> set some flag to disable interruptible_sleep_on in mpuirq_read */ - return 0; -} - -/* close function - called when the "file" /dev/mpuirq is closed in userspace */ -static int mpuirq_release(struct inode *inode, struct file *file) -{ - dev_dbg(mpuirq_dev_data.dev->this_device, "mpuirq_release\n"); - return 0; -} - -/* read function called when from /dev/mpuirq is read */ -static ssize_t mpuirq_read(struct file *file, - char *buf, size_t count, loff_t * ppos) -{ - int len, err; - struct mpuirq_dev_data *p_mpuirq_dev_data = file->private_data; - - if (!mpuirq_dev_data.data_ready && mpuirq_dev_data.timeout > 0) { - wait_event_interruptible_timeout(mpuirq_wait, - mpuirq_dev_data.data_ready, - mpuirq_dev_data.timeout); - } - - if (mpuirq_dev_data.data_ready && NULL != buf - && count >= sizeof(mpuirq_data)) { - err = copy_to_user(buf, &mpuirq_data, sizeof(mpuirq_data)); - mpuirq_data.data_type = 0; - } else { - return 0; - } - if (err != 0) { - dev_err(p_mpuirq_dev_data->dev->this_device, - "Copy to user returned %d\n", err); - return -EFAULT; - } - mpuirq_dev_data.data_ready = 0; - len = sizeof(mpuirq_data); - return len; -} - -unsigned int mpuirq_poll(struct file *file, struct poll_table_struct *poll) -{ - int mask = 0; - - poll_wait(file, &mpuirq_wait, poll); - if (mpuirq_dev_data.data_ready) - mask |= POLLIN | POLLRDNORM; - return mask; -} - -/* ioctl - I/O control */ -static long mpuirq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - int retval = 0; - int data; - - switch (cmd) { - case MPUIRQ_SET_TIMEOUT: - mpuirq_dev_data.timeout = arg; - break; - - case MPUIRQ_GET_INTERRUPT_CNT: - data = mpuirq_data.interruptcount - 1; - if (mpuirq_data.interruptcount > 1) - mpuirq_data.interruptcount = 1; - - if (copy_to_user((int *)arg, &data, sizeof(int))) - return -EFAULT; - break; - case MPUIRQ_GET_IRQ_TIME: - if (copy_to_user((int *)arg, &mpuirq_data.irqtime, - sizeof(mpuirq_data.irqtime))) - return -EFAULT; - mpuirq_data.irqtime = 0; - break; - case MPUIRQ_SET_FREQUENCY_DIVIDER: - mpuirq_dev_data.accel_divider = arg; - break; - -#ifdef FEATURE_GYRO_SELFTEST_INTERRUPT - case MPUIRQ_SET_SELFTEST_IRQ_HANDLER: - { - int res; - /* unregister mpuirq handler */ - if (mpuirq_dev_data.irq > 0) { - free_irq(mpuirq_dev_data.irq, - &mpuirq_dev_data.irq); - } - /* register selftest irq handler */ - if (mpuirq_dev_data.irq > 0) { - struct mldl_cfg *mldl_cfg = - (struct mldl_cfg *) - i2c_get_clientdata(mpuirq_dev_data. - mpu_client); - unsigned long flags; - - if (BIT_ACTL_LOW == - ((mldl_cfg->pdata->int_config) & BIT_ACTL)) - flags = IRQF_TRIGGER_FALLING; - else - flags = IRQF_TRIGGER_RISING; - - res = request_irq(mpuirq_dev_data.irq, - mpuirq_selftest_handler, flags, - interface, - &mpuirq_dev_data.irq); - - if (res) { - pr_info("MPUIRQ_SET_SELFTEST_IRQ_" \ - "HANDLER: cannot register IRQ %d\n", - mpuirq_dev_data.irq); - } - } - } - break; - case MPUIRQ_SET_MPUIRQ_HANDLER: - { - int res; - /* unregister selftest irq handler */ - if (mpuirq_dev_data.irq > 0) - free_irq(mpuirq_dev_data.irq, - &mpuirq_dev_data.irq); - - /* register mpuirq handler */ - if (mpuirq_dev_data.irq > 0) { - struct mldl_cfg *mldl_cfg = - (struct mldl_cfg *) - i2c_get_clientdata(mpuirq_dev_data. - mpu_client); - unsigned long flags; - - if (BIT_ACTL_LOW == - ((mldl_cfg->pdata->int_config) & BIT_ACTL)) - flags = IRQF_TRIGGER_FALLING; - else - flags = IRQF_TRIGGER_RISING; - - res = - request_irq(mpuirq_dev_data.irq, - mpuirq_handler, flags, - interface, - &mpuirq_dev_data.irq); - } - } - break; - case MPUIRQ_GET_MPUIRQ_JIFFIES: - { - - mpuirq_data.mpuirq_jiffies = 0; - - if (copy_to_user - ((void *)arg, selftest_get_times, - sizeof(selftest_get_times))) { - memset(selftest_get_times, 0, - sizeof(selftest_get_times)); - return -EFAULT; - } - - memset(selftest_get_times, 0, - sizeof(selftest_get_times)); - } - break; -#endif - default: - retval = -EINVAL; - } - return retval; -} - -static void mpu_accel_data_work_fcn(struct work_struct *work) -{ - struct mpuirq_dev_data *mpuirq_dev_data = - (struct mpuirq_dev_data *)work; - struct mldl_cfg *mldl_cfg = (struct mldl_cfg *) - i2c_get_clientdata(mpuirq_dev_data->mpu_client); - struct i2c_adapter *accel_adapter; - unsigned char wbuff[16]; - unsigned char rbuff[16]; - int ii; - - accel_adapter = i2c_get_adapter(mldl_cfg->pdata->accel.adapt_num); - mldl_cfg->accel->read(accel_adapter, - mldl_cfg->accel, &mldl_cfg->pdata->accel, rbuff); - - /* @todo add other data formats here as well */ - if (EXT_SLAVE_BIG_ENDIAN == mldl_cfg->accel->endian) { - for (ii = 0; ii < 3; ii++) { - wbuff[2 * ii + 1] = rbuff[2 * ii + 1]; - wbuff[2 * ii + 2] = rbuff[2 * ii + 0]; - } - } else { - memcpy(wbuff + 1, rbuff, mldl_cfg->accel->len); - } - - wbuff[7] = 0; - wbuff[8] = 1; /*set semaphore */ - - mpu_memory_write(mpuirq_dev_data->mpu_client->adapter, - mldl_cfg->addr, 0x0108, 8, wbuff); -} - -#ifdef FEATURE_GYRO_SELFTEST_INTERRUPT -static irqreturn_t mpuirq_selftest_handler(int irq, void *dev_id) -{ -/* static int mycount=0; */ - struct timeval irqtime; - unsigned long long temp_time; - - do_gettimeofday(&irqtime); - - temp_time = (((long long)irqtime.tv_sec) << 32); - temp_time += irqtime.tv_usec; - - if (mpuirq_data.mpuirq_jiffies < 10) - selftest_get_times[mpuirq_data.mpuirq_jiffies++] = temp_time; - - return IRQ_HANDLED; -} -#endif - -static irqreturn_t mpuirq_handler(int irq, void *dev_id) -{ - static int mycount; - struct timeval irqtime; - mycount++; - - mpuirq_data.interruptcount++; - - /* wake up (unblock) for reading data from userspace */ - /* and ignore first interrupt generated in module init */ - mpuirq_dev_data.data_ready = 1; - - do_gettimeofday(&irqtime); - mpuirq_data.irqtime = (((long long)irqtime.tv_sec) << 32); - mpuirq_data.irqtime += irqtime.tv_usec; - - if ((mpuirq_dev_data.accel_divider >= 0) && - (0 == (mycount % (mpuirq_dev_data.accel_divider + 1)))) { - schedule_work((struct work_struct *)(&mpuirq_dev_data)); - } - - wake_up_interruptible(&mpuirq_wait); - - return IRQ_HANDLED; - -} - -/* define which file operations are supported */ -const struct file_operations mpuirq_fops = { - .owner = THIS_MODULE, - .read = mpuirq_read, - .poll = mpuirq_poll, - -#if HAVE_COMPAT_IOCTL - .compat_ioctl = mpuirq_ioctl, -#endif -#if HAVE_UNLOCKED_IOCTL - .unlocked_ioctl = mpuirq_ioctl, -#endif - .open = mpuirq_open, - .release = mpuirq_release, -}; - -static struct miscdevice mpuirq_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = MPUIRQ_NAME, - .fops = &mpuirq_fops, -}; - -int mpuirq_init(struct i2c_client *mpu_client) -{ - - int res; - struct mldl_cfg *mldl_cfg = - (struct mldl_cfg *)i2c_get_clientdata(mpu_client); - - /* work_struct initialization */ - INIT_WORK((struct work_struct *)&mpuirq_dev_data, - mpu_accel_data_work_fcn); - mpuirq_dev_data.mpu_client = mpu_client; - - dev_info(&mpu_client->adapter->dev, - "Module Param interface = %s\n", interface); - - mpuirq_dev_data.irq = mpu_client->irq; - mpuirq_dev_data.pid = 0; - mpuirq_dev_data.accel_divider = -1; - mpuirq_dev_data.data_ready = 0; - mpuirq_dev_data.timeout = 0; - mpuirq_dev_data.dev = &mpuirq_device; - - if (mpuirq_dev_data.irq) { - unsigned long flags; - if (BIT_ACTL_LOW == ((mldl_cfg->pdata->int_config) & BIT_ACTL)) - flags = IRQF_TRIGGER_FALLING; - else - flags = IRQF_TRIGGER_RISING; - - res = - request_irq(mpuirq_dev_data.irq, mpuirq_handler, flags, - interface, &mpuirq_dev_data.irq); - if (res) { - dev_err(&mpu_client->adapter->dev, - "myirqtest: cannot register IRQ %d\n", - mpuirq_dev_data.irq); - } else { - res = misc_register(&mpuirq_device); - if (res < 0) { - dev_err(&mpu_client->adapter->dev, - "misc_register returned %d\n", res); - free_irq(mpuirq_dev_data.irq, - &mpuirq_dev_data.irq); - } - } - - } else { - res = 0; - } - - return res; -} - -void mpuirq_exit(void) -{ - /* Free the IRQ first before flushing the work */ - if (mpuirq_dev_data.irq > 0) - free_irq(mpuirq_dev_data.irq, &mpuirq_dev_data.irq); - - flush_scheduled_work(); - - dev_info(mpuirq_device.this_device, "Unregistering %s\n", MPUIRQ_NAME); - misc_deregister(&mpuirq_device); - - return; -} - -module_param(interface, charp, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(interface, "The Interface name"); diff --git a/drivers/misc/mpu3050/mpuirq.h b/drivers/misc/mpu3050/mpuirq.h deleted file mode 100755 index d6c1987..0000000 --- a/drivers/misc/mpu3050/mpuirq.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef __MPUIRQ__ -#define __MPUIRQ__ - -#ifdef __KERNEL__ -#include -#endif - -#define MPUIRQ_ENABLE_DEBUG (1) -#define MPUIRQ_GET_INTERRUPT_CNT (2) -#define MPUIRQ_GET_IRQ_TIME (3) -#define MPUIRQ_GET_LED_VALUE (4) -#define MPUIRQ_SET_TIMEOUT (5) -#define MPUIRQ_SET_ACCEL_INFO (6) -#define MPUIRQ_SET_FREQUENCY_DIVIDER (7) - -#ifdef FEATURE_GYRO_SELFTEST_INTERRUPT -#define MPUIRQ_GET_MPUIRQ_JIFFIES (8) -#define MPUIRQ_SET_SELFTEST_IRQ_HANDLER (9) -#define MPUIRQ_SET_MPUIRQ_HANDLER (10) -#endif - -#ifdef __KERNEL__ - -void mpuirq_exit(void); -int mpuirq_init(struct i2c_client *mpu_client); - -#endif - -#endif diff --git a/drivers/misc/mpu3050/sensors_core.c b/drivers/misc/mpu3050/sensors_core.c deleted file mode 100755 index b652631..0000000 --- a/drivers/misc/mpu3050/sensors_core.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Universal sensors core class - * - * Author : Ryunkyun Park - */ - -#include -#include -#include -#include -#include -#include -/* #include */ - -struct class *sensors_class; -static atomic_t sensor_count; -static DEFINE_MUTEX(sensors_mutex); - -/** - * Create sysfs interface - */ -static void set_sensor_attr(struct device *dev, - struct device_attribute *attributes[]) -{ - int i; - - for (i = 0; attributes[i] != NULL; i++) { - if ((device_create_file(dev, attributes[i])) < 0) { - pr_info("[SENSOR CORE] fail!!! device_create_file" \ - "( dev, attributes[%d] )\n", i); - } - } -} - -int sensors_register(struct device *dev, void *drvdata, - struct device_attribute *attributes[], char *name) -{ - int ret = 0; - - if (!sensors_class) { - sensors_class = class_create(THIS_MODULE, "sensors"); - if (IS_ERR(sensors_class)) - return PTR_ERR(sensors_class); - } - - mutex_lock(&sensors_mutex); - - dev = device_create(sensors_class, NULL, 0, drvdata, "%s", name); - - if (IS_ERR(dev)) { - ret = PTR_ERR(dev); - pr_err("[SENSORS CORE] device_create failed! [%d]\n", ret); - return ret; - } - - set_sensor_attr(dev, attributes); - - atomic_inc(&sensor_count); - - mutex_unlock(&sensors_mutex); - - return 0; -} - -void sensors_unregister(struct device *dev) -{ - /* TODO : Unregister device */ -} - -static int __init sensors_class_init(void) -{ - pr_info("[SENSORS CORE] sensors_class_init\n"); - sensors_class = class_create(THIS_MODULE, "sensors"); - - if (IS_ERR(sensors_class)) - return PTR_ERR(sensors_class); - - atomic_set(&sensor_count, 0); - sensors_class->dev_uevent = NULL; - - return 0; -} - -static void __exit sensors_class_exit(void) -{ - class_destroy(sensors_class); -} - -EXPORT_SYMBOL_GPL(sensors_register); -EXPORT_SYMBOL_GPL(sensors_unregister); - -/* exported for the APM Power driver, APM emulation */ -EXPORT_SYMBOL_GPL(sensors_class); - -subsys_initcall(sensors_class_init); -module_exit(sensors_class_exit); - -MODULE_DESCRIPTION("Universal sensors core class"); -MODULE_AUTHOR("Ryunkyun Park "); -MODULE_LICENSE("GPL"); diff --git a/drivers/misc/mpu3050/slaveirq.c b/drivers/misc/mpu3050/slaveirq.c deleted file mode 100755 index 2ee5385..0000000 --- a/drivers/misc/mpu3050/slaveirq.c +++ /dev/null @@ -1,270 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "mpu.h" -#include "slaveirq.h" -#include "mldl_cfg.h" -#include "mpu-i2c.h" - -/* function which gets slave data and sends it to SLAVE */ - -struct slaveirq_dev_data { - struct miscdevice dev; - struct i2c_client *slave_client; - struct mpuirq_data data; - wait_queue_head_t slaveirq_wait; - int irq; - int pid; - int data_ready; - int timeout; -}; - -/* The following depends on patch fa1f68db6ca7ebb6fc4487ac215bffba06c01c28 - * drivers: misc: pass miscdevice pointer via file private data - */ -static int slaveirq_open(struct inode *inode, struct file *file) -{ - /* Device node is availabe in the file->private_data, this is - * exactly what we want so we leave it there */ - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - - dev_dbg(data->dev.this_device, - "%s current->pid %d\n", __func__, current->pid); - data->pid = current->pid; - return 0; -} - -static int slaveirq_release(struct inode *inode, struct file *file) -{ - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - dev_dbg(data->dev.this_device, "slaveirq_release\n"); - return 0; -} - -/* read function called when from /dev/slaveirq is read */ -static ssize_t slaveirq_read(struct file *file, - char *buf, size_t count, loff_t *ppos) -{ - int len, err; - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - - if (!data->data_ready) { - wait_event_interruptible_timeout(data->slaveirq_wait, - data->data_ready, - data->timeout); - } - - if (data->data_ready && NULL != buf - && count >= sizeof(data->data)) { - err = copy_to_user(buf, &data->data, sizeof(data->data)); - data->data.data_type = 0; - } else { - return 0; - } - if (err != 0) { - dev_err(data->dev.this_device, - "Copy to user returned %d\n", err); - return -EFAULT; - } - data->data_ready = 0; - len = sizeof(data->data); - return len; -} - -unsigned int slaveirq_poll(struct file *file, struct poll_table_struct *poll) -{ - int mask = 0; - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - - poll_wait(file, &data->slaveirq_wait, poll); - if (data->data_ready) - mask |= POLLIN | POLLRDNORM; - return mask; -} - -/* ioctl - I/O control */ -static long slaveirq_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - int retval = 0; - int tmp; - struct slaveirq_dev_data *data = - container_of(file->private_data, struct slaveirq_dev_data, dev); - - switch (cmd) { - case SLAVEIRQ_SET_TIMEOUT: - data->timeout = arg; - break; - - case SLAVEIRQ_GET_INTERRUPT_CNT: - tmp = data->data.interruptcount - 1; - if (data->data.interruptcount > 1) - data->data.interruptcount = 1; - - if (copy_to_user((int *) arg, &tmp, sizeof(int))) - return -EFAULT; - break; - case SLAVEIRQ_GET_IRQ_TIME: - if (copy_to_user((int *) arg, &data->data.irqtime, - sizeof(data->data.irqtime))) - return -EFAULT; - data->data.irqtime = 0; - break; - default: - retval = -EINVAL; - } - return retval; -} - -static irqreturn_t slaveirq_handler(int irq, void *dev_id) -{ - struct slaveirq_dev_data *data = (struct slaveirq_dev_data *)dev_id; - static int mycount; - struct timeval irqtime; - mycount++; - - data->data.interruptcount++; - - /* wake up (unblock) for reading data from userspace */ - /* and ignore first interrupt generated in module init */ - data->data_ready = 1; - - do_gettimeofday(&irqtime); - data->data.irqtime = (((long long) irqtime.tv_sec) << 32); - data->data.irqtime += irqtime.tv_usec; - data->data.data_type |= 1; - - wake_up_interruptible(&data->slaveirq_wait); - - return IRQ_HANDLED; - -} - -/* define which file operations are supported */ -static const struct file_operations slaveirq_fops = { - .owner = THIS_MODULE, - .read = slaveirq_read, - .poll = slaveirq_poll, - -#if HAVE_COMPAT_IOCTL - .compat_ioctl = slaveirq_ioctl, -#endif -#if HAVE_UNLOCKED_IOCTL - .unlocked_ioctl = slaveirq_ioctl, -#endif - .open = slaveirq_open, - .release = slaveirq_release, -}; - -int slaveirq_init(struct i2c_adapter *slave_adapter, - struct ext_slave_platform_data *pdata, - char *name) -{ - - int res; - struct slaveirq_dev_data *data; - - if (!pdata->irq) - return -EINVAL; - - pdata->irq_data = kzalloc(sizeof(*data), - GFP_KERNEL); - data = (struct slaveirq_dev_data *) pdata->irq_data; - if (!data) - return -ENOMEM; - - data->dev.minor = MISC_DYNAMIC_MINOR; - data->dev.name = name; - data->dev.fops = &slaveirq_fops; - data->irq = pdata->irq; - data->pid = 0; - data->data_ready = 0; - data->timeout = 0; - - res = request_irq(data->irq, slaveirq_handler, IRQF_TRIGGER_RISING, - data->dev.name, data); - - if (res) { - dev_err(&slave_adapter->dev, - "myirqtest: cannot register IRQ %d\n", - data->irq); - goto out_request_irq; - } - - res = misc_register(&data->dev); - if (res < 0) { - dev_err(&slave_adapter->dev, - "misc_register returned %d\n", - res); - goto out_misc_register; - } - - init_waitqueue_head(&data->slaveirq_wait); - return res; - -out_misc_register: - free_irq(data->irq, data); -out_request_irq: - kfree(pdata->irq_data); - pdata->irq_data = NULL; - - return res; -} - -void slaveirq_exit(struct ext_slave_platform_data *pdata) -{ - struct slaveirq_dev_data *data = pdata->irq_data; - - if (!pdata->irq_data || data->irq <= 0) - return; - - dev_info(data->dev.this_device, "Unregistering %s\n", - data->dev.name); - - free_irq(data->irq, data); - misc_deregister(&data->dev); - kfree(pdata->irq_data); - pdata->irq_data = NULL; -} diff --git a/drivers/misc/mpu3050/slaveirq.h b/drivers/misc/mpu3050/slaveirq.h deleted file mode 100755 index ca9c7e4..0000000 --- a/drivers/misc/mpu3050/slaveirq.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef __SLAVEIRQ__ -#define __SLAVEIRQ__ - -#ifdef __KERNEL__ -#include -#endif - -#include "mpu.h" -#include "mpuirq.h" - -#define SLAVEIRQ_ENABLE_DEBUG (1) -#define SLAVEIRQ_GET_INTERRUPT_CNT (2) -#define SLAVEIRQ_GET_IRQ_TIME (3) -#define SLAVEIRQ_GET_LED_VALUE (4) -#define SLAVEIRQ_SET_TIMEOUT (5) -#define SLAVEIRQ_SET_SLAVE_INFO (6) - -#ifdef __KERNEL__ - -void slaveirq_exit(struct ext_slave_platform_data *pdata); -int slaveirq_init(struct i2c_adapter *slave_adapter, - struct ext_slave_platform_data *pdata, - char *name); - -#endif - -#endif diff --git a/drivers/misc/mpu3050/timerirq.c b/drivers/misc/mpu3050/timerirq.c deleted file mode 100755 index 53b42d2..0000000 --- a/drivers/misc/mpu3050/timerirq.c +++ /dev/null @@ -1,294 +0,0 @@ -/* -$License: -Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. -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. -You should have received a copy of the GNU General Public License -along with this program. If not, see . -$ -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "mpu.h" -#include "mltypes.h" -#include "timerirq.h" - -/* function which gets timer data and sends it to TIMER */ -struct timerirq_data { - int pid; - int data_ready; - int run; - int timeout; - unsigned long period; - struct mpuirq_data data; - struct completion timer_done; - wait_queue_head_t timerirq_wait; - struct timer_list timer; - struct miscdevice *dev; -}; - -static struct miscdevice *timerirq_dev_data; - -static void timerirq_handler(unsigned long arg) -{ - struct timerirq_data *data = (struct timerirq_data *)arg; - struct timeval irqtime; - - /* dev_info(data->dev->this_device, - "%s, %ld\n", __func__, (unsigned long)data); */ - - data->data.interruptcount++; - - data->data_ready = 1; - - do_gettimeofday(&irqtime); - data->data.irqtime = (((long long) irqtime.tv_sec) << 32); - data->data.irqtime += irqtime.tv_usec; - data->data.data_type |= 1; - - wake_up_interruptible(&data->timerirq_wait); - - if (data->run) - mod_timer(&data->timer, - jiffies + msecs_to_jiffies(data->period)); - else - complete(&data->timer_done); -} - -static int start_timerirq(struct timerirq_data *data) -{ - dev_dbg(data->dev->this_device, - "%s current->pid %d\n", __func__, current->pid); - - /* Timer already running... success */ - if (data->run) - return 0; - - /* Don't allow a period of 0 since this would fire constantly */ - if (!data->period) - return -EINVAL; - - data->run = TRUE; - data->data_ready = FALSE; - - init_completion(&data->timer_done); - setup_timer(&data->timer, timerirq_handler, (unsigned long)data); - - return mod_timer(&data->timer, - jiffies + msecs_to_jiffies(data->period)); -} - -static int stop_timerirq(struct timerirq_data *data) -{ - dev_dbg(data->dev->this_device, - "%s current->pid %lx\n", __func__, (unsigned long)data); - - if (data->run) { - data->run = FALSE; - mod_timer(&data->timer, jiffies + 1); - wait_for_completion(&data->timer_done); - } - return 0; -} - -/* The following depends on patch fa1f68db6ca7ebb6fc4487ac215bffba06c01c28 - * drivers: misc: pass miscdevice pointer via file private data - */ -static int timerirq_open(struct inode *inode, struct file *file) -{ - /* Device node is availabe in the file->private_data, this is - * exactly what we want so we leave it there */ - struct miscdevice *dev_data = file->private_data; - struct timerirq_data *data = kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - data->dev = dev_data; - file->private_data = data; - data->pid = current->pid; - init_waitqueue_head(&data->timerirq_wait); - - dev_dbg(data->dev->this_device, - "%s current->pid %d\n", __func__, current->pid); - return 0; -} - -static int timerirq_release(struct inode *inode, struct file *file) -{ - struct timerirq_data *data = file->private_data; - dev_dbg(data->dev->this_device, "timerirq_release\n"); - if (data->run) - stop_timerirq(data); - kfree(data); - return 0; -} - -/* read function called when from /dev/timerirq is read */ -static ssize_t timerirq_read(struct file *file, - char *buf, size_t count, loff_t *ppos) -{ - int len, err; - struct timerirq_data *data = file->private_data; - - if (!data->data_ready && - data->timeout) { - wait_event_interruptible_timeout(data->timerirq_wait, - data->data_ready, - data->timeout); - } - - if (data->data_ready && NULL != buf - && count >= sizeof(data->data)) { - err = copy_to_user(buf, &data->data, sizeof(data->data)); - data->data.data_type = 0; - } else { - return 0; - } - if (err != 0) { - dev_err(data->dev->this_device, - "Copy to user returned %d\n", err); - return -EFAULT; - } - data->data_ready = 0; - len = sizeof(data->data); - return len; -} - -static unsigned int timerirq_poll(struct file *file, - struct poll_table_struct *poll) -{ - int mask = 0; - struct timerirq_data *data = file->private_data; - - poll_wait(file, &data->timerirq_wait, poll); - if (data->data_ready) - mask |= POLLIN | POLLRDNORM; - return mask; -} - -/* ioctl - I/O control */ -static long timerirq_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - int retval = 0; - int tmp; - struct timerirq_data *data = file->private_data; - - dev_dbg(data->dev->this_device, - "%s current->pid %d, %d, %ld\n", - __func__, current->pid, cmd, arg); - - if (!data) - return -EFAULT; - - switch (cmd) { - case TIMERIRQ_SET_TIMEOUT: - data->timeout = arg; - break; - case TIMERIRQ_GET_INTERRUPT_CNT: - tmp = data->data.interruptcount - 1; - if (data->data.interruptcount > 1) - data->data.interruptcount = 1; - - if (copy_to_user((int *) arg, &tmp, sizeof(int))) - return -EFAULT; - break; - case TIMERIRQ_START: - data->period = arg; - retval = start_timerirq(data); - break; - case TIMERIRQ_STOP: - retval = stop_timerirq(data); - break; - default: - retval = -EINVAL; - } - return retval; -} - -/* define which file operations are supported */ -static const struct file_operations timerirq_fops = { - .owner = THIS_MODULE, - .read = timerirq_read, - .poll = timerirq_poll, - -#if HAVE_COMPAT_IOCTL - .compat_ioctl = timerirq_ioctl, -#endif -#if HAVE_UNLOCKED_IOCTL - .unlocked_ioctl = timerirq_ioctl, -#endif - .open = timerirq_open, - .release = timerirq_release, -}; - -static int __init timerirq_init(void) -{ - - int res; - static struct miscdevice *data; - - data = kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - timerirq_dev_data = data; - data->minor = MISC_DYNAMIC_MINOR; - data->name = "timerirq"; - data->fops = &timerirq_fops; - - res = misc_register(data); - if (res < 0) { - dev_err(data->this_device, - "misc_register returned %d\n", res); - kfree(data); - return res; - } - - return res; -} -module_init(timerirq_init); - -static void __exit timerirq_exit(void) -{ - struct miscdevice *data = timerirq_dev_data; - - dev_info(data->this_device, "Unregistering %s\n", - data->name); - - misc_deregister(data); - kfree(data); - - timerirq_dev_data = NULL; -} -module_exit(timerirq_exit); - -MODULE_AUTHOR("Invensense Corporation"); -MODULE_DESCRIPTION("Timer IRQ device driver."); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("timerirq"); diff --git a/drivers/misc/mpu3050/timerirq.h b/drivers/misc/mpu3050/timerirq.h deleted file mode 100755 index a38b490..0000000 --- a/drivers/misc/mpu3050/timerirq.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - $License: - Copyright (C) 2010 InvenSense Corporation, All Rights Reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - $ - */ - -#ifndef __TIMERIRQ__ -#define __TIMERIRQ__ - -#define TIMERIRQ_SET_TIMEOUT (5) -#define TIMERIRQ_GET_INTERRUPT_CNT (7) -#define TIMERIRQ_START (8) -#define TIMERIRQ_STOP (9) - -#endif diff --git a/drivers/misc/tzic.c b/drivers/misc/tzic.c deleted file mode 100644 index 6a5e3ba..0000000 --- a/drivers/misc/tzic.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Samsung TZIC Driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * 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. - */ - -#define KMSG_COMPONENT "TZIC" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define TZIC_DEV "tzic" -#define SMC_CMD_STORE_BINFO (-201) - -static int gotoCpu0(void); -static int gotoAllCpu(void) __attribute__ ((unused)); - -u32 exynos_smc1(u32 cmd, u32 arg1, u32 arg2, u32 arg3) -{ - register u32 reg0 __asm__("r0") = cmd; - register u32 reg1 __asm__("r1") = arg1; - register u32 reg2 __asm__("r2") = arg2; - register u32 reg3 __asm__("r3") = arg3; - - __asm__ volatile ( -#ifdef REQUIRES_SEC - ".arch_extension sec\n" -#endif - "smc 0\n" - : "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) - ); - - return reg0; -} - -#if defined(CONFIG_FELICA) -int exynos_smc_read_oemflag(u32 ctrl_word, u32 *val) -{ - register u32 reg0 __asm__("r0"); - register u32 reg1 __asm__("r1"); - register u32 reg2 __asm__("r2"); - register u32 reg3 __asm__("r3"); - u32 idx = 0; - - for (idx = 0; reg2 != ctrl_word; idx++) { - reg0 = -202; - reg1 = 1; - reg2 = idx; - - __asm__ volatile ( -#ifdef REQUIRES_SEC - ".arch_extension sec\n" -#endif - "smc 0\n" - :"+r" (reg0), "+r"(reg1), - "+r"(reg2), "+r"(reg3) - ); - if (reg1) - return -1; - } - - reg0 = -202; - reg1 = 1; - reg2 = idx; - - __asm__ volatile ( -#ifdef REQUIRES_SEC - ".arch_extension sec\n" -#endif - "smc 0\n" - :"+r" (reg0), "+r"(reg1), "+r"(reg2), - "+r"(reg3) - ); - if (reg1) - return -1; - - *val = reg2; - - return 0; -} -#endif - -static DEFINE_MUTEX(tzic_mutex); -static struct class *driver_class; -static dev_t tzic_device_no; -static struct cdev tzic_cdev; - -#define LOG printk -#define TZIC_IOC_MAGIC 0x9E -#define TZIC_IOCTL_SET_FUSE_REQ _IO(TZIC_IOC_MAGIC, 1) -#define TZIC_IOCTL_GET_FUSE_REQ _IOR(TZIC_IOC_MAGIC, 0, unsigned int) - -static long tzic_ioctl(struct file *file, unsigned cmd, unsigned long arg) -{ - int ret = 0; - - ret = gotoCpu0(); - if (0 != ret) { - LOG(KERN_INFO "changing core failed!"); - return -1; - } - - if (cmd == TZIC_IOCTL_SET_FUSE_REQ) { - LOG(KERN_INFO "set_fuse"); - exynos_smc1(SMC_CMD_STORE_BINFO, 0x80010001, 0, 0); - exynos_smc1(SMC_CMD_STORE_BINFO, 0x00000001, 0, 0); - } else if (cmd == TZIC_IOCTL_GET_FUSE_REQ) { - LOG(KERN_INFO "get_fuse"); -#if defined(CONFIG_FELICA) - exynos_smc_read_oemflag(0x80010001, (u32 *) arg); -#else - LOG(KERN_INFO "get_fuse not supported : CONFIG_FELICA"); -#endif - } else { - LOG(KERN_INFO "command error"); - } - - gotoAllCpu(); - - return 0; -} - -static const struct file_operations tzic_fops = { - .owner = THIS_MODULE, - .unlocked_ioctl = tzic_ioctl, -}; - -static int __init tzic_init(void) -{ - int rc; - struct device *class_dev; - - rc = alloc_chrdev_region(&tzic_device_no, 0, 1, TZIC_DEV); - if (rc < 0) { - LOG(KERN_INFO "alloc_chrdev_region failed %d", rc); - return rc; - } - - driver_class = class_create(THIS_MODULE, TZIC_DEV); - if (IS_ERR(driver_class)) { - rc = -ENOMEM; - LOG(KERN_INFO "class_create failed %d", rc); - goto unregister_chrdev_region; - } - - class_dev = device_create(driver_class, NULL, tzic_device_no, NULL, - TZIC_DEV); - if (!class_dev) { - LOG(KERN_INFO "class_device_create failed %d", rc); - rc = -ENOMEM; - goto class_destroy; - } - - cdev_init(&tzic_cdev, &tzic_fops); - tzic_cdev.owner = THIS_MODULE; - - rc = cdev_add(&tzic_cdev, MKDEV(MAJOR(tzic_device_no), 0), 1); - if (rc < 0) { - LOG(KERN_INFO "cdev_add failed %d", rc); - goto class_device_destroy; - } - - return 0; - - class_device_destroy: - device_destroy(driver_class, tzic_device_no); - class_destroy: - class_destroy(driver_class); - unregister_chrdev_region: - unregister_chrdev_region(tzic_device_no, 1); - return rc; -} - -static void __exit tzic_exit(void) -{ - device_destroy(driver_class, tzic_device_no); - class_destroy(driver_class); - unregister_chrdev_region(tzic_device_no, 1); -} - -static int gotoCpu0(void) -{ - int ret = 0; - struct cpumask mask = CPU_MASK_CPU0; - - LOG(KERN_INFO "System has %d CPU's, we are on CPU #%d\n" - "\tBinding this process to CPU #0.\n" - "\tactive mask is %lx, setting it to mask=%lx\n", - nr_cpu_ids, - raw_smp_processor_id(), cpu_active_mask->bits[0], mask.bits[0]); - ret = set_cpus_allowed_ptr(current, &mask); - if (0 != ret) - LOG(KERN_INFO "set_cpus_allowed_ptr=%d.\n", ret); - LOG(KERN_INFO "And now we are on CPU #%d", raw_smp_processor_id()); - - return ret; -} - -static int gotoAllCpu(void) -{ - int ret = 0; - struct cpumask mask = CPU_MASK_ALL; - - LOG(KERN_INFO "System has %d CPU's, we are on CPU #%d\n" - "\tBinding this process to CPU #0.\n" - "\tactive mask is %lx, setting it to mask=%lx\n", - nr_cpu_ids, - raw_smp_processor_id(), cpu_active_mask->bits[0], mask.bits[0]); - ret = set_cpus_allowed_ptr(current, &mask); - if (0 != ret) - LOG(KERN_INFO "set_cpus_allowed_ptr=%d.\n", ret); - LOG(KERN_INFO "And now we are on CPU #%d", raw_smp_processor_id()); - - return ret; -} - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Samsung TZIC Driver"); -MODULE_VERSION("1.00"); - -module_init(tzic_init); -module_exit(tzic_exit); diff --git a/drivers/net/wireless/ath/ath6kl/bmi.c b/drivers/net/wireless/ath/ath6kl/bmi.c deleted file mode 100755 index 05d1d89..0000000 --- a/drivers/net/wireless/ath/ath6kl/bmi.c +++ /dev/null @@ -1,548 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "core.h" -#include "hif-ops.h" -#include "target.h" -#include "debug.h" - -int ath6kl_bmi_done(struct ath6kl *ar) -{ - int ret; - u32 cid = BMI_DONE; - - if (ar->bmi.done_sent) { - ath6kl_dbg(ATH6KL_DBG_BMI, "bmi done skipped\n"); - return 0; - } - - ar->bmi.done_sent = true; - - ret = ath6kl_hif_bmi_write(ar, (u8 *)&cid, sizeof(cid)); - if (ret) { - ath6kl_err("Unable to send bmi done: %d\n", ret); - return ret; - } - - return 0; -} - -int ath6kl_bmi_get_target_info(struct ath6kl *ar, - struct ath6kl_bmi_target_info *targ_info) -{ - int ret; - u32 cid = BMI_GET_TARGET_INFO; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - ret = ath6kl_hif_bmi_write(ar, (u8 *)&cid, sizeof(cid)); - if (ret) { - ath6kl_err("Unable to send get target info: %d\n", ret); - return ret; - } - - if (ar->hif_type == ATH6KL_HIF_TYPE_USB) { - ret = ath6kl_hif_bmi_read(ar, (u8 *)targ_info, - sizeof(*targ_info)); - } else { - ret = ath6kl_hif_bmi_read(ar, (u8 *)&targ_info->version, - sizeof(targ_info->version)); - } - - if (ret) { - ath6kl_err("Unable to recv target info: %d\n", ret); - return ret; - } - - if (le32_to_cpu(targ_info->version) == TARGET_VERSION_SENTINAL) { - /* Determine how many bytes are in the Target's targ_info */ - ret = ath6kl_hif_bmi_read(ar, - (u8 *)&targ_info->byte_count, - sizeof(targ_info->byte_count)); - if (ret) { - ath6kl_err("unable to read target info byte count: %d\n", - ret); - return ret; - } - - /* - * The target's targ_info doesn't match the host's targ_info. - * We need to do some backwards compatibility to make this work. - */ - if (le32_to_cpu(targ_info->byte_count) != sizeof(*targ_info)) { - WARN_ON(1); - return -EINVAL; - } - - /* Read the remainder of the targ_info */ - ret = ath6kl_hif_bmi_read(ar, - ((u8 *)targ_info) + - sizeof(targ_info->byte_count), - sizeof(*targ_info) - - sizeof(targ_info->byte_count)); - - if (ret) { - ath6kl_err("Unable to read target info (%d bytes): %d\n", - targ_info->byte_count, ret); - return ret; - } - } - - ath6kl_dbg(ATH6KL_DBG_BMI, "target info (ver: 0x%x type: 0x%x)\n", - targ_info->version, targ_info->type); - - return 0; -} - -int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) -{ - u32 cid = BMI_READ_MEMORY; - int ret; - u32 offset; - u32 len_remain, rx_len; - u16 size; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - size = ar->bmi.max_data_size + sizeof(cid) + sizeof(addr) + sizeof(len); - if (size > ar->bmi.max_cmd_size) { - WARN_ON(1); - return -EINVAL; - } - memset(ar->bmi.cmd_buf, 0, size); - - ath6kl_dbg(ATH6KL_DBG_BMI, - "bmi read memory: device: addr: 0x%x, len: %d\n", - addr, len); - - len_remain = len; - - while (len_remain) { - rx_len = (len_remain < ar->bmi.max_data_size) ? - len_remain : ar->bmi.max_data_size; - offset = 0; - memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); - offset += sizeof(cid); - memcpy(&(ar->bmi.cmd_buf[offset]), &addr, sizeof(addr)); - offset += sizeof(addr); - memcpy(&(ar->bmi.cmd_buf[offset]), &rx_len, sizeof(rx_len)); - offset += sizeof(len); - - ret = ath6kl_hif_bmi_write(ar, ar->bmi.cmd_buf, offset); - if (ret) { - ath6kl_err("Unable to write to the device: %d\n", - ret); - return ret; - } - ret = ath6kl_hif_bmi_read(ar, ar->bmi.cmd_buf, rx_len); - if (ret) { - ath6kl_err("Unable to read from the device: %d\n", - ret); - return ret; - } - memcpy(&buf[len - len_remain], ar->bmi.cmd_buf, rx_len); - len_remain -= rx_len; addr += rx_len; - } - - return 0; -} - -int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) -{ - u32 cid = BMI_WRITE_MEMORY; - int ret; - u32 offset; - u32 len_remain, tx_len; - const u32 header = sizeof(cid) + sizeof(addr) + sizeof(len); - u8 aligned_buf[400]; - u8 *src; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - if ((ar->bmi.max_data_size + header) > ar->bmi.max_cmd_size) { - WARN_ON(1); - return -EINVAL; - } - - if (WARN_ON(ar->bmi.max_data_size > sizeof(aligned_buf))) - return -E2BIG; - - memset(ar->bmi.cmd_buf, 0, ar->bmi.max_data_size + header); - - ath6kl_dbg(ATH6KL_DBG_BMI, - "bmi write memory: addr: 0x%x, len: %d\n", addr, len); - - len_remain = len; - while (len_remain) { - src = &buf[len - len_remain]; - - if (len_remain < (ar->bmi.max_data_size - header)) { - if (len_remain & 3) { - /* align it with 4 bytes */ - len_remain = len_remain + - (4 - (len_remain & 3)); - memcpy(aligned_buf, src, len_remain); - src = aligned_buf; - } - tx_len = len_remain; - } else { - tx_len = (ar->bmi.max_data_size - header); - } - - offset = 0; - memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); - offset += sizeof(cid); - memcpy(&(ar->bmi.cmd_buf[offset]), &addr, sizeof(addr)); - offset += sizeof(addr); - memcpy(&(ar->bmi.cmd_buf[offset]), &tx_len, sizeof(tx_len)); - offset += sizeof(tx_len); - memcpy(&(ar->bmi.cmd_buf[offset]), src, tx_len); - offset += tx_len; - - ret = ath6kl_hif_bmi_write(ar, ar->bmi.cmd_buf, offset); - if (ret) { - ath6kl_err("Unable to write to the device: %d\n", - ret); - return ret; - } - len_remain -= tx_len; addr += tx_len; - } - - return 0; -} - -int ath6kl_bmi_execute(struct ath6kl *ar, u32 addr, u32 *param) -{ - u32 cid = BMI_EXECUTE; - int ret; - u32 offset; - u16 size; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - size = sizeof(cid) + sizeof(addr) + sizeof(param); - if (size > ar->bmi.max_cmd_size) { - WARN_ON(1); - return -EINVAL; - } - memset(ar->bmi.cmd_buf, 0, size); - - ath6kl_dbg(ATH6KL_DBG_BMI, "bmi execute: addr: 0x%x, param: %d)\n", - addr, *param); - - offset = 0; - memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); - offset += sizeof(cid); - memcpy(&(ar->bmi.cmd_buf[offset]), &addr, sizeof(addr)); - offset += sizeof(addr); - memcpy(&(ar->bmi.cmd_buf[offset]), param, sizeof(*param)); - offset += sizeof(*param); - - ret = ath6kl_hif_bmi_write(ar, ar->bmi.cmd_buf, offset); - if (ret) { - ath6kl_err("Unable to write to the device: %d\n", ret); - return ret; - } - - ret = ath6kl_hif_bmi_read(ar, ar->bmi.cmd_buf, sizeof(*param)); - if (ret) { - ath6kl_err("Unable to read from the device: %d\n", ret); - return ret; - } - - memcpy(param, ar->bmi.cmd_buf, sizeof(*param)); - - return 0; -} - -int ath6kl_bmi_set_app_start(struct ath6kl *ar, u32 addr) -{ - u32 cid = BMI_SET_APP_START; - int ret; - u32 offset; - u16 size; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - size = sizeof(cid) + sizeof(addr); - if (size > ar->bmi.max_cmd_size) { - WARN_ON(1); - return -EINVAL; - } - memset(ar->bmi.cmd_buf, 0, size); - - ath6kl_dbg(ATH6KL_DBG_BMI, "bmi set app start: addr: 0x%x\n", addr); - - offset = 0; - memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); - offset += sizeof(cid); - memcpy(&(ar->bmi.cmd_buf[offset]), &addr, sizeof(addr)); - offset += sizeof(addr); - - ret = ath6kl_hif_bmi_write(ar, ar->bmi.cmd_buf, offset); - if (ret) { - ath6kl_err("Unable to write to the device: %d\n", ret); - return ret; - } - - return 0; -} - -int ath6kl_bmi_reg_read(struct ath6kl *ar, u32 addr, u32 *param) -{ - u32 cid = BMI_READ_SOC_REGISTER; - int ret; - u32 offset; - u16 size; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - size = sizeof(cid) + sizeof(addr); - if (size > ar->bmi.max_cmd_size) { - WARN_ON(1); - return -EINVAL; - } - memset(ar->bmi.cmd_buf, 0, size); - - ath6kl_dbg(ATH6KL_DBG_BMI, "bmi read SOC reg: addr: 0x%x\n", addr); - - offset = 0; - memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); - offset += sizeof(cid); - memcpy(&(ar->bmi.cmd_buf[offset]), &addr, sizeof(addr)); - offset += sizeof(addr); - - ret = ath6kl_hif_bmi_write(ar, ar->bmi.cmd_buf, offset); - if (ret) { - ath6kl_err("Unable to write to the device: %d\n", ret); - return ret; - } - - ret = ath6kl_hif_bmi_read(ar, ar->bmi.cmd_buf, sizeof(*param)); - if (ret) { - ath6kl_err("Unable to read from the device: %d\n", ret); - return ret; - } - memcpy(param, ar->bmi.cmd_buf, sizeof(*param)); - - return 0; -} - -int ath6kl_bmi_reg_write(struct ath6kl *ar, u32 addr, u32 param) -{ - u32 cid = BMI_WRITE_SOC_REGISTER; - int ret; - u32 offset; - u16 size; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - size = sizeof(cid) + sizeof(addr) + sizeof(param); - if (size > ar->bmi.max_cmd_size) { - WARN_ON(1); - return -EINVAL; - } - memset(ar->bmi.cmd_buf, 0, size); - - ath6kl_dbg(ATH6KL_DBG_BMI, - "bmi write SOC reg: addr: 0x%x, param: %d\n", - addr, param); - - offset = 0; - memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); - offset += sizeof(cid); - memcpy(&(ar->bmi.cmd_buf[offset]), &addr, sizeof(addr)); - offset += sizeof(addr); - memcpy(&(ar->bmi.cmd_buf[offset]), ¶m, sizeof(param)); - offset += sizeof(param); - - ret = ath6kl_hif_bmi_write(ar, ar->bmi.cmd_buf, offset); - if (ret) { - ath6kl_err("Unable to write to the device: %d\n", ret); - return ret; - } - - return 0; -} - -int ath6kl_bmi_lz_data(struct ath6kl *ar, u8 *buf, u32 len) -{ - u32 cid = BMI_LZ_DATA; - int ret; - u32 offset; - u32 len_remain, tx_len; - const u32 header = sizeof(cid) + sizeof(len); - u16 size; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - size = ar->bmi.max_data_size + header; - if (size > ar->bmi.max_cmd_size) { - WARN_ON(1); - return -EINVAL; - } - memset(ar->bmi.cmd_buf, 0, size); - - ath6kl_dbg(ATH6KL_DBG_BMI, "bmi send LZ data: len: %d)\n", - len); - - len_remain = len; - while (len_remain) { - tx_len = (len_remain < (ar->bmi.max_data_size - header)) ? - len_remain : (ar->bmi.max_data_size - header); - - offset = 0; - memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); - offset += sizeof(cid); - memcpy(&(ar->bmi.cmd_buf[offset]), &tx_len, sizeof(tx_len)); - offset += sizeof(tx_len); - memcpy(&(ar->bmi.cmd_buf[offset]), &buf[len - len_remain], - tx_len); - offset += tx_len; - - ret = ath6kl_hif_bmi_write(ar, ar->bmi.cmd_buf, offset); - if (ret) { - ath6kl_err("Unable to write to the device: %d\n", - ret); - return ret; - } - - len_remain -= tx_len; - } - - return 0; -} - -int ath6kl_bmi_lz_stream_start(struct ath6kl *ar, u32 addr) -{ - u32 cid = BMI_LZ_STREAM_START; - int ret; - u32 offset; - u16 size; - - if (ar->bmi.done_sent) { - ath6kl_err("bmi done sent already, cmd %d disallowed\n", cid); - return -EACCES; - } - - size = sizeof(cid) + sizeof(addr); - if (size > ar->bmi.max_cmd_size) { - WARN_ON(1); - return -EINVAL; - } - memset(ar->bmi.cmd_buf, 0, size); - - ath6kl_dbg(ATH6KL_DBG_BMI, - "bmi LZ stream start: addr: 0x%x)\n", - addr); - - offset = 0; - memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); - offset += sizeof(cid); - memcpy(&(ar->bmi.cmd_buf[offset]), &addr, sizeof(addr)); - offset += sizeof(addr); - - ret = ath6kl_hif_bmi_write(ar, ar->bmi.cmd_buf, offset); - if (ret) { - ath6kl_err("Unable to start LZ stream to the device: %d\n", - ret); - return ret; - } - - return 0; -} - -int ath6kl_bmi_fast_download(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) -{ - int ret; - u32 last_word = 0; - u32 last_word_offset = len & ~0x3; - u32 unaligned_bytes = len & 0x3; - - ret = ath6kl_bmi_lz_stream_start(ar, addr); - if (ret) - return ret; - - if (unaligned_bytes) { - /* copy the last word into a zero padded buffer */ - memcpy(&last_word, &buf[last_word_offset], unaligned_bytes); - } - - ret = ath6kl_bmi_lz_data(ar, buf, last_word_offset); - if (ret) - return ret; - - if (unaligned_bytes) - ret = ath6kl_bmi_lz_data(ar, (u8 *)&last_word, 4); - - if (!ret) { - /* Close compressed stream and open a new (fake) one. - * This serves mainly to flush Target caches. */ - ret = ath6kl_bmi_lz_stream_start(ar, 0x00); - } - return ret; -} - -void ath6kl_bmi_reset(struct ath6kl *ar) -{ - ar->bmi.done_sent = false; -} - -int ath6kl_bmi_init(struct ath6kl *ar) -{ - if (WARN_ON(ar->bmi.max_data_size == 0)) - return -EINVAL; - - /* cmd + addr + len + data_size */ - ar->bmi.max_cmd_size = ar->bmi.max_data_size + (sizeof(u32) * 3); - - ar->bmi.cmd_buf = kzalloc(ar->bmi.max_cmd_size, GFP_ATOMIC); - if (!ar->bmi.cmd_buf) - return -ENOMEM; - - return 0; -} - -void ath6kl_bmi_cleanup(struct ath6kl *ar) -{ - kfree(ar->bmi.cmd_buf); - ar->bmi.cmd_buf = NULL; -} diff --git a/drivers/net/wireless/ath/ath6kl/bmi.h b/drivers/net/wireless/ath/ath6kl/bmi.h deleted file mode 100755 index 114f7b2..0000000 --- a/drivers/net/wireless/ath/ath6kl/bmi.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef BMI_H -#define BMI_H - -/* - * Bootloader Messaging Interface (BMI) - * - * BMI is a very simple messaging interface used during initialization - * to read memory, write memory, execute code, and to define an - * application entry PC. - * - * It is used to download an application to ATH6KL, to provide - * patches to code that is already resident on ATH6KL, and generally - * to examine and modify state. The Host has an opportunity to use - * BMI only once during bootup. Once the Host issues a BMI_DONE - * command, this opportunity ends. - * - * The Host writes BMI requests to mailbox0, and reads BMI responses - * from mailbox0. BMI requests all begin with a command - * (see below for specific commands), and are followed by - * command-specific data. - * - * Flow control: - * The Host can only issue a command once the Target gives it a - * "BMI Command Credit", using ATH6KL Counter #4. As soon as the - * Target has completed a command, it issues another BMI Command - * Credit (so the Host can issue the next command). - * - * BMI handles all required Target-side cache flushing. - */ - -/* BMI Commands */ - -#define BMI_NO_COMMAND 0 - -#define BMI_DONE 1 -/* - * Semantics: Host is done using BMI - * Request format: - * u32 command (BMI_DONE) - * Response format: none - */ - -#define BMI_READ_MEMORY 2 -/* - * Semantics: Host reads ATH6KL memory - * Request format: - * u32 command (BMI_READ_MEMORY) - * u32 address - * u32 length, at most BMI_DATASZ_MAX - * Response format: - * u8 data[length] - */ - -#define BMI_WRITE_MEMORY 3 -/* - * Semantics: Host writes ATH6KL memory - * Request format: - * u32 command (BMI_WRITE_MEMORY) - * u32 address - * u32 length, at most BMI_DATASZ_MAX - * u8 data[length] - * Response format: none - */ - -#define BMI_EXECUTE 4 -/* - * Semantics: Causes ATH6KL to execute code - * Request format: - * u32 command (BMI_EXECUTE) - * u32 address - * u32 parameter - * Response format: - * u32 return value - */ - -#define BMI_SET_APP_START 5 -/* - * Semantics: Set Target application starting address - * Request format: - * u32 command (BMI_SET_APP_START) - * u32 address - * Response format: none - */ - -#define BMI_READ_SOC_REGISTER 6 -/* - * Semantics: Read a 32-bit Target SOC register. - * Request format: - * u32 command (BMI_READ_REGISTER) - * u32 address - * Response format: - * u32 value - */ - -#define BMI_WRITE_SOC_REGISTER 7 -/* - * Semantics: Write a 32-bit Target SOC register. - * Request format: - * u32 command (BMI_WRITE_REGISTER) - * u32 address - * u32 value - * - * Response format: none - */ - -#define BMI_GET_TARGET_ID 8 -#define BMI_GET_TARGET_INFO 8 -/* - * Semantics: Fetch the 4-byte Target information - * Request format: - * u32 command (BMI_GET_TARGET_ID/INFO) - * Response format1 (old firmware): - * u32 TargetVersionID - * Response format2 (newer firmware): - * u32 TARGET_VERSION_SENTINAL - * struct bmi_target_info; - */ - -#define TARGET_VERSION_SENTINAL 0xffffffff -#define TARGET_TYPE_AR6003 3 -#define TARGET_TYPE_AR6004 5 -#define BMI_ROMPATCH_INSTALL 9 -/* - * Semantics: Install a ROM Patch. - * Request format: - * u32 command (BMI_ROMPATCH_INSTALL) - * u32 Target ROM Address - * u32 Target RAM Address or Value (depending on Target Type) - * u32 Size, in bytes - * u32 Activate? 1-->activate; - * 0-->install but do not activate - * Response format: - * u32 PatchID - */ - -#define BMI_ROMPATCH_UNINSTALL 10 -/* - * Semantics: Uninstall a previously-installed ROM Patch, - * automatically deactivating, if necessary. - * Request format: - * u32 command (BMI_ROMPATCH_UNINSTALL) - * u32 PatchID - * - * Response format: none - */ - -#define BMI_ROMPATCH_ACTIVATE 11 -/* - * Semantics: Activate a list of previously-installed ROM Patches. - * Request format: - * u32 command (BMI_ROMPATCH_ACTIVATE) - * u32 rompatch_count - * u32 PatchID[rompatch_count] - * - * Response format: none - */ - -#define BMI_ROMPATCH_DEACTIVATE 12 -/* - * Semantics: Deactivate a list of active ROM Patches. - * Request format: - * u32 command (BMI_ROMPATCH_DEACTIVATE) - * u32 rompatch_count - * u32 PatchID[rompatch_count] - * - * Response format: none - */ - - -#define BMI_LZ_STREAM_START 13 -/* - * Semantics: Begin an LZ-compressed stream of input - * which is to be uncompressed by the Target to an - * output buffer at address. The output buffer must - * be sufficiently large to hold the uncompressed - * output from the compressed input stream. This BMI - * command should be followed by a series of 1 or more - * BMI_LZ_DATA commands. - * u32 command (BMI_LZ_STREAM_START) - * u32 address - * Note: Not supported on all versions of ROM firmware. - */ - -#define BMI_LZ_DATA 14 -/* - * Semantics: Host writes ATH6KL memory with LZ-compressed - * data which is uncompressed by the Target. This command - * must be preceded by a BMI_LZ_STREAM_START command. A series - * of BMI_LZ_DATA commands are considered part of a single - * input stream until another BMI_LZ_STREAM_START is issued. - * Request format: - * u32 command (BMI_LZ_DATA) - * u32 length (of compressed data), - * at most BMI_DATASZ_MAX - * u8 CompressedData[length] - * Response format: none - * Note: Not supported on all versions of ROM firmware. - */ - -#define BMI_COMMUNICATION_TIMEOUT 1000 /* in msec */ - -struct ath6kl; -struct ath6kl_bmi_target_info { - __le32 byte_count; /* size of this structure */ - __le32 version; /* target version id */ - __le32 type; /* target type */ -} __packed; - -int ath6kl_bmi_init(struct ath6kl *ar); -void ath6kl_bmi_cleanup(struct ath6kl *ar); -void ath6kl_bmi_reset(struct ath6kl *ar); - -int ath6kl_bmi_done(struct ath6kl *ar); -int ath6kl_bmi_get_target_info(struct ath6kl *ar, - struct ath6kl_bmi_target_info *targ_info); -int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len); -int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len); -int ath6kl_bmi_execute(struct ath6kl *ar, - u32 addr, u32 *param); -int ath6kl_bmi_set_app_start(struct ath6kl *ar, - u32 addr); -int ath6kl_bmi_reg_read(struct ath6kl *ar, u32 addr, u32 *param); -int ath6kl_bmi_reg_write(struct ath6kl *ar, u32 addr, u32 param); -int ath6kl_bmi_lz_data(struct ath6kl *ar, - u8 *buf, u32 len); -int ath6kl_bmi_lz_stream_start(struct ath6kl *ar, - u32 addr); -int ath6kl_bmi_fast_download(struct ath6kl *ar, - u32 addr, u8 *buf, u32 len); -#endif diff --git a/drivers/net/wireless/ath/ath6kl/btc.h b/drivers/net/wireless/ath/ath6kl/btc.h deleted file mode 100644 index 71075a8..0000000 --- a/drivers/net/wireless/ath/ath6kl/btc.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef BTC_H -#define BTC_H -#include - -#define EVENT_ID_LEN 2 - -void cfg80211_send_genevent_to_app(struct net_device *dev, - u16 event_id, - u8 *datap, int len) -{ - char *buf; - u16 size; - union iwreq_data wrqu; - - size = len + EVENT_ID_LEN; - - if (size > IW_GENERIC_IE_MAX) - return; - - buf = kmalloc(size, GFP_ATOMIC); - if (buf == NULL) - return; - - memset(buf, 0, size); - memcpy(buf, &event_id, EVENT_ID_LEN); - memcpy(buf + EVENT_ID_LEN, datap, len); - - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.data.length = size; - wireless_send_event(dev, IWEVGENIE, &wrqu, buf); - kfree(buf); -} - -void cfg80211_send_event_to_app(struct net_device *dev, - u16 event_id, - u8 *datap, int len) -{ - char *buf; - u16 size; - union iwreq_data wrqu; - - size = len + EVENT_ID_LEN; - - if (size > IW_CUSTOM_MAX) - return; - - buf = kmalloc(size, GFP_ATOMIC); - if (buf == NULL) - return; - - memset(buf, 0, size); - memcpy(buf, &event_id, EVENT_ID_LEN); - memcpy(buf + EVENT_ID_LEN, datap, len); - - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.data.length = size; - wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); - kfree(buf); -} -#endif diff --git a/drivers/net/wireless/ath/ath6kl/c210.c b/drivers/net/wireless/ath/ath6kl/c210.c deleted file mode 100644 index bb5f189..0000000 --- a/drivers/net/wireless/ath/ath6kl/c210.c +++ /dev/null @@ -1,152 +0,0 @@ -#include -#include -#include -#include -#include - -#include "core.h" - -typedef int A_BOOL; -typedef unsigned char A_UCHAR; -typedef unsigned long A_ATH_TIMER; -typedef int8_t A_INT8; -typedef int16_t A_INT16; -typedef int32_t A_INT32; -typedef u_int8_t A_UINT8; -typedef u_int16_t A_UINT16; -typedef u_int32_t A_UINT32; - -#define WMI_MAX_SSID_LEN 32 -#define ATH_MAC_LEN 6 /* length of mac in bytes */ - -#define __ATTRIB_PACK -#define POSTPACK __ATTRIB_PACK -#define PREPACK - -typedef PREPACK struct { - PREPACK union { - A_UINT8 ie[17]; - A_INT32 wac_status; - } POSTPACK info; -} POSTPACK WMI_GET_WAC_INFO; - -struct ar_wep_key { - A_UINT8 arKeyIndex; - A_UINT8 arKeyLen; - A_UINT8 arKey[64]; -} ; - -#define A_MDELAY(msecs) mdelay(msecs) - -#define WMI_MAX_RATE_MASK 2 - -#define GET_INODE_FROM_FILEP(filp) \ - (filp)->f_path.dentry->d_inode -typedef char A_CHAR; -int android_readwrite_file(const A_CHAR *filename, A_CHAR *rbuf, const A_CHAR *wbuf, size_t length) -{ - int ret = 0; - struct file *filp = (struct file *)-ENOENT; - mm_segment_t oldfs; - oldfs = get_fs(); - set_fs(KERNEL_DS); - - do { - int mode = (wbuf) ? O_RDWR|O_CREAT : O_RDONLY; - filp = filp_open(filename, mode, - S_IRUSR | S_IWUSR | S_IRGRP | - S_IWGRP | S_IROTH | S_IWOTH); - - if (IS_ERR(filp) || !filp->f_op) { - ret = -ENOENT; - break; - } - - if (length == 0) { - /* Read the length of the file only */ - struct inode *inode; - - inode = GET_INODE_FROM_FILEP(filp); - if (!inode) { - printk(KERN_INFO "android_readwrite_file: Error 2\n"); - ret = -ENOENT; - break; - } - ret = i_size_read(inode->i_mapping->host); - break; - } - - if (wbuf) { - if ((ret=filp->f_op->write(filp, wbuf, length, &filp->f_pos)) < 0) { - printk(KERN_INFO "android_readwrite_file: Error 3\n"); - break; - } - } else { - if ((ret=filp->f_op->read(filp, rbuf, length, &filp->f_pos)) < 0) { - printk(KERN_INFO "android_readwrite_file: Error 4\n"); - break; - } - } - } while (0); - - if (!IS_ERR(filp)) { - filp_close(filp, NULL); - } - - set_fs(oldfs); - printk(KERN_INFO "android_readwrite_file: ret=%d\n", ret); - - return ret; -} - -extern void wlan_setup_power(int on, int detect); - -static int ath6kl_pm_probe(struct platform_device *pdev) -{ - wlan_setup_power(1,1); - return 0; -} - -static int ath6kl_pm_remove(struct platform_device *pdev) -{ - wlan_setup_power(0,1); - return 0; -} - -static int ath6kl_pm_suspend(struct platform_device *pdev, pm_message_t state) -{ - return 0; -} - -static inline void *ar6k_priv(struct net_device *dev) -{ - return (wdev_priv(dev->ieee80211_ptr)); -} - -static int ath6kl_pm_resume(struct platform_device *pdev) -{ - return 0; -} - - -static struct platform_driver ath6kl_pm_device = { - .probe = ath6kl_pm_probe, - .remove = ath6kl_pm_remove, - .suspend = ath6kl_pm_suspend, - .resume = ath6kl_pm_resume, - .driver = { - .name = "wlan_ar6000_pm_dev", - }, -}; - -void __init ath6kl_sdio_init_c210(void) -{ - platform_driver_register(&ath6kl_pm_device); - A_MDELAY(50); -} - -void __exit ath6kl_sdio_exit_c210(void) -{ - platform_driver_unregister(&ath6kl_pm_device); - A_MDELAY(1000); -} diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c deleted file mode 100755 index cceb9fd..0000000 --- a/drivers/net/wireless/ath/ath6kl/cfg80211.c +++ /dev/null @@ -1,3623 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include - -#include "core.h" -#include "cfg80211.h" -#include "debug.h" -#include "hif-ops.h" -#include "testmode.h" -#include "cfg80211_btcoex.h" -#include "pm.h" - -#ifdef CONFIG_MACH_PX -#include -#define GPIO_WLAN_nRST EXYNOS4_GPL0(4) -#else -#define GPIO_WLAN_nRST 0 -#endif - -static unsigned int ath6kl_p2p = 1; -static unsigned int ath6kl_first_2g_only = 1; - -module_param(ath6kl_p2p, uint, 0644); -module_param(ath6kl_first_2g_only, uint, 0644); - -#define RATETAB_ENT(_rate, _rateid, _flags) { \ - .bitrate = (_rate), \ - .flags = (_flags), \ - .hw_value = (_rateid), \ -} - -#define CHAN2G(_channel, _freq, _flags) { \ - .band = IEEE80211_BAND_2GHZ, \ - .hw_value = (_channel), \ - .center_freq = (_freq), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -#define CHAN5G(_channel, _flags) { \ - .band = IEEE80211_BAND_5GHZ, \ - .hw_value = (_channel), \ - .center_freq = 5000 + (5 * (_channel)), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -static struct ieee80211_rate ath6kl_rates[] = { - RATETAB_ENT(10, 0x1, 0), - RATETAB_ENT(20, 0x2, 0), - RATETAB_ENT(55, 0x4, 0), - RATETAB_ENT(110, 0x8, 0), - RATETAB_ENT(60, 0x10, 0), - RATETAB_ENT(90, 0x20, 0), - RATETAB_ENT(120, 0x40, 0), - RATETAB_ENT(180, 0x80, 0), - RATETAB_ENT(240, 0x100, 0), - RATETAB_ENT(360, 0x200, 0), - RATETAB_ENT(480, 0x400, 0), - RATETAB_ENT(540, 0x800, 0), -}; - -#define ath6kl_a_rates (ath6kl_rates + 4) -#define ath6kl_a_rates_size 8 -#define ath6kl_g_rates (ath6kl_rates + 0) -#define ath6kl_g_rates_size 12 - - -static struct ieee80211_channel ath6kl_2ghz_channels[] = { - CHAN2G(1, 2412, 0), - CHAN2G(2, 2417, 0), - CHAN2G(3, 2422, 0), - CHAN2G(4, 2427, 0), - CHAN2G(5, 2432, 0), - CHAN2G(6, 2437, 0), - CHAN2G(7, 2442, 0), - CHAN2G(8, 2447, 0), - CHAN2G(9, 2452, 0), - CHAN2G(10, 2457, 0), - CHAN2G(11, 2462, 0), - CHAN2G(12, 2467, 0), - CHAN2G(13, 2472, 0), - CHAN2G(14, 2484, 0), -}; - -static struct ieee80211_channel ath6kl_5ghz_a_channels[] = { - CHAN5G(34, 0), CHAN5G(36, 0), - CHAN5G(38, 0), CHAN5G(40, 0), - CHAN5G(42, 0), CHAN5G(44, 0), - CHAN5G(46, 0), CHAN5G(48, 0), - CHAN5G(52, 0), CHAN5G(56, 0), - CHAN5G(60, 0), CHAN5G(64, 0), - CHAN5G(100, 0), CHAN5G(104, 0), - CHAN5G(108, 0), CHAN5G(112, 0), - CHAN5G(116, 0), CHAN5G(120, 0), - CHAN5G(124, 0), CHAN5G(128, 0), - CHAN5G(132, 0), CHAN5G(136, 0), - CHAN5G(140, 0), CHAN5G(149, 0), - CHAN5G(153, 0), CHAN5G(157, 0), - CHAN5G(161, 0), CHAN5G(165, 0), - CHAN5G(184, 0), CHAN5G(188, 0), - CHAN5G(192, 0), CHAN5G(196, 0), - CHAN5G(200, 0), CHAN5G(204, 0), - CHAN5G(208, 0), CHAN5G(212, 0), - CHAN5G(216, 0), -}; - -static struct ieee80211_supported_band ath6kl_band_2ghz = { - .n_channels = ARRAY_SIZE(ath6kl_2ghz_channels), - .channels = ath6kl_2ghz_channels, - .n_bitrates = ath6kl_g_rates_size, - .bitrates = ath6kl_g_rates, - -}; - -static struct ieee80211_supported_band ath6kl_band_5ghz = { - .n_channels = ARRAY_SIZE(ath6kl_5ghz_a_channels), - .channels = ath6kl_5ghz_a_channels, - .n_bitrates = ath6kl_a_rates_size, - .bitrates = ath6kl_a_rates, - -}; - -#define CCKM_KRK_CIPHER_SUITE 0x004096ff /* use for KRK */ - -/* returns true if scheduled scan was stopped */ -static bool __ath6kl_cfg80211_sscan_stop(struct ath6kl_vif *vif) -{ - struct ath6kl *ar = vif->ar; - - if (ar->state != ATH6KL_STATE_SCHED_SCAN) - return false; - - del_timer_sync(&vif->sched_scan_timer); - - ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_HOST_MODE_AWAKE); - - ar->state = ATH6KL_STATE_ON; - - return true; -} - -static void ath6kl_cfg80211_sscan_disable(struct ath6kl_vif *vif) -{ - struct ath6kl *ar = vif->ar; - bool stopped; - - stopped = __ath6kl_cfg80211_sscan_stop(vif); - - if (!stopped) - return; - - cfg80211_sched_scan_stopped(ar->wiphy); -} - -static int ath6kl_set_wpa_version(struct ath6kl_vif *vif, - enum nl80211_wpa_versions wpa_version) -{ - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: %u\n", __func__, wpa_version); - - if (!wpa_version) { - vif->auth_mode = NONE_AUTH; - } else if (wpa_version & NL80211_WPA_VERSION_2) { - vif->auth_mode = WPA2_AUTH; - } else if (wpa_version & NL80211_WPA_VERSION_1) { - vif->auth_mode = WPA_AUTH; - } else { - ath6kl_err("%s: %u not supported\n", __func__, wpa_version); - return -ENOTSUPP; - } - - return 0; -} - -static int ath6kl_set_auth_type(struct ath6kl_vif *vif, - enum nl80211_auth_type auth_type) -{ - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, auth_type); - - switch (auth_type) { - case NL80211_AUTHTYPE_OPEN_SYSTEM: - vif->dot11_auth_mode = OPEN_AUTH; - break; - case NL80211_AUTHTYPE_SHARED_KEY: - vif->dot11_auth_mode = SHARED_AUTH; - break; - case NL80211_AUTHTYPE_NETWORK_EAP: - vif->dot11_auth_mode = LEAP_AUTH; - break; - - case NL80211_AUTHTYPE_AUTOMATIC: - vif->dot11_auth_mode = OPEN_AUTH | SHARED_AUTH; - break; - - default: - ath6kl_err("%s: 0x%x not spported\n", __func__, auth_type); - return -ENOTSUPP; - } - - return 0; -} - -static int ath6kl_set_cipher(struct ath6kl_vif *vif, u32 cipher, bool ucast) -{ - u8 *ar_cipher = ucast ? &vif->prwise_crypto : &vif->grp_crypto; - u8 *ar_cipher_len = ucast ? &vif->prwise_crypto_len : - &vif->grp_crypto_len; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: cipher 0x%x, ucast %u\n", - __func__, cipher, ucast); - - switch (cipher) { - case 0: - /* our own hack to use value 0 as no crypto used */ - *ar_cipher = NONE_CRYPT; - *ar_cipher_len = 0; - break; - case WLAN_CIPHER_SUITE_WEP40: - *ar_cipher = WEP_CRYPT; - *ar_cipher_len = 5; - break; - case WLAN_CIPHER_SUITE_WEP104: - *ar_cipher = WEP_CRYPT; - *ar_cipher_len = 13; - break; - case WLAN_CIPHER_SUITE_TKIP: - *ar_cipher = TKIP_CRYPT; - *ar_cipher_len = 0; - break; - case WLAN_CIPHER_SUITE_CCMP: - *ar_cipher = AES_CRYPT; - *ar_cipher_len = 0; - break; - case WLAN_CIPHER_SUITE_SMS4: - *ar_cipher = WAPI_CRYPT; - *ar_cipher_len = 0; - break; - default: - ath6kl_err("cipher 0x%x not supported\n", cipher); - return -ENOTSUPP; - } - - return 0; -} - -static void ath6kl_set_key_mgmt(struct ath6kl_vif *vif, u32 key_mgmt) -{ - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, key_mgmt); - - if (key_mgmt == WLAN_AKM_SUITE_PSK) { - if (vif->auth_mode == WPA_AUTH) - vif->auth_mode = WPA_PSK_AUTH; - else if (vif->auth_mode == WPA2_AUTH) - vif->auth_mode = WPA2_PSK_AUTH; - } else if (key_mgmt == 0x00409600) { - if (vif->auth_mode == WPA_AUTH) - vif->auth_mode = WPA_AUTH_CCKM; - else if (vif->auth_mode == WPA2_AUTH) - vif->auth_mode = WPA2_AUTH_CCKM; - } else if (key_mgmt != WLAN_AKM_SUITE_8021X) { - vif->auth_mode = NONE_AUTH; - } -} - -static bool ath6kl_cfg80211_ready(struct ath6kl_vif *vif) -{ - struct ath6kl *ar = vif->ar; - - if (!test_bit(WMI_READY, &ar->flag)) { - ath6kl_err("wmi is not ready\n"); - return false; - } - - if (!test_bit(WLAN_ENABLED, &vif->flags)) { - ath6kl_err("wlan disabled\n"); - return false; - } - - return true; -} - -static bool ath6kl_is_wpa_ie(const u8 *pos) -{ - return pos[0] == WLAN_EID_WPA && pos[1] >= 4 && - pos[2] == 0x00 && pos[3] == 0x50 && - pos[4] == 0xf2 && pos[5] == 0x01; -} - -static bool ath6kl_is_rsn_ie(const u8 *pos) -{ - return pos[0] == WLAN_EID_RSN; -} - -static bool ath6kl_is_wps_ie(const u8 *pos) -{ - return (pos[0] == WLAN_EID_VENDOR_SPECIFIC && - pos[1] >= 4 && - pos[2] == 0x00 && pos[3] == 0x50 && pos[4] == 0xf2 && - pos[5] == 0x04); -} - -static int ath6kl_set_assoc_req_ies(struct ath6kl_vif *vif, const u8 *ies, - size_t ies_len) -{ - struct ath6kl *ar = vif->ar; - const u8 *pos; - u8 *buf = NULL; - size_t len = 0; - int ret; - - /* - * Clear previously set flag - */ - - ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG; - - /* - * Filter out RSN/WPA IE(s) - */ - - if (ies && ies_len) { - buf = kmalloc(ies_len, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - pos = ies; - - while (pos + 1 < ies + ies_len) { - if (pos + 2 + pos[1] > ies + ies_len) - break; - if (!(ath6kl_is_wpa_ie(pos) || ath6kl_is_rsn_ie(pos))) { - memcpy(buf + len, pos, 2 + pos[1]); - len += 2 + pos[1]; - } - - if (ath6kl_is_wps_ie(pos)) - ar->connect_ctrl_flags |= CONNECT_WPS_FLAG; - - pos += 2 + pos[1]; - } - } - - ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, - WMI_FRAME_ASSOC_REQ, buf, len); - kfree(buf); - return ret; -} - -static int ath6kl_nliftype_to_drv_iftype(enum nl80211_iftype type, u8 *nw_type) -{ - switch (type) { - case NL80211_IFTYPE_STATION: - *nw_type = INFRA_NETWORK; - break; - case NL80211_IFTYPE_ADHOC: - *nw_type = ADHOC_NETWORK; - break; - case NL80211_IFTYPE_AP: - *nw_type = AP_NETWORK; - break; - case NL80211_IFTYPE_P2P_CLIENT: - *nw_type = INFRA_NETWORK; - break; - case NL80211_IFTYPE_P2P_GO: - *nw_type = AP_NETWORK; - break; - default: - ath6kl_err("invalid interface type %u\n", type); - return -ENOTSUPP; - } - - return 0; -} - -static bool ath6kl_is_valid_iftype(struct ath6kl *ar, enum nl80211_iftype type, - u8 *if_idx, u8 *nw_type) -{ - int i; - - if (ath6kl_nliftype_to_drv_iftype(type, nw_type)) - return false; - - if (ar->ibss_if_active || ((type == NL80211_IFTYPE_ADHOC) && - ar->num_vif)) - return false; - - if (type == NL80211_IFTYPE_STATION || - type == NL80211_IFTYPE_AP || type == NL80211_IFTYPE_ADHOC) { - for (i = 0; i < ar->vif_max; i++) { - if ((ar->avail_idx_map >> i) & BIT(0)) { - *if_idx = i; - return true; - } - } - } - - if (type == NL80211_IFTYPE_P2P_CLIENT || - type == NL80211_IFTYPE_P2P_GO) { - for (i = ar->max_norm_iface; i < ar->vif_max; i++) { - if ((ar->avail_idx_map >> i) & BIT(0)) { - *if_idx = i; - return true; - } - } - } - - return false; -} - -static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, - struct cfg80211_connect_params *sme) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - int status; - u8 nw_subtype = (ar->p2p) ? SUBTYPE_P2PDEV : SUBTYPE_NONE; - u16 interval; - - ath6kl_cfg80211_sscan_disable(vif); - - vif->sme_state = SME_CONNECTING; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) { - ath6kl_err("destroy in progress\n"); - return -EBUSY; - } - - if (test_bit(SKIP_SCAN, &ar->flag) && - ((sme->channel && sme->channel->center_freq == 0) || - (sme->bssid && is_zero_ether_addr(sme->bssid)))) { - ath6kl_err("SkipScan: channel or bssid invalid\n"); - return -EINVAL; - } - - if (down_interruptible(&ar->sem)) { - ath6kl_err("busy, couldn't get access\n"); - return -ERESTARTSYS; - } - - if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) { - ath6kl_err("busy, destroy in progress\n"); - up(&ar->sem); - return -EBUSY; - } - - if (ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)]) { - /* - * sleep until the command queue drains - */ - wait_event_interruptible_timeout(ar->event_wq, - ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)] == 0, - WMI_TIMEOUT); - if (signal_pending(current)) { - ath6kl_err("cmd queue drain timeout\n"); - up(&ar->sem); - return -EINTR; - } - } - - status = ath6kl_set_assoc_req_ies(vif, sme->ie, sme->ie_len); - if (status) { - up(&ar->sem); - return status; - } - - if (sme->ie == NULL || sme->ie_len == 0) - ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG; - - if (test_bit(CONNECTED, &vif->flags) && - vif->ssid_len == sme->ssid_len && - !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) { - vif->reconnect_flag = true; - status = ath6kl_wmi_reconnect_cmd(ar->wmi, vif->fw_vif_idx, - vif->req_bssid, - vif->ch_hint); - - up(&ar->sem); - if (status) { - ath6kl_err("wmi_reconnect_cmd failed\n"); - return -EIO; - } - return 0; - } else if (vif->ssid_len == sme->ssid_len && - !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) { - ath6kl_disconnect(vif); - } - - memset(vif->ssid, 0, sizeof(vif->ssid)); - vif->ssid_len = sme->ssid_len; - memcpy(vif->ssid, sme->ssid, sme->ssid_len); - - if (sme->channel) - vif->ch_hint = sme->channel->center_freq; - - memset(vif->req_bssid, 0, sizeof(vif->req_bssid)); - if (sme->bssid && !is_broadcast_ether_addr(sme->bssid)) - memcpy(vif->req_bssid, sme->bssid, sizeof(vif->req_bssid)); - - ath6kl_set_wpa_version(vif, sme->crypto.wpa_versions); - - status = ath6kl_set_auth_type(vif, sme->auth_type); - if (status) { - up(&ar->sem); - return status; - } - - if (sme->crypto.n_ciphers_pairwise) - ath6kl_set_cipher(vif, sme->crypto.ciphers_pairwise[0], true); - else - ath6kl_set_cipher(vif, 0, true); - - ath6kl_set_cipher(vif, sme->crypto.cipher_group, false); - - if (sme->crypto.n_akm_suites) - ath6kl_set_key_mgmt(vif, sme->crypto.akm_suites[0]); - - if ((sme->key_len) && - (vif->auth_mode == NONE_AUTH) && - (vif->prwise_crypto == WEP_CRYPT)) { - struct ath6kl_key *key = NULL; - - if (sme->key_idx > WMI_MAX_KEY_INDEX) { - ath6kl_err("key index %d out of bounds\n", - sme->key_idx); - up(&ar->sem); - return -ENOENT; - } - - key = &vif->keys[sme->key_idx]; - key->key_len = sme->key_len; - memcpy(key->key, sme->key, key->key_len); - key->cipher = vif->prwise_crypto; - vif->def_txkey_index = sme->key_idx; - - ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, sme->key_idx, - vif->prwise_crypto, - GROUP_USAGE | TX_USAGE, - key->key_len, - NULL, 0, - key->key, KEY_OP_INIT_VAL, NULL, - NO_SYNC_WMIFLAG); - } - - if (!ar->usr_bss_filter) { - clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); - if (ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, - ALL_BSS_FILTER, 0) != 0) { - ath6kl_err("couldn't set bss filtering\n"); - up(&ar->sem); - return -EIO; - } - } - - vif->nw_type = vif->next_mode; - - if (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) - nw_subtype = SUBTYPE_P2PCLIENT; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: connect called with authmode %d dot11 auth %d" - " PW crypto %d PW crypto len %d GRP crypto %d" - " GRP crypto len %d channel hint %u\n", - __func__, - vif->auth_mode, vif->dot11_auth_mode, vif->prwise_crypto, - vif->prwise_crypto_len, vif->grp_crypto, - vif->grp_crypto_len, vif->ch_hint); - - vif->reconnect_flag = 0; - - if (vif->nw_type == INFRA_NETWORK) { - interval = max(vif->listen_intvl_t, - (u16) ATH6KL_MAX_WOW_LISTEN_INTL); - status = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, - interval, - 0); - if (status) { - ath6kl_err("couldn't set listen intervel\n"); - up(&ar->sem); - return status; - } - } - - status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type, - vif->dot11_auth_mode, vif->auth_mode, - vif->prwise_crypto, - vif->prwise_crypto_len, - vif->grp_crypto, vif->grp_crypto_len, - vif->ssid_len, vif->ssid, - vif->req_bssid, vif->ch_hint, - ar->connect_ctrl_flags, nw_subtype); - - up(&ar->sem); - - if (status == -EINVAL) { - memset(vif->ssid, 0, sizeof(vif->ssid)); - vif->ssid_len = 0; - ath6kl_err("invalid request\n"); - return -ENOENT; - } else if (status) { - ath6kl_err("ath6kl_wmi_connect_cmd failed\n"); - return -EIO; - } - - if ((!(ar->connect_ctrl_flags & CONNECT_DO_WPA_OFFLOAD)) && - ((vif->auth_mode == WPA_PSK_AUTH) - || (vif->auth_mode == WPA2_PSK_AUTH))) { - mod_timer(&vif->disconnect_timer, - jiffies + msecs_to_jiffies(DISCON_TIMER_INTVAL)); - } - - ar->connect_ctrl_flags &= ~CONNECT_DO_WPA_OFFLOAD; - set_bit(CONNECT_PEND, &vif->flags); - - return 0; -} - -static struct cfg80211_bss * -ath6kl_add_bss_if_needed(struct ath6kl_vif *vif, - enum network_type nw_type, - const u8 *bssid, - struct ieee80211_channel *chan, - const u8 *beacon_ie, - size_t beacon_ie_len) -{ - struct ath6kl *ar = vif->ar; - struct cfg80211_bss *bss; - u16 cap_mask, cap_val; - u8 *ie; - - if (nw_type & ADHOC_NETWORK) { - cap_mask = WLAN_CAPABILITY_IBSS; - cap_val = WLAN_CAPABILITY_IBSS; - } else { - cap_mask = WLAN_CAPABILITY_ESS; - cap_val = WLAN_CAPABILITY_ESS; - } - - bss = cfg80211_get_bss(ar->wiphy, chan, bssid, - vif->ssid, vif->ssid_len, - cap_mask, cap_val); - if (bss == NULL) { - /* - * Since cfg80211 may not yet know about the BSS, - * generate a partial entry until the first BSS info - * event becomes available. - * - * Prepend SSID element since it is not included in the Beacon - * IEs from the target. - */ - ie = kmalloc(2 + vif->ssid_len + beacon_ie_len, GFP_KERNEL); - if (ie == NULL) - return NULL; - ie[0] = WLAN_EID_SSID; - ie[1] = vif->ssid_len; - memcpy(ie + 2, vif->ssid, vif->ssid_len); - memcpy(ie + 2 + vif->ssid_len, beacon_ie, beacon_ie_len); - bss = cfg80211_inform_bss(ar->wiphy, chan, - bssid, 0, cap_val, 100, - ie, 2 + vif->ssid_len + beacon_ie_len, - 0, GFP_KERNEL); - if (bss) - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "added bss %s to " - "cfg80211\n", sec_conv_mac(bssid)); - kfree(ie); - } else - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss\n"); - - return bss; -} - -void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel, - u8 *bssid, u16 listen_intvl, - u16 beacon_intvl, - enum network_type nw_type, - u8 beacon_ie_len, u8 assoc_req_len, - u8 assoc_resp_len, u8 *assoc_info) -{ - struct ieee80211_channel *chan; - struct ath6kl *ar = vif->ar; - struct cfg80211_bss *bss; - - /* capinfo + listen interval */ - u8 assoc_req_ie_offset = sizeof(u16) + sizeof(u16); - - /* capinfo + status code + associd */ - u8 assoc_resp_ie_offset = sizeof(u16) + sizeof(u16) + sizeof(u16); - - u8 *assoc_req_ie = assoc_info + beacon_ie_len + assoc_req_ie_offset; - u8 *assoc_resp_ie = assoc_info + beacon_ie_len + assoc_req_len + - assoc_resp_ie_offset; - - assoc_req_len -= assoc_req_ie_offset; - assoc_resp_len -= assoc_resp_ie_offset; - - /* - * Store Beacon interval here; DTIM period will be available only once - * a Beacon frame from the AP is seen. - */ - vif->assoc_bss_beacon_int = beacon_intvl; - clear_bit(DTIM_PERIOD_AVAIL, &vif->flags); - - if (nw_type & ADHOC_NETWORK) { - if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: ath6k not in ibss mode\n", __func__); - return; - } - } - - if (nw_type & INFRA_NETWORK) { - if (vif->wdev.iftype != NL80211_IFTYPE_STATION && - vif->wdev.iftype != NL80211_IFTYPE_P2P_CLIENT) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: ath6k not in station mode\n", __func__); - return; - } - } - - chan = ieee80211_get_channel(ar->wiphy, (int) channel); - - bss = ath6kl_add_bss_if_needed(vif, nw_type, bssid, chan, - assoc_info, beacon_ie_len); - if (!bss) { - ath6kl_err("could not add cfg80211 bss entry\n"); - return; - } - - if (nw_type & ADHOC_NETWORK) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "ad-hoc %s selected\n", - nw_type & ADHOC_CREATOR ? "creator" : "joiner"); - cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL); - cfg80211_put_bss(bss); - return; - } - - if (vif->sme_state == SME_CONNECTING) { - /* inform connect result to cfg80211 */ - vif->sme_state = SME_CONNECTED; - cfg80211_connect_result(vif->ndev, bssid, - assoc_req_ie, assoc_req_len, - assoc_resp_ie, assoc_resp_len, - WLAN_STATUS_SUCCESS, GFP_KERNEL); - cfg80211_put_bss(bss); - } else if (vif->sme_state == SME_CONNECTED) { - /* inform roam event to cfg80211 */ - cfg80211_roamed_bss(vif->ndev, bss, assoc_req_ie, assoc_req_len, - assoc_resp_ie, assoc_resp_len, GFP_KERNEL); - } -} - -static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy, - struct net_device *dev, u16 reason_code) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: reason=%u\n", __func__, - reason_code); - - ath6kl_cfg80211_sscan_disable(vif); - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) { - ath6kl_err("busy, destroy in progress\n"); - return -EBUSY; - } - - if (down_interruptible(&ar->sem)) { - ath6kl_err("busy, couldn't get access\n"); - return -ERESTARTSYS; - } - - vif->reconnect_flag = 0; - ath6kl_disconnect(vif); - memset(vif->ssid, 0, sizeof(vif->ssid)); - vif->ssid_len = 0; - - if (!test_bit(SKIP_SCAN, &ar->flag)) - memset(vif->req_bssid, 0, sizeof(vif->req_bssid)); - - up(&ar->sem); - - vif->sme_state = SME_DISCONNECTED; - - return 0; -} - -void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason, - u8 *bssid, u8 assoc_resp_len, - u8 *assoc_info, u16 proto_reason) -{ - struct ath6kl *ar = vif->ar; - - if (vif->scan_req) { - cfg80211_scan_done(vif->scan_req, true); - vif->scan_req = NULL; - } - - if (vif->nw_type & ADHOC_NETWORK) { - if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: ath6k not in ibss mode\n", __func__); - return; - } - memset(bssid, 0, ETH_ALEN); - cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL); - return; - } - - if (vif->nw_type & INFRA_NETWORK) { - if (vif->wdev.iftype != NL80211_IFTYPE_STATION && - vif->wdev.iftype != NL80211_IFTYPE_P2P_CLIENT) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: ath6k not in station mode\n", __func__); - return; - } - } - - /* - * Send a disconnect command to target when a disconnect event is - * received with reason code other than 3 (DISCONNECT_CMD - disconnect - * request from host) to make the firmware stop trying to connect even - * after giving disconnect event. There will be one more disconnect - * event for this disconnect command with reason code DISCONNECT_CMD - * which will be notified to cfg80211. - */ - if (is_zero_ether_addr((const u8 *) bssid) || - memcmp(bssid, "\x44\x44\x44\x44\x44\x44", ETH_ALEN) == 0) { - - if (reason != DISCONNECT_CMD) { - ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx); - return; - } - } - - clear_bit(CONNECT_PEND, &vif->flags); - - if (vif->sme_state == SME_CONNECTING) { - cfg80211_connect_result(vif->ndev, - bssid, NULL, 0, - NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, - GFP_KERNEL); - } else if (vif->sme_state == SME_CONNECTED) { - cfg80211_disconnected(vif->ndev, reason, - NULL, 0, GFP_KERNEL); - } - - vif->sme_state = SME_DISCONNECTED; -} - -static int ath6kl_set_probed_ssids(struct ath6kl *ar, - struct ath6kl_vif *vif, - struct cfg80211_ssid *ssids, int n_ssids) -{ - u8 i; - - if (n_ssids > MAX_PROBED_SSIDS) - return -EINVAL; - - for (i = 0; i < n_ssids; i++) { - ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i, - ssids[i].ssid_len ? - SPECIFIC_SSID_FLAG : ANY_SSID_FLAG, - ssids[i].ssid_len, - ssids[i].ssid); - } - - /* Make sure no old entries are left behind */ - for (i = n_ssids; i < MAX_PROBED_SSIDS; i++) { - ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i, - DISABLE_SSID_FLAG, 0, NULL); - } - - return 0; -} - - -static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_scan_request *request) -{ - struct ath6kl *ar = ath6kl_priv(ndev); - struct ath6kl_vif *vif = netdev_priv(ndev); - s8 n_channels = 0; - u16 *channels = NULL; - int ret = 0; - u32 force_fg_scan = 0; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - ath6kl_cfg80211_sscan_disable(vif); - - if (!ar->usr_bss_filter) { - clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); - ret = ath6kl_wmi_bssfilter_cmd( - ar->wmi, vif->fw_vif_idx, - (test_bit(CONNECTED, &vif->flags) ? - ALL_BUT_BSS_FILTER : ALL_BSS_FILTER), 0); - if (ret) { - ath6kl_err("couldn't set bss filtering\n"); - return ret; - } - } - - ret = ath6kl_set_probed_ssids(ar, vif, request->ssids, - request->n_ssids); - if (ret < 0) - return ret; - - /* this also clears IE in fw if it's not set */ - ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, - WMI_FRAME_PROBE_REQ, - request->ie, request->ie_len); - if (ret) { - ath6kl_err("failed to set Probe Request appie for " - "scan"); - return ret; - } - - /* - * Scan only the requested channels if the request specifies a set of - * channels. If the list is longer than the target supports, do not - * configure the list and instead, scan all available channels. - */ - ath6kl_err("channel num %d \n",request->n_channels); -#ifdef CONFIG_MACH_PX - if (request->n_channels > 0) { -#else - if (request->n_channels > 0 && - request->n_channels <= WMI_MAX_CHANNELS) { -#endif - u8 i; - - n_channels = request->n_channels; - - channels = kzalloc(n_channels * sizeof(u16), GFP_KERNEL); - if (channels == NULL) { - ath6kl_warn("failed to set scan channels, " - "scan all channels"); - n_channels = 0; - } - - for (i = 0; i < n_channels; i++) { -#if 0 - ath6kl_err("scanning channel %d\n",request->channels[i]->center_freq); -#endif - if (ath6kl_first_2g_only - && request->channels[i]->center_freq > 5000) { - ath6kl_err("skip 5ghz channel %d %d\n", - ath6kl_first_2g_only, - request->channels[i]->center_freq); - continue; - } - - channels[i] = request->channels[i]->center_freq; - } - } - - if (ath6kl_first_2g_only) - ath6kl_first_2g_only = 0; - - if (test_bit(CONNECTED, &vif->flags)) - force_fg_scan = 1; - - vif->scan_req = request; - - if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX, - ar->fw_capabilities)) { - /* - * If capable of doing P2P mgmt operations using - * station interface, send additional information like - * supported rates to advertise and xmit rates for - * probe requests - */ - if (request->no_cck) { -#ifdef CONFIG_HAS_WAKELOCK - ath6kl_p2p_release_wakelock(ar); - ath6kl_p2p_acquire_wakelock(ar , n_channels * 200); -#endif - } - ret = ath6kl_wmi_beginscan_cmd(ar->wmi, vif->fw_vif_idx, - WMI_LONG_SCAN, force_fg_scan, - false, 0, - ATH6KL_FG_SCAN_INTERVAL, - n_channels, channels, - request->no_cck, - request->rates); - } else { - ret = ath6kl_wmi_startscan_cmd(ar->wmi, vif->fw_vif_idx, - WMI_LONG_SCAN, force_fg_scan, - false, 0, - ATH6KL_FG_SCAN_INTERVAL, - n_channels, channels); - } - if (ret) { - ath6kl_err("wmi_startscan_cmd failed\n"); - vif->scan_req = NULL; - } - - kfree(channels); - - return ret; -} - -void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, bool aborted) -{ - struct ath6kl *ar = vif->ar; - int i; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: status%s\n", __func__, - aborted ? " aborted" : ""); - - if (!vif->scan_req) - return; - - if (aborted) - goto out; - - if (vif->scan_req->n_ssids && vif->scan_req->ssids[0].ssid_len) { - for (i = 0; i < vif->scan_req->n_ssids; i++) { - ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, - i + 1, DISABLE_SSID_FLAG, - 0, NULL); - } - } - -out: - cfg80211_scan_done(vif->scan_req, aborted); - vif->scan_req = NULL; -} - -static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, - u8 key_index, bool pairwise, - const u8 *mac_addr, - struct key_params *params) -{ - struct ath6kl *ar = ath6kl_priv(ndev); - struct ath6kl_vif *vif = netdev_priv(ndev); - struct ath6kl_key *key = NULL; - int seq_len = 0; - u8 key_usage; - u8 key_type; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (params->cipher == CCKM_KRK_CIPHER_SUITE) { - if (params->key_len != WMI_KRK_LEN) - return -EINVAL; - return ath6kl_wmi_add_krk_cmd(ar->wmi, vif->fw_vif_idx, - params->key); - } - - if (key_index > WMI_MAX_KEY_INDEX) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: key index %d out of bounds\n", __func__, - key_index); - return -ENOENT; - } - - key = &vif->keys[key_index]; - memset(key, 0, sizeof(struct ath6kl_key)); - - if (pairwise) - key_usage = PAIRWISE_USAGE; - else - key_usage = GROUP_USAGE; - - seq_len = params->seq_len; - if (params->cipher == WLAN_CIPHER_SUITE_SMS4 && - seq_len > ATH6KL_KEY_SEQ_LEN) { - /* Only first half of the WPI PN is configured */ - seq_len = ATH6KL_KEY_SEQ_LEN; - } - if (params->key_len > WLAN_MAX_KEY_LEN || - seq_len > sizeof(key->seq)) - return -EINVAL; - - key->key_len = params->key_len; - memcpy(key->key, params->key, key->key_len); - key->seq_len = seq_len; - memcpy(key->seq, params->seq, key->seq_len); - key->cipher = params->cipher; - - switch (key->cipher) { - case WLAN_CIPHER_SUITE_WEP40: - case WLAN_CIPHER_SUITE_WEP104: - key_type = WEP_CRYPT; - break; - - case WLAN_CIPHER_SUITE_TKIP: - key_type = TKIP_CRYPT; - break; - - case WLAN_CIPHER_SUITE_CCMP: - key_type = AES_CRYPT; - break; - case WLAN_CIPHER_SUITE_SMS4: - key_type = WAPI_CRYPT; - break; - - default: - return -ENOTSUPP; - } - - if (((vif->auth_mode == WPA_PSK_AUTH) - || (vif->auth_mode == WPA2_PSK_AUTH)) - && (key_usage & GROUP_USAGE)) - del_timer(&vif->disconnect_timer); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: index %d, key_len %d, key_type 0x%x, key_usage 0x%x, seq_len %d\n", - __func__, key_index, key->key_len, key_type, - key_usage, key->seq_len); - - if (vif->nw_type == AP_NETWORK && !pairwise && - (key_type == TKIP_CRYPT || key_type == AES_CRYPT || - key_type == WAPI_CRYPT)) { - ar->ap_mode_bkey.valid = true; - ar->ap_mode_bkey.key_index = key_index; - ar->ap_mode_bkey.key_type = key_type; - ar->ap_mode_bkey.key_len = key->key_len; - memcpy(ar->ap_mode_bkey.key, key->key, key->key_len); - if (!test_bit(CONNECTED, &vif->flags)) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay initial group " - "key configuration until AP mode has been " - "started\n"); - /* - * The key will be set in ath6kl_connect_ap_mode() once - * the connected event is received from the target. - */ - return 0; - } - } - - if (vif->next_mode == AP_NETWORK && key_type == WEP_CRYPT && - !test_bit(CONNECTED, &vif->flags)) { - /* - * Store the key locally so that it can be re-configured after - * the AP mode has properly started - * (ath6kl_install_statioc_wep_keys). - */ - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay WEP key configuration " - "until AP mode has been started\n"); - vif->wep_key_list[key_index].key_len = key->key_len; - memcpy(vif->wep_key_list[key_index].key, key->key, - key->key_len); - return 0; - } - - return ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, key_index, - key_type, key_usage, key->key_len, - key->seq, key->seq_len, key->key, - KEY_OP_INIT_VAL, - (u8 *) mac_addr, SYNC_BOTH_WMIFLAG); -} - -static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev, - u8 key_index, bool pairwise, - const u8 *mac_addr) -{ - struct ath6kl *ar = ath6kl_priv(ndev); - struct ath6kl_vif *vif = netdev_priv(ndev); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index); - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (key_index > WMI_MAX_KEY_INDEX) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: key index %d out of bounds\n", __func__, - key_index); - return -ENOENT; - } - - if (!vif->keys[key_index].key_len) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: index %d is empty\n", __func__, key_index); - return 0; - } - - vif->keys[key_index].key_len = 0; - - return ath6kl_wmi_deletekey_cmd(ar->wmi, vif->fw_vif_idx, key_index); -} - -static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, - u8 key_index, bool pairwise, - const u8 *mac_addr, void *cookie, - void (*callback) (void *cookie, - struct key_params *)) -{ - struct ath6kl_vif *vif = netdev_priv(ndev); - struct ath6kl_key *key = NULL; - struct key_params params; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index); - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (key_index > WMI_MAX_KEY_INDEX) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: key index %d out of bounds\n", __func__, - key_index); - return -ENOENT; - } - - key = &vif->keys[key_index]; - memset(¶ms, 0, sizeof(params)); - params.cipher = key->cipher; - params.key_len = key->key_len; - params.seq_len = key->seq_len; - params.seq = key->seq; - params.key = key->key; - - callback(cookie, ¶ms); - - return key->key_len ? 0 : -ENOENT; -} - -static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy, - struct net_device *ndev, - u8 key_index, bool unicast, - bool multicast) -{ - struct ath6kl *ar = ath6kl_priv(ndev); - struct ath6kl_vif *vif = netdev_priv(ndev); - struct ath6kl_key *key = NULL; - u8 key_usage; - enum crypto_type key_type = NONE_CRYPT; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index); - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (key_index > WMI_MAX_KEY_INDEX) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: key index %d out of bounds\n", - __func__, key_index); - return -ENOENT; - } - - if (!vif->keys[key_index].key_len) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: invalid key index %d\n", - __func__, key_index); - return -EINVAL; - } - - vif->def_txkey_index = key_index; - key = &vif->keys[vif->def_txkey_index]; - key_usage = GROUP_USAGE; - if (vif->prwise_crypto == WEP_CRYPT) - key_usage |= TX_USAGE; - if (unicast) - key_type = vif->prwise_crypto; - if (multicast) - key_type = vif->grp_crypto; - - if (vif->next_mode == AP_NETWORK && !test_bit(CONNECTED, &vif->flags)) - return 0; /* Delay until AP mode has been started */ - - return ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, - vif->def_txkey_index, - key_type, key_usage, - key->key_len, key->seq, key->seq_len, - key->key, - KEY_OP_INIT_VAL, NULL, - SYNC_BOTH_WMIFLAG); -} - -void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid, - bool ismcast) -{ - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: keyid %d, ismcast %d\n", __func__, keyid, ismcast); - - cfg80211_michael_mic_failure(vif->ndev, vif->bssid, - (ismcast ? NL80211_KEYTYPE_GROUP : - NL80211_KEYTYPE_PAIRWISE), keyid, NULL, - GFP_KERNEL); -} - -static int ath6kl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - struct ath6kl_vif *vif; - int ret; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: changed 0x%x\n", __func__, - changed); - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (changed & WIPHY_PARAM_RTS_THRESHOLD) { - ret = ath6kl_wmi_set_rts_cmd(ar->wmi, wiphy->rts_threshold); - if (ret != 0) { - ath6kl_err("ath6kl_wmi_set_rts_cmd failed\n"); - return -EIO; - } - } - - return 0; -} - -/* - * The type nl80211_tx_power_setting replaces the following - * data type from 2.6.36 onwards -*/ -static int ath6kl_cfg80211_set_txpower(struct wiphy *wiphy, - enum nl80211_tx_power_setting type, - int mbm) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - struct ath6kl_vif *vif; - u8 ath6kl_dbm; - int dbm = MBM_TO_DBM(mbm); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x, dbm %d\n", __func__, - type, dbm); - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - switch (type) { - case NL80211_TX_POWER_AUTOMATIC: - return 0; - case NL80211_TX_POWER_LIMITED: - ar->tx_pwr = ath6kl_dbm = dbm; - break; - default: - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x not supported\n", - __func__, type); - return -EOPNOTSUPP; - } - - ath6kl_wmi_set_tx_pwr_cmd(ar->wmi, vif->fw_vif_idx, ath6kl_dbm); - - return 0; -} - -static int ath6kl_cfg80211_get_txpower(struct wiphy *wiphy, int *dbm) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - struct ath6kl_vif *vif; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (test_bit(CONNECTED, &vif->flags)) { - ar->tx_pwr = 0; - - if (ath6kl_wmi_get_tx_pwr_cmd(ar->wmi, vif->fw_vif_idx) != 0) { - ath6kl_err("ath6kl_wmi_get_tx_pwr_cmd failed\n"); - return -EIO; - } - - wait_event_interruptible_timeout(ar->event_wq, ar->tx_pwr != 0, - 5 * HZ); - - if (signal_pending(current)) { - ath6kl_err("target did not respond\n"); - return -EINTR; - } - } - - *dbm = ar->tx_pwr; - return 0; -} - -static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy, - struct net_device *dev, - bool pmgmt, int timeout) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct wmi_power_mode_cmd mode; - struct ath6kl_vif *vif = netdev_priv(dev); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: pmgmt %d, timeout %d\n", - __func__, pmgmt, timeout); - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (pmgmt) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: rec power\n", __func__); - mode.pwr_mode = REC_POWER; - } else { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: max perf\n", __func__); - mode.pwr_mode = MAX_PERF_POWER; - } - - if (ath6kl_wmi_powermode_cmd(ar->wmi, vif->fw_vif_idx, - mode.pwr_mode) != 0) { - ath6kl_err("wmi_powermode_cmd failed\n"); - return -EIO; - } - - return 0; -} - -static struct net_device *ath6kl_cfg80211_add_iface(struct wiphy *wiphy, - char *name, - enum nl80211_iftype type, - u32 *flags, - struct vif_params *params) -{ - struct ath6kl *ar = wiphy_priv(wiphy); - struct net_device *ndev; - u8 if_idx, nw_type; - - if (ar->num_vif == ar->vif_max) { - ath6kl_err("Reached maximum number of supported vif\n"); - return ERR_PTR(-EINVAL); - } - - if (!ath6kl_is_valid_iftype(ar, type, &if_idx, &nw_type)) { - ath6kl_err("Not a supported interface type\n"); - return ERR_PTR(-EINVAL); - } - - ndev = ath6kl_interface_add(ar, name, type, if_idx, nw_type); - if (!ndev) - return ERR_PTR(-ENOMEM); - - ar->num_vif++; - - return ndev; -} - -static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy, - struct net_device *ndev) -{ - struct ath6kl *ar = wiphy_priv(wiphy); - struct ath6kl_vif *vif = netdev_priv(ndev); - - spin_lock_bh(&ar->list_lock); - list_del(&vif->list); - spin_unlock_bh(&ar->list_lock); - - ath6kl_cleanup_vif(vif, test_bit(WMI_READY, &ar->flag)); - - ath6kl_deinit_if_data(vif); - - return 0; -} - -static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy, - struct net_device *ndev, - enum nl80211_iftype type, u32 *flags, - struct vif_params *params) -{ - struct ath6kl_vif *vif = netdev_priv(ndev); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type %u\n", __func__, type); - - switch (type) { - case NL80211_IFTYPE_STATION: - vif->next_mode = INFRA_NETWORK; - break; - case NL80211_IFTYPE_ADHOC: - vif->next_mode = ADHOC_NETWORK; - break; - case NL80211_IFTYPE_AP: - vif->next_mode = AP_NETWORK; - break; - case NL80211_IFTYPE_P2P_CLIENT: - vif->next_mode = INFRA_NETWORK; - break; - case NL80211_IFTYPE_P2P_GO: - vif->next_mode = AP_NETWORK; - break; - default: - ath6kl_err("invalid interface type %u\n", type); - return -EOPNOTSUPP; - } - - vif->wdev.iftype = type; - - return 0; -} - -static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy, - struct net_device *dev, - struct cfg80211_ibss_params *ibss_param) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - int status; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - vif->ssid_len = ibss_param->ssid_len; - memcpy(vif->ssid, ibss_param->ssid, vif->ssid_len); - - if (ibss_param->channel) - vif->ch_hint = ibss_param->channel->center_freq; - - if (ibss_param->channel_fixed) { - /* - * TODO: channel_fixed: The channel should be fixed, do not - * search for IBSSs to join on other channels. Target - * firmware does not support this feature, needs to be - * updated. - */ - return -EOPNOTSUPP; - } - - memset(vif->req_bssid, 0, sizeof(vif->req_bssid)); - if (ibss_param->bssid && !is_broadcast_ether_addr(ibss_param->bssid)) - memcpy(vif->req_bssid, ibss_param->bssid, - sizeof(vif->req_bssid)); - - ath6kl_set_wpa_version(vif, 0); - - status = ath6kl_set_auth_type(vif, NL80211_AUTHTYPE_OPEN_SYSTEM); - if (status) - return status; - - if (ibss_param->privacy) { - ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, true); - ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, false); - } else { - ath6kl_set_cipher(vif, 0, true); - ath6kl_set_cipher(vif, 0, false); - } - - vif->nw_type = vif->next_mode; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "%s: connect called with authmode %d dot11 auth %d" - " PW crypto %d PW crypto len %d GRP crypto %d" - " GRP crypto len %d channel hint %u\n", - __func__, - vif->auth_mode, vif->dot11_auth_mode, vif->prwise_crypto, - vif->prwise_crypto_len, vif->grp_crypto, - vif->grp_crypto_len, vif->ch_hint); - - status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type, - vif->dot11_auth_mode, vif->auth_mode, - vif->prwise_crypto, - vif->prwise_crypto_len, - vif->grp_crypto, vif->grp_crypto_len, - vif->ssid_len, vif->ssid, - vif->req_bssid, vif->ch_hint, - ar->connect_ctrl_flags, SUBTYPE_NONE); - set_bit(CONNECT_PEND, &vif->flags); - - return 0; -} - -static int ath6kl_cfg80211_leave_ibss(struct wiphy *wiphy, - struct net_device *dev) -{ - struct ath6kl_vif *vif = netdev_priv(dev); - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - ath6kl_disconnect(vif); - memset(vif->ssid, 0, sizeof(vif->ssid)); - vif->ssid_len = 0; - - return 0; -} - -static const u32 cipher_suites[] = { - WLAN_CIPHER_SUITE_WEP40, - WLAN_CIPHER_SUITE_WEP104, - WLAN_CIPHER_SUITE_TKIP, - WLAN_CIPHER_SUITE_CCMP, - CCKM_KRK_CIPHER_SUITE, - WLAN_CIPHER_SUITE_SMS4, -}; - -static bool is_rate_legacy(s32 rate) -{ - static const s32 legacy[] = { 1000, 2000, 5500, 11000, - 6000, 9000, 12000, 18000, 24000, - 36000, 48000, 54000 - }; - u8 i; - - for (i = 0; i < ARRAY_SIZE(legacy); i++) - if (rate == legacy[i]) - return true; - - return false; -} - -static bool is_rate_ht20(s32 rate, u8 *mcs, bool *sgi) -{ - static const s32 ht20[] = { 6500, 13000, 19500, 26000, 39000, - 52000, 58500, 65000, 72200 - }; - u8 i; - - for (i = 0; i < ARRAY_SIZE(ht20); i++) { - if (rate == ht20[i]) { - if (i == ARRAY_SIZE(ht20) - 1) - /* last rate uses sgi */ - *sgi = true; - else - *sgi = false; - - *mcs = i; - return true; - } - } - return false; -} - -static bool is_rate_ht40(s32 rate, u8 *mcs, bool *sgi) -{ - static const s32 ht40[] = { 13500, 27000, 40500, 54000, - 81000, 108000, 121500, 135000, - 150000 - }; - u8 i; - - for (i = 0; i < ARRAY_SIZE(ht40); i++) { - if (rate == ht40[i]) { - if (i == ARRAY_SIZE(ht40) - 1) - /* last rate uses sgi */ - *sgi = true; - else - *sgi = false; - - *mcs = i; - return true; - } - } - - return false; -} - -static int ath6kl_get_station(struct wiphy *wiphy, struct net_device *dev, - u8 *mac, struct station_info *sinfo) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - long left; - bool sgi; - s32 rate; - int ret; - u8 mcs; - - if (memcmp(mac, vif->bssid, ETH_ALEN) != 0) - return -ENOENT; - - if (down_interruptible(&ar->sem)) - return -EBUSY; - - set_bit(STATS_UPDATE_PEND, &vif->flags); - - ret = ath6kl_wmi_get_stats_cmd(ar->wmi, vif->fw_vif_idx); - - if (ret != 0) { - up(&ar->sem); - return -EIO; - } - - left = wait_event_interruptible_timeout(ar->event_wq, - !test_bit(STATS_UPDATE_PEND, - &vif->flags), - WMI_TIMEOUT); - - up(&ar->sem); - - if (left == 0) - return -ETIMEDOUT; - else if (left < 0) - return left; - - if (vif->target_stats.rx_byte) { - sinfo->rx_bytes = vif->target_stats.rx_byte; - sinfo->filled |= STATION_INFO_RX_BYTES; - sinfo->rx_packets = vif->target_stats.rx_pkt; - sinfo->filled |= STATION_INFO_RX_PACKETS; - } - - if (vif->target_stats.tx_byte) { - sinfo->tx_bytes = vif->target_stats.tx_byte; - sinfo->filled |= STATION_INFO_TX_BYTES; - sinfo->tx_packets = vif->target_stats.tx_pkt; - sinfo->filled |= STATION_INFO_TX_PACKETS; - } - - sinfo->signal = vif->target_stats.cs_rssi; - sinfo->filled |= STATION_INFO_SIGNAL; - - rate = vif->target_stats.tx_ucast_rate; - - if (is_rate_legacy(rate)) { - sinfo->txrate.legacy = rate / 100; - } else if (is_rate_ht20(rate, &mcs, &sgi)) { - if (sgi) { - sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; - sinfo->txrate.mcs = mcs - 1; - } else { - sinfo->txrate.mcs = mcs; - } - - sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; - } else if (is_rate_ht40(rate, &mcs, &sgi)) { - if (sgi) { - sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; - sinfo->txrate.mcs = mcs - 1; - } else { - sinfo->txrate.mcs = mcs; - } - - sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; - sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; - } else { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "invalid rate from stats: %d\n", rate); - ath6kl_debug_war(ar, ATH6KL_WAR_INVALID_RATE); - return 0; - } - - sinfo->filled |= STATION_INFO_TX_BITRATE; - - if (test_bit(CONNECTED, &vif->flags) && - test_bit(DTIM_PERIOD_AVAIL, &vif->flags) && - vif->nw_type == INFRA_NETWORK) { - sinfo->filled |= STATION_INFO_BSS_PARAM; - sinfo->bss_param.flags = 0; - sinfo->bss_param.dtim_period = vif->assoc_bss_dtim_period; - sinfo->bss_param.beacon_interval = vif->assoc_bss_beacon_int; - } - - return 0; -} - -static int ath6kl_set_pmksa(struct wiphy *wiphy, struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - struct ath6kl *ar = ath6kl_priv(netdev); - struct ath6kl_vif *vif = netdev_priv(netdev); - - return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, pmksa->bssid, - pmksa->pmkid, true); -} - -static int ath6kl_del_pmksa(struct wiphy *wiphy, struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - struct ath6kl *ar = ath6kl_priv(netdev); - struct ath6kl_vif *vif = netdev_priv(netdev); - - return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, pmksa->bssid, - pmksa->pmkid, false); -} - -static int ath6kl_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev) -{ - struct ath6kl *ar = ath6kl_priv(netdev); - struct ath6kl_vif *vif = netdev_priv(netdev); - - if (test_bit(CONNECTED, &vif->flags)) - return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, - vif->bssid, NULL, false); - return 0; -} - -static int ath6kl_wow_usr(struct ath6kl *ar, struct ath6kl_vif *vif, - struct cfg80211_wowlan *wow, u32 *filter) -{ - int ret, pos; - u8 mask[WOW_MASK_SIZE]; - u16 i; - - /* Configure the patterns that we received from the user. */ - for (i = 0; i < wow->n_patterns; i++) { - - /* - * Convert given nl80211 specific mask value to equivalent - * driver specific mask value and send it to the chip along - * with patterns. For example, If the mask value defined in - * struct cfg80211_wowlan is 0xA (equivalent binary is 1010), - * then equivalent driver specific mask value is - * "0xFF 0x00 0xFF 0x00". - */ - memset(&mask, 0, sizeof(mask)); - for (pos = 0; pos < wow->patterns[i].pattern_len; pos++) { - if (wow->patterns[i].mask[pos / 8] & (0x1 << (pos % 8))) - mask[pos] = 0xFF; - } - /* - * Note: Pattern's offset is not passed as part of wowlan - * parameter from CFG layer. So it's always passed as ZERO - * to the firmware. It means, given WOW patterns are always - * matched from the first byte of received pkt in the firmware. - */ - ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, - vif->fw_vif_idx, WOW_LIST_ID, - wow->patterns[i].pattern_len, - 0 /* pattern offset */, - wow->patterns[i].pattern, mask); - if (ret) - return ret; - } - - if (wow->disconnect) - *filter |= WOW_FILTER_OPTION_NWK_DISASSOC; - - if (wow->magic_pkt) - *filter |= WOW_FILTER_OPTION_MAGIC_PACKET; - - if (wow->gtk_rekey_failure) - *filter |= WOW_FILTER_OPTION_GTK_ERROR; - - if (wow->eap_identity_req) - *filter |= WOW_FILTER_OPTION_EAP_REQ; - - if (wow->four_way_handshake) - *filter |= WOW_FILTER_OPTION_8021X_4WAYHS; - - return 0; -} - -static int ath6kl_wow_ap(struct ath6kl *ar, struct ath6kl_vif *vif) -{ - static const u8 unicst_pattern[] = { 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08 }; - static const u8 unicst_mask[] = { 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7f }; - u8 unicst_offset = 0; - static const u8 arp_pattern[] = { 0x08, 0x06 }; - static const u8 arp_mask[] = { 0xff, 0xff }; - u8 arp_offset = 20; - static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 }; - static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 }; - u8 discvr_offset = 38; - static const u8 dhcp_pattern[] = { 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x43 /* port 67 */ }; - static const u8 dhcp_mask[] = { 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff /* port 67 */ }; - u8 dhcp_offset = 0; - int ret; - - /* Setup unicast IP, EAPOL-like and ARP pkt pattern */ - ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, - vif->fw_vif_idx, WOW_LIST_ID, - sizeof(unicst_pattern), unicst_offset, - unicst_pattern, unicst_mask); - if (ret) { - ath6kl_err("failed to add WOW unicast IP pattern\n"); - return ret; - } - - /* Setup all ARP pkt pattern */ - ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, - vif->fw_vif_idx, WOW_LIST_ID, - sizeof(arp_pattern), arp_offset, - arp_pattern, arp_mask); - if (ret) { - ath6kl_err("failed to add WOW ARP pattern\n"); - return ret; - } - - /* - * Setup multicast pattern for mDNS 224.0.0.251, - * SSDP 239.255.255.250 and LLMNR 224.0.0.252 - */ - ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, - vif->fw_vif_idx, WOW_LIST_ID, - sizeof(discvr_pattern), discvr_offset, - discvr_pattern, discvr_mask); - if (ret) { - ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR pattern\n"); - return ret; - } - - /* Setup all DHCP broadcast pkt pattern */ - ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, - vif->fw_vif_idx, WOW_LIST_ID, - sizeof(dhcp_pattern), dhcp_offset, - dhcp_pattern, dhcp_mask); - if (ret) { - ath6kl_err("failed to add WOW DHCP broadcast pattern\n"); - return ret; - } - - return 0; -} - -static int ath6kl_wow_sta(struct ath6kl *ar, struct ath6kl_vif *vif) -{ - struct net_device *ndev = vif->ndev; - static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 }; - static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 }; - u8 discvr_offset = 38; - u8 mac_mask[ETH_ALEN]; - int ret; - - /* Setup unicast pkt pattern */ - memset(mac_mask, 0xff, ETH_ALEN); - ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, - vif->fw_vif_idx, WOW_LIST_ID, - ETH_ALEN, 0, ndev->dev_addr, - mac_mask); - if (ret) { - ath6kl_err("failed to add WOW unicast pattern\n"); - return ret; - } - - /* - * Setup multicast pattern for mDNS 224.0.0.251, - * SSDP 239.255.255.250 and LLMNR 224.0.0.252 - */ - if ((ndev->flags & IFF_ALLMULTI) || - (ndev->flags & IFF_MULTICAST && netdev_mc_count(ndev) > 0)) { - ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, - vif->fw_vif_idx, WOW_LIST_ID, - sizeof(discvr_pattern), discvr_offset, - discvr_pattern, discvr_mask); - if (ret) { - ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR " - "pattern\n"); - return ret; - } - } - - return 0; -} - -static int is_hsleep_mode_procsed(struct ath6kl_vif *vif) -{ - return test_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags); -} - -static bool is_ctrl_ep_empty(struct ath6kl *ar) -{ - return !ar->tx_pending[ar->ctrl_ep]; -} - -static int ath6kl_cfg80211_host_sleep(struct ath6kl *ar, struct ath6kl_vif *vif) -{ - int ret, left; - - clear_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags); - - ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_HOST_MODE_ASLEEP); - if (ret) - return ret; - - left = wait_event_interruptible_timeout(ar->event_wq, - is_hsleep_mode_procsed(vif), - WMI_TIMEOUT); - if (left == 0) { - ath6kl_warn("timeout, didn't get host sleep cmd processed event\n"); - ret = -ETIMEDOUT; - } else if (left < 0) { - ath6kl_warn("error while waiting for host sleep cmd processed event %d\n", - left); - ret = left; - } - - if (ar->tx_pending[ar->ctrl_ep]) { - left = wait_event_interruptible_timeout(ar->event_wq, - is_ctrl_ep_empty(ar), - WMI_TIMEOUT); - if (left == 0) { - ath6kl_warn("clear wmi ctrl data timeout\n"); - ret = -ETIMEDOUT; - } else if (left < 0) { - ath6kl_warn("clear wmi ctrl data failed: %d\n", left); - ret = left; - } - } - - return ret; -} - -static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow) -{ - struct in_device *in_dev; - struct in_ifaddr *ifa; - struct ath6kl_vif *vif; - int ret; - u32 filter = 0; - u16 i, bmiss_time; - u8 index = 0; - __be32 ips[MAX_IP_ADDRS]; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (!test_bit(CONNECTED, &vif->flags)) - return -ENOTCONN; - - if (wow && (wow->n_patterns > WOW_MAX_FILTERS_PER_LIST)) - return -EINVAL; - - /* Clear existing WOW patterns */ - for (i = 0; i < WOW_MAX_FILTERS_PER_LIST; i++) - ath6kl_wmi_del_wow_pattern_cmd(ar->wmi, vif->fw_vif_idx, - WOW_LIST_ID, i); - - /* - * Skip the default WOW pattern configuration - * if the driver receives any WOW patterns from - * the user. - */ - if (wow) - ret = ath6kl_wow_usr(ar, vif, wow, &filter); - else if (vif->nw_type == AP_NETWORK) - ret = ath6kl_wow_ap(ar, vif); - else - ret = ath6kl_wow_sta(ar, vif); - - if (ret) - return ret; - - netif_stop_queue(vif->ndev); - - if (vif->nw_type != AP_NETWORK) { - ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_MAX_WOW_LISTEN_INTL, - 0); - if (ret) - return ret; - - /* Set listen interval x 15 times as bmiss time */ - bmiss_time = ATH6KL_MAX_WOW_LISTEN_INTL * 15; - if (bmiss_time > ATH6KL_MAX_BMISS_TIME) - bmiss_time = ATH6KL_MAX_BMISS_TIME; - - ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx, - bmiss_time, 0); - if (ret) - return ret; - - ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, - 0xFFFF, 0, 0xFFFF, 0, 0, 0, - 0, 0, 0, 0); - if (ret) - return ret; - } - - ar->state = ATH6KL_STATE_SUSPENDING; - - /* Setup own IP addr for ARP agent. */ - in_dev = __in_dev_get_rtnl(vif->ndev); - if (!in_dev) - goto skip_arp; - - ifa = in_dev->ifa_list; - memset(&ips, 0, sizeof(ips)); - - /* Configure IP addr only if IP address count < MAX_IP_ADDRS */ - while (index < MAX_IP_ADDRS && ifa) { - ips[index] = ifa->ifa_local; - ifa = ifa->ifa_next; - index++; - } - - if (ifa) { - ath6kl_err("total IP addr count is exceeding fw limit\n"); - return -EINVAL; - } - - ret = ath6kl_wmi_set_ip_cmd(ar->wmi, vif->fw_vif_idx, ips[0], ips[1]); - if (ret) { - ath6kl_err("fail to setup ip for arp agent\n"); - return ret; - } - -skip_arp: - ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_WOW_MODE_ENABLE, - filter, - WOW_HOST_REQ_DELAY); - if (ret) - return ret; - - ret = ath6kl_cfg80211_host_sleep(ar, vif); - if (ret) - return ret; - - - ret = ath6kl_hif_wait_for_pending_recv(ar); - - return ret; -} - -static int ath6kl_wow_resume(struct ath6kl *ar) -{ - struct ath6kl_vif *vif; - int ret; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - if (ar->state == ATH6KL_STATE_RESUMING) - return 0; - - ar->state = ATH6KL_STATE_RESUMING; - -#ifdef CONFIG_HAS_WAKELOCK - wake_lock_timeout(&ar->wake_lock, 5 * HZ); -#endif - ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_HOST_MODE_AWAKE); - if (ret) { - ath6kl_warn("Failed to configure host sleep mode for " - "wow resume: %d\n", ret); - ar->state = ATH6KL_STATE_WOW; - return ret; - } - - if (vif->nw_type != AP_NETWORK) { - ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0); - if (ret) - return ret; - - ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, - vif->listen_intvl_t, 0); - if (ret) - return ret; - - ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx, - vif->bmiss_time_t, 0); - if (ret) - return ret; - } - - ar->state = ATH6KL_STATE_ON; - - netif_wake_queue(vif->ndev); - - return 0; -} - -static int ath6kl_cfg80211_deepsleep_suspend(struct ath6kl *ar) -{ - struct ath6kl_vif *vif; - int ret; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - ath6kl_cfg80211_stop_all(ar); - - /* Save the current power mode before enabling power save */ - ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode; - - ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER); - if (ret) - return ret; - - /* Disable WOW mode */ - ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_WOW_MODE_DISABLE, - 0, 0); - if (ret) - return ret; - - /* Flush all non control pkts in TX path */ - ath6kl_tx_data_cleanup(ar); - - ret = ath6kl_cfg80211_host_sleep(ar, vif); - if (ret) - return ret; - - - ret = ath6kl_hif_wait_for_pending_recv(ar); - - return ret; -} - -static int ath6kl_cfg80211_deepsleep_resume(struct ath6kl *ar) -{ - struct ath6kl_vif *vif; - int ret; - - vif = ath6kl_vif_first(ar); - - if (!vif) - return -EIO; - - if (ar->wmi->pwr_mode != ar->wmi->saved_pwr_mode) { - ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0, - ar->wmi->saved_pwr_mode); - if (ret) - return ret; - } - - ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_HOST_MODE_AWAKE); - if (ret) - return ret; - - ar->state = ATH6KL_STATE_ON; - - /* Reset scan parameter to default values */ - ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0); - if (ret) - return ret; - - return 0; -} - -int ath6kl_cfg80211_suspend(struct ath6kl *ar, - enum ath6kl_cfg_suspend_mode mode, - struct cfg80211_wowlan *wow) -{ - enum ath6kl_state prev_state; - int ret; - struct ath6kl_vif *vif; - - switch (mode) { - case ATH6KL_CFG_SUSPEND_WOW: - - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "wow mode suspend\n"); - - /* Flush all non control pkts in TX path */ - ath6kl_tx_data_cleanup(ar); - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi, vif->fw_vif_idx, - false); - if (ret) - return ret; - - prev_state = ar->state; - - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "ath6kl_wow_suspend()+ check GPIO_WLAN_nRST - %d\n", - GPIO_WLAN_nRST ? gpio_get_value(GPIO_WLAN_nRST) : 0xFF); - ret = ath6kl_wow_suspend(ar, wow); - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "ath6kl_wow_suspend()- check GPIO_WLAN_nRST - %d\n", - GPIO_WLAN_nRST ? gpio_get_value(GPIO_WLAN_nRST) : 0xFF); - if (ret) { - ath6kl_err("wow suspend failed: %d\n", ret); - ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi, - vif->fw_vif_idx, true); - ar->state = prev_state; - return ret; - } - set_bit(WOW_RESUME_PRINT, &ar->flag); - ar->state = ATH6KL_STATE_WOW; - break; - - case ATH6KL_CFG_SUSPEND_DEEPSLEEP: - - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "deepsleep mode suspend\n"); - - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "ath6kl_deepsleep_suspend()+ check GPIO_WLAN_nRST - %d\n", - GPIO_WLAN_nRST ? gpio_get_value(GPIO_WLAN_nRST) : 0xFF); - ret = ath6kl_cfg80211_deepsleep_suspend(ar); - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "ath6kl_deepsleep_suspend()- check GPIO_WLAN_nRST - %d\n", - GPIO_WLAN_nRST ? gpio_get_value(GPIO_WLAN_nRST) : 0xFF); - - if (ret) { - ath6kl_err("deepsleep suspend failed: %d\n", ret); - return ret; - } - - ar->state = ATH6KL_STATE_DEEPSLEEP; - - break; - - case ATH6KL_CFG_SUSPEND_CUTPOWER: - - ath6kl_cfg80211_stop_all(ar); - - if (ar->state == ATH6KL_STATE_OFF) { - ath6kl_dbg(ATH6KL_DBG_SUSPEND, - "suspend hw off, no action for cutpower\n"); - break; - } - - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "suspend cutting power\n"); - - ret = ath6kl_init_hw_stop(ar); - if (ret) { - ath6kl_warn("failed to stop hw during suspend: %d\n", - ret); - } - - ar->state = ATH6KL_STATE_CUTPOWER; - - break; - - case ATH6KL_CFG_SUSPEND_SCHED_SCAN: - /* - * Nothing needed for schedule scan, firmware is already in - * wow mode and sleeping most of the time. - */ - break; - - default: - break; - } - - return 0; -} - -int ath6kl_cfg80211_resume(struct ath6kl *ar) -{ - int ret; - struct ath6kl_vif *vif; - - switch (ar->state) { - case ATH6KL_STATE_WOW: - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "wow mode resume\n"); - - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "ath6kl_wow_resume()+ check GPIO_WLAN_nRST - %d\n", - GPIO_WLAN_nRST ? gpio_get_value(GPIO_WLAN_nRST) : 0xFF); - ret = ath6kl_wow_resume(ar); - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "ath6kl_wow_resume()- check GPIO_WLAN_nRST - %d\n", - GPIO_WLAN_nRST ? gpio_get_value(GPIO_WLAN_nRST) : 0xFF); - if (ret) { - ath6kl_warn("wow mode resume failed: %d\n", ret); - return ret; - } - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi, vif->fw_vif_idx, - true); - - if (ret) - return ret; - - break; - - case ATH6KL_STATE_DEEPSLEEP: - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "deep sleep resume\n"); - - - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "ath6kl_deepsleep_resume()+ check GPIO_WLAN_nRST - %d\n", - GPIO_WLAN_nRST ? gpio_get_value(GPIO_WLAN_nRST) : 0xFF); - ret = ath6kl_cfg80211_deepsleep_resume(ar); - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "ath6kl_deepsleep_resume()- check GPIO_WLAN_nRST - %d\n", - GPIO_WLAN_nRST ? gpio_get_value(GPIO_WLAN_nRST) : 0xFF); - if (ret) { - ath6kl_warn("deep sleep resume failed: %d\n", ret); - return ret; - } - break; - - case ATH6KL_STATE_CUTPOWER: - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "resume restoring power\n"); - - ret = ath6kl_init_hw_start(ar); - if (ret) { - ath6kl_warn("Failed to boot hw in resume: %d\n", ret); - return ret; - } - break; - - case ATH6KL_STATE_SCHED_SCAN: -#ifdef CONFIG_HAS_WAKELOCK - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sched scan 30s wake lock\n"); - wake_lock_timeout(&ar->wake_lock, 30 * HZ); -#endif - break; - - default: - break; - } - - return 0; -} - -#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) - -/* hif layer decides what suspend mode to use */ -static int __ath6kl_cfg80211_suspend(struct wiphy *wiphy, - struct cfg80211_wowlan *wow) -{ -#ifdef CONFIG_MACH_PX - return 0; -#else - struct ath6kl *ar = wiphy_priv(wiphy); - - return ath6kl_hif_suspend(ar, wow); -#endif -} - -static int __ath6kl_cfg80211_resume(struct wiphy *wiphy) -{ -#ifdef CONFIG_MACH_PX - return 0; -#else - struct ath6kl *ar = wiphy_priv(wiphy); - - return ath6kl_hif_resume(ar); -#endif -} - -/* - * FIXME: WOW suspend mode is selected if the host sdio controller supports - * both sdio irq wake up and keep power. The target pulls sdio data line to - * wake up the host when WOW pattern matches. This causes sdio irq handler - * is being called in the host side which internally hits ath6kl's RX path. - * - * Since sdio interrupt is not disabled, RX path executes even before - * the host executes the actual resume operation from PM module. - * - * In the current scenario, WOW resume should happen before start processing - * any data from the target. So It's required to perform WOW resume in RX path. - * Ideally we should perform WOW resume only in the actual platform - * resume path. This area needs bit rework to avoid WOW resume in RX path. - * - * ath6kl_check_wow_status() is called from ath6kl_rx(). - */ -void ath6kl_check_wow_status(struct ath6kl *ar, struct sk_buff *skb, - bool is_event_pkt) -{ - - if (in_interrupt()) { - ath6kl_dbg(ATH6KL_DBG_SUSPEND, - "%s() called in sw interrupt context\n", __func__); - return; - } - - if (ar->state == ATH6KL_STATE_SUSPENDING) { - ath6kl_dbg(ATH6KL_DBG_SUSPEND, - "%s() received IRQ while we are WoW suspending\n", - __func__); - return; - } - - ath6kl_config_suspend_wake_lock(ar, skb, is_event_pkt); - - if (ar->state == ATH6KL_STATE_WOW || ar->state == ATH6KL_STATE_SCHED_SCAN) - ath6kl_cfg80211_resume(ar); - -} - -#else - -void ath6kl_check_wow_status(struct ath6kl *ar, struct sk_buff *skb, - bool is_event_pkt) -{ -} -#endif - -static int ath6kl_set_channel(struct wiphy *wiphy, struct net_device *dev, - struct ieee80211_channel *chan, - enum nl80211_channel_type channel_type) -{ - struct ath6kl_vif *vif; - - /* - * 'dev' could be NULL if a channel change is required for the hardware - * device itself, instead of a particular VIF. - * - * FIXME: To be handled properly when monitor mode is supported. - */ - if (!dev) - return -EBUSY; - - vif = netdev_priv(dev); - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: center_freq=%u hw_value=%u\n", - __func__, chan->center_freq, chan->hw_value); - vif->next_chan = chan->center_freq; - - return 0; -} - -static int ath6kl_priv_cmd(struct wiphy *wiphy, struct net_device *dev, - char *priv_cmd) -{ - struct ath6kl_vif *vif; - struct ath6kl *ar; - - if (!dev) - return -EBUSY; - - vif = netdev_priv(dev); - ar = wiphy_priv(wiphy); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: priv_cmd %s\n", - __func__, priv_cmd); - - if (strcasecmp(priv_cmd, "STOP") == 0) { - - /* assume that sleep policy is deep-sleep mode - ath6kl will support cutpower-mode as well in generlized way */ - if (down_interruptible(&ar->sem)) { - ath6kl_err("busy, couldn't get access\n"); - return -ERESTARTSYS; - } - - if (test_bit(CONNECTED, &vif->flags) || - test_bit(CONNECT_PEND, &vif->flags)) { - vif->reconnect_flag = 0; - ath6kl_disconnect(vif); - memset(vif->ssid, 0, sizeof(vif->ssid)); - vif->ssid_len = 0; - - if (!test_bit(SKIP_SCAN, &ar->flag)) - memset(vif->req_bssid, 0, - sizeof(vif->req_bssid)); - } - - up(&ar->sem); - - if (vif->scan_req) { - cfg80211_scan_done(vif->scan_req, true); - vif->scan_req = NULL; - } - - set_bit(SLEEP_POLICY_ENABLED, &vif->flags); - ath6kl_hif_suspend(ar, NULL); - } else if (strcasecmp(priv_cmd, "START") == 0) { - ath6kl_hif_resume(ar); - clear_bit(SLEEP_POLICY_ENABLED, &vif->flags); - } - - return 0; - -} - -static bool ath6kl_is_p2p_ie(const u8 *pos) -{ - return pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 && - pos[2] == 0x50 && pos[3] == 0x6f && - pos[4] == 0x9a && pos[5] == 0x09; -} - -static int ath6kl_set_ap_probe_resp_ies(struct ath6kl_vif *vif, - const u8 *ies, size_t ies_len) -{ - struct ath6kl *ar = vif->ar; - const u8 *pos; - u8 *buf = NULL; - size_t len = 0; - int ret; - - /* - * Filter out P2P IE(s) since they will be included depending on - * the Probe Request frame in ath6kl_send_go_probe_resp(). - */ - - if (ies && ies_len) { - buf = kmalloc(ies_len, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - pos = ies; - while (pos + 1 < ies + ies_len) { - if (pos + 2 + pos[1] > ies + ies_len) - break; - if (!ath6kl_is_p2p_ie(pos)) { - memcpy(buf + len, pos, 2 + pos[1]); - len += 2 + pos[1]; - } - pos += 2 + pos[1]; - } - } - - ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, - WMI_FRAME_PROBE_RESP, buf, len); - kfree(buf); - return ret; -} - -static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev, - struct beacon_parameters *info, bool add) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - struct ieee80211_mgmt *mgmt; - bool hidden = false; - u8 *ies; - int ies_len; - struct wmi_connect_cmd p; - int res; - int i, ret; - u8 *rsn_ie; - int rsn_ie_len; - u16 cnt; - u16 rsn_capb; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: add=%d\n", __func__, add); - - if (!ath6kl_cfg80211_ready(vif)) - return -EIO; - - if (vif->next_mode != AP_NETWORK) - return -EOPNOTSUPP; - - /* this also clears IE in fw if it's not set */ - res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, - WMI_FRAME_BEACON, - info->beacon_ies, - info->beacon_ies_len); - if (res) - return res; - - /* this also clears IE in fw if it's not set */ - res = ath6kl_set_ap_probe_resp_ies(vif, info->proberesp_ies, - info->proberesp_ies_len); - if (res) - return res; - - /* this also clears IE in fw if it's not set */ - res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, - WMI_FRAME_ASSOC_RESP, - info->assocresp_ies, - info->assocresp_ies_len); - if (res) - return res; - - if (!add) - return 0; - - ar->ap_mode_bkey.valid = false; - - /* TODO: - * info->interval - * info->dtim_period - */ - - if (info->head == NULL) - return -EINVAL; - mgmt = (struct ieee80211_mgmt *) info->head; - ies = mgmt->u.beacon.variable; - if (ies > info->head + info->head_len) - return -EINVAL; - ies_len = info->head + info->head_len - ies; - - if (info->ssid == NULL) - return -EINVAL; - memcpy(vif->ssid, info->ssid, info->ssid_len); - vif->ssid_len = info->ssid_len; - if (info->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE) - hidden = true; - - res = ath6kl_wmi_ap_hidden_ssid(ar->wmi, vif->fw_vif_idx, hidden); - if (res) - return res; - - ret = ath6kl_set_auth_type(vif, info->auth_type); - if (ret) - return ret; - - memset(&p, 0, sizeof(p)); - - for (i = 0; i < info->crypto.n_akm_suites; i++) { - switch (info->crypto.akm_suites[i]) { - case WLAN_AKM_SUITE_8021X: - if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1) - p.auth_mode |= WPA_AUTH; - if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2) - p.auth_mode |= WPA2_AUTH; - break; - case WLAN_AKM_SUITE_PSK: - if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1) - p.auth_mode |= WPA_PSK_AUTH; - if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2) - p.auth_mode |= WPA2_PSK_AUTH; - break; - } - } - if (p.auth_mode == 0) - p.auth_mode = NONE_AUTH; - vif->auth_mode = p.auth_mode; - - for (i = 0; i < info->crypto.n_ciphers_pairwise; i++) { - switch (info->crypto.ciphers_pairwise[i]) { - case WLAN_CIPHER_SUITE_WEP40: - case WLAN_CIPHER_SUITE_WEP104: - p.prwise_crypto_type |= WEP_CRYPT; - break; - case WLAN_CIPHER_SUITE_TKIP: - p.prwise_crypto_type |= TKIP_CRYPT; - break; - case WLAN_CIPHER_SUITE_CCMP: - p.prwise_crypto_type |= AES_CRYPT; - break; - case WLAN_CIPHER_SUITE_SMS4: - p.prwise_crypto_type |= WAPI_CRYPT; - break; - } - } - if (p.prwise_crypto_type == 0) { - p.prwise_crypto_type = NONE_CRYPT; - ath6kl_set_cipher(vif, 0, true); - } else if (info->crypto.n_ciphers_pairwise == 1) - ath6kl_set_cipher(vif, info->crypto.ciphers_pairwise[0], true); - - switch (info->crypto.cipher_group) { - case WLAN_CIPHER_SUITE_WEP40: - case WLAN_CIPHER_SUITE_WEP104: - p.grp_crypto_type = WEP_CRYPT; - break; - case WLAN_CIPHER_SUITE_TKIP: - p.grp_crypto_type = TKIP_CRYPT; - break; - case WLAN_CIPHER_SUITE_CCMP: - p.grp_crypto_type = AES_CRYPT; - break; - case WLAN_CIPHER_SUITE_SMS4: - p.grp_crypto_type = WAPI_CRYPT; - break; - default: - p.grp_crypto_type = NONE_CRYPT; - break; - } - ath6kl_set_cipher(vif, info->crypto.cipher_group, false); - - p.nw_type = AP_NETWORK; - vif->nw_type = vif->next_mode; - - p.ssid_len = vif->ssid_len; - memcpy(p.ssid, vif->ssid, vif->ssid_len); - p.dot11_auth_mode = vif->dot11_auth_mode; - p.ch = cpu_to_le16(vif->next_chan); - - /* - * Get the PTKSA replay counter in the RSN IE. Supplicant - * will use the RSN IE in M3 message and firmware has to - * advertise the same in beacon/probe response. Send - * the complete RSN IE capability field to firmware - */ - if ((p.auth_mode & (WPA2_AUTH | WPA2_PSK_AUTH)) && (info->tail) && - test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE, - ar->fw_capabilities)) { - rsn_capb = 0; - rsn_ie = (u8 *)cfg80211_find_ie(WLAN_EID_RSN, info->tail, - info->tail_len); - if (rsn_ie) { - rsn_ie_len = *(rsn_ie + 1); - rsn_ie += 2; /* skip element id and length */ - do { - /* skip version, group cipher */ - if (rsn_ie_len < 6) - break; - rsn_ie += 6; - rsn_ie_len -= 6; - /* skip pairwise cipher suite */ - if (rsn_ie_len < 2) - break; - cnt = *((u16 *)rsn_ie); - rsn_ie += (2 + cnt * 4); - rsn_ie_len -= (2 + cnt * 4); - /* skip akm suite */ - if (rsn_ie_len < 2) - break; - cnt = *((u16 *)rsn_ie); - rsn_ie += (2 + cnt * 4); - rsn_ie_len -= (2 + cnt * 4); - if (rsn_ie_len < 2) - break; - rsn_capb = *((u16 *)rsn_ie); - } while (0); - rsn_capb = cpu_to_le16(rsn_capb); - res = ath6kl_wmi_set_ie_cmd(ar->wmi, vif->fw_vif_idx, - WLAN_EID_RSN, WMI_RSN_IE_CAPB, - (const u8 *)&rsn_capb, sizeof(rsn_capb)); - if (res < 0) - return res; - } - } - - /* Enable uAPSD support by default */ - res = ath6kl_wmi_ap_set_apsd(ar->wmi, vif->fw_vif_idx, true); - if (res < 0) - return res; - - if (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) { - p.nw_subtype = SUBTYPE_P2PGO; - } else { - /* - * Due to firmware limitation, it is not possible to - * do P2P mgmt operations in AP mode - */ - p.nw_subtype = SUBTYPE_NONE; - } - - res = ath6kl_wmi_ap_profile_commit(ar->wmi, vif->fw_vif_idx, &p); - if (res < 0) - return res; - - return 0; -} - -static int ath6kl_add_beacon(struct wiphy *wiphy, struct net_device *dev, - struct beacon_parameters *info) -{ - return ath6kl_ap_beacon(wiphy, dev, info, true); -} - -static int ath6kl_set_beacon(struct wiphy *wiphy, struct net_device *dev, - struct beacon_parameters *info) -{ - return ath6kl_ap_beacon(wiphy, dev, info, false); -} - -static int ath6kl_del_beacon(struct wiphy *wiphy, struct net_device *dev) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - - if (vif->nw_type != AP_NETWORK) - return -EOPNOTSUPP; - if (!test_bit(CONNECTED, &vif->flags)) - return -ENOTCONN; - - ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx); - clear_bit(CONNECTED, &vif->flags); - - return 0; -} - -static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - -static int ath6kl_del_station(struct wiphy *wiphy, struct net_device *dev, - u8 *mac) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - const u8 *addr = mac ? mac : bcast_addr; - - return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, WMI_AP_DEAUTH, - addr, WLAN_REASON_PREV_AUTH_NOT_VALID); -} - -static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev, - u8 *mac, struct station_parameters *params) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - - if (vif->nw_type != AP_NETWORK) - return -EOPNOTSUPP; - - /* Use this only for authorizing/unauthorizing a station */ - if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) - return -EOPNOTSUPP; - - if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED)) - return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, - WMI_AP_MLME_AUTHORIZE, mac, 0); - return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, - WMI_AP_MLME_UNAUTHORIZE, mac, 0); -} - -static int ath6kl_remain_on_channel(struct wiphy *wiphy, - struct net_device *dev, - struct ieee80211_channel *chan, - enum nl80211_channel_type channel_type, - unsigned int duration, - u64 *cookie) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - u32 id; -#ifdef CONFIG_HAS_WAKELOCK - ath6kl_p2p_release_wakelock(ar); - ath6kl_p2p_acquire_wakelock(ar , duration + 100); -#endif - /* TODO: if already pending or ongoing remain-on-channel, - * return -EBUSY */ - id = ++vif->last_roc_id; - if (id == 0) { - /* Do not use 0 as the cookie value */ - id = ++vif->last_roc_id; - } - *cookie = id; - - return ath6kl_wmi_remain_on_chnl_cmd(ar->wmi, vif->fw_vif_idx, - chan->center_freq, duration); -} - -static int ath6kl_cancel_remain_on_channel(struct wiphy *wiphy, - struct net_device *dev, - u64 cookie) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - - if (cookie != vif->last_roc_id) - return -ENOENT; - vif->last_cancel_roc_id = cookie; - - return ath6kl_wmi_cancel_remain_on_chnl_cmd(ar->wmi, vif->fw_vif_idx); -} - -static int ath6kl_send_go_probe_resp(struct ath6kl_vif *vif, - const u8 *buf, size_t len, - unsigned int freq) -{ - struct ath6kl *ar = vif->ar; - const u8 *pos; - u8 *p2p; - int p2p_len; - int ret; - const struct ieee80211_mgmt *mgmt; - - mgmt = (const struct ieee80211_mgmt *) buf; - - /* Include P2P IE(s) from the frame generated in user space. */ - - p2p = kmalloc(len, GFP_KERNEL); - if (p2p == NULL) - return -ENOMEM; - p2p_len = 0; - - pos = mgmt->u.probe_resp.variable; - while (pos + 1 < buf + len) { - if (pos + 2 + pos[1] > buf + len) - break; - if (ath6kl_is_p2p_ie(pos)) { - memcpy(p2p + p2p_len, pos, 2 + pos[1]); - p2p_len += 2 + pos[1]; - } - pos += 2 + pos[1]; - } - - ret = ath6kl_wmi_send_probe_response_cmd(ar->wmi, vif->fw_vif_idx, freq, - mgmt->da, p2p, p2p_len); - kfree(p2p); - return ret; -} - -static bool ath6kl_mgmt_powersave_ap(struct ath6kl_vif *vif, - u32 id, - u32 freq, - u32 wait, - const u8 *buf, - size_t len, - bool *more_data, - bool no_cck) -{ - struct ieee80211_mgmt *mgmt; - struct ath6kl_sta *conn; - bool is_psq_empty = false; - struct ath6kl_mgmt_buff *mgmt_buf; - size_t mgmt_buf_size; - struct ath6kl *ar = vif->ar; - - mgmt = (struct ieee80211_mgmt *) buf; - if (is_multicast_ether_addr(mgmt->da)) - return false; - - conn = ath6kl_find_sta(vif, mgmt->da); - if (!conn) - return false; - - if (conn->sta_flags & STA_PS_SLEEP) { - if (!(conn->sta_flags & STA_PS_POLLED)) { - /* Queue the frames if the STA is sleeping */ - mgmt_buf_size = len + sizeof(struct ath6kl_mgmt_buff); - mgmt_buf = kmalloc(mgmt_buf_size, GFP_KERNEL); - if (!mgmt_buf) - return false; - - INIT_LIST_HEAD(&mgmt_buf->list); - mgmt_buf->id = id; - mgmt_buf->freq = freq; - mgmt_buf->wait = wait; - mgmt_buf->len = len; - mgmt_buf->no_cck = no_cck; - memcpy(mgmt_buf->buf, buf, len); - spin_lock_bh(&conn->psq_lock); - is_psq_empty = skb_queue_empty(&conn->psq) && - (conn->mgmt_psq_len == 0); - list_add_tail(&mgmt_buf->list, &conn->mgmt_psq); - conn->mgmt_psq_len++; - spin_unlock_bh(&conn->psq_lock); - - /* - * If this is the first pkt getting queued - * for this STA, update the PVB for this - * STA. - */ - if (is_psq_empty) - ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, - conn->aid, 1); - return true; - } - - /* - * This tx is because of a PsPoll. - * Determine if MoreData bit has to be set. - */ - spin_lock_bh(&conn->psq_lock); - if (!skb_queue_empty(&conn->psq) || (conn->mgmt_psq_len != 0)) - *more_data = true; - spin_unlock_bh(&conn->psq_lock); - } - - return false; -} - -/* Check if SSID length is greater than DIRECT- */ -static bool ath6kl_is_p2p_go_ssid(const u8 *buf, size_t len) -{ - const struct ieee80211_mgmt *mgmt; - mgmt = (const struct ieee80211_mgmt *) buf; - - /* variable[1] contains the SSID tag length */ - if (buf + len >= &mgmt->u.probe_resp.variable[1] && - (mgmt->u.probe_resp.variable[1] > P2P_WILDCARD_SSID_LEN)) { - return true; - } - - return false; -} - -static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct net_device *dev, - struct ieee80211_channel *chan, bool offchan, - enum nl80211_channel_type channel_type, - bool channel_type_valid, unsigned int wait, - const u8 *buf, size_t len, bool no_cck, - bool dont_wait_for_ack, u64 *cookie) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - u32 id; - const struct ieee80211_mgmt *mgmt; - bool more_data, queued; - - mgmt = (const struct ieee80211_mgmt *) buf; - if (vif->nw_type == AP_NETWORK && test_bit(CONNECTED, &vif->flags) && - ieee80211_is_probe_resp(mgmt->frame_control) && - ath6kl_is_p2p_go_ssid(buf, len)) { - /* - * Send Probe Response frame in GO mode using a separate WMI - * command to allow the target to fill in the generic IEs. - */ - *cookie = 0; /* TX status not supported */ - return ath6kl_send_go_probe_resp(vif, buf, len, - chan->center_freq); - } - - id = vif->send_action_id++; - if (id == 0) { - /* - * 0 is a reserved value in the WMI command and shall not be - * used for the command. - */ - id = vif->send_action_id++; - } - - *cookie = id; - - /* AP mode Power saving processing */ - if (vif->nw_type == AP_NETWORK) { - queued = ath6kl_mgmt_powersave_ap(vif, - id, chan->center_freq, - wait, buf, - len, &more_data, no_cck); - if (queued) - return 0; - } - - return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id, - chan->center_freq, wait, - buf, len, no_cck); -} - -static void ath6kl_mgmt_frame_register(struct wiphy *wiphy, - struct net_device *dev, - u16 frame_type, bool reg) -{ - struct ath6kl_vif *vif = netdev_priv(dev); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: frame_type=0x%x reg=%d\n", - __func__, frame_type, reg); - if (frame_type == IEEE80211_STYPE_PROBE_REQ) { - /* - * Note: This notification callback is not allowed to sleep, so - * we cannot send WMI_PROBE_REQ_REPORT_CMD here. Instead, we - * hardcode target to report Probe Request frames all the time. - */ - vif->probe_req_report = reg; - } -} - -static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy, - struct net_device *dev, - struct cfg80211_sched_scan_request *request) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_vif *vif = netdev_priv(dev); - u16 interval; - int ret; - - if (ar->state != ATH6KL_STATE_ON) - return -EIO; - - if (vif->sme_state != SME_DISCONNECTED) - return -EBUSY; - - ath6kl_cfg80211_scan_complete_event(vif, true); - - ret = ath6kl_set_probed_ssids(ar, vif, request->ssids, - request->n_ssids); - if (ret < 0) - return ret; - - - /* fw uses seconds, also make sure that it's >0 */ - interval = max_t(u16, 1, request->interval / 1000); - - ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, - interval, interval, - 10, 0, 0, 0, 3, 0, 0, 0); - - ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_WOW_MODE_ENABLE, - WOW_FILTER_SSID, - WOW_HOST_REQ_DELAY); - if (ret) { - ath6kl_warn("Failed to enable wow with ssid filter: %d\n", ret); - return ret; - } - - /* this also clears IE in fw if it's not set */ - ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, - WMI_FRAME_PROBE_REQ, - request->ie, request->ie_len); - if (ret) { - ath6kl_warn("Failed to set probe request IE for scheduled scan: %d", - ret); - return ret; - } - - ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx, - ATH6KL_HOST_MODE_ASLEEP); - if (ret) { - ath6kl_warn("Failed to enable host sleep mode for sched scan: %d\n", - ret); - return ret; - } - - ar->state = ATH6KL_STATE_SCHED_SCAN; - - return ret; -} - -static int ath6kl_cfg80211_sscan_stop(struct wiphy *wiphy, - struct net_device *dev) -{ - struct ath6kl_vif *vif = netdev_priv(dev); - bool stopped; - - stopped = __ath6kl_cfg80211_sscan_stop(vif); - - if (!stopped) - return -EIO; - - return 0; -} - - -static int ath6kl_notify_p2p_flush(struct wiphy *wiphy) -{ - ath6kl_err("%s() Enter - steven", __func__); - - cfg80211_unlink_allbss(wiphy); - - return 0; -} - -static const struct ieee80211_txrx_stypes -ath6kl_mgmt_stypes[NUM_NL80211_IFTYPES] = { - [NL80211_IFTYPE_STATION] = { - .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_RESP >> 4), - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_AP] = { - .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_RESP >> 4), - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_P2P_CLIENT] = { - .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_RESP >> 4), - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_P2P_GO] = { - .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_RESP >> 4), - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, -}; - -static struct cfg80211_ops ath6kl_cfg80211_ops = { - .add_virtual_intf = ath6kl_cfg80211_add_iface, - .del_virtual_intf = ath6kl_cfg80211_del_iface, - .change_virtual_intf = ath6kl_cfg80211_change_iface, - .scan = ath6kl_cfg80211_scan, - .connect = ath6kl_cfg80211_connect, - .disconnect = ath6kl_cfg80211_disconnect, - .add_key = ath6kl_cfg80211_add_key, - .get_key = ath6kl_cfg80211_get_key, - .del_key = ath6kl_cfg80211_del_key, - .set_default_key = ath6kl_cfg80211_set_default_key, - .set_wiphy_params = ath6kl_cfg80211_set_wiphy_params, - .set_tx_power = ath6kl_cfg80211_set_txpower, - .get_tx_power = ath6kl_cfg80211_get_txpower, - .set_power_mgmt = ath6kl_cfg80211_set_power_mgmt, - .join_ibss = ath6kl_cfg80211_join_ibss, - .leave_ibss = ath6kl_cfg80211_leave_ibss, - .get_station = ath6kl_get_station, - .set_pmksa = ath6kl_set_pmksa, - .del_pmksa = ath6kl_del_pmksa, - .flush_pmksa = ath6kl_flush_pmksa, - CFG80211_TESTMODE_CMD(ath6kl_tm_cmd) -#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) - .suspend = __ath6kl_cfg80211_suspend, - .resume = __ath6kl_cfg80211_resume, -#endif - .set_channel = ath6kl_set_channel, - .add_beacon = ath6kl_add_beacon, - .set_beacon = ath6kl_set_beacon, - .del_beacon = ath6kl_del_beacon, - .del_station = ath6kl_del_station, - .change_station = ath6kl_change_station, - .remain_on_channel = ath6kl_remain_on_channel, - .cancel_remain_on_channel = ath6kl_cancel_remain_on_channel, - .mgmt_tx = ath6kl_mgmt_tx, - .mgmt_frame_register = ath6kl_mgmt_frame_register, - .notify_btcoex_inq_status = ath6kl_notify_btcoex_inq_status, - .notify_btcoex_sco_status = ath6kl_notify_btcoex_sco_status, - .notify_btcoex_a2dp_status = ath6kl_notify_btcoex_a2dp_status, - .notify_btcoex_acl_info = ath6kl_notify_btcoex_acl_info, - .notify_btcoex_antenna_config = ath6kl_notify_btcoex_antenna_config, - .notify_btcoex_bt_vendor = ath6kl_notify_btcoex_bt_vendor, - .notify_btcoex = ath6kl_notify_btcoex, - .notify_p2p_flush = ath6kl_notify_p2p_flush, - .sched_scan_start = ath6kl_cfg80211_sscan_start, - .sched_scan_stop = ath6kl_cfg80211_sscan_stop, - .priv_cmd = ath6kl_priv_cmd, -}; - -void ath6kl_cfg80211_stop(struct ath6kl_vif *vif) -{ - ath6kl_cfg80211_sscan_disable(vif); - - switch (vif->sme_state) { - case SME_DISCONNECTED: - break; - case SME_CONNECTING: - cfg80211_connect_result(vif->ndev, vif->bssid, NULL, 0, - NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, - GFP_KERNEL); - break; - case SME_CONNECTED: - cfg80211_disconnected(vif->ndev, 0, NULL, 0, GFP_KERNEL); - break; - } - - if (test_bit(CONNECTED, &vif->flags) || - test_bit(CONNECT_PEND, &vif->flags)) - ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx); - - vif->sme_state = SME_DISCONNECTED; - clear_bit(CONNECTED, &vif->flags); - clear_bit(CONNECT_PEND, &vif->flags); - - /* disable scanning */ - if (ath6kl_wmi_scanparams_cmd(vif->ar->wmi, vif->fw_vif_idx, 0xFFFF, - 0, 0, 0, 0, 0, 0, 0, 0, 0) != 0) - ath6kl_warn("failed to disable scan during stop\n"); - - ath6kl_cfg80211_scan_complete_event(vif, true); -} - -void ath6kl_cfg80211_stop_all(struct ath6kl *ar) -{ - struct ath6kl_vif *vif; - - vif = ath6kl_vif_first(ar); - if (!vif) { - /* save the current power mode before enabling power save */ - ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode; - - if (ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER) != 0) - ath6kl_warn("ath6kl_deep_sleep_enable: " - "wmi_powermode_cmd failed\n"); - return; - } - - /* - * FIXME: we should take ar->list_lock to protect changes in the - * vif_list, but that's not trivial to do as ath6kl_cfg80211_stop() - * sleeps. - */ - list_for_each_entry(vif, &ar->vif_list, list) - ath6kl_cfg80211_stop(vif); -} - -struct ath6kl *ath6kl_core_alloc(struct device *dev) -{ - struct ath6kl *ar; - struct wiphy *wiphy; - u8 ctr; - - /* create a new wiphy for use with cfg80211 */ - wiphy = wiphy_new(&ath6kl_cfg80211_ops, sizeof(struct ath6kl)); - - if (!wiphy) { - ath6kl_err("couldn't allocate wiphy device\n"); - return NULL; - } - - ar = wiphy_priv(wiphy); - ar->p2p = !!ath6kl_p2p; - ar->wiphy = wiphy; - ar->dev = dev; - - ar->vif_max = 1; - - ar->max_norm_iface = 1; - - spin_lock_init(&ar->lock); - spin_lock_init(&ar->mcastpsq_lock); - spin_lock_init(&ar->list_lock); - - init_waitqueue_head(&ar->event_wq); - sema_init(&ar->sem, 1); - - INIT_LIST_HEAD(&ar->amsdu_rx_buffer_queue); - INIT_LIST_HEAD(&ar->vif_list); - - clear_bit(WMI_ENABLED, &ar->flag); - clear_bit(SKIP_SCAN, &ar->flag); - clear_bit(DESTROY_IN_PROGRESS, &ar->flag); - - ar->tx_pwr = 0; - ar->intra_bss = 1; - ar->lrssi_roam_threshold = DEF_LRSSI_ROAM_THRESHOLD; - - ar->state = ATH6KL_STATE_OFF; - - memset((u8 *)ar->sta_list, 0, - AP_MAX_NUM_STA * sizeof(struct ath6kl_sta)); - - /* Init the PS queues */ - for (ctr = 0; ctr < AP_MAX_NUM_STA; ctr++) { - spin_lock_init(&ar->sta_list[ctr].psq_lock); - skb_queue_head_init(&ar->sta_list[ctr].psq); - skb_queue_head_init(&ar->sta_list[ctr].apsdq); - ar->sta_list[ctr].mgmt_psq_len = 0; - INIT_LIST_HEAD(&ar->sta_list[ctr].mgmt_psq); - ar->sta_list[ctr].aggr_conn = - kzalloc(sizeof(struct aggr_info_conn), GFP_KERNEL); - if (!ar->sta_list[ctr].aggr_conn) { - ath6kl_err("Failed to allocate memory for sta aggregation information\n"); - ath6kl_core_cleanup(ar); - return NULL; - } - } - - skb_queue_head_init(&ar->mcastpsq); - - memcpy(ar->ap_country_code, DEF_AP_COUNTRY_CODE, 3); - - return ar; -} - -int ath6kl_register_ieee80211_hw(struct ath6kl *ar) -{ - struct wiphy *wiphy = ar->wiphy; - int ret; - - wiphy->mgmt_stypes = ath6kl_mgmt_stypes; - - wiphy->max_remain_on_channel_duration = 5000; - - /* set device pointer for wiphy */ - set_wiphy_dev(wiphy, ar->dev); - - wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | - BIT(NL80211_IFTYPE_ADHOC) | - BIT(NL80211_IFTYPE_AP); - if (ar->p2p) { - wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_GO) | - BIT(NL80211_IFTYPE_P2P_CLIENT); - } - - /* max num of ssids that can be probed during scanning */ - wiphy->max_scan_ssids = MAX_PROBED_SSIDS; - wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */ - wiphy->bands[IEEE80211_BAND_2GHZ] = &ath6kl_band_2ghz; - wiphy->bands[IEEE80211_BAND_5GHZ] = &ath6kl_band_5ghz; - wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; - - wiphy->cipher_suites = cipher_suites; - wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); - - wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT | - WIPHY_WOWLAN_DISCONNECT | - WIPHY_WOWLAN_GTK_REKEY_FAILURE | - WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | - WIPHY_WOWLAN_EAP_IDENTITY_REQ | - WIPHY_WOWLAN_4WAY_HANDSHAKE; - wiphy->wowlan.n_patterns = WOW_MAX_FILTERS_PER_LIST; - wiphy->wowlan.pattern_min_len = 1; - wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE; - - wiphy->max_sched_scan_ssids = MAX_PROBED_SSIDS; - - ath6kl_setup_android_resource(ar); - - ret = wiphy_register(wiphy); - if (ret < 0) { - ath6kl_err("couldn't register wiphy device\n"); - return ret; - } - - return 0; -} - -static int ath6kl_init_if_data(struct ath6kl_vif *vif) -{ - vif->aggr_cntxt = aggr_init(vif); - if (!vif->aggr_cntxt) { - ath6kl_err("failed to initialize aggr\n"); - return -ENOMEM; - } - - setup_timer(&vif->disconnect_timer, disconnect_timer_handler, - (unsigned long) vif->ndev); - setup_timer(&vif->sched_scan_timer, ath6kl_wmi_sscan_timer, - (unsigned long) vif); - - set_bit(WMM_ENABLED, &vif->flags); - spin_lock_init(&vif->if_lock); - - INIT_LIST_HEAD(&vif->mc_filter); - - return 0; -} - -void ath6kl_deinit_if_data(struct ath6kl_vif *vif) -{ - struct ath6kl *ar = vif->ar; - struct ath6kl_mc_filter *mc_filter, *tmp; - - aggr_module_destroy(vif->aggr_cntxt); - - ar->avail_idx_map |= BIT(vif->fw_vif_idx); - - if (vif->nw_type == ADHOC_NETWORK) - ar->ibss_if_active = false; - - list_for_each_entry_safe(mc_filter, tmp, &vif->mc_filter, list) { - list_del(&mc_filter->list); - kfree(mc_filter); - } - - unregister_netdevice(vif->ndev); - - ar->num_vif--; -} - -struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name, - enum nl80211_iftype type, u8 fw_vif_idx, - u8 nw_type) -{ - struct net_device *ndev; - struct ath6kl_vif *vif; - - ndev = alloc_netdev(sizeof(*vif), name, ether_setup); - if (!ndev) - return NULL; - - vif = netdev_priv(ndev); - ndev->ieee80211_ptr = &vif->wdev; - vif->wdev.wiphy = ar->wiphy; - vif->ar = ar; - vif->ndev = ndev; - SET_NETDEV_DEV(ndev, wiphy_dev(vif->wdev.wiphy)); - vif->wdev.netdev = ndev; - vif->wdev.iftype = type; - vif->fw_vif_idx = fw_vif_idx; - vif->nw_type = vif->next_mode = nw_type; - vif->bg_scan_period = 0; - vif->scan_ctrl_flag = 0; - vif->listen_intvl_t = ATH6KL_DEFAULT_LISTEN_INTVAL; - vif->bmiss_time_t = ATH6KL_DEFAULT_BMISS_TIME; - - memset((u8 *)&vif->scparams, 0, sizeof(vif->scparams)); - vif->scparams.bg_period = WLAN_CONFIG_BG_SCAN_INTERVAL; - vif->scparams.maxact_chdwell_time = WLAN_CONFIG_MAXACT_CHDWELL_TIME; - vif->scparams.pas_chdwell_time = WLAN_CONFIG_PASSIVE_CHDWELL_TIME; - vif->scparams.short_scan_ratio = WMI_SHORTSCANRATIO_DEFAULT; - vif->scparams.scan_ctrl_flags = DEFAULT_SCAN_CTRL_FLAGS; - - vif->pspoll_num = WLAN_CONFIG_PSPOLL_NUM; - vif->mcastrate = WLAN_CONFIG_MCAST_RATE; - vif->force_reload = false; - vif->sdio_remove = false; - - memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN); - if (fw_vif_idx != 0) - ndev->dev_addr[0] = (ndev->dev_addr[0] ^ (1 << fw_vif_idx)) | - 0x2; - - init_netdev(ndev); - - ath6kl_init_control_info(vif); - - /* TODO: Pass interface specific pointer instead of ar */ - if (ath6kl_init_if_data(vif)) - goto err; - - if (register_netdevice(ndev)) - goto err; - - ar->avail_idx_map &= ~BIT(fw_vif_idx); - vif->sme_state = SME_DISCONNECTED; - set_bit(WLAN_ENABLED, &vif->flags); - ar->wlan_pwr_state = WLAN_POWER_STATE_ON; - set_bit(NETDEV_REGISTERED, &vif->flags); - - if (type == NL80211_IFTYPE_ADHOC) - ar->ibss_if_active = true; - - spin_lock_bh(&ar->list_lock); - list_add_tail(&vif->list, &ar->vif_list); - spin_unlock_bh(&ar->list_lock); - - return ndev; - -err: - aggr_module_destroy(vif->aggr_cntxt); - free_netdev(ndev); - return NULL; -} - -void ath6kl_deinit_ieee80211_hw(struct ath6kl *ar) -{ - int i; - - ath6kl_cleanup_android_resource(ar); - - for (i = 0; i < AP_MAX_NUM_STA; i++) - kfree(ar->sta_list[i].aggr_conn); - - wiphy_unregister(ar->wiphy); - wiphy_free(ar->wiphy); -} diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.h b/drivers/net/wireless/ath/ath6kl/cfg80211.h deleted file mode 100755 index ae375b6..0000000 --- a/drivers/net/wireless/ath/ath6kl/cfg80211.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef ATH6KL_CFG80211_H -#define ATH6KL_CFG80211_H - -enum ath6kl_cfg_suspend_mode { - ATH6KL_CFG_SUSPEND_DEEPSLEEP, - ATH6KL_CFG_SUSPEND_CUTPOWER, - ATH6KL_CFG_SUSPEND_WOW, - ATH6KL_CFG_SUSPEND_SCHED_SCAN, -}; - -struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name, - enum nl80211_iftype type, - u8 fw_vif_idx, u8 nw_type); -int ath6kl_register_ieee80211_hw(struct ath6kl *ar); -struct ath6kl *ath6kl_core_alloc(struct device *dev); -void ath6kl_deinit_ieee80211_hw(struct ath6kl *ar); - -void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, bool aborted); - -void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel, - u8 *bssid, u16 listen_intvl, - u16 beacon_intvl, - enum network_type nw_type, - u8 beacon_ie_len, u8 assoc_req_len, - u8 assoc_resp_len, u8 *assoc_info); - -void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason, - u8 *bssid, u8 assoc_resp_len, - u8 *assoc_info, u16 proto_reason); - -void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid, - bool ismcast); - -int ath6kl_cfg80211_suspend(struct ath6kl *ar, - enum ath6kl_cfg_suspend_mode mode, - struct cfg80211_wowlan *wow); - -int ath6kl_cfg80211_resume(struct ath6kl *ar); - -void ath6kl_cfg80211_stop(struct ath6kl_vif *vif); -void ath6kl_cfg80211_stop_all(struct ath6kl *ar); - -#endif /* ATH6KL_CFG80211_H */ diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.c b/drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.c deleted file mode 100644 index 399ffd7..0000000 --- a/drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include - -#ifdef CONFIG_HAS_WAKELOCK -#include -#endif - -#include "core.h" -#include "cfg80211.h" -#include "debug.h" -#include "hif-ops.h" -#include "testmode.h" -#include "cfg80211_btcoex.h" - -bool ath6kl_btcoex_cfg80211_ready(struct ath6kl_vif *vif) -{ - struct ath6kl *ar = vif->ar; - - if (!test_bit(WMI_READY, &ar->flag)) { - ath6kl_err("wmi is not ready\n"); - return false; - } - - if (!test_bit(WLAN_ENABLED, &vif->flags)) { - ath6kl_err("wlan disabled\n"); - return false; - } - - return true; -} -#define OP_TYPE_SCO 0x01 -#define OP_TYPE_A2DP 0x02 -#define OP_TYPE_INQUIRY 0x03 -#define OP_TYPE_ESCO 0x04 - -int ath6kl_notify_btcoex_inq_status(struct wiphy *wiphy, bool status) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - struct ath6kl_vif *vif; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "BT coex scan status:%d\n", status); - - if (!ath6kl_btcoex_cfg80211_ready(vif)) - return -EIO; - - return ath6kl_wmi_set_btcoex_bt_op_status(ar->wmi, OP_TYPE_INQUIRY, - status); -} - -int ath6kl_notify_btcoex_sco_status(struct wiphy *wiphy, bool status, - bool esco, u32 tx_interval, - u32 tx_pkt_len) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - struct ath6kl_vif *vif; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - if (!ath6kl_btcoex_cfg80211_ready(vif)) - return -EIO; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, - "BT Coex sco status:%d sco type %s tx interval %d tx pk len %d\n", - status, esco ? "ESCO" : "SCO", tx_interval, tx_pkt_len); - - if (status) - ath6kl_wmi_set_btcoex_sco_op(ar->wmi, esco, tx_interval, - tx_pkt_len); - - return ath6kl_wmi_set_btcoex_bt_op_status(ar->wmi, OP_TYPE_SCO, - status); -} - -int ath6kl_notify_btcoex_a2dp_status(struct wiphy *wiphy, bool status) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - struct ath6kl_vif *vif; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - if (!ath6kl_btcoex_cfg80211_ready(vif)) - return -EIO; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "BT coex A2DP status:%d\n", status); - - if (status) - ath6kl_wmi_set_btcoex_a2dp_op(ar->wmi, - ar->btcoex_info.acl_role, - ar->btcoex_info.remote_lmp_ver, - ar->btcoex_info.bt_vendor); - - return ath6kl_wmi_set_btcoex_bt_op_status(ar->wmi, OP_TYPE_A2DP, - status); -} - -#define MAX_LMP_VER 6 -int ath6kl_notify_btcoex_acl_info(struct wiphy *wiphy, - enum nl80211_btcoex_acl_role role, - u32 lmp_ver) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - - if (lmp_ver > MAX_LMP_VER) - return -EINVAL; - - if (role > NL80211_BTCOEX_ACL_ROLE_SLAVE) - return -EINVAL; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "BT coex ACL role:%d Lmp ver %d\n", - role, lmp_ver); - - ar->btcoex_info.acl_role = role; - ar->btcoex_info.remote_lmp_ver = lmp_ver; - - return 0; -} - -#define BTCOEX_COLOCATED_BT_DEFAULT 1 -#define BTCOEX_COLOCATED_BT_QCOM 2 - -inline int get_bt_vendor_id(enum nl80211_btcoex_vendor_list vendor) -{ - switch (vendor) { - case NL80211_BTCOEX_VENDOR_DEFAULT: - return BTCOEX_COLOCATED_BT_DEFAULT; - case NL80211_BTCOEX_VENDOR_QCOM: - return BTCOEX_COLOCATED_BT_QCOM; - } - - return BTCOEX_COLOCATED_BT_DEFAULT; -} - -int ath6kl_notify_btcoex_antenna_config(struct wiphy *wiphy, - enum nl80211_btcoex_antenna_config config) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - - if (config > NL80211_BTCOEX_ANTENNA_SA) - return -EINVAL; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "BT coex Antenna configuration:%d\n", - config); - ath6kl_wmi_set_btcoex_set_colocated_bt(ar->wmi, - get_bt_vendor_id - (ar->btcoex_info.bt_vendor)); - - return ath6kl_wmi_set_btcoex_set_fe_antenna(ar->wmi, config); -} -int ath6kl_notify_btcoex_bt_vendor(struct wiphy *wiphy, - enum nl80211_btcoex_vendor_list vendor) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - - if (vendor > NL80211_BTCOEX_VENDOR_QCOM) - return -EINVAL; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "vendor :%d\n", vendor); - - ar->btcoex_info.bt_vendor = vendor; - - return 0; -} - -int ath6kl_notify_btcoex(struct wiphy *wiphy, u8 *buf, - int len) -{ - struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); - struct ath6kl_vif *vif; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "BT coex wmi command:%p\n", buf); - - if (!ath6kl_btcoex_cfg80211_ready(vif)) - return -EIO; - - return ath6kl_wmi_send_btcoex_cmd(ar->wmi, buf, - len); -} diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.h b/drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.h deleted file mode 100644 index 01c6181..0000000 --- a/drivers/net/wireless/ath/ath6kl/cfg80211_btcoex.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -int ath6kl_notify_btcoex_inq_status(struct wiphy *wiphy, bool status); -int ath6kl_notify_btcoex_sco_status(struct wiphy *wiphy, bool status, - bool esco, u32 tx_interval, - u32 tx_pkt_len); -int ath6kl_notify_btcoex_a2dp_status(struct wiphy *wiphy, bool status); -int ath6kl_notify_btcoex_acl_info(struct wiphy *wiphy, - enum nl80211_btcoex_acl_role role, - u32 lmp_ver); -int ath6kl_notify_btcoex_antenna_config(struct wiphy *wiphy, - enum nl80211_btcoex_antenna_config config); -int ath6kl_notify_btcoex_bt_vendor(struct wiphy *wiphy, - enum nl80211_btcoex_vendor_list vendor); -int ath6kl_notify_btcoex(struct wiphy *wiphy, u8 *buf, - int len); diff --git a/drivers/net/wireless/ath/ath6kl/common.h b/drivers/net/wireless/ath/ath6kl/common.h deleted file mode 100755 index 88a5459..0000000 --- a/drivers/net/wireless/ath/ath6kl/common.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2010-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef COMMON_H -#define COMMON_H - -#include - -#define ATH6KL_MAX_IE 256 - -extern int ath6kl_printk(const char *level, const char *fmt, ...); - -/* - * Reflects the version of binary interface exposed by ATH6KL target - * firmware. Needs to be incremented by 1 for any change in the firmware - * that requires upgrade of the driver on the host side for the change to - * work correctly - */ -#define ATH6KL_ABI_VERSION 1 - -#define SIGNAL_QUALITY_METRICS_NUM_MAX 2 - -enum { - SIGNAL_QUALITY_METRICS_SNR = 0, - SIGNAL_QUALITY_METRICS_RSSI, - SIGNAL_QUALITY_METRICS_ALL, -}; - -/* - * Data Path - */ - -#define WMI_MAX_TX_DATA_FRAME_LENGTH \ - (1500 + sizeof(struct wmi_data_hdr) + \ - sizeof(struct ethhdr) + \ - sizeof(struct ath6kl_llc_snap_hdr)) - -/* An AMSDU frame */ /* The MAX AMSDU length of AR6003 is 3839 */ -#define WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH \ - (3840 + sizeof(struct wmi_data_hdr) + \ - sizeof(struct ethhdr) + \ - sizeof(struct ath6kl_llc_snap_hdr)) - -#define EPPING_ALIGNMENT_PAD \ - (((sizeof(struct htc_frame_hdr) + 3) & (~0x3)) \ - - sizeof(struct htc_frame_hdr)) - -struct ath6kl_llc_snap_hdr { - u8 dsap; - u8 ssap; - u8 cntl; - u8 org_code[3]; - __be16 eth_type; -} __packed; - -enum crypto_type { - NONE_CRYPT = 0x01, - WEP_CRYPT = 0x02, - TKIP_CRYPT = 0x04, - AES_CRYPT = 0x08, - WAPI_CRYPT = 0x10, -}; - -struct htc_endpoint_credit_dist; -struct ath6kl; -enum htc_credit_dist_reason; -struct ath6kl_htc_credit_info; - -struct ath6kl *ath6kl_core_alloc(struct device *sdev); -int ath6kl_core_init(struct ath6kl *ar); -void ath6kl_core_cleanup(struct ath6kl *ar); -struct sk_buff *ath6kl_buf_alloc(int size); -#endif /* COMMON_H */ diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h deleted file mode 100755 index 97c1ae5..0000000 --- a/drivers/net/wireless/ath/ath6kl/core.h +++ /dev/null @@ -1,932 +0,0 @@ -/* - * Copyright (c) 2010-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef CORE_H -#define CORE_H - -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_HAS_EARLYSUSPEND -#include -#endif -#ifdef CONFIG_HAS_WAKELOCK -#include -#endif -#include "htc.h" -#include "wmi.h" -#include "bmi.h" -#include "target.h" -#include "wmi_btcoex.h" - -#define MAX_ATH6KL 1 -#define ATH6KL_MAX_RX_BUFFERS 16 -#define ATH6KL_BUFFER_SIZE 1664 -#define ATH6KL_MAX_AMSDU_RX_BUFFERS 4 -#define ATH6KL_AMSDU_REFILL_THRESHOLD 3 -#define ATH6KL_AMSDU_BUFFER_SIZE (WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH + 128) -#define MAX_MSDU_SUBFRAME_PAYLOAD_LEN 1508 -#define MIN_MSDU_SUBFRAME_PAYLOAD_LEN 46 - -#define USER_SAVEDKEYS_STAT_INIT 0 -#define USER_SAVEDKEYS_STAT_RUN 1 - -#define ATH6KL_TX_TIMEOUT 10 -#define ATH6KL_MAX_ENDPOINTS 4 -#define MAX_NODE_NUM 15 - -#define ATH6KL_APSD_ALL_FRAME 0xFFFF -#define ATH6KL_APSD_NUM_OF_AC 0x4 -#define ATH6KL_APSD_FRAME_MASK 0xF - -/* Extra bytes for htc header alignment */ -#define ATH6KL_HTC_ALIGN_BYTES 3 - -/* MAX_HI_COOKIE_NUM are reserved for high priority traffic */ -#define MAX_DEF_COOKIE_NUM 180 -#define MAX_HI_COOKIE_NUM 18 /* 10% of MAX_COOKIE_NUM */ -#define MAX_COOKIE_NUM (MAX_DEF_COOKIE_NUM + MAX_HI_COOKIE_NUM) - -#define MAX_DEFAULT_SEND_QUEUE_DEPTH (MAX_DEF_COOKIE_NUM / WMM_NUM_AC) - -#define DISCON_TIMER_INTVAL 10000 /* in msec */ - -/* Channel dwell time in fg scan */ -#define ATH6KL_FG_SCAN_INTERVAL 60 /* in ms */ - -/* - * background scan interval (sec) - * disable background scan interval: 65535 - * default: 60 sec - * to restore the default value: 0 - * - * For P2P and PMKID cache, bg scan should be enabled. - */ -#ifdef CONFIG_MACH_PX -#define WLAN_CONFIG_BG_SCAN_INTERVAL 65535 -#else -#define WLAN_CONFIG_BG_SCAN_INTERVAL 0 -#endif -/* - * maximum active dwell time (ms) - * default: 20 ms - * to restore the default value: 0 - */ -#ifdef CONFIG_MACH_PX -#define WLAN_CONFIG_MAXACT_CHDWELL_TIME 60 -#else -#define WLAN_CONFIG_MAXACT_CHDWELL_TIME 20 -#endif -/* - * passive dwell time (ms) - * default: 50 ms - * to restore the default value: 0 - */ -#ifdef CONFIG_MACH_PX -#define WLAN_CONFIG_PASSIVE_CHDWELL_TIME 120 -#else -#define WLAN_CONFIG_PASSIVE_CHDWELL_TIME 50 -#endif -#define WMI_SHORTSCANRATIO_DEFAULT 3 -#define DEFAULT_SCAN_CTRL_FLAGS (CONNECT_SCAN_CTRL_FLAGS | \ - SCAN_CONNECTED_CTRL_FLAGS | ACTIVE_SCAN_CTRL_FLAGS | \ - ROAM_SCAN_CTRL_FLAGS | ENABLE_AUTO_CTRL_FLAGS) - -/* - * 0: to disable sending ps-poll in TIM interrupt - * 1: to send one ps-poll (the default) - */ -#ifdef CONFIG_MACH_PX -#define WLAN_CONFIG_PSPOLL_NUM 0 -#else -#define WLAN_CONFIG_PSPOLL_NUM 1 -#endif - -#define WLAN_CONFIG_MCAST_RATE 60 - -/* includes also the null byte */ -#define ATH6KL_FIRMWARE_MAGIC "QCA-ATH6KL" - -enum ath6kl_fw_ie_type { - ATH6KL_FW_IE_FW_VERSION = 0, - ATH6KL_FW_IE_TIMESTAMP = 1, - ATH6KL_FW_IE_OTP_IMAGE = 2, - ATH6KL_FW_IE_FW_IMAGE = 3, - ATH6KL_FW_IE_PATCH_IMAGE = 4, - ATH6KL_FW_IE_RESERVED_RAM_SIZE = 5, - ATH6KL_FW_IE_CAPABILITIES = 6, - ATH6KL_FW_IE_PATCH_ADDR = 7, - ATH6KL_FW_IE_BOARD_ADDR = 8, - ATH6KL_FW_IE_VIF_MAX = 9, -}; - -enum ath6kl_fw_capability { - ATH6KL_FW_CAPABILITY_HOST_P2P = 0, - ATH6KL_FW_CAPABILITY_SCHED_SCAN = 1, - - /* - * Firmware is capable of supporting P2P mgmt operations on a - * station interface. After group formation, the station - * interface will become a P2P client/GO interface as the case may be - */ - ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX, - - ATH6KL_FW_CAPABILITY_INACTIVITY_TIMEOUT, - - ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE, - - /* this needs to be last */ - ATH6KL_FW_CAPABILITY_MAX, -}; - -#define ATH6KL_CAPABILITY_LEN (ALIGN(ATH6KL_FW_CAPABILITY_MAX, 32) / 32) - -struct ath6kl_fw_ie { - __le32 id; - __le32 len; - u8 data[0]; -}; - -#define ATH6KL_FW_API2_FILE "fw-2.bin" -#define ATH6KL_FW_API3_FILE "fw-3.bin" - -/* AR6003 1.0 definitions */ -#define AR6003_HW_1_0_VERSION 0x300002ba - -/* AR6003 2.0 definitions */ -#define AR6003_HW_2_0_VERSION 0x30000384 -#define AR6003_HW_2_0_PATCH_DOWNLOAD_ADDRESS 0x57e910 -#define AR6003_HW_2_0_FW_DIR "ath6k/AR6003/hw2.0" -#define AR6003_HW_2_0_OTP_FILE "otp.bin.z77" -#define AR6003_HW_2_0_FIRMWARE_FILE "athwlan.bin.z77" -#define AR6003_HW_2_0_TCMD_FIRMWARE_FILE "athtcmd_ram.bin" -#define AR6003_HW_2_0_PATCH_FILE "data.patch.bin" -#define AR6003_HW_2_0_BOARD_DATA_FILE "ath6k/AR6003/hw2.0/bdata.bin" -#define AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE \ - "ath6k/AR6003/hw2.0/bdata.SD31.bin" - -/* AR6003 3.0 definitions */ -#define AR6003_HW_2_1_1_VERSION 0x30000582 -#define AR6003_HW_2_1_1_FW_DIR "ath6k/AR6003/hw2.1.1" -#define AR6003_HW_2_1_1_OTP_FILE "otp.bin" -#define AR6003_HW_2_1_1_FIRMWARE_FILE "athwlan.bin" -#define AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE "athtcmd_ram.bin" -#define AR6003_HW_2_1_1_UTF_FIRMWARE_FILE "utf.bin" -#define AR6003_HW_2_1_1_TESTSCRIPT_FILE "nullTestFlow.bin" -#define AR6003_HW_2_1_1_PATCH_FILE "data.patch.bin" -#define AR6003_HW_2_1_1_BOARD_DATA_FILE "ath6k/AR6003/hw2.1.1/bdata.bin" -#define AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE \ - "ath6k/AR6003/hw2.1.1/bdata.SD31.bin" - -#ifdef CONFIG_MACH_PX -#define AR6003_HW_2_1_1_TCMD_BOARD_DATA_FILE \ - "ath6k/AR6003/hw2.1.1/bdata.tcmd.bin" -#endif - -/* AR6004 1.0 definitions */ -#define AR6004_HW_1_0_VERSION 0x30000623 -#define AR6004_HW_1_0_FW_DIR "ath6k/AR6004/hw1.0" -#define AR6004_HW_1_0_FIRMWARE_FILE "fw.ram.bin" -#define AR6004_HW_1_0_BOARD_DATA_FILE "ath6k/AR6004/hw1.0/bdata.bin" -#define AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE \ - "ath6k/AR6004/hw1.0/bdata.DB132.bin" - -/* AR6004 1.1 definitions */ -#define AR6004_HW_1_1_VERSION 0x30000001 -#define AR6004_HW_1_1_FW_DIR "ath6k/AR6004/hw1.1" -#define AR6004_HW_1_1_FIRMWARE_FILE "fw.ram.bin" -#define AR6004_HW_1_1_BOARD_DATA_FILE "ath6k/AR6004/hw1.1/bdata.bin" -#define AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE \ - "ath6k/AR6004/hw1.1/bdata.DB132.bin" - -/* Per STA data, used in AP mode */ -#define STA_PS_AWAKE BIT(0) -#define STA_PS_SLEEP BIT(1) -#define STA_PS_POLLED BIT(2) -#define STA_PS_APSD_TRIGGER BIT(3) -#define STA_PS_APSD_EOSP BIT(4) - -/* HTC TX packet tagging definitions */ -#define ATH6KL_CONTROL_PKT_TAG HTC_TX_PACKET_TAG_USER_DEFINED -#define ATH6KL_DATA_PKT_TAG (ATH6KL_CONTROL_PKT_TAG + 1) - -#define AR6003_CUST_DATA_SIZE 16 - -#define AGGR_WIN_IDX(x, y) ((x) % (y)) -#define AGGR_INCR_IDX(x, y) AGGR_WIN_IDX(((x) + 1), (y)) -#define AGGR_DCRM_IDX(x, y) AGGR_WIN_IDX(((x) - 1), (y)) -#define ATH6KL_MAX_SEQ_NO 0xFFF -#define ATH6KL_NEXT_SEQ_NO(x) (((x) + 1) & ATH6KL_MAX_SEQ_NO) - -#define NUM_OF_TIDS 8 -#define AGGR_SZ_DEFAULT 8 - -#define AGGR_WIN_SZ_MIN 2 -#define AGGR_WIN_SZ_MAX 8 - -#define TID_WINDOW_SZ(_x) ((_x) << 1) - -#define AGGR_NUM_OF_FREE_NETBUFS 16 - -#ifdef CONFIG_MACH_PX -#define AGGR_RX_TIMEOUT 100 /* in ms */ -#else -#define AGGR_RX_TIMEOUT 400 /* in ms */ -#endif - -#define WMI_TIMEOUT (2 * HZ) - -#define MBOX_YIELD_LIMIT 99 - -#define ATH6KL_DEFAULT_LISTEN_INTVAL 100 /* in TUs */ -#define ATH6KL_DEFAULT_BMISS_TIME 1500 -#define ATH6KL_MAX_WOW_LISTEN_INTL 300 /* in TUs */ -#define ATH6KL_MAX_BMISS_TIME 5000 - -/* configuration lags */ -/* - * ATH6KL_CONF_IGNORE_ERP_BARKER: Ignore the barker premable in - * ERP IE of beacon to determine the short premable support when - * sending (Re)Assoc req. - * ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN: Don't send the power - * module state transition failure events which happen during - * scan, to the host. - */ -#define ATH6KL_CONF_IGNORE_ERP_BARKER BIT(0) -#define ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN BIT(1) -#define ATH6KL_CONF_ENABLE_11N BIT(2) -#define ATH6KL_CONF_ENABLE_TX_BURST BIT(3) -#define ATH6KL_CONF_UART_DEBUG BIT(4) - -#define P2P_WILDCARD_SSID_LEN 7 /* DIRECT- */ - -enum wlan_low_pwr_state { - WLAN_POWER_STATE_ON, - WLAN_POWER_STATE_CUT_PWR, - WLAN_POWER_STATE_DEEP_SLEEP, - WLAN_POWER_STATE_WOW -}; - -enum sme_state { - SME_DISCONNECTED, - SME_CONNECTING, - SME_CONNECTED -}; - -struct skb_hold_q { - struct sk_buff *skb; - bool is_amsdu; - u16 seq_no; -}; - -struct rxtid { - bool aggr; - bool progress; - bool timer_mon; - u16 win_sz; - u16 seq_next; - u32 hold_q_sz; - struct skb_hold_q *hold_q; - struct sk_buff_head q; - spinlock_t lock; -}; - -struct rxtid_stats { - u32 num_into_aggr; - u32 num_dups; - u32 num_oow; - u32 num_mpdu; - u32 num_amsdu; - u32 num_delivered; - u32 num_timeouts; - u32 num_hole; - u32 num_bar; -}; - -struct aggr_info_conn { - u8 aggr_sz; - u8 timer_scheduled; - struct timer_list timer; - struct net_device *dev; - struct rxtid rx_tid[NUM_OF_TIDS]; - struct rxtid_stats stat[NUM_OF_TIDS]; - struct aggr_info *aggr_info; -}; - -struct aggr_info { - struct aggr_info_conn *aggr_conn; - struct sk_buff_head rx_amsdu_freeq; -}; - -struct ath6kl_wep_key { - u8 key_index; - u8 key_len; - u8 key[64]; -}; - -#define ATH6KL_KEY_SEQ_LEN 8 - -struct ath6kl_key { - u8 key[WLAN_MAX_KEY_LEN]; - u8 key_len; - u8 seq[ATH6KL_KEY_SEQ_LEN]; - u8 seq_len; - u32 cipher; -}; - -struct ath6kl_node_mapping { - u8 mac_addr[ETH_ALEN]; - u8 ep_id; - u8 tx_pend; -}; - -struct ath6kl_cookie { - struct sk_buff *skb; - u32 map_no; - struct htc_packet htc_pkt; - struct ath6kl_cookie *arc_list_next; -}; - -struct ath6kl_mgmt_buff { - struct list_head list; - u32 freq; - u32 wait; - u32 id; - bool no_cck; - size_t len; - u8 buf[0]; -}; - -struct ath6kl_sta { - u16 sta_flags; - u8 mac[ETH_ALEN]; - u8 aid; - u8 keymgmt; - u8 ucipher; - u8 auth; - u8 wpa_ie[ATH6KL_MAX_IE]; - struct sk_buff_head psq; - spinlock_t psq_lock; - struct list_head mgmt_psq; - size_t mgmt_psq_len; - u8 apsd_info; - struct sk_buff_head apsdq; - struct aggr_info_conn *aggr_conn; -}; - -struct ath6kl_version { - u32 target_ver; - u32 wlan_ver; - u32 abi_ver; -}; - -struct ath6kl_bmi { - u32 cmd_credits; - bool done_sent; - u8 *cmd_buf; - u32 max_data_size; - u32 max_cmd_size; -}; - -struct target_stats { - u64 tx_pkt; - u64 tx_byte; - u64 tx_ucast_pkt; - u64 tx_ucast_byte; - u64 tx_mcast_pkt; - u64 tx_mcast_byte; - u64 tx_bcast_pkt; - u64 tx_bcast_byte; - u64 tx_rts_success_cnt; - u64 tx_pkt_per_ac[4]; - - u64 tx_err; - u64 tx_fail_cnt; - u64 tx_retry_cnt; - u64 tx_mult_retry_cnt; - u64 tx_rts_fail_cnt; - - u64 rx_pkt; - u64 rx_byte; - u64 rx_ucast_pkt; - u64 rx_ucast_byte; - u64 rx_mcast_pkt; - u64 rx_mcast_byte; - u64 rx_bcast_pkt; - u64 rx_bcast_byte; - u64 rx_frgment_pkt; - - u64 rx_err; - u64 rx_crc_err; - u64 rx_key_cache_miss; - u64 rx_decrypt_err; - u64 rx_dupl_frame; - - u64 tkip_local_mic_fail; - u64 tkip_cnter_measures_invoked; - u64 tkip_replays; - u64 tkip_fmt_err; - u64 ccmp_fmt_err; - u64 ccmp_replays; - - u64 pwr_save_fail_cnt; - - u64 cs_bmiss_cnt; - u64 cs_low_rssi_cnt; - u64 cs_connect_cnt; - u64 cs_discon_cnt; - - s32 tx_ucast_rate; - s32 rx_ucast_rate; - - u32 lq_val; - - u32 wow_pkt_dropped; - u16 wow_evt_discarded; - - s16 noise_floor_calib; - s16 cs_rssi; - s16 cs_ave_beacon_rssi; - u8 cs_ave_beacon_snr; - u8 cs_last_roam_msec; - u8 cs_snr; - - u8 wow_host_pkt_wakeups; - u8 wow_host_evt_wakeups; - - u32 arp_received; - u32 arp_matched; - u32 arp_replied; -}; - -struct ath6kl_mbox_info { - u32 htc_addr; - u32 htc_ext_addr; - u32 htc_ext_sz; - - u32 block_size; - - u32 gmbox_addr; - - u32 gmbox_sz; -}; - -/* - * 802.11i defines an extended IV for use with non-WEP ciphers. - * When the EXTIV bit is set in the key id byte an additional - * 4 bytes immediately follow the IV for TKIP. For CCMP the - * EXTIV bit is likewise set but the 8 bytes represent the - * CCMP header rather than IV+extended-IV. - */ - -#define ATH6KL_KEYBUF_SIZE 16 -#define ATH6KL_MICBUF_SIZE (8+8) /* space for both tx and rx */ - -#define ATH6KL_KEY_XMIT 0x01 -#define ATH6KL_KEY_RECV 0x02 -#define ATH6KL_KEY_DEFAULT 0x80 /* default xmit key */ - -/* Initial group key for AP mode */ -struct ath6kl_req_key { - bool valid; - u8 key_index; - int key_type; - u8 key[WLAN_MAX_KEY_LEN]; - u8 key_len; -}; - -/* - * Bluetooth WiFi co-ex information. - * This structure keeps track of the Bluetooth related status. - * This involves the Bluetooth ACL link role, Bluetooth remote lmp version. - */ -struct ath6kl_btcoex { - u32 acl_role; /* Master/slave role of Bluetooth ACL link */ - u32 remote_lmp_ver; /* LMP version of the remote device. */ - u32 bt_vendor; /* Keeps track of the Bluetooth chip vendor */ -}; -enum ath6kl_hif_type { - ATH6KL_HIF_TYPE_SDIO, - ATH6KL_HIF_TYPE_USB, -}; - -/* Max number of filters that hw supports */ -#define ATH6K_MAX_MC_FILTERS_PER_LIST 7 -struct ath6kl_mc_filter { - struct list_head list; - char hw_addr[ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE]; -}; - -/* - * Driver's maximum limit, note that some firmwares support only one vif - * and the runtime (current) limit must be checked from ar->vif_max. - */ -#define ATH6KL_VIF_MAX 3 - -/* vif flags info */ -enum ath6kl_vif_state { - CONNECTED, - CONNECT_PEND, - WMM_ENABLED, - NETQ_STOPPED, - DTIM_EXPIRED, - NETDEV_REGISTERED, - CLEAR_BSSFILTER_ON_BEACON, - DTIM_PERIOD_AVAIL, - WLAN_ENABLED, - STATS_UPDATE_PEND, - HOST_SLEEP_MODE_CMD_PROCESSED, - SLEEP_POLICY_ENABLED, -}; - -struct ath6kl_vif { - struct list_head list; - struct wireless_dev wdev; - struct net_device *ndev; - struct ath6kl *ar; - /* Lock to protect vif specific net_stats and flags */ - spinlock_t if_lock; - u8 fw_vif_idx; - unsigned long flags; - int ssid_len; - u8 ssid[IEEE80211_MAX_SSID_LEN]; - u8 dot11_auth_mode; - u8 auth_mode; - u8 prwise_crypto; - u8 prwise_crypto_len; - u8 grp_crypto; - u8 grp_crypto_len; - u8 def_txkey_index; - u8 next_mode; - u8 nw_type; - u8 bssid[ETH_ALEN]; - u8 req_bssid[ETH_ALEN]; - u16 ch_hint; - u16 bss_ch; - struct ath6kl_wep_key wep_key_list[WMI_MAX_KEY_INDEX + 1]; - struct ath6kl_key keys[WMI_MAX_KEY_INDEX + 1]; - struct aggr_info *aggr_cntxt; - - struct timer_list disconnect_timer; - struct timer_list sched_scan_timer; - - struct cfg80211_scan_request *scan_req; - enum sme_state sme_state; - int reconnect_flag; - u32 last_roc_id; - u32 last_cancel_roc_id; - u32 send_action_id; - bool probe_req_report; - u16 next_chan; - u16 assoc_bss_beacon_int; - u16 bg_scan_period; - u8 scan_ctrl_flag; - u16 listen_intvl_t; - u16 bmiss_time_t; - u8 assoc_bss_dtim_period; - struct net_device_stats net_stats; - struct target_stats target_stats; - - struct list_head mc_filter; - - struct wmi_scan_params_cmd scparams; - unsigned int pspoll_num; - u16 mcastrate; - bool force_reload; - bool sdio_remove; -}; - -#define WOW_LIST_ID 0 -#define WOW_HOST_REQ_DELAY 500 /* ms */ - -#define ATH6KL_SCHED_SCAN_RESULT_DELAY 5000 /* ms */ - -/* Flag info */ -enum ath6kl_dev_state { - WMI_ENABLED, - WMI_READY, - WMI_CTRL_EP_FULL, - TESTMODE, - DESTROY_IN_PROGRESS, - SKIP_SCAN, - ROAM_TBL_PEND, - FIRST_BOOT, - WOW_RESUME_PRINT, -}; - -enum ath6kl_state { - ATH6KL_STATE_OFF, - ATH6KL_STATE_ON, - ATH6KL_STATE_SUSPENDING, - ATH6KL_STATE_RESUMING, - ATH6KL_STATE_DEEPSLEEP, - ATH6KL_STATE_CUTPOWER, - ATH6KL_STATE_WOW, - ATH6KL_STATE_SCHED_SCAN, -}; - -struct ath6kl { - struct device *dev; - struct wiphy *wiphy; - - enum ath6kl_state state; - - struct ath6kl_bmi bmi; - const struct ath6kl_hif_ops *hif_ops; - struct wmi *wmi; - int tx_pending[ENDPOINT_MAX]; - int total_tx_data_pend; - struct htc_target *htc_target; - enum ath6kl_hif_type hif_type; - void *hif_priv; - struct list_head vif_list; - /* Lock to avoid race in vif_list entries among add/del/traverse */ - spinlock_t list_lock; - u8 num_vif; - unsigned int vif_max; - u8 max_norm_iface; - u8 avail_idx_map; - spinlock_t lock; - struct semaphore sem; - u8 lrssi_roam_threshold; - struct ath6kl_version version; - u32 target_type; - u8 tx_pwr; - struct ath6kl_node_mapping node_map[MAX_NODE_NUM]; - u8 ibss_ps_enable; - bool ibss_if_active; - u8 node_num; - u8 next_ep_id; - struct ath6kl_cookie *cookie_list; - u32 cookie_count; - enum htc_endpoint_id ac2ep_map[WMM_NUM_AC]; - bool ac_stream_active[WMM_NUM_AC]; - u8 ac_stream_pri_map[WMM_NUM_AC]; - u8 hiac_stream_active_pri; - u8 ep2ac_map[ENDPOINT_MAX]; - enum htc_endpoint_id ctrl_ep; - struct ath6kl_htc_credit_info credit_state_info; - u32 connect_ctrl_flags; - u32 user_key_ctrl; - u8 usr_bss_filter; - struct ath6kl_sta sta_list[AP_MAX_NUM_STA]; - u8 sta_list_index; - struct ath6kl_req_key ap_mode_bkey; - struct sk_buff_head mcastpsq; - spinlock_t mcastpsq_lock; - u8 intra_bss; - struct wmi_ap_mode_stat ap_stats; - u8 ap_country_code[3]; - struct list_head amsdu_rx_buffer_queue; - u8 rx_meta_ver; - enum wlan_low_pwr_state wlan_pwr_state; - u8 mac_addr[ETH_ALEN]; -#define AR_MCAST_FILTER_MAC_ADDR_SIZE 4 - struct { - void *rx_report; - size_t rx_report_len; - } tm; - - struct ath6kl_hw { - u32 id; - const char *name; - u32 dataset_patch_addr; - u32 app_load_addr; - u32 app_start_override_addr; - u32 board_ext_data_addr; - u32 reserved_ram_size; - u32 board_addr; - u32 refclk_hz; - u32 uarttx_pin; - u32 testscript_addr; - - struct ath6kl_hw_fw { - const char *dir; - const char *otp; - const char *fw; - const char *tcmd; - const char *patch; - const char *utf; - const char *testscript; - } fw; - - const char *fw_board; - const char *fw_default_board; - } hw; - - u16 conf_flags; - u16 suspend_mode; - u16 wow_suspend_mode; - wait_queue_head_t event_wq; - struct ath6kl_mbox_info mbox_info; - - struct ath6kl_cookie cookie_mem[MAX_COOKIE_NUM]; - unsigned long flag; - - u8 *fw_board; - size_t fw_board_len; - - u8 *fw_otp; - size_t fw_otp_len; - - u8 *fw; - size_t fw_len; - - u8 *fw_patch; - size_t fw_patch_len; - - u8 *fw_testscript; - size_t fw_testscript_len; - - unsigned int fw_api; - unsigned long fw_capabilities[ATH6KL_CAPABILITY_LEN]; - - struct workqueue_struct *ath6kl_wq; - - struct dentry *debugfs_phy; - - bool p2p; - - struct ath6kl_btcoex btcoex_info; - - unsigned int psminfo; - -#ifdef CONFIG_ATH6KL_DEBUG - struct { - struct sk_buff_head fwlog_queue; - struct completion fwlog_completion; - bool fwlog_open; - - u32 fwlog_mask; - - unsigned int dbgfs_diag_reg; - u32 diag_reg_addr_wr; - u32 diag_reg_val_wr; - - struct { - unsigned int invalid_rate; - } war_stats; - - u8 *roam_tbl; - unsigned int roam_tbl_len; - - u8 keepalive; - u8 disc_timeout; - } debug; -#endif /* CONFIG_ATH6KL_DEBUG */ - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct early_suspend early_suspend; - bool screen_off; -#endif /* CONFIG_HAS_EARLYSUSPEND */ - -#ifdef CONFIG_HAS_WAKELOCK - struct wake_lock wake_lock; - struct wake_lock p2p_wake_lock; -#endif /* CONFIG_HAS_WAKELOCK */ - -}; - -#ifdef CONFIG_MACH_PX -/* - For this 3.2.0.4402 image: - 00561734 g O .bss 00000004 epc1 - 00561738 g O .bss 00000004 epc2 - 0056173c g O .bss 00000004 epc3 - 00561740 g O .bss 00000004 epc4 - - For this 3.2.0.64 image: - 00561fa4 g O .bss 00000004 epc1 -*/ - -#define EPC1_ADDR 0x00 - -void ath6kl_print_ar6k_registers(struct ath6kl *ar); -#endif - -static inline struct ath6kl *ath6kl_priv(struct net_device *dev) -{ - return ((struct ath6kl_vif *) netdev_priv(dev))->ar; -} - -static inline u32 ath6kl_get_hi_item_addr(struct ath6kl *ar, - u32 item_offset) -{ - u32 addr = 0; - - if (ar->target_type == TARGET_TYPE_AR6003) - addr = ATH6KL_AR6003_HI_START_ADDR + item_offset; - else if (ar->target_type == TARGET_TYPE_AR6004) - addr = ATH6KL_AR6004_HI_START_ADDR + item_offset; - - return addr; -} - -int ath6kl_configure_target(struct ath6kl *ar); -void ath6kl_detect_error(unsigned long ptr); -void disconnect_timer_handler(unsigned long ptr); -void init_netdev(struct net_device *dev); -void ath6kl_cookie_init(struct ath6kl *ar); -void ath6kl_cookie_cleanup(struct ath6kl *ar); -void ath6kl_rx(struct htc_target *target, struct htc_packet *packet); -void ath6kl_tx_complete(void *context, struct list_head *packet_queue); -enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target, - struct htc_packet *packet); -void ath6kl_stop_txrx(struct ath6kl *ar); -void ath6kl_cleanup_amsdu_rxbufs(struct ath6kl *ar); -int ath6kl_diag_write32(struct ath6kl *ar, u32 address, __le32 value); -int ath6kl_diag_write(struct ath6kl *ar, u32 address, void *data, u32 length); -int ath6kl_diag_read32(struct ath6kl *ar, u32 address, u32 *value); -int ath6kl_diag_read(struct ath6kl *ar, u32 address, void *data, u32 length); -int ath6kl_read_fwlogs(struct ath6kl *ar); -void ath6kl_init_profile_info(struct ath6kl_vif *vif); -void ath6kl_tx_data_cleanup(struct ath6kl *ar); - -struct ath6kl_cookie *ath6kl_alloc_cookie(struct ath6kl *ar); -void ath6kl_free_cookie(struct ath6kl *ar, struct ath6kl_cookie *cookie); -int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev); - -struct aggr_info *aggr_init(struct ath6kl_vif *vif); -void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info, - struct aggr_info_conn *aggr_conn); -void ath6kl_rx_refill(struct htc_target *target, - enum htc_endpoint_id endpoint); -void ath6kl_refill_amsdu_rxbufs(struct ath6kl *ar, int count); -struct htc_packet *ath6kl_alloc_amsdu_rxbuf(struct htc_target *target, - enum htc_endpoint_id endpoint, - int len); -void aggr_module_destroy(struct aggr_info *aggr_info); -void aggr_reset_state(struct aggr_info_conn *aggr_conn); - -struct ath6kl_sta *ath6kl_find_sta(struct ath6kl_vif *vif, u8 * node_addr); -struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid); - -void ath6kl_ready_event(void *devt, u8 * datap, u32 sw_ver, u32 abi_ver); -int ath6kl_control_tx(void *devt, struct sk_buff *skb, - enum htc_endpoint_id eid); -void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, - u8 *bssid, u16 listen_int, - u16 beacon_int, enum network_type net_type, - u8 beacon_ie_len, u8 assoc_req_len, - u8 assoc_resp_len, u8 *assoc_info); -void ath6kl_connect_ap_mode_bss(struct ath6kl_vif *vif, u16 channel); -void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr, - u8 keymgmt, u8 ucipher, u8 auth, - u8 assoc_req_len, u8 *assoc_info, u8 apsd_info); -void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason, - u8 *bssid, u8 assoc_resp_len, - u8 *assoc_info, u16 prot_reason_status); -void ath6kl_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid, bool ismcast); -void ath6kl_txpwr_rx_evt(void *devt, u8 tx_pwr); -void ath6kl_scan_complete_evt(struct ath6kl_vif *vif, int status); -void ath6kl_tgt_stats_event(struct ath6kl_vif *vif, u8 *ptr, u32 len); -void ath6kl_indicate_tx_activity(void *devt, u8 traffic_class, bool active); -enum htc_endpoint_id ath6kl_ac2_endpoint_id(void *devt, u8 ac); - -void ath6kl_pspoll_event(struct ath6kl_vif *vif, u8 aid); - -void ath6kl_dtimexpiry_event(struct ath6kl_vif *vif); -void ath6kl_disconnect(struct ath6kl_vif *vif); -void aggr_recv_delba_req_evt(struct ath6kl_vif *vif, u8 tid); -void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid, u16 seq_no, - u8 win_sz); -void ath6kl_wakeup_event(void *dev); - -void ath6kl_reset_device(struct ath6kl *ar, u32 target_type, - bool wait_fot_compltn, bool cold_reset); -void ath6kl_init_control_info(struct ath6kl_vif *vif); -void ath6kl_deinit_if_data(struct ath6kl_vif *vif); -void ath6kl_core_free(struct ath6kl *ar); -struct ath6kl_vif *ath6kl_vif_first(struct ath6kl *ar); -void ath6kl_cleanup_vif(struct ath6kl_vif *vif, bool wmi_ready); -int ath6kl_init_hw_start(struct ath6kl *ar); -int ath6kl_init_hw_stop(struct ath6kl *ar); -void ath6kl_check_wow_status(struct ath6kl *ar, struct sk_buff *skb, - bool is_event_pkt); -#ifdef CONFIG_MACH_PX -void ath6kl_sdio_init_c210(void); -void ath6kl_sdio_exit_c210(void); -#else -void ath6kl_sdio_init_msm(void); -void ath6kl_sdio_exit_msm(void); -#endif -void ath6kl_mangle_mac_address(struct ath6kl *ar); - -#endif /* CORE_H */ diff --git a/drivers/net/wireless/ath/ath6kl/dbglog.c b/drivers/net/wireless/ath/ath6kl/dbglog.c deleted file mode 100644 index 3498aac..0000000 --- a/drivers/net/wireless/ath/ath6kl/dbglog.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2011 Qualcomm Atheros - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include "core.h" -#include "debug.h" -#include "dbglog.h" - -#define DEVICE_NAME "ath6kl-dbglog" -#define DBGLOG_BUFSIZ 8192 -static int major_num; -static int num_readers; -static struct circ_buf dbglog_buf; -static spinlock_t dbglog_lock; -static wait_queue_head_t dbglog_wait; -static struct class *dbglog_class; -static struct device *dbglog_dev; - - -void ath6kl_dbglog_add(const u8 *buf, size_t len) -{ - size_t i; - int added = 0; - int cspace; - - if (major_num < 0 || dbglog_buf.buf == NULL) - return; - - spin_lock_bh(&dbglog_lock); - i = 0; - while (i < len) { - if (CIRC_SPACE(dbglog_buf.head, dbglog_buf.tail, - DBGLOG_BUFSIZ) == 0) { - spin_unlock_bh(&dbglog_lock); - if (num_readers) - ath6kl_dbg(ATH6KL_DBG_WMI, - "dbglog buffer overflow"); - return; - } - cspace = CIRC_SPACE_TO_END(dbglog_buf.head, dbglog_buf.tail, - DBGLOG_BUFSIZ); - if ((size_t) cspace > len - i) - cspace = len - i; - memcpy(&dbglog_buf.buf[dbglog_buf.head], &buf[i], cspace); - dbglog_buf.head = (dbglog_buf.head + cspace) & - (DBGLOG_BUFSIZ - 1); - i += cspace; - added++; - } - spin_unlock_bh(&dbglog_lock); - if (added) - wake_up(&dbglog_wait); -} - -static int ath6kl_dbglog_open(struct inode *inode, struct file *filp) -{ - if (major_num < 0 || dbglog_buf.buf == NULL) - return -EOPNOTSUPP; - - if (num_readers) - return -EBUSY; - - num_readers++; - try_module_get(THIS_MODULE); - - return 0; -} - -static int ath6kl_dbglog_release(struct inode *inode, struct file *filp) -{ - num_readers--; - module_put(THIS_MODULE); - return 0; -} - -static bool ath6kl_dbglog_empty(void) -{ - return CIRC_CNT(dbglog_buf.head, dbglog_buf.tail, DBGLOG_BUFSIZ) == 0; -} - -static ssize_t ath6kl_dbglog_read(struct file *filp, char *buf, size_t len, - loff_t *offset) -{ - char *pos = buf; - - wait_event_interruptible(dbglog_wait, !ath6kl_dbglog_empty()); - spin_lock_bh(&dbglog_lock); - while (len && - CIRC_CNT(dbglog_buf.head, dbglog_buf.tail, DBGLOG_BUFSIZ) > 0) { - int ccnt = CIRC_CNT_TO_END(dbglog_buf.head, dbglog_buf.tail, - DBGLOG_BUFSIZ); - spin_unlock_bh(&dbglog_lock); - if ((size_t) ccnt > len) - ccnt = len; - if (copy_to_user(pos, &dbglog_buf.buf[dbglog_buf.tail], ccnt)) - return -EFAULT; - pos += ccnt; - spin_lock_bh(&dbglog_lock); - dbglog_buf.tail = (dbglog_buf.tail + ccnt) & - (DBGLOG_BUFSIZ - 1); - len -= ccnt; - } - spin_unlock_bh(&dbglog_lock); - - return pos - buf; -} - -static ssize_t ath6kl_dbglog_write(struct file *filp, const char *buf, - size_t len, loff_t *off) -{ - return -EOPNOTSUPP; -} - -static struct file_operations fops = { - .open = ath6kl_dbglog_open, - .release = ath6kl_dbglog_release, - .read = ath6kl_dbglog_read, - .write = ath6kl_dbglog_write, -}; - -int ath6kl_dbglog_init(void) -{ - major_num = -1; - dbglog_buf.buf = kmalloc(DBGLOG_BUFSIZ, GFP_KERNEL); - if (dbglog_buf.buf == NULL) - return -ENOMEM; - - dbglog_buf.head = dbglog_buf.tail = 0; - - major_num = register_chrdev(0, DEVICE_NAME, &fops); - if (major_num < 0) { - ath6kl_err("Failed to register chrdev for dbglog: %d\n", - major_num); - return major_num; - } - - dbglog_class = class_create(THIS_MODULE, DEVICE_NAME); - dbglog_dev = device_create(dbglog_class, NULL, MKDEV(major_num, 0), - NULL, DEVICE_NAME); - - spin_lock_init(&dbglog_lock); - init_waitqueue_head(&dbglog_wait); - - return 0; -} - -void ath6kl_dbglog_deinit(void) -{ - device_destroy(dbglog_class, MKDEV(major_num, 0)); - class_unregister(dbglog_class); - class_destroy(dbglog_class); - unregister_chrdev(major_num, DEVICE_NAME); - kfree(dbglog_buf.buf); -} diff --git a/drivers/net/wireless/ath/ath6kl/dbglog.h b/drivers/net/wireless/ath/ath6kl/dbglog.h deleted file mode 100644 index 9c244be..0000000 --- a/drivers/net/wireless/ath/ath6kl/dbglog.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2011 Qualcomm Atheros - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef DBGLOG_H -#define DBGLOG_H - -void ath6kl_dbglog_add(const u8 *buf, size_t len); -int ath6kl_dbglog_init(void); -void ath6kl_dbglog_deinit(void); - -#endif /* DBGLOG_H */ diff --git a/drivers/net/wireless/ath/ath6kl/debug.c b/drivers/net/wireless/ath/ath6kl/debug.c deleted file mode 100755 index 28b3e77..0000000 --- a/drivers/net/wireless/ath/ath6kl/debug.c +++ /dev/null @@ -1,2022 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "core.h" - -#include -#include -#include -#include - -#include "debug.h" -#include "debugfs_pri.h" -#include "target.h" - -struct ath6kl_fwlog_slot { - __le32 timestamp; - __le32 length; - - /* max ATH6KL_FWLOG_PAYLOAD_SIZE bytes */ - u8 payload[0]; -}; - -#define ATH6KL_FWLOG_MAX_ENTRIES 20 - -#define ATH6KL_FWLOG_VALID_MASK 0x1ffff - -int ath6kl_printk(const char *level, const char *fmt, ...) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) - struct va_format vaf; -#endif - va_list args; - int rtn; - - va_start(args, fmt); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) - vaf.fmt = fmt; - vaf.va = &args; - - rtn = printk("%sath6kl: %pV", level, &vaf); -#else - printk("%sath6kl: ", level); - rtn = vprintk(fmt, args); -#endif - - va_end(args); - - return rtn; -} - -char *sec_conv_mac(const u8 *mac) -{ - static char ret_mac[16]; - char *p = ret_mac; - - p = pack_hex_byte(p, mac[0]); - *p++ = '_'; - p = pack_hex_byte(p, mac[4]); - *p++ = ':'; - p = pack_hex_byte(p, mac[5]); - *p++ = '\0'; - - return ret_mac; -} - -#ifdef CONFIG_ATH6KL_DEBUG - -#define REG_OUTPUT_LEN_PER_LINE 25 -#define REGTYPE_STR_LEN 100 - -struct ath6kl_diag_reg_info { - u32 reg_start; - u32 reg_end; - const char *reg_info; -}; - -static const struct ath6kl_diag_reg_info diag_reg[] = { - { 0x20000, 0x200fc, "General DMA and Rx registers" }, - { 0x28000, 0x28900, "MAC PCU register & keycache" }, - { 0x20800, 0x20a40, "QCU" }, - { 0x21000, 0x212f0, "DCU" }, - { 0x4000, 0x42e4, "RTC" }, - { 0x540000, 0x540000 + (256 * 1024), "RAM" }, - { 0x29800, 0x2B210, "Base Band" }, - { 0x1C000, 0x1C748, "Analog" }, -}; - -void ath6kl_dump_registers(struct ath6kl_device *dev, - struct ath6kl_irq_proc_registers *irq_proc_reg, - struct ath6kl_irq_enable_reg *irq_enable_reg) -{ - - ath6kl_dbg(ATH6KL_DBG_ANY, ("<------- Register Table -------->\n")); - - if (irq_proc_reg != NULL) { - ath6kl_dbg(ATH6KL_DBG_ANY, - "Host Int status: 0x%x\n", - irq_proc_reg->host_int_status); - ath6kl_dbg(ATH6KL_DBG_ANY, - "CPU Int status: 0x%x\n", - irq_proc_reg->cpu_int_status); - ath6kl_dbg(ATH6KL_DBG_ANY, - "Error Int status: 0x%x\n", - irq_proc_reg->error_int_status); - ath6kl_dbg(ATH6KL_DBG_ANY, - "Counter Int status: 0x%x\n", - irq_proc_reg->counter_int_status); - ath6kl_dbg(ATH6KL_DBG_ANY, - "Mbox Frame: 0x%x\n", - irq_proc_reg->mbox_frame); - ath6kl_dbg(ATH6KL_DBG_ANY, - "Rx Lookahead Valid: 0x%x\n", - irq_proc_reg->rx_lkahd_valid); - ath6kl_dbg(ATH6KL_DBG_ANY, - "Rx Lookahead 0: 0x%x\n", - irq_proc_reg->rx_lkahd[0]); - ath6kl_dbg(ATH6KL_DBG_ANY, - "Rx Lookahead 1: 0x%x\n", - irq_proc_reg->rx_lkahd[1]); - - if (dev->ar->mbox_info.gmbox_addr != 0) { - /* - * If the target supports GMBOX hardware, dump some - * additional state. - */ - ath6kl_dbg(ATH6KL_DBG_ANY, - "GMBOX Host Int status 2: 0x%x\n", - irq_proc_reg->host_int_status2); - ath6kl_dbg(ATH6KL_DBG_ANY, - "GMBOX RX Avail: 0x%x\n", - irq_proc_reg->gmbox_rx_avail); - ath6kl_dbg(ATH6KL_DBG_ANY, - "GMBOX lookahead alias 0: 0x%x\n", - irq_proc_reg->rx_gmbox_lkahd_alias[0]); - ath6kl_dbg(ATH6KL_DBG_ANY, - "GMBOX lookahead alias 1: 0x%x\n", - irq_proc_reg->rx_gmbox_lkahd_alias[1]); - } - - } - - if (irq_enable_reg != NULL) { - ath6kl_dbg(ATH6KL_DBG_ANY, - "Int status Enable: 0x%x\n", - irq_enable_reg->int_status_en); - ath6kl_dbg(ATH6KL_DBG_ANY, "Counter Int status Enable: 0x%x\n", - irq_enable_reg->cntr_int_status_en); - } - ath6kl_dbg(ATH6KL_DBG_ANY, "<------------------------------->\n"); -} - -static void dump_cred_dist(struct htc_endpoint_credit_dist *ep_dist) -{ - ath6kl_dbg(ATH6KL_DBG_CREDIT, - "--- endpoint: %d svc_id: 0x%X ---\n", - ep_dist->endpoint, ep_dist->svc_id); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " dist_flags : 0x%X\n", - ep_dist->dist_flags); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " cred_norm : %d\n", - ep_dist->cred_norm); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " cred_min : %d\n", - ep_dist->cred_min); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " credits : %d\n", - ep_dist->credits); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " cred_assngd : %d\n", - ep_dist->cred_assngd); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " seek_cred : %d\n", - ep_dist->seek_cred); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " cred_sz : %d\n", - ep_dist->cred_sz); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " cred_per_msg : %d\n", - ep_dist->cred_per_msg); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " cred_to_dist : %d\n", - ep_dist->cred_to_dist); - ath6kl_dbg(ATH6KL_DBG_CREDIT, " txq_depth : %d\n", - get_queue_depth(&ep_dist->htc_ep->txq)); - ath6kl_dbg(ATH6KL_DBG_CREDIT, - "----------------------------------\n"); -} - -/* FIXME: move to htc.c */ -void dump_cred_dist_stats(struct htc_target *target) -{ - struct htc_endpoint_credit_dist *ep_list; - - if (!AR_DBG_LVL_CHECK(ATH6KL_DBG_CREDIT)) - return; - - list_for_each_entry(ep_list, &target->cred_dist_list, list) - dump_cred_dist(ep_list); - - ath6kl_dbg(ATH6KL_DBG_CREDIT, - "credit distribution total %d free %d\n", - target->credit_info->total_avail_credits, - target->credit_info->cur_free_credits); -} - -static int ath6kl_debugfs_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war) -{ - switch (war) { - case ATH6KL_WAR_INVALID_RATE: - ar->debug.war_stats.invalid_rate++; - break; - } -} - -static ssize_t read_file_war_stats(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - char *buf; - unsigned int len = 0, buf_len = 1500; - ssize_t ret_cnt; - - buf = kzalloc(buf_len, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - len += scnprintf(buf + len, buf_len - len, "\n"); - len += scnprintf(buf + len, buf_len - len, "%25s\n", - "Workaround stats"); - len += scnprintf(buf + len, buf_len - len, "%25s\n\n", - "================="); - len += scnprintf(buf + len, buf_len - len, "%20s %10u\n", - "Invalid rates", ar->debug.war_stats.invalid_rate); - - if (WARN_ON(len > buf_len)) - len = buf_len; - - ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); - - kfree(buf); - return ret_cnt; -} - -static const struct file_operations fops_war_stats = { - .read = read_file_war_stats, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -void ath6kl_debug_fwlog_event(struct ath6kl *ar, const void *buf, size_t len) -{ - struct ath6kl_fwlog_slot *slot; - struct sk_buff *skb; - size_t slot_len; - - if (WARN_ON(len > ATH6KL_FWLOG_PAYLOAD_SIZE)) - return; - - slot_len = sizeof(*slot) + ATH6KL_FWLOG_PAYLOAD_SIZE; - - skb = alloc_skb(slot_len, GFP_KERNEL); - if (!skb) - return; - - slot = (struct ath6kl_fwlog_slot *) skb_put(skb, slot_len); - slot->timestamp = cpu_to_le32(jiffies); - slot->length = cpu_to_le32(len); - memcpy(slot->payload, buf, len); - - /* Need to pad each record to fixed length ATH6KL_FWLOG_PAYLOAD_SIZE */ - memset(slot->payload + len, 0, ATH6KL_FWLOG_PAYLOAD_SIZE - len); - - spin_lock(&ar->debug.fwlog_queue.lock); - - __skb_queue_tail(&ar->debug.fwlog_queue, skb); - complete(&ar->debug.fwlog_completion); - - /* drop oldest entries */ - while (skb_queue_len(&ar->debug.fwlog_queue) > - ATH6KL_FWLOG_MAX_ENTRIES) { - skb = __skb_dequeue(&ar->debug.fwlog_queue); - kfree_skb(skb); - } - - spin_unlock(&ar->debug.fwlog_queue.lock); - - return; -} - -static int ath6kl_fwlog_open(struct inode *inode, struct file *file) -{ - struct ath6kl *ar = inode->i_private; - - if (ar->debug.fwlog_open) - return -EBUSY; - - ar->debug.fwlog_open = true; - - file->private_data = inode->i_private; - return 0; -} - -static int ath6kl_fwlog_release(struct inode *inode, struct file *file) -{ - struct ath6kl *ar = inode->i_private; - - ar->debug.fwlog_open = false; - - return 0; -} - -static ssize_t ath6kl_fwlog_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct sk_buff *skb; - ssize_t ret_cnt; - size_t len = 0; - char *buf; - - buf = vmalloc(count); - if (!buf) - return -ENOMEM; - - /* read undelivered logs from firmware */ - ath6kl_read_fwlogs(ar); - - spin_lock(&ar->debug.fwlog_queue.lock); - - while ((skb = __skb_dequeue(&ar->debug.fwlog_queue))) { - if (skb->len > count - len) { - /* not enough space, put skb back and leave */ - __skb_queue_head(&ar->debug.fwlog_queue, skb); - break; - } - - - memcpy(buf + len, skb->data, skb->len); - len += skb->len; - - kfree_skb(skb); - } - - spin_unlock(&ar->debug.fwlog_queue.lock); - - /* FIXME: what to do if len == 0? */ - - ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); - - vfree(buf); - - return ret_cnt; -} - -static const struct file_operations fops_fwlog = { - .open = ath6kl_fwlog_open, - .release = ath6kl_fwlog_release, - .read = ath6kl_fwlog_read, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_fwlog_block_read(struct file *file, - char __user *user_buf, - size_t count, - loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct sk_buff *skb; - ssize_t ret_cnt; - size_t len = 0, not_copied; - char *buf; - int ret; - - buf = vmalloc(count); - if (!buf) - return -ENOMEM; - - spin_lock(&ar->debug.fwlog_queue.lock); - - if (skb_queue_len(&ar->debug.fwlog_queue) == 0) { - /* we must init under queue lock */ - init_completion(&ar->debug.fwlog_completion); - - spin_unlock(&ar->debug.fwlog_queue.lock); - - ret = wait_for_completion_interruptible( - &ar->debug.fwlog_completion); - if (ret == -ERESTARTSYS) { - vfree(buf); - return ret; - } - - spin_lock(&ar->debug.fwlog_queue.lock); - } - - while ((skb = __skb_dequeue(&ar->debug.fwlog_queue))) { - if (skb->len > count - len) { - /* not enough space, put skb back and leave */ - __skb_queue_head(&ar->debug.fwlog_queue, skb); - break; - } - - - memcpy(buf + len, skb->data, skb->len); - len += skb->len; - - kfree_skb(skb); - } - - spin_unlock(&ar->debug.fwlog_queue.lock); - - /* FIXME: what to do if len == 0? */ - - not_copied = copy_to_user(user_buf, buf, len); - if (not_copied != 0) { - ret_cnt = -EFAULT; - goto out; - } - - *ppos = *ppos + len; - - ret_cnt = len; - -out: - vfree(buf); - - return ret_cnt; -} - -static const struct file_operations fops_fwlog_block = { - .open = ath6kl_fwlog_open, - .release = ath6kl_fwlog_release, - .read = ath6kl_fwlog_block_read, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_fwlog_mask_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - char buf[16]; - int len; - - len = snprintf(buf, sizeof(buf), "0x%x\n", ar->debug.fwlog_mask); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static ssize_t ath6kl_fwlog_mask_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - int ret; - - ret = kstrtou32_from_user(user_buf, count, 0, &ar->debug.fwlog_mask); - if (ret) - return ret; - - ret = ath6kl_wmi_config_debug_module_cmd(ar->wmi, - ATH6KL_FWLOG_VALID_MASK, - ar->debug.fwlog_mask); - if (ret) - return ret; - - return count; -} - -static const struct file_operations fops_fwlog_mask = { - .open = ath6kl_debugfs_open, - .read = ath6kl_fwlog_mask_read, - .write = ath6kl_fwlog_mask_write, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t read_file_tgt_stats(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - struct target_stats *tgt_stats; - char *buf; - unsigned int len = 0, buf_len = 1500; - int i; - long left; - ssize_t ret_cnt; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - tgt_stats = &vif->target_stats; - - buf = kzalloc(buf_len, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - if (down_interruptible(&ar->sem)) { - kfree(buf); - return -EBUSY; - } - - set_bit(STATS_UPDATE_PEND, &vif->flags); - - if (ath6kl_wmi_get_stats_cmd(ar->wmi, 0)) { - up(&ar->sem); - kfree(buf); - return -EIO; - } - - left = wait_event_interruptible_timeout(ar->event_wq, - !test_bit(STATS_UPDATE_PEND, - &vif->flags), WMI_TIMEOUT); - - up(&ar->sem); - - if (left <= 0) { - kfree(buf); - return -ETIMEDOUT; - } - - len += scnprintf(buf + len, buf_len - len, "\n"); - len += scnprintf(buf + len, buf_len - len, "%25s\n", - "Target Tx stats"); - len += scnprintf(buf + len, buf_len - len, "%25s\n\n", - "================="); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Ucast packets", tgt_stats->tx_ucast_pkt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Bcast packets", tgt_stats->tx_bcast_pkt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Ucast byte", tgt_stats->tx_ucast_byte); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Bcast byte", tgt_stats->tx_bcast_byte); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Rts success cnt", tgt_stats->tx_rts_success_cnt); - for (i = 0; i < 4; i++) - len += scnprintf(buf + len, buf_len - len, - "%18s %d %10llu\n", "PER on ac", - i, tgt_stats->tx_pkt_per_ac[i]); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Error", tgt_stats->tx_err); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Fail count", tgt_stats->tx_fail_cnt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Retry count", tgt_stats->tx_retry_cnt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Multi retry cnt", tgt_stats->tx_mult_retry_cnt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Rts fail cnt", tgt_stats->tx_rts_fail_cnt); - len += scnprintf(buf + len, buf_len - len, "%25s %10llu\n\n", - "TKIP counter measure used", - tgt_stats->tkip_cnter_measures_invoked); - - len += scnprintf(buf + len, buf_len - len, "%25s\n", - "Target Rx stats"); - len += scnprintf(buf + len, buf_len - len, "%25s\n", - "================="); - - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Ucast packets", tgt_stats->rx_ucast_pkt); - len += scnprintf(buf + len, buf_len - len, "%20s %10d\n", - "Ucast Rate", tgt_stats->rx_ucast_rate); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Bcast packets", tgt_stats->rx_bcast_pkt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Ucast byte", tgt_stats->rx_ucast_byte); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Bcast byte", tgt_stats->rx_bcast_byte); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Fragmented pkt", tgt_stats->rx_frgment_pkt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Error", tgt_stats->rx_err); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "CRC Err", tgt_stats->rx_crc_err); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Key chache miss", tgt_stats->rx_key_cache_miss); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Decrypt Err", tgt_stats->rx_decrypt_err); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Duplicate frame", tgt_stats->rx_dupl_frame); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Tkip Mic failure", tgt_stats->tkip_local_mic_fail); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "TKIP format err", tgt_stats->tkip_fmt_err); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "CCMP format Err", tgt_stats->ccmp_fmt_err); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n\n", - "CCMP Replay Err", tgt_stats->ccmp_replays); - - len += scnprintf(buf + len, buf_len - len, "%25s\n", - "Misc Target stats"); - len += scnprintf(buf + len, buf_len - len, "%25s\n", - "================="); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Beacon Miss count", tgt_stats->cs_bmiss_cnt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Num Connects", tgt_stats->cs_connect_cnt); - len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n", - "Num disconnects", tgt_stats->cs_discon_cnt); - len += scnprintf(buf + len, buf_len - len, "%20s %10d\n", - "Beacon avg rssi", tgt_stats->cs_ave_beacon_rssi); - len += scnprintf(buf + len, buf_len - len, "%20s %10d\n", - "ARP pkt received", tgt_stats->arp_received); - len += scnprintf(buf + len, buf_len - len, "%20s %10d\n", - "ARP pkt matched", tgt_stats->arp_matched); - len += scnprintf(buf + len, buf_len - len, "%20s %10d\n", - "ARP pkt replied", tgt_stats->arp_replied); - - if (len > buf_len) - len = buf_len; - - ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); - - kfree(buf); - return ret_cnt; -} - -static const struct file_operations fops_tgt_stats = { - .read = read_file_tgt_stats, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -#define print_credit_info(fmt_str, ep_list_field) \ - (len += scnprintf(buf + len, buf_len - len, fmt_str, \ - ep_list->ep_list_field)) -#define CREDIT_INFO_DISPLAY_STRING_LEN 200 -#define CREDIT_INFO_LEN 128 - -static ssize_t read_file_credit_dist_stats(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct htc_target *target = ar->htc_target; - struct htc_endpoint_credit_dist *ep_list; - char *buf; - unsigned int buf_len, len = 0; - ssize_t ret_cnt; - - buf_len = CREDIT_INFO_DISPLAY_STRING_LEN + - get_queue_depth(&target->cred_dist_list) * CREDIT_INFO_LEN; - buf = kzalloc(buf_len, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - len += scnprintf(buf + len, buf_len - len, "%25s%5d\n", - "Total Avail Credits: ", - target->credit_info->total_avail_credits); - len += scnprintf(buf + len, buf_len - len, "%25s%5d\n", - "Free credits :", - target->credit_info->cur_free_credits); - - len += scnprintf(buf + len, buf_len - len, - " Epid Flags Cred_norm Cred_min Credits Cred_assngd" - " Seek_cred Cred_sz Cred_per_msg Cred_to_dist" - " qdepth\n"); - - list_for_each_entry(ep_list, &target->cred_dist_list, list) { - print_credit_info(" %2d", endpoint); - print_credit_info("%10x", dist_flags); - print_credit_info("%8d", cred_norm); - print_credit_info("%9d", cred_min); - print_credit_info("%9d", credits); - print_credit_info("%10d", cred_assngd); - print_credit_info("%13d", seek_cred); - print_credit_info("%12d", cred_sz); - print_credit_info("%9d", cred_per_msg); - print_credit_info("%14d", cred_to_dist); - len += scnprintf(buf + len, buf_len - len, "%12d\n", - get_queue_depth(&ep_list->htc_ep->txq)); - } - - if (len > buf_len) - len = buf_len; - - ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); - kfree(buf); - return ret_cnt; -} - -static const struct file_operations fops_credit_dist_stats = { - .read = read_file_credit_dist_stats, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static unsigned int print_endpoint_stat(struct htc_target *target, char *buf, - unsigned int buf_len, unsigned int len, - int offset, const char *name) -{ - int i; - struct htc_endpoint_stats *ep_st; - u32 *counter; - - len += scnprintf(buf + len, buf_len - len, "%s:", name); - for (i = 0; i < ENDPOINT_MAX; i++) { - ep_st = &target->endpoint[i].ep_st; - counter = ((u32 *) ep_st) + (offset / 4); - len += scnprintf(buf + len, buf_len - len, " %u", *counter); - } - len += scnprintf(buf + len, buf_len - len, "\n"); - - return len; -} - -static ssize_t ath6kl_endpoint_stats_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct htc_target *target = ar->htc_target; - char *buf; - unsigned int buf_len, len = 0; - ssize_t ret_cnt; - - buf_len = sizeof(struct htc_endpoint_stats) / sizeof(u32) * - (25 + ENDPOINT_MAX * 11); - buf = kmalloc(buf_len, GFP_KERNEL); - if (!buf) - return -ENOMEM; - -#define EPSTAT(name) \ - len = print_endpoint_stat(target, buf, buf_len, len, \ - offsetof(struct htc_endpoint_stats, name), \ - #name) - EPSTAT(cred_low_indicate); - EPSTAT(tx_issued); - EPSTAT(tx_pkt_bundled); - EPSTAT(tx_bundles); - EPSTAT(tx_dropped); - EPSTAT(tx_cred_rpt); - EPSTAT(cred_rpt_from_rx); - EPSTAT(cred_rpt_from_other); - EPSTAT(cred_rpt_ep0); - EPSTAT(cred_from_rx); - EPSTAT(cred_from_other); - EPSTAT(cred_from_ep0); - EPSTAT(cred_cosumd); - EPSTAT(cred_retnd); - EPSTAT(rx_pkts); - EPSTAT(rx_lkahds); - EPSTAT(rx_bundl); - EPSTAT(rx_bundle_lkahd); - EPSTAT(rx_bundle_from_hdr); - EPSTAT(rx_alloc_thresh_hit); - EPSTAT(rxalloc_thresh_byte); -#undef EPSTAT - - if (len > buf_len) - len = buf_len; - - ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); - kfree(buf); - return ret_cnt; -} - -static ssize_t ath6kl_endpoint_stats_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct htc_target *target = ar->htc_target; - int ret, i; - u32 val; - struct htc_endpoint_stats *ep_st; - - ret = kstrtou32_from_user(user_buf, count, 0, &val); - if (ret) - return ret; - if (val == 0) { - for (i = 0; i < ENDPOINT_MAX; i++) { - ep_st = &target->endpoint[i].ep_st; - memset(ep_st, 0, sizeof(*ep_st)); - } - } - - return count; -} - -static const struct file_operations fops_endpoint_stats = { - .open = ath6kl_debugfs_open, - .read = ath6kl_endpoint_stats_read, - .write = ath6kl_endpoint_stats_write, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static unsigned long ath6kl_get_num_reg(void) -{ - int i; - unsigned long n_reg = 0; - - for (i = 0; i < ARRAY_SIZE(diag_reg); i++) - n_reg = n_reg + - (diag_reg[i].reg_end - diag_reg[i].reg_start) / 4 + 1; - - return n_reg; -} - -static bool ath6kl_dbg_is_diag_reg_valid(u32 reg_addr) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(diag_reg); i++) { - if (reg_addr >= diag_reg[i].reg_start && - reg_addr <= diag_reg[i].reg_end) - return true; - } - - return false; -} - -static ssize_t ath6kl_regread_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - u8 buf[50]; - unsigned int len = 0; - - if (ar->debug.dbgfs_diag_reg) - len += scnprintf(buf + len, sizeof(buf) - len, "0x%x\n", - ar->debug.dbgfs_diag_reg); - else - len += scnprintf(buf + len, sizeof(buf) - len, - "All diag registers\n"); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static ssize_t ath6kl_regread_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - u8 buf[50]; - unsigned int len; - unsigned long reg_addr; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - - if (strict_strtoul(buf, 0, ®_addr)) - return -EINVAL; - - if ((reg_addr % 4) != 0) - return -EINVAL; - - if (reg_addr && !ath6kl_dbg_is_diag_reg_valid(reg_addr)) - return -EINVAL; - - ar->debug.dbgfs_diag_reg = reg_addr; - - return count; -} - -static const struct file_operations fops_diag_reg_read = { - .read = ath6kl_regread_read, - .write = ath6kl_regread_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static int ath6kl_regdump_open(struct inode *inode, struct file *file) -{ - struct ath6kl *ar = inode->i_private; - u8 *buf; - unsigned long int reg_len; - unsigned int len = 0, n_reg; - u32 addr; - __le32 reg_val; - int i, status; - - /* Dump all the registers if no register is specified */ - if (!ar->debug.dbgfs_diag_reg) - n_reg = ath6kl_get_num_reg(); - else - n_reg = 1; - - reg_len = n_reg * REG_OUTPUT_LEN_PER_LINE; - if (n_reg > 1) - reg_len += REGTYPE_STR_LEN; - - buf = vmalloc(reg_len); - if (!buf) - return -ENOMEM; - - if (n_reg == 1) { - addr = ar->debug.dbgfs_diag_reg; - - status = ath6kl_diag_read32(ar, - TARG_VTOP(ar->target_type, addr), - (u32 *)®_val); - if (status) - goto fail_reg_read; - - len += scnprintf(buf + len, reg_len - len, - "0x%06x 0x%08x\n", addr, le32_to_cpu(reg_val)); - goto done; - } - - for (i = 0; i < ARRAY_SIZE(diag_reg); i++) { - len += scnprintf(buf + len, reg_len - len, - "%s\n", diag_reg[i].reg_info); - for (addr = diag_reg[i].reg_start; - addr <= diag_reg[i].reg_end; addr += 4) { - status = ath6kl_diag_read32(ar, - TARG_VTOP(ar->target_type, addr), - (u32 *)®_val); - if (status) - goto fail_reg_read; - - len += scnprintf(buf + len, reg_len - len, - "0x%06x 0x%08x\n", - addr, le32_to_cpu(reg_val)); - } - } - -done: - file->private_data = buf; - return 0; - -fail_reg_read: - ath6kl_warn("Unable to read memory:%u\n", addr); - vfree(buf); - return -EIO; -} - -static ssize_t ath6kl_regdump_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - u8 *buf = file->private_data; - return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf)); -} - -static int ath6kl_regdump_release(struct inode *inode, struct file *file) -{ - vfree(file->private_data); - return 0; -} - -static const struct file_operations fops_reg_dump = { - .open = ath6kl_regdump_open, - .read = ath6kl_regdump_read, - .release = ath6kl_regdump_release, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_lrssi_roam_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - unsigned long lrssi_roam_threshold; - char buf[32]; - ssize_t len; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - if (strict_strtoul(buf, 0, &lrssi_roam_threshold)) - return -EINVAL; - - ar->lrssi_roam_threshold = lrssi_roam_threshold; - - ath6kl_wmi_set_roam_lrssi_cmd(ar->wmi, ar->lrssi_roam_threshold); - - return count; -} - -static ssize_t ath6kl_lrssi_roam_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - char buf[32]; - unsigned int len; - - len = snprintf(buf, sizeof(buf), "%u\n", ar->lrssi_roam_threshold); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static const struct file_operations fops_lrssi_roam_threshold = { - .read = ath6kl_lrssi_roam_read, - .write = ath6kl_lrssi_roam_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_regwrite_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - u8 buf[32]; - unsigned int len = 0; - - len = scnprintf(buf, sizeof(buf), "Addr: 0x%x Val: 0x%x\n", - ar->debug.diag_reg_addr_wr, ar->debug.diag_reg_val_wr); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static ssize_t ath6kl_regwrite_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - char buf[32]; - char *sptr, *token; - unsigned int len = 0; - u32 reg_addr, reg_val; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - sptr = buf; - - token = strsep(&sptr, "="); - if (!token) - return -EINVAL; - - if (kstrtou32(token, 0, ®_addr)) - return -EINVAL; - - if (!ath6kl_dbg_is_diag_reg_valid(reg_addr)) - return -EINVAL; - - if (kstrtou32(sptr, 0, ®_val)) - return -EINVAL; - - ar->debug.diag_reg_addr_wr = reg_addr; - ar->debug.diag_reg_val_wr = reg_val; - - if (ath6kl_diag_write32(ar, ar->debug.diag_reg_addr_wr, - cpu_to_le32(ar->debug.diag_reg_val_wr))) - return -EIO; - - return count; -} - -static const struct file_operations fops_diag_reg_write = { - .read = ath6kl_regwrite_read, - .write = ath6kl_regwrite_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -int ath6kl_debug_roam_tbl_event(struct ath6kl *ar, const void *buf, - size_t len) -{ - const struct wmi_target_roam_tbl *tbl; - u16 num_entries; - - if (len < sizeof(*tbl)) - return -EINVAL; - - tbl = (const struct wmi_target_roam_tbl *) buf; - num_entries = le16_to_cpu(tbl->num_entries); - if (sizeof(*tbl) + num_entries * sizeof(struct wmi_bss_roam_info) > - len) - return -EINVAL; - - if (ar->debug.roam_tbl == NULL || - ar->debug.roam_tbl_len < (unsigned int) len) { - kfree(ar->debug.roam_tbl); - ar->debug.roam_tbl = kmalloc(len, GFP_ATOMIC); - if (ar->debug.roam_tbl == NULL) - return -ENOMEM; - } - - memcpy(ar->debug.roam_tbl, buf, len); - ar->debug.roam_tbl_len = len; - - if (test_bit(ROAM_TBL_PEND, &ar->flag)) { - clear_bit(ROAM_TBL_PEND, &ar->flag); - wake_up(&ar->event_wq); - } - - return 0; -} - -static ssize_t ath6kl_roam_table_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - int ret; - long left; - struct wmi_target_roam_tbl *tbl; - u16 num_entries, i; - char *buf; - unsigned int len, buf_len; - ssize_t ret_cnt; - - if (down_interruptible(&ar->sem)) - return -EBUSY; - - set_bit(ROAM_TBL_PEND, &ar->flag); - - ret = ath6kl_wmi_get_roam_tbl_cmd(ar->wmi); - if (ret) { - up(&ar->sem); - return ret; - } - - left = wait_event_interruptible_timeout( - ar->event_wq, !test_bit(ROAM_TBL_PEND, &ar->flag), WMI_TIMEOUT); - up(&ar->sem); - - if (left <= 0) - return -ETIMEDOUT; - - if (ar->debug.roam_tbl == NULL) - return -ENOMEM; - - tbl = (struct wmi_target_roam_tbl *) ar->debug.roam_tbl; - num_entries = le16_to_cpu(tbl->num_entries); - - buf_len = 100 + num_entries * 100; - buf = kzalloc(buf_len, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - len = 0; - len += scnprintf(buf + len, buf_len - len, - "roam_mode=%u\n\n" - "# roam_util bssid rssi rssidt last_rssi util bias\n", - le16_to_cpu(tbl->roam_mode)); - - for (i = 0; i < num_entries; i++) { - struct wmi_bss_roam_info *info = &tbl->info[i]; - len += scnprintf(buf + len, buf_len - len, - "%d %pM %d %d %d %d %d\n", - a_sle32_to_cpu(info->roam_util), info->bssid, - info->rssi, info->rssidt, info->last_rssi, - info->util, info->bias); - } - - if (len > buf_len) - len = buf_len; - - ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); - - kfree(buf); - return ret_cnt; -} - -static const struct file_operations fops_roam_table = { - .read = ath6kl_roam_table_read, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_force_roam_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - int ret; - char buf[20]; - size_t len; - u8 bssid[ETH_ALEN]; - int i; - int addr[ETH_ALEN]; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - buf[len] = '\0'; - - if (sscanf(buf, "%02x:%02x:%02x:%02x:%02x:%02x", - &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5]) - != ETH_ALEN) - return -EINVAL; - for (i = 0; i < ETH_ALEN; i++) - bssid[i] = addr[i]; - - ret = ath6kl_wmi_force_roam_cmd(ar->wmi, bssid); - if (ret) - return ret; - - return count; -} - -static const struct file_operations fops_force_roam = { - .write = ath6kl_force_roam_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_roam_mode_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - int ret; - char buf[20]; - size_t len; - enum wmi_roam_mode mode; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - buf[len] = '\0'; - if (len > 0 && buf[len - 1] == '\n') - buf[len - 1] = '\0'; - - if (strcasecmp(buf, "default") == 0) - mode = WMI_DEFAULT_ROAM_MODE; - else if (strcasecmp(buf, "bssbias") == 0) - mode = WMI_HOST_BIAS_ROAM_MODE; - else if (strcasecmp(buf, "lock") == 0) - mode = WMI_LOCK_BSS_MODE; - else - return -EINVAL; - - ret = ath6kl_wmi_set_roam_mode_cmd(ar->wmi, mode); - if (ret) - return ret; - - return count; -} - -static const struct file_operations fops_roam_mode = { - .write = ath6kl_roam_mode_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -void ath6kl_debug_set_keepalive(struct ath6kl *ar, u8 keepalive) -{ - ar->debug.keepalive = keepalive; -} - -static ssize_t ath6kl_keepalive_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - char buf[16]; - int len; - - len = snprintf(buf, sizeof(buf), "%u\n", ar->debug.keepalive); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static ssize_t ath6kl_keepalive_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - int ret; - u8 val; - - ret = kstrtou8_from_user(user_buf, count, 0, &val); - if (ret) - return ret; - - ret = ath6kl_wmi_set_keepalive_cmd(ar->wmi, 0, val); - if (ret) - return ret; - - return count; -} - -static const struct file_operations fops_keepalive = { - .open = ath6kl_debugfs_open, - .read = ath6kl_keepalive_read, - .write = ath6kl_keepalive_write, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -void ath6kl_debug_set_disconnect_timeout(struct ath6kl *ar, u8 timeout) -{ - ar->debug.disc_timeout = timeout; -} - -static ssize_t ath6kl_disconnect_timeout_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - char buf[16]; - int len; - - len = snprintf(buf, sizeof(buf), "%u\n", ar->debug.disc_timeout); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static ssize_t ath6kl_disconnect_timeout_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - int ret; - u8 val; - - ret = kstrtou8_from_user(user_buf, count, 0, &val); - if (ret) - return ret; - - ret = ath6kl_wmi_disctimeout_cmd(ar->wmi, 0, val); - if (ret) - return ret; - - return count; -} - -static const struct file_operations fops_disconnect_timeout = { - .open = ath6kl_debugfs_open, - .read = ath6kl_disconnect_timeout_read, - .write = ath6kl_disconnect_timeout_write, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_create_qos_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - char buf[200]; - ssize_t len; - char *sptr, *token; - struct wmi_create_pstream_cmd pstream; - u32 val32; - u16 val16; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - buf[len] = '\0'; - sptr = buf; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &pstream.user_pri)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &pstream.traffic_direc)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &pstream.traffic_class)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &pstream.traffic_type)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &pstream.voice_psc_cap)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.min_service_int = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.max_service_int = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.inactivity_int = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.suspension_int = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.service_start_time = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &pstream.tsid)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &val16)) - return -EINVAL; - pstream.nominal_msdu = cpu_to_le16(val16); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &val16)) - return -EINVAL; - pstream.max_msdu = cpu_to_le16(val16); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.min_data_rate = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.mean_data_rate = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.peak_data_rate = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.max_burst_size = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.delay_bound = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.min_phy_rate = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.sba = cpu_to_le32(val32); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &val32)) - return -EINVAL; - pstream.medium_time = cpu_to_le32(val32); - - pstream.nominal_phy = ((le32_to_cpu(pstream.min_phy_rate) / 1000) / 1000); - - ath6kl_wmi_create_pstream_cmd(ar->wmi, vif->fw_vif_idx, &pstream); - - return count; -} - -static const struct file_operations fops_create_qos = { - .write = ath6kl_create_qos_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_delete_qos_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - char buf[100]; - ssize_t len; - char *sptr, *token; - u8 traffic_class; - u8 tsid; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - buf[len] = '\0'; - sptr = buf; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &traffic_class)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &tsid)) - return -EINVAL; - - ath6kl_wmi_delete_pstream_cmd(ar->wmi, vif->fw_vif_idx, - traffic_class, tsid); - - return count; -} - -static const struct file_operations fops_delete_qos = { - .write = ath6kl_delete_qos_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_bgscan_int_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - u16 bgscan_int; - char buf[32]; - ssize_t len; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - if (kstrtou16(buf, 0, &bgscan_int)) - return -EINVAL; - - if (bgscan_int == 0) - bgscan_int = 0xffff; - - vif->bg_scan_period = bgscan_int; - ath6kl_wmi_scanparams_cmd(ar->wmi, 0, 0, 0, bgscan_int, 0, 0, 0, 3, - vif->scan_ctrl_flag, 0, 0); - - return count; -} - -static const struct file_operations fops_bgscan_int = { - .write = ath6kl_bgscan_int_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_listen_int_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - u16 listen_interval; - char buf[32]; - ssize_t len; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - if (kstrtou16(buf, 0, &listen_interval)) - return -EINVAL; - - if ((listen_interval < 15) || (listen_interval > 3000)) - return -EINVAL; - - vif->listen_intvl_t = listen_interval; - ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, - vif->listen_intvl_t, 0); - - return count; -} - -static ssize_t ath6kl_listen_int_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - char buf[32]; - int len; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = scnprintf(buf, sizeof(buf), "%u\n", vif->listen_intvl_t); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static const struct file_operations fops_listen_int = { - .read = ath6kl_listen_int_read, - .write = ath6kl_listen_int_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_mcastrate_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - u16 mcastrate; - char buf[32]; - ssize_t len; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - if (kstrtou16(buf, 0, &mcastrate)) - return -EINVAL; - - vif->mcastrate = mcastrate; - ath6kl_wmi_mcastrate_cmd(ar->wmi, vif->fw_vif_idx, - vif->mcastrate); - - return count; -} - -static ssize_t ath6kl_mcastrate_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - char buf[32]; - int len; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = scnprintf(buf, sizeof(buf), "%u\n", vif->mcastrate); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static const struct file_operations fops_mcastrate = { - .read = ath6kl_mcastrate_read, - .write = ath6kl_mcastrate_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_power_params_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - u8 buf[100]; - unsigned int len = 0; - char *sptr, *token; - u16 idle_period, ps_poll_num, dtim, - tx_wakeup, num_tx; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - buf[len] = '\0'; - sptr = buf; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &idle_period)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &ps_poll_num)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &dtim)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &tx_wakeup)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &num_tx)) - return -EINVAL; - - ath6kl_wmi_pmparams_cmd(ar->wmi, 0, idle_period, ps_poll_num, - dtim, tx_wakeup, num_tx, 0); - - return count; -} - -static const struct file_operations fops_power_params = { - .write = ath6kl_power_params_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_lrssi_roam_config_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct low_rssi_scan_params lrssi_params; - char buf[32]; - ssize_t len; - char *sptr, *token; - u16 val16; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - sptr = buf; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &val16)) - return -EINVAL; - lrssi_params.lrssi_scan_period = cpu_to_le16(val16); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &val16)) - return -EINVAL; - lrssi_params.lrssi_scan_threshold = cpu_to_le16(val16); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou16(token, 0, &val16)) - return -EINVAL; - lrssi_params.lrssi_roam_threshold = cpu_to_le16(val16); - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &lrssi_params.roam_rssi_floor)) - return -EINVAL; - - ath6kl_wmi_set_roam_lrssi_config_cmd(ar->wmi, &lrssi_params); - - return count; -} - -static const struct file_operations fops_lrssi_roam_config = { - .write = ath6kl_lrssi_roam_config_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_ht_cap_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - struct wmi_set_ht_cap_cmd ht_cap; - char buf[32]; - ssize_t len; - char *sptr, *token; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - sptr = buf; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &ht_cap.band)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &ht_cap.enable)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &ht_cap.chan_width_40m_supported)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &ht_cap.short_gi_20mhz)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &ht_cap.short_gi_40mhz)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &ht_cap.intolerance_40mhz)) - return -EINVAL; - - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou8(token, 0, &ht_cap.max_ampdu_len_exp)) - return -EINVAL; - - ath6kl_wmi_set_ht_cap_cmd(ar->wmi, vif->fw_vif_idx, &ht_cap); - - return count; -} - -static const struct file_operations fops_ht_cap = { - .write = ath6kl_ht_cap_write, - .open = ath6kl_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -int ath6kl_debug_init(struct ath6kl *ar) -{ - skb_queue_head_init(&ar->debug.fwlog_queue); - init_completion(&ar->debug.fwlog_completion); - - /* - * Actually we are lying here but don't know how to read the mask - * value from the firmware. - */ - ar->debug.fwlog_mask = 0; - - ar->debugfs_phy = debugfs_create_dir("ath6kl", - ar->wiphy->debugfsdir); - if (!ar->debugfs_phy) - return -ENOMEM; - - debugfs_create_file("tgt_stats", S_IRUSR, ar->debugfs_phy, ar, - &fops_tgt_stats); - - debugfs_create_file("credit_dist_stats", S_IRUSR, ar->debugfs_phy, ar, - &fops_credit_dist_stats); - - debugfs_create_file("endpoint_stats", S_IRUSR | S_IWUSR, - ar->debugfs_phy, ar, &fops_endpoint_stats); - - debugfs_create_file("fwlog", S_IRUSR, ar->debugfs_phy, ar, - &fops_fwlog); - - debugfs_create_file("fwlog_block", S_IRUSR, ar->debugfs_phy, ar, - &fops_fwlog_block); - - debugfs_create_file("fwlog_mask", S_IRUSR | S_IWUSR, ar->debugfs_phy, - ar, &fops_fwlog_mask); - - debugfs_create_file("reg_addr", S_IRUSR | S_IWUSR, ar->debugfs_phy, ar, - &fops_diag_reg_read); - - debugfs_create_file("reg_dump", S_IRUSR, ar->debugfs_phy, ar, - &fops_reg_dump); - - debugfs_create_file("lrssi_roam_threshold", S_IRUSR | S_IWUSR, - ar->debugfs_phy, ar, &fops_lrssi_roam_threshold); - - debugfs_create_file("reg_write", S_IRUSR | S_IWUSR, - ar->debugfs_phy, ar, &fops_diag_reg_write); - - debugfs_create_file("war_stats", S_IRUSR, ar->debugfs_phy, ar, - &fops_war_stats); - - debugfs_create_file("roam_table", S_IRUSR, ar->debugfs_phy, ar, - &fops_roam_table); - - debugfs_create_file("force_roam", S_IWUSR, ar->debugfs_phy, ar, - &fops_force_roam); - - debugfs_create_file("roam_mode", S_IWUSR, ar->debugfs_phy, ar, - &fops_roam_mode); - - debugfs_create_file("keepalive", S_IRUSR | S_IWUSR, ar->debugfs_phy, ar, - &fops_keepalive); - - debugfs_create_file("disconnect_timeout", S_IRUSR | S_IWUSR, - ar->debugfs_phy, ar, &fops_disconnect_timeout); - - debugfs_create_file("create_qos", S_IWUSR, ar->debugfs_phy, ar, - &fops_create_qos); - - debugfs_create_file("delete_qos", S_IWUSR, ar->debugfs_phy, ar, - &fops_delete_qos); - - debugfs_create_file("bgscan_interval", S_IWUSR, - ar->debugfs_phy, ar, &fops_bgscan_int); - - debugfs_create_file("listen_interval", S_IRUSR | S_IWUSR, - ar->debugfs_phy, ar, &fops_listen_int); - - debugfs_create_file("mcast_rate", S_IRUSR | S_IWUSR, - ar->debugfs_phy, ar, &fops_mcastrate); - - debugfs_create_file("power_params", S_IWUSR, ar->debugfs_phy, ar, - &fops_power_params); - - debugfs_create_file("lrssi_roam_config", S_IRUSR, ar->debugfs_phy, ar, - &fops_lrssi_roam_config); - - debugfs_create_file("ht_cap", S_IRUSR, ar->debugfs_phy, ar, - &fops_ht_cap); - - return ath6kl_init_debugfs_pri(ar); -} - -void ath6kl_debug_cleanup(struct ath6kl *ar) -{ - skb_queue_purge(&ar->debug.fwlog_queue); - kfree(ar->debug.roam_tbl); -} - -#endif diff --git a/drivers/net/wireless/ath/ath6kl/debug.h b/drivers/net/wireless/ath/ath6kl/debug.h deleted file mode 100755 index aaecb5d..0000000 --- a/drivers/net/wireless/ath/ath6kl/debug.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef DEBUG_H -#define DEBUG_H - -#include "hif.h" - -enum ATH6K_DEBUG_MASK { - ATH6KL_DBG_CREDIT = BIT(0), - /* hole */ - ATH6KL_DBG_WLAN_TX = BIT(2), /* wlan tx */ - ATH6KL_DBG_WLAN_RX = BIT(3), /* wlan rx */ - ATH6KL_DBG_BMI = BIT(4), /* bmi tracing */ - ATH6KL_DBG_HTC = BIT(5), - ATH6KL_DBG_HIF = BIT(6), - ATH6KL_DBG_IRQ = BIT(7), /* interrupt processing */ - /* hole */ - /* hole */ - ATH6KL_DBG_WMI = BIT(10), /* wmi tracing */ - ATH6KL_DBG_TRC = BIT(11), /* generic func tracing */ - ATH6KL_DBG_SCATTER = BIT(12), /* hif scatter tracing */ - ATH6KL_DBG_WLAN_CFG = BIT(13), /* cfg80211 i/f file tracing */ - ATH6KL_DBG_RAW_BYTES = BIT(14), /* dump tx/rx frames */ - ATH6KL_DBG_AGGR = BIT(15), /* aggregation */ - ATH6KL_DBG_SDIO = BIT(16), - ATH6KL_DBG_SDIO_DUMP = BIT(17), - ATH6KL_DBG_BOOT = BIT(18), /* driver init and fw boot */ - ATH6KL_DBG_WMI_DUMP = BIT(19), - ATH6KL_DBG_SUSPEND = BIT(20), - ATH6KL_DBG_USB = BIT(21), - ATH6KL_DBG_ANY = 0xffffffff /* enable all logs */ -}; - -extern unsigned int debug_mask; -extern __printf(2, 3) -int ath6kl_printk(const char *level, const char *fmt, ...); -char *sec_conv_mac(const u8 *mac); - -#define ath6kl_info(fmt, ...) \ - ath6kl_printk(KERN_INFO, fmt, ##__VA_ARGS__) -#define ath6kl_err(fmt, ...) \ - ath6kl_printk(KERN_INFO, fmt, ##__VA_ARGS__) -#define ath6kl_warn(fmt, ...) \ - ath6kl_printk(KERN_INFO, fmt, ##__VA_ARGS__) - -#define AR_DBG_LVL_CHECK(mask) (debug_mask & mask) - -enum ath6kl_war { - ATH6KL_WAR_INVALID_RATE, -}; - -#ifdef CONFIG_ATH6KL_DEBUG -#define ath6kl_dbg(mask, fmt, ...) \ - ({ \ - int rtn; \ - if (debug_mask & mask) \ - rtn = ath6kl_printk(KERN_DEBUG, fmt, ##__VA_ARGS__); \ - else \ - rtn = 0; \ - \ - rtn; \ - }) - -static inline void ath6kl_dbg_dump(enum ATH6K_DEBUG_MASK mask, - const char *msg, const char *prefix, - const void *buf, size_t len) -{ - if (debug_mask & mask) { - if (msg) - ath6kl_dbg(mask, "%s\n", msg); - - print_hex_dump_bytes(prefix, DUMP_PREFIX_OFFSET, buf, len); - } -} - -void ath6kl_dump_registers(struct ath6kl_device *dev, - struct ath6kl_irq_proc_registers *irq_proc_reg, - struct ath6kl_irq_enable_reg *irq_en_reg); -void dump_cred_dist_stats(struct htc_target *target); -void ath6kl_debug_fwlog_event(struct ath6kl *ar, const void *buf, size_t len); -void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war); -int ath6kl_debug_roam_tbl_event(struct ath6kl *ar, const void *buf, - size_t len); -void ath6kl_debug_set_keepalive(struct ath6kl *ar, u8 keepalive); -void ath6kl_debug_set_disconnect_timeout(struct ath6kl *ar, u8 timeout); -int ath6kl_debug_init(struct ath6kl *ar); -void ath6kl_debug_cleanup(struct ath6kl *ar); - -#else -static inline int ath6kl_dbg(enum ATH6K_DEBUG_MASK dbg_mask, - const char *fmt, ...) -{ - return 0; -} - -static inline void ath6kl_dbg_dump(enum ATH6K_DEBUG_MASK mask, - const char *msg, const char *prefix, - const void *buf, size_t len) -{ -} - -static inline void ath6kl_dump_registers(struct ath6kl_device *dev, - struct ath6kl_irq_proc_registers *irq_proc_reg, - struct ath6kl_irq_enable_reg *irq_en_reg) -{ - -} -static inline void dump_cred_dist_stats(struct htc_target *target) -{ -} - -static inline void ath6kl_debug_fwlog_event(struct ath6kl *ar, - const void *buf, size_t len) -{ -} - -static inline void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war) -{ -} - -static inline int ath6kl_debug_roam_tbl_event(struct ath6kl *ar, - const void *buf, size_t len) -{ - return 0; -} - -static inline void ath6kl_debug_set_keepalive(struct ath6kl *ar, u8 keepalive) -{ -} - -static inline void ath6kl_debug_set_disconnect_timeout(struct ath6kl *ar, - u8 timeout) -{ -} - -static inline int ath6kl_debug_init(struct ath6kl *ar) -{ - return 0; -} - -static inline void ath6kl_debug_cleanup(struct ath6kl *ar) -{ -} - -#endif -#endif diff --git a/drivers/net/wireless/ath/ath6kl/debugfs_pri.c b/drivers/net/wireless/ath/ath6kl/debugfs_pri.c deleted file mode 100644 index 1130cb2..0000000 --- a/drivers/net/wireless/ath/ath6kl/debugfs_pri.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (c) 2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifdef CONFIG_ATH6KL_DEBUG - -#include -#include -#include "core.h" -#include "wmi.h" -#include "debug.h" -#include "debugfs_pri.h" - -struct wmi_set_inact_period_cmd { - __le32 inact_period; - u8 num_null_func; -} __packed; - -static inline struct sk_buff *ath6kl_wmi_get_new_buf_pri(u32 size) -{ - struct sk_buff *skb; - - skb = ath6kl_buf_alloc(size); - if (!skb) - return NULL; - - skb_put(skb, size); - if (size) - memset(skb->data, 0, size); - - return skb; -} - -static int ath6kl_wmi_inact_period_cmd(struct wmi *wmi, u32 inact_period, - u8 num_null_func) -{ - struct sk_buff *skb; - struct wmi_set_inact_period_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf_pri(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_inact_period_cmd *) skb->data; - cmd->inact_period = cpu_to_le32(inact_period); - cmd->num_null_func = num_null_func; - - ret = ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_AP_CONN_INACT_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -static int ath6kl_wmi_set_err_report_bitmask(struct wmi *wmi, u8 if_idx, - u32 mask) -{ - struct sk_buff *skb; - struct wmi_tgt_err_report_mask *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf_pri(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_tgt_err_report_mask *) skb->data; - cmd->mask = cpu_to_le32(mask); - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, - WMI_TARGET_ERROR_REPORT_BITMASK_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_error_report_event(struct wmi *wmi, u8 *data, int len) -{ - struct wmi_tgt_err_report_evt *report; - - if (len < sizeof(*report)) - return -EINVAL; - - report = (struct wmi_tgt_err_report_evt *) data; - ath6kl_dbg(ATH6KL_DBG_WMI, "Reason for error report: 0x%x\n", - report->err_val); - - return 0; -} - -static int ath6kl_debugfs_open_pri(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t ath6kl_inact_period_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - int ret; - char buf[32]; - u32 inact_period; - size_t len; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - if (kstrtou32(buf, 0, &inact_period)) - return -EINVAL; - - ret = ath6kl_wmi_inact_period_cmd(ar->wmi, inact_period, 0); - - if (ret) - return ret; - - return count; -} - -static const struct file_operations fops_inact_period = { - .write = ath6kl_inact_period_write, - .open = ath6kl_debugfs_open_pri, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_bmisstime_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - u16 bmiss_time; - char buf[32]; - ssize_t len; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = min(count, sizeof(buf) - 1); - if (copy_from_user(buf, user_buf, len)) - return -EFAULT; - - buf[len] = '\0'; - if (kstrtou16(buf, 0, &bmiss_time)) - return -EINVAL; - - vif->bmiss_time_t = bmiss_time; - - /* Enable error report event for bmiss */ - ath6kl_wmi_set_err_report_bitmask(ar->wmi, vif->fw_vif_idx, - ATH6KL_ERR_REPORT_BMISS_MASK); - - ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx, - vif->bmiss_time_t, 0); - return count; -} - -static ssize_t ath6kl_bmisstime_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - char buf[32]; - int len; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - len = scnprintf(buf, sizeof(buf), "%u\n", vif->bmiss_time_t); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); -} - -static const struct file_operations fops_bmisstime = { - .read = ath6kl_bmisstime_read, - .write = ath6kl_bmisstime_write, - .open = ath6kl_debugfs_open_pri, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -static ssize_t ath6kl_scan_ctrl_flag_write(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct ath6kl *ar = file->private_data; - struct ath6kl_vif *vif; - u8 ctrl_flag; - int ret; - - vif = ath6kl_vif_first(ar); - if (!vif) - return -EIO; - - ret = kstrtou8_from_user(user_buf, count, 0, &ctrl_flag); - if (ret) - return ret; - - if (ctrl_flag > ATH6KL_MAX_SCAN_CTRL_FLAGS) - ctrl_flag = ATH6KL_DEFAULT_SCAN_CTRL_FLAGS; - - vif->scan_ctrl_flag = ctrl_flag; - ath6kl_wmi_scanparams_cmd(ar->wmi, 0, 0, 0, vif->bg_scan_period, 0, 0, - 0, 3, ctrl_flag, 0, 0); - - return count; -} - -static const struct file_operations fops_scanctrl_flag = { - .write = ath6kl_scan_ctrl_flag_write, - .open = ath6kl_debugfs_open_pri, - .owner = THIS_MODULE, - .llseek = default_llseek, -}; - -int ath6kl_init_debugfs_pri(struct ath6kl *ar) -{ - debugfs_create_file("inactivity_period", S_IWUSR, ar->debugfs_phy, ar, - &fops_inact_period); - - debugfs_create_file("bmiss_time", S_IRUSR | S_IWUSR, ar->debugfs_phy, - ar, &fops_bmisstime); - - debugfs_create_file("scan_ctrl_flag", S_IRUSR, ar->debugfs_phy, ar, - &fops_scanctrl_flag); - - return 0; -} - -#endif diff --git a/drivers/net/wireless/ath/ath6kl/debugfs_pri.h b/drivers/net/wireless/ath/ath6kl/debugfs_pri.h deleted file mode 100644 index de862f2..0000000 --- a/drivers/net/wireless/ath/ath6kl/debugfs_pri.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef DEBUG_PRI_H -#define DEBUG_PRI_H - -#ifdef CONFIG_ATH6KL_DEBUG - -#define ATH6KL_ERR_REPORT_BMISS_MASK BIT(3) - -struct wmi_tgt_err_report_mask { - __le32 mask; -}; - -struct wmi_tgt_err_report_evt { - __le32 err_val; -} __packed; - -#define ATH6KL_DEFAULT_SCAN_CTRL_FLAGS (CONNECT_SCAN_CTRL_FLAGS | \ - SCAN_CONNECTED_CTRL_FLAGS | \ - ACTIVE_SCAN_CTRL_FLAGS | \ - ROAM_SCAN_CTRL_FLAGS | \ - ENABLE_AUTO_CTRL_FLAGS) - -#define ATH6KL_MAX_SCAN_CTRL_FLAGS 0x7F - -int ath6kl_wmi_error_report_event(struct wmi *wmi, u8 *data, int len); -int ath6kl_init_debugfs_pri(struct ath6kl *ar); -#endif -#endif diff --git a/drivers/net/wireless/ath/ath6kl/hif-ops.h b/drivers/net/wireless/ath/ath6kl/hif-ops.h deleted file mode 100755 index fb2b196..0000000 --- a/drivers/net/wireless/ath/ath6kl/hif-ops.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef HIF_OPS_H -#define HIF_OPS_H - -#include "hif.h" -#include "debug.h" - -static inline int hif_read_write_sync(struct ath6kl *ar, u32 addr, u8 *buf, - u32 len, u32 request) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, - "hif %s sync addr 0x%x buf 0x%p len %d request 0x%x\n", - (request & HIF_WRITE) ? "write" : "read", - addr, buf, len, request); - - return ar->hif_ops->read_write_sync(ar, addr, buf, len, request); -} - -static inline int hif_write_async(struct ath6kl *ar, u32 address, u8 *buffer, - u32 length, u32 request, - struct htc_packet *packet) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, - "hif write async addr 0x%x buf 0x%p len %d request 0x%x\n", - address, buffer, length, request); - - return ar->hif_ops->write_async(ar, address, buffer, length, - request, packet); -} -static inline void ath6kl_hif_irq_enable(struct ath6kl *ar) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, "hif irq enable\n"); - - return ar->hif_ops->irq_enable(ar); -} - -static inline void ath6kl_hif_irq_disable(struct ath6kl *ar) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, "hif irq disable\n"); - - return ar->hif_ops->irq_disable(ar); -} - -static inline struct hif_scatter_req *hif_scatter_req_get(struct ath6kl *ar) -{ - return ar->hif_ops->scatter_req_get(ar); -} - -static inline void hif_scatter_req_add(struct ath6kl *ar, - struct hif_scatter_req *s_req) -{ - return ar->hif_ops->scatter_req_add(ar, s_req); -} - -static inline int ath6kl_hif_enable_scatter(struct ath6kl *ar) -{ - return ar->hif_ops->enable_scatter(ar); -} - -static inline int ath6kl_hif_scat_req_rw(struct ath6kl *ar, - struct hif_scatter_req *scat_req) -{ - return ar->hif_ops->scat_req_rw(ar, scat_req); -} - -static inline void ath6kl_hif_cleanup_scatter(struct ath6kl *ar) -{ - return ar->hif_ops->cleanup_scatter(ar); -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) -static inline int ath6kl_hif_suspend(struct ath6kl *ar, - struct cfg80211_wowlan *wow) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, "hif suspend\n"); - - return ar->hif_ops->suspend(ar, wow); -} -#endif - -/* - * Read from the ATH6KL through its diagnostic window. No cooperation from - * the Target is required for this. - */ -static inline int ath6kl_hif_diag_read32(struct ath6kl *ar, u32 address, - u32 *value) -{ - return ar->hif_ops->diag_read32(ar, address, value); -} - -/* - * Write to the ATH6KL through its diagnostic window. No cooperation from - * the Target is required for this. - */ -static inline int ath6kl_hif_diag_write32(struct ath6kl *ar, u32 address, - __le32 value) -{ - return ar->hif_ops->diag_write32(ar, address, value); -} - -static inline int ath6kl_hif_bmi_read(struct ath6kl *ar, u8 *buf, u32 len) -{ - return ar->hif_ops->bmi_read(ar, buf, len); -} - -static inline int ath6kl_hif_bmi_write(struct ath6kl *ar, u8 *buf, u32 len) -{ - return ar->hif_ops->bmi_write(ar, buf, len); -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) -static inline int ath6kl_hif_resume(struct ath6kl *ar) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, "hif resume\n"); - - return ar->hif_ops->resume(ar); -} -#endif - -static inline int ath6kl_hif_power_on(struct ath6kl *ar) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, "hif power on\n"); - - return ar->hif_ops->power_on(ar); -} - -static inline int ath6kl_hif_power_off(struct ath6kl *ar) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, "hif power off\n"); - - return ar->hif_ops->power_off(ar); -} - -static inline void ath6kl_hif_stop(struct ath6kl *ar) -{ - ath6kl_dbg(ATH6KL_DBG_HIF, "hif stop\n"); - - ar->hif_ops->stop(ar); -} - -#endif diff --git a/drivers/net/wireless/ath/ath6kl/hif.c b/drivers/net/wireless/ath/ath6kl/hif.c deleted file mode 100755 index 2793ab6..0000000 --- a/drivers/net/wireless/ath/ath6kl/hif.c +++ /dev/null @@ -1,791 +0,0 @@ -/* - * Copyright (c) 2007-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -#include "hif.h" - -#include "core.h" -#include "target.h" -#include "hif-ops.h" -#include "debug.h" - -#define MAILBOX_FOR_BLOCK_SIZE 1 - -#define ATH6KL_TIME_QUANTUM 10 /* in ms */ - -static int ath6kl_hif_cp_scat_dma_buf(struct hif_scatter_req *req, - bool from_dma) -{ - u8 *buf; - int i; - - buf = req->virt_dma_buf; - - for (i = 0; i < req->scat_entries; i++) { - - if (from_dma) - memcpy(req->scat_list[i].buf, buf, - req->scat_list[i].len); - else - memcpy(buf, req->scat_list[i].buf, - req->scat_list[i].len); - - buf += req->scat_list[i].len; - } - - return 0; -} - -int ath6kl_hif_rw_comp_handler(void *context, int status) -{ - struct htc_packet *packet = context; - - ath6kl_dbg(ATH6KL_DBG_HIF, "hif rw completion pkt 0x%p status %d\n", - packet, status); - - packet->status = status; - packet->completion(packet->context, packet); - - return 0; -} -#define REG_DUMP_COUNT_AR6003 60 -#define REGISTER_DUMP_LEN_MAX 60 - -static void ath6kl_hif_dump_fw_crash(struct ath6kl *ar) -{ - __le32 regdump_val[REGISTER_DUMP_LEN_MAX]; - u32 i, address, regdump_addr = 0; - int ret; - - if (ar->target_type != TARGET_TYPE_AR6003) - return; - - /* the reg dump pointer is copied to the host interest area */ - address = ath6kl_get_hi_item_addr(ar, HI_ITEM(hi_failure_state)); - address = TARG_VTOP(ar->target_type, address); - - /* read RAM location through diagnostic window */ - ret = ath6kl_diag_read32(ar, address, ®dump_addr); - - if (ret || !regdump_addr) { - ath6kl_warn("failed to get ptr to register dump area: %d\n", - ret); - return; - } - - ath6kl_dbg(ATH6KL_DBG_IRQ, "register dump data address 0x%x\n", - regdump_addr); - regdump_addr = TARG_VTOP(ar->target_type, regdump_addr); - - /* fetch register dump data */ - ret = ath6kl_diag_read(ar, regdump_addr, (u8 *)®dump_val[0], - REG_DUMP_COUNT_AR6003 * (sizeof(u32))); - if (ret) { - ath6kl_warn("failed to get register dump: %d\n", ret); - return; - } - - ath6kl_info("crash dump:\n"); - ath6kl_info("hw 0x%x fw %s\n", ar->wiphy->hw_version, - ar->wiphy->fw_version); - - BUILD_BUG_ON(REG_DUMP_COUNT_AR6003 % 4); - - for (i = 0; i < REG_DUMP_COUNT_AR6003; i += 4) { - ath6kl_info("%d: 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x\n", - i, - le32_to_cpu(regdump_val[i]), - le32_to_cpu(regdump_val[i + 1]), - le32_to_cpu(regdump_val[i + 2]), - le32_to_cpu(regdump_val[i + 3])); - } - -} - -static int ath6kl_hif_proc_dbg_intr(struct ath6kl_device *dev) -{ - u32 dummy; - int ret; - struct ath6kl_vif *vif; - - vif = ath6kl_vif_first(dev->ar); - - ath6kl_warn("firmware crashed\n"); - - /* - * read counter to clear the interrupt, the debug error interrupt is - * counter 0. - */ - ret = hif_read_write_sync(dev->ar, COUNT_DEC_ADDRESS, - (u8 *)&dummy, 4, HIF_RD_SYNC_BYTE_INC); - if (ret) - ath6kl_warn("Failed to clear debug interrupt: %d\n", ret); - - ath6kl_hif_dump_fw_crash(dev->ar); - ath6kl_read_fwlogs(dev->ar); - - cfg80211_priv_event(vif->ndev, "HANG", GFP_ATOMIC); - - return ret; -} - -/* mailbox recv message polling */ -int ath6kl_hif_poll_mboxmsg_rx(struct ath6kl_device *dev, u32 *lk_ahd, - int timeout) -{ - struct ath6kl_irq_proc_registers *rg; - int status = 0, i; - u8 htc_mbox = 1 << HTC_MAILBOX; - - for (i = timeout / ATH6KL_TIME_QUANTUM; i > 0; i--) { - /* this is the standard HIF way, load the reg table */ - status = hif_read_write_sync(dev->ar, HOST_INT_STATUS_ADDRESS, - (u8 *) &dev->irq_proc_reg, - sizeof(dev->irq_proc_reg), - HIF_RD_SYNC_BYTE_INC); - - if (status) { - ath6kl_err("failed to read reg table\n"); - return status; - } - - /* check for MBOX data and valid lookahead */ - if (dev->irq_proc_reg.host_int_status & htc_mbox) { - if (dev->irq_proc_reg.rx_lkahd_valid & - htc_mbox) { - /* - * Mailbox has a message and the look ahead - * is valid. - */ - rg = &dev->irq_proc_reg; - *lk_ahd = - le32_to_cpu(rg->rx_lkahd[HTC_MAILBOX]); - break; - } - } - - /* delay a little */ - mdelay(ATH6KL_TIME_QUANTUM); - ath6kl_dbg(ATH6KL_DBG_HIF, "hif retry mbox poll try %d\n", i); - } - - if (i == 0) { - ath6kl_err("timeout waiting for recv message\n"); - status = -ETIME; - /* check if the target asserted */ - if (dev->irq_proc_reg.counter_int_status & - ATH6KL_TARGET_DEBUG_INTR_MASK) - /* - * Target failure handler will be called in case of - * an assert. - */ - ath6kl_hif_proc_dbg_intr(dev); - } - - return status; -} - -/* - * Disable packet reception (used in case the host runs out of buffers) - * using the interrupt enable registers through the host I/F - */ -int ath6kl_hif_rx_control(struct ath6kl_device *dev, bool enable_rx) -{ - struct ath6kl_irq_enable_reg regs; - int status = 0; - - ath6kl_dbg(ATH6KL_DBG_HIF, "hif rx %s\n", - enable_rx ? "enable" : "disable"); - - /* take the lock to protect interrupt enable shadows */ - spin_lock_bh(&dev->lock); - - if (enable_rx) - dev->irq_en_reg.int_status_en |= - SM(INT_STATUS_ENABLE_MBOX_DATA, 0x01); - else - dev->irq_en_reg.int_status_en &= - ~SM(INT_STATUS_ENABLE_MBOX_DATA, 0x01); - - memcpy(®s, &dev->irq_en_reg, sizeof(regs)); - - spin_unlock_bh(&dev->lock); - - status = hif_read_write_sync(dev->ar, INT_STATUS_ENABLE_ADDRESS, - ®s.int_status_en, - sizeof(struct ath6kl_irq_enable_reg), - HIF_WR_SYNC_BYTE_INC); - - return status; -} - -int ath6kl_hif_submit_scat_req(struct ath6kl_device *dev, - struct hif_scatter_req *scat_req, bool read) -{ - int status = 0; - - if (read) { - scat_req->req = HIF_RD_SYNC_BLOCK_FIX; - scat_req->addr = dev->ar->mbox_info.htc_addr; - } else { - scat_req->req = HIF_WR_ASYNC_BLOCK_INC; - - scat_req->addr = - (scat_req->len > HIF_MBOX_WIDTH) ? - dev->ar->mbox_info.htc_ext_addr : - dev->ar->mbox_info.htc_addr; - } - - ath6kl_dbg(ATH6KL_DBG_HIF, - "hif submit scatter request entries %d len %d mbox 0x%x %s %s\n", - scat_req->scat_entries, scat_req->len, - scat_req->addr, !read ? "async" : "sync", - (read) ? "rd" : "wr"); - - if (!read && scat_req->virt_scat) { - status = ath6kl_hif_cp_scat_dma_buf(scat_req, false); - if (status) { - scat_req->status = status; - scat_req->complete(dev->ar->htc_target, scat_req); - return 0; - } - } - - status = ath6kl_hif_scat_req_rw(dev->ar, scat_req); - - if (read) { - /* in sync mode, we can touch the scatter request */ - scat_req->status = status; - if (!status && scat_req->virt_scat) - scat_req->status = - ath6kl_hif_cp_scat_dma_buf(scat_req, true); - } - - return status; -} - -static int ath6kl_hif_proc_counter_intr(struct ath6kl_device *dev) -{ - u8 counter_int_status; - - ath6kl_dbg(ATH6KL_DBG_IRQ, "counter interrupt\n"); - - counter_int_status = dev->irq_proc_reg.counter_int_status & - dev->irq_en_reg.cntr_int_status_en; - - ath6kl_dbg(ATH6KL_DBG_IRQ, - "valid interrupt source(s) in COUNTER_INT_STATUS: 0x%x\n", - counter_int_status); - - /* - * NOTE: other modules like GMBOX may use the counter interrupt for - * credit flow control on other counters, we only need to check for - * the debug assertion counter interrupt. - */ - if (counter_int_status & ATH6KL_TARGET_DEBUG_INTR_MASK) - return ath6kl_hif_proc_dbg_intr(dev); - - return 0; -} - -static int ath6kl_hif_proc_err_intr(struct ath6kl_device *dev) -{ - int status; - u8 error_int_status; - u8 reg_buf[4]; - - ath6kl_dbg(ATH6KL_DBG_IRQ, "error interrupt\n"); - - error_int_status = dev->irq_proc_reg.error_int_status & 0x0F; - if (!error_int_status) { - WARN_ON(1); - return -EIO; - } - - ath6kl_dbg(ATH6KL_DBG_IRQ, - "valid interrupt source(s) in ERROR_INT_STATUS: 0x%x\n", - error_int_status); - - if (MS(ERROR_INT_STATUS_WAKEUP, error_int_status)) - ath6kl_dbg(ATH6KL_DBG_IRQ, "error : wakeup\n"); - - if (MS(ERROR_INT_STATUS_RX_UNDERFLOW, error_int_status)) - ath6kl_err("rx underflow\n"); - - if (MS(ERROR_INT_STATUS_TX_OVERFLOW, error_int_status)) - ath6kl_err("tx overflow\n"); - - /* Clear the interrupt */ - dev->irq_proc_reg.error_int_status &= ~error_int_status; - - /* set W1C value to clear the interrupt, this hits the register first */ - reg_buf[0] = error_int_status; - reg_buf[1] = 0; - reg_buf[2] = 0; - reg_buf[3] = 0; - - status = hif_read_write_sync(dev->ar, ERROR_INT_STATUS_ADDRESS, - reg_buf, 4, HIF_WR_SYNC_BYTE_FIX); - - if (status) - WARN_ON(1); - - return status; -} - -static int ath6kl_hif_proc_cpu_intr(struct ath6kl_device *dev) -{ - int status; - u8 cpu_int_status; - u8 reg_buf[4]; - - ath6kl_dbg(ATH6KL_DBG_IRQ, "cpu interrupt\n"); - - cpu_int_status = dev->irq_proc_reg.cpu_int_status & - dev->irq_en_reg.cpu_int_status_en; - if (!cpu_int_status) { - WARN_ON(1); - return -EIO; - } - - ath6kl_dbg(ATH6KL_DBG_IRQ, - "valid interrupt source(s) in CPU_INT_STATUS: 0x%x\n", - cpu_int_status); - - /* Clear the interrupt */ - dev->irq_proc_reg.cpu_int_status &= ~cpu_int_status; - - /* - * Set up the register transfer buffer to hit the register 4 times , - * this is done to make the access 4-byte aligned to mitigate issues - * with host bus interconnects that restrict bus transfer lengths to - * be a multiple of 4-bytes. - */ - - /* set W1C value to clear the interrupt, this hits the register first */ - reg_buf[0] = cpu_int_status; - /* the remaining are set to zero which have no-effect */ - reg_buf[1] = 0; - reg_buf[2] = 0; - reg_buf[3] = 0; - - status = hif_read_write_sync(dev->ar, CPU_INT_STATUS_ADDRESS, - reg_buf, 4, HIF_WR_SYNC_BYTE_FIX); - - if (status) - WARN_ON(1); - - return status; -} - -/* process pending interrupts synchronously */ -static int proc_pending_irqs(struct ath6kl_device *dev, bool *done) -{ - struct ath6kl_irq_proc_registers *rg; - int status = 0; - u8 host_int_status = 0; - u32 lk_ahd = 0; - u8 htc_mbox = 1 << HTC_MAILBOX; - struct ath6kl_vif *vif; - vif = ath6kl_vif_first(dev->ar); - ath6kl_dbg(ATH6KL_DBG_IRQ, "proc_pending_irqs: (dev: 0x%p)\n", dev); - - /* - * NOTE: HIF implementation guarantees that the context of this - * call allows us to perform SYNCHRONOUS I/O, that is we can block, - * sleep or call any API that can block or switch thread/task - * contexts. This is a fully schedulable context. - */ -#ifdef CONFIG_MACH_PX - if (vif->sdio_remove == true) { - *done = true; - goto out; - } -#endif - /* - * Process pending intr only when int_status_en is clear, it may - * result in unnecessary bus transaction otherwise. Target may be - * unresponsive at the time. - */ - if (dev->irq_en_reg.int_status_en) { - /* - * Read the first 28 bytes of the HTC register table. This - * will yield us the value of different int status - * registers and the lookahead registers. - * - * length = sizeof(int_status) + sizeof(cpu_int_status) - * + sizeof(error_int_status) + - * sizeof(counter_int_status) + - * sizeof(mbox_frame) + sizeof(rx_lkahd_valid) - * + sizeof(hole) + sizeof(rx_lkahd) + - * sizeof(int_status_en) + - * sizeof(cpu_int_status_en) + - * sizeof(err_int_status_en) + - * sizeof(cntr_int_status_en); - */ - status = hif_read_write_sync(dev->ar, HOST_INT_STATUS_ADDRESS, - (u8 *) &dev->irq_proc_reg, - sizeof(dev->irq_proc_reg), - HIF_RD_SYNC_BYTE_INC); - if (status) - goto out; - - if (AR_DBG_LVL_CHECK(ATH6KL_DBG_IRQ)) - ath6kl_dump_registers(dev, &dev->irq_proc_reg, - &dev->irq_en_reg); - - /* Update only those registers that are enabled */ - host_int_status = dev->irq_proc_reg.host_int_status & - dev->irq_en_reg.int_status_en; - - /* Look at mbox status */ - if (host_int_status & htc_mbox) { - /* - * Mask out pending mbox value, we use "lookAhead as - * the real flag for mbox processing. - */ - host_int_status &= ~htc_mbox; - if (dev->irq_proc_reg.rx_lkahd_valid & - htc_mbox) { - rg = &dev->irq_proc_reg; - lk_ahd = le32_to_cpu(rg->rx_lkahd[HTC_MAILBOX]); - - if (vif->force_reload == true) { - lk_ahd = 0; - } - if (!lk_ahd) { - ath6kl_err("lookAhead is zero! force_reload = %d\n", vif->force_reload); -#ifdef CONFIG_MACH_PX - cfg80211_priv_event(vif->ndev, "HANG", GFP_ATOMIC); - ath6kl_hif_rx_control(dev, false); - ssleep(3); - status = -ENOMEM; -#endif - } - } - } - } - - if (!host_int_status && !lk_ahd) { - *done = true; - goto out; - } - - if (lk_ahd) { - int fetched = 0; - - ath6kl_dbg(ATH6KL_DBG_IRQ, - "pending mailbox msg, lk_ahd: 0x%X\n", lk_ahd); - /* - * Mailbox Interrupt, the HTC layer may issue async - * requests to empty the mailbox. When emptying the recv - * mailbox we use the async handler above called from the - * completion routine of the callers read request. This can - * improve performance by reducing context switching when - * we rapidly pull packets. - */ - status = ath6kl_htc_rxmsg_pending_handler(dev->htc_cnxt, - lk_ahd, &fetched); -#ifdef CONFIG_MACH_PX - if (status && status != -ECANCELED) { - cfg80211_priv_event(vif->ndev, "HANG", GFP_ATOMIC); - ath6kl_hif_rx_control(dev, false); - ssleep(3); - goto out; - } -#else - if (status) - goto out; -#endif - if (!fetched) - /* - * HTC could not pull any messages out due to lack - * of resources. - */ - dev->htc_cnxt->chk_irq_status_cnt = 0; - } - - /* now handle the rest of them */ - ath6kl_dbg(ATH6KL_DBG_IRQ, - "valid interrupt source(s) for other interrupts: 0x%x\n", - host_int_status); - - if (MS(HOST_INT_STATUS_CPU, host_int_status)) { - /* CPU Interrupt */ - status = ath6kl_hif_proc_cpu_intr(dev); - if (status) - goto out; - } - - if (MS(HOST_INT_STATUS_ERROR, host_int_status)) { - /* Error Interrupt */ - status = ath6kl_hif_proc_err_intr(dev); - if (status) - goto out; - } - - if (MS(HOST_INT_STATUS_COUNTER, host_int_status)) - /* Counter Interrupt */ - status = ath6kl_hif_proc_counter_intr(dev); - -out: - /* - * An optimization to bypass reading the IRQ status registers - * unecessarily which can re-wake the target, if upper layers - * determine that we are in a low-throughput mode, we can rely on - * taking another interrupt rather than re-checking the status - * registers which can re-wake the target. - * - * NOTE : for host interfaces that makes use of detecting pending - * mbox messages at hif can not use this optimization due to - * possible side effects, SPI requires the host to drain all - * messages from the mailbox before exiting the ISR routine. - */ - - ath6kl_dbg(ATH6KL_DBG_IRQ, - "bypassing irq status re-check, forcing done\n"); - - if (!dev->htc_cnxt->chk_irq_status_cnt) - *done = true; - - ath6kl_dbg(ATH6KL_DBG_IRQ, - "proc_pending_irqs: (done:%d, status=%d\n", *done, status); - - return status; -} - -/* interrupt handler, kicks off all interrupt processing */ -int ath6kl_hif_intr_bh_handler(struct ath6kl *ar) -{ -#ifdef CONFIG_MACH_PX - struct ath6kl_device *dev; - unsigned long timeout; - int status = 0; - bool done = false; - - if ((ar != NULL) && (ar->htc_target != NULL) && (ar->htc_target->dev != NULL)) - dev = ar->htc_target->dev; - else - return status; -#else - struct ath6kl_device *dev = ar->htc_target->dev; - unsigned long timeout; - int status = 0; - bool done = false; -#endif - - /* - * Reset counter used to flag a re-scan of IRQ status registers on - * the target. - */ - dev->htc_cnxt->chk_irq_status_cnt = 0; - - /* - * IRQ processing is synchronous, interrupt status registers can be - * re-read. - */ - timeout = jiffies + msecs_to_jiffies(ATH6KL_HIF_COMMUNICATION_TIMEOUT); -#ifdef CONFIG_MACH_PX - while (time_before(jiffies, timeout) && !done && (dev != NULL)) -#else - while (time_before(jiffies, timeout) && !done) -#endif - { - status = proc_pending_irqs(dev, &done); - if (status) - break; - } - - return status; -} - -static int ath6kl_hif_enable_intrs(struct ath6kl_device *dev) -{ - struct ath6kl_irq_enable_reg regs; - int status; - - spin_lock_bh(&dev->lock); - - /* Enable all but ATH6KL CPU interrupts */ - dev->irq_en_reg.int_status_en = - SM(INT_STATUS_ENABLE_ERROR, 0x01) | - SM(INT_STATUS_ENABLE_CPU, 0x01) | - SM(INT_STATUS_ENABLE_COUNTER, 0x01); - - /* - * NOTE: There are some cases where HIF can do detection of - * pending mbox messages which is disabled now. - */ - dev->irq_en_reg.int_status_en |= SM(INT_STATUS_ENABLE_MBOX_DATA, 0x01); - - /* Set up the CPU Interrupt status Register */ - dev->irq_en_reg.cpu_int_status_en = 0; - - /* Set up the Error Interrupt status Register */ - dev->irq_en_reg.err_int_status_en = - SM(ERROR_STATUS_ENABLE_RX_UNDERFLOW, 0x01) | - SM(ERROR_STATUS_ENABLE_TX_OVERFLOW, 0x1); - - /* - * Enable Counter interrupt status register to get fatal errors for - * debugging. - */ - dev->irq_en_reg.cntr_int_status_en = SM(COUNTER_INT_STATUS_ENABLE_BIT, - ATH6KL_TARGET_DEBUG_INTR_MASK); - memcpy(®s, &dev->irq_en_reg, sizeof(regs)); - - spin_unlock_bh(&dev->lock); - - status = hif_read_write_sync(dev->ar, INT_STATUS_ENABLE_ADDRESS, - ®s.int_status_en, sizeof(regs), - HIF_WR_SYNC_BYTE_INC); - - if (status) - ath6kl_err("failed to update interrupt ctl reg err: %d\n", - status); - - return status; -} - -int ath6kl_hif_disable_intrs(struct ath6kl_device *dev) -{ - struct ath6kl_irq_enable_reg regs; - - spin_lock_bh(&dev->lock); - /* Disable all interrupts */ - dev->irq_en_reg.int_status_en = 0; - dev->irq_en_reg.cpu_int_status_en = 0; - dev->irq_en_reg.err_int_status_en = 0; - dev->irq_en_reg.cntr_int_status_en = 0; - memcpy(®s, &dev->irq_en_reg, sizeof(regs)); - spin_unlock_bh(&dev->lock); - - return hif_read_write_sync(dev->ar, INT_STATUS_ENABLE_ADDRESS, - ®s.int_status_en, sizeof(regs), - HIF_WR_SYNC_BYTE_INC); -} - -/* enable device interrupts */ -int ath6kl_hif_unmask_intrs(struct ath6kl_device *dev) -{ - int status = 0; - - /* - * Make sure interrupt are disabled before unmasking at the HIF - * layer. The rationale here is that between device insertion - * (where we clear the interrupts the first time) and when HTC - * is finally ready to handle interrupts, other software can perform - * target "soft" resets. The ATH6KL interrupt enables reset back to an - * "enabled" state when this happens. - */ - ath6kl_hif_disable_intrs(dev); - - /* unmask the host controller interrupts */ - ath6kl_hif_irq_enable(dev->ar); - status = ath6kl_hif_enable_intrs(dev); - - return status; -} - -/* disable all device interrupts */ -int ath6kl_hif_mask_intrs(struct ath6kl_device *dev) -{ - /* - * Mask the interrupt at the HIF layer to avoid any stray interrupt - * taken while we zero out our shadow registers in - * ath6kl_hif_disable_intrs(). - */ - ath6kl_hif_irq_disable(dev->ar); - - return ath6kl_hif_disable_intrs(dev); -} - -int ath6kl_hif_setup(struct ath6kl_device *dev) -{ - int status = 0; - - spin_lock_init(&dev->lock); - - /* - * NOTE: we actually get the block size of a mailbox other than 0, - * for SDIO the block size on mailbox 0 is artificially set to 1. - * So we use the block size that is set for the other 3 mailboxes. - */ - dev->htc_cnxt->block_sz = dev->ar->mbox_info.block_size; - - /* must be a power of 2 */ - if ((dev->htc_cnxt->block_sz & (dev->htc_cnxt->block_sz - 1)) != 0) { - WARN_ON(1); - status = -EINVAL; - goto fail_setup; - } - - /* assemble mask, used for padding to a block */ - dev->htc_cnxt->block_mask = dev->htc_cnxt->block_sz - 1; - - ath6kl_dbg(ATH6KL_DBG_HIF, "hif block size %d mbox addr 0x%x\n", - dev->htc_cnxt->block_sz, dev->ar->mbox_info.htc_addr); - - /* usb doesn't support enabling interrupts */ - /* FIXME: remove check once USB support is implemented */ - if (dev->ar->hif_type == ATH6KL_HIF_TYPE_USB) - return 0; - - status = ath6kl_hif_disable_intrs(dev); - -fail_setup: - return status; - -} - -int ath6kl_hif_wait_for_pending_recv(struct ath6kl *ar) -{ - int loop_cnt = 5; - u8 host_int_status; - int status = 0; - - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - - do { - int irq_cnt = 10; - while (atomic_read(&ar_sdio->irq_handling) && --irq_cnt > 0) { - /* wait until irq handler finished all the jobs */ - schedule_timeout_interruptible(HZ / 10); - } - /* check if there is any pending irq due to force done */ - host_int_status = 0; - status = hif_read_write_sync(ar, HOST_INT_STATUS_ADDRESS, - (u8 *)&host_int_status, sizeof(host_int_status), - HIF_RD_SYNC_BYTE_INC); - /* force it to query again due to resources issue*/ - if (status) - host_int_status = 1; - else - host_int_status = (host_int_status & (1 << 0)); - - if (host_int_status) { - /* Wait until irq handler finishes its job */ - schedule_timeout_interruptible(1); - } - } while (host_int_status && --loop_cnt > 0); - - if (host_int_status || loop_cnt == 0) { - ath6kl_err("%s(), Unable clear up pending IRQ" - "before the system suspended\n", __func__); - return -1; - } - - return 0; -} diff --git a/drivers/net/wireless/ath/ath6kl/hif.h b/drivers/net/wireless/ath/ath6kl/hif.h deleted file mode 100755 index 92ec268..0000000 --- a/drivers/net/wireless/ath/ath6kl/hif.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef HIF_H -#define HIF_H - -#include "common.h" -#include "core.h" - -#include - -#define BUS_REQUEST_MAX_NUM 64 -#define HIF_MBOX_BLOCK_SIZE 128 -#define HIF_MBOX0_BLOCK_SIZE 1 - -#define HIF_DMA_BUFFER_SIZE (32 * 1024) -#define CMD53_FIXED_ADDRESS 1 -#define CMD53_INCR_ADDRESS 2 - -#define MAX_SCATTER_REQUESTS 4 -#define MAX_SCATTER_ENTRIES_PER_REQ 16 -#define MAX_SCATTER_REQ_TRANSFER_SIZE (32 * 1024) - -#define MANUFACTURER_ID_AR6003_BASE 0x300 -#define MANUFACTURER_ID_AR6004_BASE 0x400 - /* SDIO manufacturer ID and Codes */ -#define MANUFACTURER_ID_ATH6KL_BASE_MASK 0xFF00 -#define MANUFACTURER_CODE 0x271 /* Atheros */ - -/* Mailbox address in SDIO address space */ -#define HIF_MBOX_BASE_ADDR 0x800 -#define HIF_MBOX_WIDTH 0x800 - -#define HIF_MBOX_END_ADDR (HTC_MAILBOX_NUM_MAX * HIF_MBOX_WIDTH - 1) - -/* version 1 of the chip has only a 12K extended mbox range */ -#define HIF_MBOX0_EXT_BASE_ADDR 0x4000 -#define HIF_MBOX0_EXT_WIDTH (12*1024) - -/* GMBOX addresses */ -#define HIF_GMBOX_BASE_ADDR 0x7000 -#define HIF_GMBOX_WIDTH 0x4000 - -/* interrupt mode register */ -#define CCCR_SDIO_IRQ_MODE_REG 0xF0 - -/* mode to enable special 4-bit interrupt assertion without clock */ -#define SDIO_IRQ_MODE_ASYNC_4BIT_IRQ (1 << 0) - -/* HTC runs over mailbox 0 */ -#define HTC_MAILBOX 0 - -#define ATH6KL_TARGET_DEBUG_INTR_MASK 0x01 - -/* FIXME: are these duplicates with MAX_SCATTER_ values in hif.h? */ -#define ATH6KL_SCATTER_ENTRIES_PER_REQ 16 -#define ATH6KL_MAX_TRANSFER_SIZE_PER_SCATTER (16 * 1024) -#define ATH6KL_SCATTER_REQS 4 - -#define ATH6KL_HIF_COMMUNICATION_TIMEOUT 1000 - -struct bus_request { - struct list_head list; - - /* request data */ - u32 address; - - u8 *buffer; - u32 length; - u32 request; - struct htc_packet *packet; - int status; - - /* this is a scatter request */ - struct hif_scatter_req *scat_req; -}; - -/* direction of transfer (read/write) */ -#define HIF_READ 0x00000001 -#define HIF_WRITE 0x00000002 -#define HIF_DIR_MASK (HIF_READ | HIF_WRITE) - -/* - * emode - This indicates the whether the command is to be executed in a - * blocking or non-blocking fashion (HIF_SYNCHRONOUS/ - * HIF_ASYNCHRONOUS). The read/write data paths in HTC have been - * implemented using the asynchronous mode allowing the the bus - * driver to indicate the completion of operation through the - * registered callback routine. The requirement primarily comes - * from the contexts these operations get called from (a driver's - * transmit context or the ISR context in case of receive). - * Support for both of these modes is essential. - */ -#define HIF_SYNCHRONOUS 0x00000010 -#define HIF_ASYNCHRONOUS 0x00000020 -#define HIF_EMODE_MASK (HIF_SYNCHRONOUS | HIF_ASYNCHRONOUS) - -/* - * dmode - An interface may support different kinds of commands based on - * the tradeoff between the amount of data it can carry and the - * setup time. Byte and Block modes are supported (HIF_BYTE_BASIS/ - * HIF_BLOCK_BASIS). In case of latter, the data is rounded off - * to the nearest block size by padding. The size of the block is - * configurable at compile time using the HIF_BLOCK_SIZE and is - * negotiated with the target during initialization after the - * ATH6KL interrupts are enabled. - */ -#define HIF_BYTE_BASIS 0x00000040 -#define HIF_BLOCK_BASIS 0x00000080 -#define HIF_DMODE_MASK (HIF_BYTE_BASIS | HIF_BLOCK_BASIS) - -/* - * amode - This indicates if the address has to be incremented on ATH6KL - * after every read/write operation (HIF?FIXED_ADDRESS/ - * HIF_INCREMENTAL_ADDRESS). - */ -#define HIF_FIXED_ADDRESS 0x00000100 -#define HIF_INCREMENTAL_ADDRESS 0x00000200 -#define HIF_AMODE_MASK (HIF_FIXED_ADDRESS | HIF_INCREMENTAL_ADDRESS) - -#define HIF_WR_ASYNC_BYTE_INC \ - (HIF_WRITE | HIF_ASYNCHRONOUS | \ - HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS) - -#define HIF_WR_ASYNC_BLOCK_INC \ - (HIF_WRITE | HIF_ASYNCHRONOUS | \ - HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS) - -#define HIF_WR_SYNC_BYTE_FIX \ - (HIF_WRITE | HIF_SYNCHRONOUS | \ - HIF_BYTE_BASIS | HIF_FIXED_ADDRESS) - -#define HIF_WR_SYNC_BYTE_INC \ - (HIF_WRITE | HIF_SYNCHRONOUS | \ - HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS) - -#define HIF_WR_SYNC_BLOCK_INC \ - (HIF_WRITE | HIF_SYNCHRONOUS | \ - HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS) - -#define HIF_RD_SYNC_BYTE_INC \ - (HIF_READ | HIF_SYNCHRONOUS | \ - HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS) - -#define HIF_RD_SYNC_BYTE_FIX \ - (HIF_READ | HIF_SYNCHRONOUS | \ - HIF_BYTE_BASIS | HIF_FIXED_ADDRESS) - -#define HIF_RD_ASYNC_BLOCK_FIX \ - (HIF_READ | HIF_ASYNCHRONOUS | \ - HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS) - -#define HIF_RD_SYNC_BLOCK_FIX \ - (HIF_READ | HIF_SYNCHRONOUS | \ - HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS) - -struct hif_scatter_item { - u8 *buf; - int len; - struct htc_packet *packet; -}; - -struct hif_scatter_req { - struct list_head list; - /* address for the read/write operation */ - u32 addr; - - /* request flags */ - u32 req; - - /* total length of entire transfer */ - u32 len; - - bool virt_scat; - - void (*complete) (struct htc_target *, struct hif_scatter_req *); - int status; - int scat_entries; - - struct bus_request *busrequest; - struct scatterlist *sgentries; - - /* bounce buffer for upper layers to copy to/from */ - u8 *virt_dma_buf; - - struct hif_scatter_item scat_list[1]; - - u32 scat_q_depth; -}; - -struct ath6kl_irq_proc_registers { - u8 host_int_status; - u8 cpu_int_status; - u8 error_int_status; - u8 counter_int_status; - u8 mbox_frame; - u8 rx_lkahd_valid; - u8 host_int_status2; - u8 gmbox_rx_avail; - __le32 rx_lkahd[2]; - __le32 rx_gmbox_lkahd_alias[2]; -} __packed; - -struct ath6kl_irq_enable_reg { - u8 int_status_en; - u8 cpu_int_status_en; - u8 err_int_status_en; - u8 cntr_int_status_en; -} __packed; - -struct ath6kl_device { - spinlock_t lock; - struct ath6kl_irq_proc_registers irq_proc_reg; - struct ath6kl_irq_enable_reg irq_en_reg; - struct htc_target *htc_cnxt; - struct ath6kl *ar; -}; - -struct ath6kl_sdio { - struct sdio_func *func; - - spinlock_t lock; - - /* free list */ - struct list_head bus_req_freeq; - - /* available bus requests */ - struct bus_request bus_req[BUS_REQUEST_MAX_NUM]; - - struct ath6kl *ar; - - u8 *dma_buffer; - - /* protects access to dma_buffer */ - struct mutex dma_buffer_mutex; - - /* scatter request list head */ - struct list_head scat_req; - - atomic_t irq_handling; - wait_queue_head_t irq_wq; - - spinlock_t scat_lock; - bool scatter_enabled; - - bool is_disabled; - const struct sdio_device_id *id; - struct work_struct wr_async_work; - struct list_head wr_asyncq; - spinlock_t wr_async_lock; -}; - -static inline struct ath6kl_sdio *ath6kl_sdio_priv(struct ath6kl *ar) -{ - return ar->hif_priv; -} - -struct ath6kl_hif_ops { - int (*read_write_sync)(struct ath6kl *ar, u32 addr, u8 *buf, - u32 len, u32 request); - int (*write_async)(struct ath6kl *ar, u32 address, u8 *buffer, - u32 length, u32 request, struct htc_packet *packet); - - void (*irq_enable)(struct ath6kl *ar); - void (*irq_disable)(struct ath6kl *ar); - - struct hif_scatter_req *(*scatter_req_get)(struct ath6kl *ar); - void (*scatter_req_add)(struct ath6kl *ar, - struct hif_scatter_req *s_req); - int (*enable_scatter)(struct ath6kl *ar); - int (*scat_req_rw) (struct ath6kl *ar, - struct hif_scatter_req *scat_req); - void (*cleanup_scatter)(struct ath6kl *ar); - int (*suspend)(struct ath6kl *ar, struct cfg80211_wowlan *wow); - int (*resume)(struct ath6kl *ar); - int (*diag_read32)(struct ath6kl *ar, u32 address, u32 *value); - int (*diag_write32)(struct ath6kl *ar, u32 address, __le32 value); - int (*bmi_read)(struct ath6kl *ar, u8 *buf, u32 len); - int (*bmi_write)(struct ath6kl *ar, u8 *buf, u32 len); - int (*power_on)(struct ath6kl *ar); - int (*power_off)(struct ath6kl *ar); - void (*stop)(struct ath6kl *ar); -}; - -int ath6kl_hif_setup(struct ath6kl_device *dev); -int ath6kl_hif_unmask_intrs(struct ath6kl_device *dev); -int ath6kl_hif_mask_intrs(struct ath6kl_device *dev); -int ath6kl_hif_poll_mboxmsg_rx(struct ath6kl_device *dev, - u32 *lk_ahd, int timeout); -int ath6kl_hif_rx_control(struct ath6kl_device *dev, bool enable_rx); -int ath6kl_hif_disable_intrs(struct ath6kl_device *dev); - -int ath6kl_hif_rw_comp_handler(void *context, int status); -int ath6kl_hif_intr_bh_handler(struct ath6kl *ar); - -/* Scatter Function and Definitions */ -int ath6kl_hif_submit_scat_req(struct ath6kl_device *dev, - struct hif_scatter_req *scat_req, bool read); - -int ath6kl_hif_wait_for_pending_recv(struct ath6kl *ar); -#endif diff --git a/drivers/net/wireless/ath/ath6kl/htc.c b/drivers/net/wireless/ath/ath6kl/htc.c deleted file mode 100755 index 16729fb..0000000 --- a/drivers/net/wireless/ath/ath6kl/htc.c +++ /dev/null @@ -1,2888 +0,0 @@ -/* - * Copyright (c) 2007-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "core.h" -#include "hif.h" -#include "debug.h" -#include "hif-ops.h" -#include - -#define CALC_TXRX_PADDED_LEN(dev, len) (__ALIGN_MASK((len), (dev)->block_mask)) - -/* threshold to re-enable Tx bundling for an AC*/ -#define TX_RESUME_BUNDLE_THRESHOLD 1500 - -/* Functions for Tx credit handling */ -static void ath6kl_credit_deposit(struct ath6kl_htc_credit_info *cred_info, - struct htc_endpoint_credit_dist *ep_dist, - int credits) -{ - ath6kl_dbg(ATH6KL_DBG_CREDIT, "credit deposit ep %d credits %d\n", - ep_dist->endpoint, credits); - - ep_dist->credits += credits; - ep_dist->cred_assngd += credits; - cred_info->cur_free_credits -= credits; -} - -static void ath6kl_credit_init(struct ath6kl_htc_credit_info *cred_info, - struct list_head *ep_list, - int tot_credits) -{ - struct htc_endpoint_credit_dist *cur_ep_dist; - int count; - - ath6kl_dbg(ATH6KL_DBG_CREDIT, "credit init total %d\n", tot_credits); - - cred_info->cur_free_credits = tot_credits; - cred_info->total_avail_credits = tot_credits; - - list_for_each_entry(cur_ep_dist, ep_list, list) { - if (cur_ep_dist->endpoint == ENDPOINT_0) - continue; - - cur_ep_dist->cred_min = cur_ep_dist->cred_per_msg; - - if (tot_credits > 4) { - if ((cur_ep_dist->svc_id == WMI_DATA_BK_SVC) || - (cur_ep_dist->svc_id == WMI_DATA_BE_SVC)) { - ath6kl_credit_deposit(cred_info, - cur_ep_dist, - cur_ep_dist->cred_min); - cur_ep_dist->dist_flags |= HTC_EP_ACTIVE; - } - } - - if (cur_ep_dist->svc_id == WMI_CONTROL_SVC) { - ath6kl_credit_deposit(cred_info, cur_ep_dist, - cur_ep_dist->cred_min); - /* - * Control service is always marked active, it - * never goes inactive EVER. - */ - cur_ep_dist->dist_flags |= HTC_EP_ACTIVE; - } else if (cur_ep_dist->svc_id == WMI_DATA_BK_SVC) - /* this is the lowest priority data endpoint */ - /* FIXME: this looks fishy, check */ - cred_info->lowestpri_ep_dist = cur_ep_dist->list; - - /* - * Streams have to be created (explicit | implicit) for all - * kinds of traffic. BE endpoints are also inactive in the - * beginning. When BE traffic starts it creates implicit - * streams that redistributes credits. - * - * Note: all other endpoints have minimums set but are - * initially given NO credits. credits will be distributed - * as traffic activity demands - */ - } - - WARN_ON(cred_info->cur_free_credits <= 0); - - list_for_each_entry(cur_ep_dist, ep_list, list) { - if (cur_ep_dist->endpoint == ENDPOINT_0) - continue; - - if (cur_ep_dist->svc_id == WMI_CONTROL_SVC) - cur_ep_dist->cred_norm = cur_ep_dist->cred_per_msg; - else { - /* - * For the remaining data endpoints, we assume that - * each cred_per_msg are the same. We use a simple - * calculation here, we take the remaining credits - * and determine how many max messages this can - * cover and then set each endpoint's normal value - * equal to 3/4 this amount. - */ - count = (cred_info->cur_free_credits / - cur_ep_dist->cred_per_msg) - * cur_ep_dist->cred_per_msg; - count = (count * 3) >> 2; - count = max(count, cur_ep_dist->cred_per_msg); - cur_ep_dist->cred_norm = count; - - } - - ath6kl_dbg(ATH6KL_DBG_CREDIT, - "credit ep %d svc_id %d credits %d per_msg %d norm %d min %d\n", - cur_ep_dist->endpoint, - cur_ep_dist->svc_id, - cur_ep_dist->credits, - cur_ep_dist->cred_per_msg, - cur_ep_dist->cred_norm, - cur_ep_dist->cred_min); - } -} - -/* initialize and setup credit distribution */ -int ath6kl_credit_setup(void *htc_handle, - struct ath6kl_htc_credit_info *cred_info) -{ - u16 servicepriority[5]; - - memset(cred_info, 0, sizeof(struct ath6kl_htc_credit_info)); - - servicepriority[0] = WMI_CONTROL_SVC; /* highest */ - servicepriority[1] = WMI_DATA_VO_SVC; - servicepriority[2] = WMI_DATA_VI_SVC; - servicepriority[3] = WMI_DATA_BE_SVC; - servicepriority[4] = WMI_DATA_BK_SVC; /* lowest */ - - /* set priority list */ - ath6kl_htc_set_credit_dist(htc_handle, cred_info, servicepriority, 5); - - return 0; -} - -/* reduce an ep's credits back to a set limit */ -static void ath6kl_credit_reduce(struct ath6kl_htc_credit_info *cred_info, - struct htc_endpoint_credit_dist *ep_dist, - int limit) -{ - int credits; - - ath6kl_dbg(ATH6KL_DBG_CREDIT, "credit reduce ep %d limit %d\n", - ep_dist->endpoint, limit); - - ep_dist->cred_assngd = limit; - - if (ep_dist->credits <= limit) - return; - - credits = ep_dist->credits - limit; - ep_dist->credits -= credits; - cred_info->cur_free_credits += credits; -} - -static void ath6kl_credit_update(struct ath6kl_htc_credit_info *cred_info, - struct list_head *epdist_list) -{ - struct htc_endpoint_credit_dist *cur_dist_list; - - list_for_each_entry(cur_dist_list, epdist_list, list) { - if (cur_dist_list->endpoint == ENDPOINT_0) - continue; - - if (cur_dist_list->cred_to_dist > 0) { - cur_dist_list->credits += - cur_dist_list->cred_to_dist; - cur_dist_list->cred_to_dist = 0; - if (cur_dist_list->credits > - cur_dist_list->cred_assngd) - ath6kl_credit_reduce(cred_info, - cur_dist_list, - cur_dist_list->cred_assngd); - - if (cur_dist_list->credits > - cur_dist_list->cred_norm) - ath6kl_credit_reduce(cred_info, cur_dist_list, - cur_dist_list->cred_norm); - - if (!(cur_dist_list->dist_flags & HTC_EP_ACTIVE)) { - if (cur_dist_list->txq_depth == 0) - ath6kl_credit_reduce(cred_info, - cur_dist_list, 0); - } - } - } -} - -/* - * HTC has an endpoint that needs credits, ep_dist is the endpoint in - * question. - */ -static void ath6kl_credit_seek(struct ath6kl_htc_credit_info *cred_info, - struct htc_endpoint_credit_dist *ep_dist) -{ - struct htc_endpoint_credit_dist *curdist_list; - int credits = 0; - int need; - - if (ep_dist->svc_id == WMI_CONTROL_SVC) - goto out; - - if ((ep_dist->svc_id == WMI_DATA_VI_SVC) || - (ep_dist->svc_id == WMI_DATA_VO_SVC)) - if ((ep_dist->cred_assngd >= ep_dist->cred_norm)) - goto out; - - /* - * For all other services, we follow a simple algorithm of: - * - * 1. checking the free pool for credits - * 2. checking lower priority endpoints for credits to take - */ - - credits = min(cred_info->cur_free_credits, ep_dist->seek_cred); - - if (credits >= ep_dist->seek_cred) - goto out; - - /* - * We don't have enough in the free pool, try taking away from - * lower priority services The rule for taking away credits: - * - * 1. Only take from lower priority endpoints - * 2. Only take what is allocated above the minimum (never - * starve an endpoint completely) - * 3. Only take what you need. - */ - - list_for_each_entry_reverse(curdist_list, - &cred_info->lowestpri_ep_dist, - list) { - if (curdist_list == ep_dist) - break; - - need = ep_dist->seek_cred - cred_info->cur_free_credits; - - if ((curdist_list->cred_assngd - need) >= - curdist_list->cred_min) { - /* - * The current one has been allocated more than - * it's minimum and it has enough credits assigned - * above it's minimum to fulfill our need try to - * take away just enough to fulfill our need. - */ - ath6kl_credit_reduce(cred_info, curdist_list, - curdist_list->cred_assngd - need); - - if (cred_info->cur_free_credits >= - ep_dist->seek_cred) - break; - } - - if (curdist_list->endpoint == ENDPOINT_0) - break; - } - - credits = min(cred_info->cur_free_credits, ep_dist->seek_cred); - -out: - /* did we find some credits? */ - if (credits) - ath6kl_credit_deposit(cred_info, ep_dist, credits); - - ep_dist->seek_cred = 0; -} - -/* redistribute credits based on activity change */ -static void ath6kl_credit_redistribute(struct ath6kl_htc_credit_info *info, - struct list_head *ep_dist_list) -{ - struct htc_endpoint_credit_dist *curdist_list; - - list_for_each_entry(curdist_list, ep_dist_list, list) { - if (curdist_list->endpoint == ENDPOINT_0) - continue; - - if ((curdist_list->svc_id == WMI_DATA_BK_SVC) || - (curdist_list->svc_id == WMI_DATA_BE_SVC)) - curdist_list->dist_flags |= HTC_EP_ACTIVE; - - if ((curdist_list->svc_id != WMI_CONTROL_SVC) && - !(curdist_list->dist_flags & HTC_EP_ACTIVE)) { - if (curdist_list->txq_depth == 0) - ath6kl_credit_reduce(info, curdist_list, 0); - else - ath6kl_credit_reduce(info, - curdist_list, - curdist_list->cred_min); - } - } -} - -/* - * - * This function is invoked whenever endpoints require credit - * distributions. A lock is held while this function is invoked, this - * function shall NOT block. The ep_dist_list is a list of distribution - * structures in prioritized order as defined by the call to the - * htc_set_credit_dist() api. - */ -static void ath6kl_credit_distribute(struct ath6kl_htc_credit_info *cred_info, - struct list_head *ep_dist_list, - enum htc_credit_dist_reason reason) -{ - switch (reason) { - case HTC_CREDIT_DIST_SEND_COMPLETE: - ath6kl_credit_update(cred_info, ep_dist_list); - break; - case HTC_CREDIT_DIST_ACTIVITY_CHANGE: - ath6kl_credit_redistribute(cred_info, ep_dist_list); - break; - default: - break; - } - - WARN_ON(cred_info->cur_free_credits > cred_info->total_avail_credits); - WARN_ON(cred_info->cur_free_credits < 0); -} - -static void ath6kl_htc_tx_buf_align(u8 **buf, unsigned long len) -{ - u8 *align_addr; - - if (!IS_ALIGNED((unsigned long) *buf, 4)) { - align_addr = PTR_ALIGN(*buf - 4, 4); - memmove(align_addr, *buf, len); - *buf = align_addr; - } -} - -static void ath6kl_htc_tx_prep_pkt(struct htc_packet *packet, u8 flags, - int ctrl0, int ctrl1) -{ - struct htc_frame_hdr *hdr; - - packet->buf -= HTC_HDR_LENGTH; - hdr = (struct htc_frame_hdr *)packet->buf; - - /* Endianess? */ - put_unaligned((u16)packet->act_len, &hdr->payld_len); - hdr->flags = flags; - hdr->eid = packet->endpoint; - hdr->ctrl[0] = ctrl0; - hdr->ctrl[1] = ctrl1; -} - -static void htc_reclaim_txctrl_buf(struct htc_target *target, - struct htc_packet *pkt) -{ - spin_lock_bh(&target->htc_lock); - list_add_tail(&pkt->list, &target->free_ctrl_txbuf); - spin_unlock_bh(&target->htc_lock); -} - -static struct htc_packet *htc_get_control_buf(struct htc_target *target, - bool tx) -{ - struct htc_packet *packet = NULL; - struct list_head *buf_list; - - buf_list = tx ? &target->free_ctrl_txbuf : &target->free_ctrl_rxbuf; - - spin_lock_bh(&target->htc_lock); - - if (list_empty(buf_list)) { - spin_unlock_bh(&target->htc_lock); - return NULL; - } - - packet = list_first_entry(buf_list, struct htc_packet, list); - list_del(&packet->list); - spin_unlock_bh(&target->htc_lock); - - if (tx) - packet->buf = packet->buf_start + HTC_HDR_LENGTH; - - return packet; -} - -static void htc_tx_comp_update(struct htc_target *target, - struct htc_endpoint *endpoint, - struct htc_packet *packet) -{ - packet->completion = NULL; - packet->buf += HTC_HDR_LENGTH; - - if (!packet->status) - return; - - ath6kl_err("req failed (status:%d, ep:%d, len:%d creds:%d)\n", - packet->status, packet->endpoint, packet->act_len, - packet->info.tx.cred_used); - - /* on failure to submit, reclaim credits for this packet */ - spin_lock_bh(&target->tx_lock); - endpoint->cred_dist.cred_to_dist += - packet->info.tx.cred_used; - endpoint->cred_dist.txq_depth = get_queue_depth(&endpoint->txq); - - ath6kl_dbg(ATH6KL_DBG_HTC, "htc tx ctxt 0x%p dist 0x%p\n", - target->credit_info, &target->cred_dist_list); - - ath6kl_credit_distribute(target->credit_info, - &target->cred_dist_list, - HTC_CREDIT_DIST_SEND_COMPLETE); - - spin_unlock_bh(&target->tx_lock); -} - -static void htc_tx_complete(struct htc_endpoint *endpoint, - struct list_head *txq) -{ - if (list_empty(txq)) - return; - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx complete ep %d pkts %d\n", - endpoint->eid, get_queue_depth(txq)); - - ath6kl_tx_complete(endpoint->target->dev->ar, txq); -} - -static void htc_tx_comp_handler(struct htc_target *target, - struct htc_packet *packet) -{ - struct htc_endpoint *endpoint = &target->endpoint[packet->endpoint]; - struct list_head container; - - ath6kl_dbg(ATH6KL_DBG_HTC, "htc tx complete seqno %d\n", - packet->info.tx.seqno); - - htc_tx_comp_update(target, endpoint, packet); - INIT_LIST_HEAD(&container); - list_add_tail(&packet->list, &container); - /* do completion */ - htc_tx_complete(endpoint, &container); -} - -static void htc_async_tx_scat_complete(struct htc_target *target, - struct hif_scatter_req *scat_req) -{ - struct htc_endpoint *endpoint; - struct htc_packet *packet; - struct list_head tx_compq; - int i; - - INIT_LIST_HEAD(&tx_compq); - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx scat complete len %d entries %d\n", - scat_req->len, scat_req->scat_entries); - - if (scat_req->status) - ath6kl_err("send scatter req failed: %d\n", scat_req->status); - - packet = scat_req->scat_list[0].packet; - endpoint = &target->endpoint[packet->endpoint]; - - /* walk through the scatter list and process */ - for (i = 0; i < scat_req->scat_entries; i++) { - packet = scat_req->scat_list[i].packet; - if (!packet) { - WARN_ON(1); - return; - } - - packet->status = scat_req->status; - htc_tx_comp_update(target, endpoint, packet); - list_add_tail(&packet->list, &tx_compq); - } - - /* free scatter request */ - hif_scatter_req_add(target->dev->ar, scat_req); - - /* complete all packets */ - htc_tx_complete(endpoint, &tx_compq); -} - -static int ath6kl_htc_tx_issue(struct htc_target *target, - struct htc_packet *packet) -{ - int status; - bool sync = false; - u32 padded_len, send_len; - - if (!packet->completion) - sync = true; - - send_len = packet->act_len + HTC_HDR_LENGTH; - - padded_len = CALC_TXRX_PADDED_LEN(target, send_len); - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx issue len %d seqno %d padded_len %d mbox 0x%X %s\n", - send_len, packet->info.tx.seqno, padded_len, - target->dev->ar->mbox_info.htc_addr, - sync ? "sync" : "async"); - - if (sync) { - status = hif_read_write_sync(target->dev->ar, - target->dev->ar->mbox_info.htc_addr, - packet->buf, padded_len, - HIF_WR_SYNC_BLOCK_INC); - - packet->status = status; - packet->buf += HTC_HDR_LENGTH; - } else - status = hif_write_async(target->dev->ar, - target->dev->ar->mbox_info.htc_addr, - packet->buf, padded_len, - HIF_WR_ASYNC_BLOCK_INC, packet); - - return status; -} - -static int htc_check_credits(struct htc_target *target, - struct htc_endpoint *ep, u8 *flags, - enum htc_endpoint_id eid, unsigned int len, - int *req_cred) -{ - - *req_cred = (len > target->tgt_cred_sz) ? - DIV_ROUND_UP(len, target->tgt_cred_sz) : 1; - - ath6kl_dbg(ATH6KL_DBG_CREDIT, "credit check need %d got %d\n", - *req_cred, ep->cred_dist.credits); - - if (ep->cred_dist.credits < *req_cred) { - if (eid == ENDPOINT_0) - return -EINVAL; - - /* Seek more credits */ - ep->cred_dist.seek_cred = *req_cred - ep->cred_dist.credits; - - ath6kl_credit_seek(target->credit_info, &ep->cred_dist); - - ep->cred_dist.seek_cred = 0; - - if (ep->cred_dist.credits < *req_cred) { - ath6kl_dbg(ATH6KL_DBG_CREDIT, - "credit not found for ep %d\n", - eid); - return -EINVAL; - } - } - - ep->cred_dist.credits -= *req_cred; - ep->ep_st.cred_cosumd += *req_cred; - - /* When we are getting low on credits, ask for more */ - if (ep->cred_dist.credits < ep->cred_dist.cred_per_msg) { - ep->cred_dist.seek_cred = - ep->cred_dist.cred_per_msg - ep->cred_dist.credits; - - ath6kl_credit_seek(target->credit_info, &ep->cred_dist); - - /* see if we were successful in getting more */ - if (ep->cred_dist.credits < ep->cred_dist.cred_per_msg) { - /* tell the target we need credits ASAP! */ - *flags |= HTC_FLAGS_NEED_CREDIT_UPDATE; - ep->ep_st.cred_low_indicate += 1; - ath6kl_dbg(ATH6KL_DBG_CREDIT, - "credit we need credits asap\n"); - } - } - - return 0; -} - -static void ath6kl_htc_tx_pkts_get(struct htc_target *target, - struct htc_endpoint *endpoint, - struct list_head *queue) -{ - int req_cred; - u8 flags; - struct htc_packet *packet; - unsigned int len; - - while (true) { - - flags = 0; - - if (list_empty(&endpoint->txq)) - break; - packet = list_first_entry(&endpoint->txq, struct htc_packet, - list); - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx got packet 0x%p queue depth %d\n", - packet, get_queue_depth(&endpoint->txq)); - - len = CALC_TXRX_PADDED_LEN(target, - packet->act_len + HTC_HDR_LENGTH); - - if (htc_check_credits(target, endpoint, &flags, - packet->endpoint, len, &req_cred)) - break; - - /* now we can fully move onto caller's queue */ - packet = list_first_entry(&endpoint->txq, struct htc_packet, - list); - list_move_tail(&packet->list, queue); - - /* save the number of credits this packet consumed */ - packet->info.tx.cred_used = req_cred; - - /* all TX packets are handled asynchronously */ - packet->completion = htc_tx_comp_handler; - packet->context = target; - endpoint->ep_st.tx_issued += 1; - - /* save send flags */ - packet->info.tx.flags = flags; - packet->info.tx.seqno = endpoint->seqno; - endpoint->seqno++; - } -} - -/* See if the padded tx length falls on a credit boundary */ -static int htc_get_credit_padding(unsigned int cred_sz, int *len, - struct htc_endpoint *ep) -{ - int rem_cred, cred_pad; - - rem_cred = *len % cred_sz; - - /* No padding needed */ - if (!rem_cred) - return 0; - - if (!(ep->conn_flags & HTC_FLGS_TX_BNDL_PAD_EN)) - return -1; - - /* - * The transfer consumes a "partial" credit, this - * packet cannot be bundled unless we add - * additional "dummy" padding (max 255 bytes) to - * consume the entire credit. - */ - cred_pad = *len < cred_sz ? (cred_sz - *len) : rem_cred; - - if ((cred_pad > 0) && (cred_pad <= 255)) - *len += cred_pad; - else - /* The amount of padding is too large, send as non-bundled */ - return -1; - - return cred_pad; -} - -static int ath6kl_htc_tx_setup_scat_list(struct htc_target *target, - struct htc_endpoint *endpoint, - struct hif_scatter_req *scat_req, - int n_scat, - struct list_head *queue) -{ - struct htc_packet *packet; - int i, len, rem_scat, cred_pad; - int status = 0; - - rem_scat = target->max_tx_bndl_sz; - - for (i = 0; i < n_scat; i++) { - scat_req->scat_list[i].packet = NULL; - - if (list_empty(queue)) - break; - - packet = list_first_entry(queue, struct htc_packet, list); - len = CALC_TXRX_PADDED_LEN(target, - packet->act_len + HTC_HDR_LENGTH); - - cred_pad = htc_get_credit_padding(target->tgt_cred_sz, - &len, endpoint); - if (cred_pad < 0 || rem_scat < len) { - status = -ENOSPC; - break; - } - - rem_scat -= len; - /* now remove it from the queue */ - list_del(&packet->list); - - scat_req->scat_list[i].packet = packet; - /* prepare packet and flag message as part of a send bundle */ - ath6kl_htc_tx_prep_pkt(packet, - packet->info.tx.flags | HTC_FLAGS_SEND_BUNDLE, - cred_pad, packet->info.tx.seqno); - /* Make sure the buffer is 4-byte aligned */ - ath6kl_htc_tx_buf_align(&packet->buf, - packet->act_len + HTC_HDR_LENGTH); - scat_req->scat_list[i].buf = packet->buf; - scat_req->scat_list[i].len = len; - - scat_req->len += len; - scat_req->scat_entries++; - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx adding (%d) pkt 0x%p seqno %d len %d remaining %d\n", - i, packet, packet->info.tx.seqno, len, rem_scat); - } - - /* Roll back scatter setup in case of any failure */ - if (scat_req->scat_entries < HTC_MIN_HTC_MSGS_TO_BUNDLE) { - for (i = scat_req->scat_entries - 1; i >= 0; i--) { - packet = scat_req->scat_list[i].packet; - if (packet) { - packet->buf += HTC_HDR_LENGTH; - list_add(&packet->list, queue); - } - } - return -EAGAIN; - } - - return status; -} - -/* - * Drain a queue and send as bundles this function may return without fully - * draining the queue when - * - * 1. scatter resources are exhausted - * 2. a message that will consume a partial credit will stop the - * bundling process early - * 3. we drop below the minimum number of messages for a bundle - */ -static void ath6kl_htc_tx_bundle(struct htc_endpoint *endpoint, - struct list_head *queue, - int *sent_bundle, int *n_bundle_pkts) -{ - struct htc_target *target = endpoint->target; - struct hif_scatter_req *scat_req = NULL; - int n_scat, n_sent_bundle = 0, tot_pkts_bundle = 0; - int status; - u32 txb_mask; - u8 ac = WMM_NUM_AC; - - if ((HTC_CTRL_RSVD_SVC != endpoint->svc_id) || - (WMI_CONTROL_SVC != endpoint->svc_id)) - ac = target->dev->ar->ep2ac_map[endpoint->eid]; - - while (true) { - status = 0; - n_scat = get_queue_depth(queue); - n_scat = min(n_scat, target->msg_per_bndl_max); - - if (n_scat < HTC_MIN_HTC_MSGS_TO_BUNDLE) - /* not enough to bundle */ - break; - - scat_req = hif_scatter_req_get(target->dev->ar); - - if (!scat_req) { - /* no scatter resources */ - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx no more scatter resources\n"); - break; - } - - if ((ac < WMM_NUM_AC) && (ac != WMM_AC_BK)) { - if (WMM_AC_BE == ac) - /* - * BE, BK have priorities and bit - * positions reversed - */ - txb_mask = (1 << WMM_AC_BK); - else - /* - * any AC with priority lower than - * itself - */ - txb_mask = ((1 << ac) - 1); - /* - * when the scatter request resources drop below a - * certain threshold, disable Tx bundling for all - * AC's with priority lower than the current requesting - * AC. Otherwise re-enable Tx bundling for them - */ - if (scat_req->scat_q_depth < ATH6KL_SCATTER_REQS) - target->tx_bndl_mask &= ~txb_mask; - else - target->tx_bndl_mask |= txb_mask; - } - - ath6kl_dbg(ATH6KL_DBG_HTC, "htc tx pkts to scatter: %d\n", - n_scat); - - scat_req->len = 0; - scat_req->scat_entries = 0; - - status = ath6kl_htc_tx_setup_scat_list(target, endpoint, - scat_req, n_scat, - queue); - if (status == -EAGAIN) { - hif_scatter_req_add(target->dev->ar, scat_req); - break; - } - - /* send path is always asynchronous */ - scat_req->complete = htc_async_tx_scat_complete; - n_sent_bundle++; - tot_pkts_bundle += scat_req->scat_entries; - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx scatter bytes %d entries %d\n", - scat_req->len, scat_req->scat_entries); - ath6kl_hif_submit_scat_req(target->dev, scat_req, false); - - if (status) - break; - } - - *sent_bundle = n_sent_bundle; - *n_bundle_pkts = tot_pkts_bundle; - ath6kl_dbg(ATH6KL_DBG_HTC, "htc tx bundle sent %d pkts\n", - n_sent_bundle); - - return; -} - -static void ath6kl_htc_tx_from_queue(struct htc_target *target, - struct htc_endpoint *endpoint) -{ - struct list_head txq; - struct htc_packet *packet; - int bundle_sent; - int n_pkts_bundle; - u8 ac = WMM_NUM_AC; - - spin_lock_bh(&target->tx_lock); - - endpoint->tx_proc_cnt++; - if (endpoint->tx_proc_cnt > 1) { - endpoint->tx_proc_cnt--; - spin_unlock_bh(&target->tx_lock); - ath6kl_dbg(ATH6KL_DBG_HTC, "htc tx busy\n"); - return; - } - - /* - * drain the endpoint TX queue for transmission as long - * as we have enough credits. - */ - INIT_LIST_HEAD(&txq); - - if ((HTC_CTRL_RSVD_SVC != endpoint->svc_id) || - (WMI_CONTROL_SVC != endpoint->svc_id)) - ac = target->dev->ar->ep2ac_map[endpoint->eid]; - - while (true) { - - if (list_empty(&endpoint->txq)) - break; - - ath6kl_htc_tx_pkts_get(target, endpoint, &txq); - - if (list_empty(&txq)) - break; - - spin_unlock_bh(&target->tx_lock); - - bundle_sent = 0; - n_pkts_bundle = 0; - - while (true) { - /* try to send a bundle on each pass */ - if ((target->tx_bndl_mask) && - (get_queue_depth(&txq) >= - HTC_MIN_HTC_MSGS_TO_BUNDLE)) { - int temp1 = 0, temp2 = 0; - - /* check if bundling is enabled for an AC */ - if (target->tx_bndl_mask & (1 << ac)) { - ath6kl_htc_tx_bundle(endpoint, &txq, - &temp1, &temp2); - bundle_sent += temp1; - n_pkts_bundle += temp2; - } - } - - if (list_empty(&txq)) - break; - - packet = list_first_entry(&txq, struct htc_packet, - list); - list_del(&packet->list); - - ath6kl_htc_tx_prep_pkt(packet, packet->info.tx.flags, - 0, packet->info.tx.seqno); - ath6kl_htc_tx_issue(target, packet); - } - - spin_lock_bh(&target->tx_lock); - - endpoint->ep_st.tx_bundles += bundle_sent; - endpoint->ep_st.tx_pkt_bundled += n_pkts_bundle; - - /* - * if an AC has bundling disabled and no tx bundling - * has occured continously for a certain number of TX, - * enable tx bundling for this AC - */ - if (!bundle_sent) { - if (!(target->tx_bndl_mask & (1 << ac)) && - (ac < WMM_NUM_AC)) { - if (++target->ac_tx_count[ac] >= - TX_RESUME_BUNDLE_THRESHOLD) { - target->ac_tx_count[ac] = 0; - target->tx_bndl_mask |= (1 << ac); - } - } - } else { - /* tx bundling will reset the counter */ - if (ac < WMM_NUM_AC) - target->ac_tx_count[ac] = 0; - } - } - - endpoint->tx_proc_cnt = 0; - spin_unlock_bh(&target->tx_lock); -} - -static bool ath6kl_htc_tx_try(struct htc_target *target, - struct htc_endpoint *endpoint, - struct htc_packet *tx_pkt) -{ - struct htc_ep_callbacks ep_cb; - int txq_depth; - bool overflow = false; - - ep_cb = endpoint->ep_cb; - - spin_lock_bh(&target->tx_lock); - txq_depth = get_queue_depth(&endpoint->txq); - spin_unlock_bh(&target->tx_lock); - - if (txq_depth >= endpoint->max_txq_depth) - overflow = true; - - if (overflow) - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx overflow ep %d depth %d max %d\n", - endpoint->eid, txq_depth, - endpoint->max_txq_depth); - - if (overflow && ep_cb.tx_full) { - if (ep_cb.tx_full(endpoint->target, tx_pkt) == - HTC_SEND_FULL_DROP) { - endpoint->ep_st.tx_dropped += 1; - return false; - } - } - - spin_lock_bh(&target->tx_lock); - list_add_tail(&tx_pkt->list, &endpoint->txq); - spin_unlock_bh(&target->tx_lock); - - ath6kl_htc_tx_from_queue(target, endpoint); - - return true; -} - -static void htc_chk_ep_txq(struct htc_target *target) -{ - struct htc_endpoint *endpoint; - struct htc_endpoint_credit_dist *cred_dist; - - /* - * Run through the credit distribution list to see if there are - * packets queued. NOTE: no locks need to be taken since the - * distribution list is not dynamic (cannot be re-ordered) and we - * are not modifying any state. - */ - list_for_each_entry(cred_dist, &target->cred_dist_list, list) { - endpoint = cred_dist->htc_ep; - - spin_lock_bh(&target->tx_lock); - if (!list_empty(&endpoint->txq)) { - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc creds ep %d credits %d pkts %d\n", - cred_dist->endpoint, - endpoint->cred_dist.credits, - get_queue_depth(&endpoint->txq)); - spin_unlock_bh(&target->tx_lock); - /* - * Try to start the stalled queue, this list is - * ordered by priority. If there are credits - * available the highest priority queue will get a - * chance to reclaim credits from lower priority - * ones. - */ - ath6kl_htc_tx_from_queue(target, endpoint); - spin_lock_bh(&target->tx_lock); - } - spin_unlock_bh(&target->tx_lock); - } -} - -static int htc_setup_tx_complete(struct htc_target *target) -{ - struct htc_packet *send_pkt = NULL; - int status; - - send_pkt = htc_get_control_buf(target, true); - - if (!send_pkt) - return -ENOMEM; - - if (target->htc_tgt_ver >= HTC_VERSION_2P1) { - struct htc_setup_comp_ext_msg *setup_comp_ext; - u32 flags = 0; - - setup_comp_ext = - (struct htc_setup_comp_ext_msg *)send_pkt->buf; - memset(setup_comp_ext, 0, sizeof(*setup_comp_ext)); - setup_comp_ext->msg_id = - cpu_to_le16(HTC_MSG_SETUP_COMPLETE_EX_ID); - - if (target->msg_per_bndl_max > 0) { - /* Indicate HTC bundling to the target */ - flags |= HTC_SETUP_COMP_FLG_RX_BNDL_EN; - setup_comp_ext->msg_per_rxbndl = - target->msg_per_bndl_max; - } - - memcpy(&setup_comp_ext->flags, &flags, - sizeof(setup_comp_ext->flags)); - set_htc_pkt_info(send_pkt, NULL, (u8 *) setup_comp_ext, - sizeof(struct htc_setup_comp_ext_msg), - ENDPOINT_0, HTC_SERVICE_TX_PACKET_TAG); - - } else { - struct htc_setup_comp_msg *setup_comp; - setup_comp = (struct htc_setup_comp_msg *)send_pkt->buf; - memset(setup_comp, 0, sizeof(struct htc_setup_comp_msg)); - setup_comp->msg_id = cpu_to_le16(HTC_MSG_SETUP_COMPLETE_ID); - set_htc_pkt_info(send_pkt, NULL, (u8 *) setup_comp, - sizeof(struct htc_setup_comp_msg), - ENDPOINT_0, HTC_SERVICE_TX_PACKET_TAG); - } - - /* we want synchronous operation */ - send_pkt->completion = NULL; - ath6kl_htc_tx_prep_pkt(send_pkt, 0, 0, 0); - status = ath6kl_htc_tx_issue(target, send_pkt); - - if (send_pkt != NULL) - htc_reclaim_txctrl_buf(target, send_pkt); - - return status; -} - -void ath6kl_htc_set_credit_dist(struct htc_target *target, - struct ath6kl_htc_credit_info *credit_info, - u16 srvc_pri_order[], int list_len) -{ - struct htc_endpoint *endpoint; - int i, ep; - - target->credit_info = credit_info; - - list_add_tail(&target->endpoint[ENDPOINT_0].cred_dist.list, - &target->cred_dist_list); - - for (i = 0; i < list_len; i++) { - for (ep = ENDPOINT_1; ep < ENDPOINT_MAX; ep++) { - endpoint = &target->endpoint[ep]; - if (endpoint->svc_id == srvc_pri_order[i]) { - list_add_tail(&endpoint->cred_dist.list, - &target->cred_dist_list); - break; - } - } - if (ep >= ENDPOINT_MAX) { - WARN_ON(1); - return; - } - } -} - -int ath6kl_htc_tx(struct htc_target *target, struct htc_packet *packet) -{ - struct htc_endpoint *endpoint; - struct list_head queue; - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx ep id %d buf 0x%p len %d\n", - packet->endpoint, packet->buf, packet->act_len); - - if (packet->endpoint >= ENDPOINT_MAX) { - WARN_ON(1); - return -EINVAL; - } - - endpoint = &target->endpoint[packet->endpoint]; - - if (!ath6kl_htc_tx_try(target, endpoint, packet)) { - packet->status = (target->htc_flags & HTC_OP_STATE_STOPPING) ? - -ECANCELED : -ENOSPC; - INIT_LIST_HEAD(&queue); - list_add(&packet->list, &queue); - htc_tx_complete(endpoint, &queue); - } - - return 0; -} - -/* flush endpoint TX queue */ -void ath6kl_htc_flush_txep(struct htc_target *target, - enum htc_endpoint_id eid, u16 tag) -{ - struct htc_packet *packet, *tmp_pkt; - struct list_head discard_q, container; - struct htc_endpoint *endpoint = &target->endpoint[eid]; - - if (!endpoint->svc_id) { - WARN_ON(1); - return; - } - - /* initialize the discard queue */ - INIT_LIST_HEAD(&discard_q); - - spin_lock_bh(&target->tx_lock); - - list_for_each_entry_safe(packet, tmp_pkt, &endpoint->txq, list) { - if ((tag == HTC_TX_PACKET_TAG_ALL) || - (tag == packet->info.tx.tag)) - list_move_tail(&packet->list, &discard_q); - } - - spin_unlock_bh(&target->tx_lock); - - list_for_each_entry_safe(packet, tmp_pkt, &discard_q, list) { - packet->status = -ECANCELED; - list_del(&packet->list); - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx flushing pkt 0x%p len %d ep %d tag 0x%x\n", - packet, packet->act_len, - packet->endpoint, packet->info.tx.tag); - - INIT_LIST_HEAD(&container); - list_add_tail(&packet->list, &container); - htc_tx_complete(endpoint, &container); - } - -} - -static void ath6kl_htc_flush_txep_all(struct htc_target *target) -{ - struct htc_endpoint *endpoint; - int i; - - dump_cred_dist_stats(target); - - for (i = ENDPOINT_0; i < ENDPOINT_MAX; i++) { - endpoint = &target->endpoint[i]; - if (endpoint->svc_id == 0) - /* not in use.. */ - continue; - ath6kl_htc_flush_txep(target, i, HTC_TX_PACKET_TAG_ALL); - } -} - -void ath6kl_htc_indicate_activity_change(struct htc_target *target, - enum htc_endpoint_id eid, bool active) -{ - struct htc_endpoint *endpoint = &target->endpoint[eid]; - bool dist = false; - - if (endpoint->svc_id == 0) { - WARN_ON(1); - return; - } - - spin_lock_bh(&target->tx_lock); - - if (active) { - if (!(endpoint->cred_dist.dist_flags & HTC_EP_ACTIVE)) { - endpoint->cred_dist.dist_flags |= HTC_EP_ACTIVE; - dist = true; - } - } else { - if (endpoint->cred_dist.dist_flags & HTC_EP_ACTIVE) { - endpoint->cred_dist.dist_flags &= ~HTC_EP_ACTIVE; - dist = true; - } - } - - if (dist) { - endpoint->cred_dist.txq_depth = - get_queue_depth(&endpoint->txq); - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc tx activity ctxt 0x%p dist 0x%p\n", - target->credit_info, &target->cred_dist_list); - - ath6kl_credit_distribute(target->credit_info, - &target->cred_dist_list, - HTC_CREDIT_DIST_ACTIVITY_CHANGE); - } - - spin_unlock_bh(&target->tx_lock); - - if (dist && !active) - htc_chk_ep_txq(target); -} - -/* HTC Rx */ - -static inline void ath6kl_htc_rx_update_stats(struct htc_endpoint *endpoint, - int n_look_ahds) -{ - endpoint->ep_st.rx_pkts++; - if (n_look_ahds == 1) - endpoint->ep_st.rx_lkahds++; - else if (n_look_ahds > 1) - endpoint->ep_st.rx_bundle_lkahd++; -} - -static inline bool htc_valid_rx_frame_len(struct htc_target *target, - enum htc_endpoint_id eid, int len) -{ - return (eid == target->dev->ar->ctrl_ep) ? - len <= ATH6KL_BUFFER_SIZE : len <= ATH6KL_AMSDU_BUFFER_SIZE; -} - -static int htc_add_rxbuf(struct htc_target *target, struct htc_packet *packet) -{ - struct list_head queue; - - INIT_LIST_HEAD(&queue); - list_add_tail(&packet->list, &queue); - return ath6kl_htc_add_rxbuf_multiple(target, &queue); -} - -static void htc_reclaim_rxbuf(struct htc_target *target, - struct htc_packet *packet, - struct htc_endpoint *ep) -{ - if (packet->info.rx.rx_flags & HTC_RX_PKT_NO_RECYCLE) { - htc_rxpkt_reset(packet); - packet->status = -ECANCELED; - ep->ep_cb.rx(ep->target, packet); - } else { - htc_rxpkt_reset(packet); - htc_add_rxbuf((void *)(target), packet); - } -} - -static void reclaim_rx_ctrl_buf(struct htc_target *target, - struct htc_packet *packet) -{ - spin_lock_bh(&target->htc_lock); - list_add_tail(&packet->list, &target->free_ctrl_rxbuf); - spin_unlock_bh(&target->htc_lock); -} - -static int ath6kl_htc_rx_packet(struct htc_target *target, - struct htc_packet *packet, - u32 rx_len) -{ - struct ath6kl_device *dev = target->dev; - u32 padded_len; - int status; - - padded_len = CALC_TXRX_PADDED_LEN(target, rx_len); - - if (padded_len > packet->buf_len) { - ath6kl_err("not enough receive space for packet - padlen %d recvlen %d bufferlen %d\n", - padded_len, rx_len, packet->buf_len); - return -ENOMEM; - } - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx 0x%p hdr x%x len %d mbox 0x%x\n", - packet, packet->info.rx.exp_hdr, - padded_len, dev->ar->mbox_info.htc_addr); - - status = hif_read_write_sync(dev->ar, - dev->ar->mbox_info.htc_addr, - packet->buf, padded_len, - HIF_RD_SYNC_BLOCK_FIX); - - packet->status = status; - - return status; -} - -/* - * optimization for recv packets, we can indicate a - * "hint" that there are more single-packets to fetch - * on this endpoint. - */ -static void ath6kl_htc_rx_set_indicate(u32 lk_ahd, - struct htc_endpoint *endpoint, - struct htc_packet *packet) -{ - struct htc_frame_hdr *htc_hdr = (struct htc_frame_hdr *)&lk_ahd; - - if (htc_hdr->eid == packet->endpoint) { - if (!list_empty(&endpoint->rx_bufq)) - packet->info.rx.indicat_flags |= - HTC_RX_FLAGS_INDICATE_MORE_PKTS; - } -} - -static void ath6kl_htc_rx_chk_water_mark(struct htc_endpoint *endpoint) -{ - struct htc_ep_callbacks ep_cb = endpoint->ep_cb; - - if (ep_cb.rx_refill_thresh > 0) { - spin_lock_bh(&endpoint->target->rx_lock); - if (get_queue_depth(&endpoint->rx_bufq) - < ep_cb.rx_refill_thresh) { - spin_unlock_bh(&endpoint->target->rx_lock); - ep_cb.rx_refill(endpoint->target, endpoint->eid); - return; - } - spin_unlock_bh(&endpoint->target->rx_lock); - } -} - -/* This function is called with rx_lock held */ -static int ath6kl_htc_rx_setup(struct htc_target *target, - struct htc_endpoint *ep, - u32 *lk_ahds, struct list_head *queue, int n_msg) -{ - struct htc_packet *packet; - /* FIXME: type of lk_ahds can't be right */ - struct htc_frame_hdr *htc_hdr = (struct htc_frame_hdr *)lk_ahds; - struct htc_ep_callbacks ep_cb; - int status = 0, j, full_len; - bool no_recycle; - - full_len = CALC_TXRX_PADDED_LEN(target, - le16_to_cpu(htc_hdr->payld_len) + - sizeof(*htc_hdr)); - - if (!htc_valid_rx_frame_len(target, ep->eid, full_len)) { - ath6kl_warn("Rx buffer requested with invalid length" - " htc_hdr : eid - %d, flags = 0x%x, len - %d\n", - htc_hdr->eid, htc_hdr->flags, le16_to_cpu(htc_hdr->payld_len)); - return -EINVAL; - } - - ep_cb = ep->ep_cb; - for (j = 0; j < n_msg; j++) { - - /* - * Reset flag, any packets allocated using the - * rx_alloc() API cannot be recycled on - * cleanup,they must be explicitly returned. - */ - no_recycle = false; - - if (ep_cb.rx_allocthresh && - (full_len > ep_cb.rx_alloc_thresh)) { - ep->ep_st.rx_alloc_thresh_hit += 1; - ep->ep_st.rxalloc_thresh_byte += - le16_to_cpu(htc_hdr->payld_len); - - spin_unlock_bh(&target->rx_lock); - no_recycle = true; - - packet = ep_cb.rx_allocthresh(ep->target, ep->eid, - full_len); - spin_lock_bh(&target->rx_lock); - } else { - /* refill handler is being used */ - if (list_empty(&ep->rx_bufq)) { - if (ep_cb.rx_refill) { - spin_unlock_bh(&target->rx_lock); - ep_cb.rx_refill(ep->target, ep->eid); - spin_lock_bh(&target->rx_lock); - } - } - - if (list_empty(&ep->rx_bufq)) - packet = NULL; - else { - packet = list_first_entry(&ep->rx_bufq, - struct htc_packet, list); - list_del(&packet->list); - } - } - - if (!packet) { - target->rx_st_flags |= HTC_RECV_WAIT_BUFFERS; - target->ep_waiting = ep->eid; - return -ENOSPC; - } - - /* clear flags */ - packet->info.rx.rx_flags = 0; - packet->info.rx.indicat_flags = 0; - packet->status = 0; - - if (no_recycle) - /* - * flag that these packets cannot be - * recycled, they have to be returned to - * the user - */ - packet->info.rx.rx_flags |= HTC_RX_PKT_NO_RECYCLE; - - /* Caller needs to free this upon any failure */ - list_add_tail(&packet->list, queue); - - if (target->htc_flags & HTC_OP_STATE_STOPPING) { - status = -ECANCELED; - break; - } - - if (j) { - packet->info.rx.rx_flags |= HTC_RX_PKT_REFRESH_HDR; - packet->info.rx.exp_hdr = 0xFFFFFFFF; - } else - /* set expected look ahead */ - packet->info.rx.exp_hdr = *lk_ahds; - - packet->act_len = le16_to_cpu(htc_hdr->payld_len) + - HTC_HDR_LENGTH; - } - - return status; -} - -static int ath6kl_htc_rx_alloc(struct htc_target *target, - u32 lk_ahds[], int msg, - struct htc_endpoint *endpoint, - struct list_head *queue) -{ - int status = 0; - struct htc_packet *packet, *tmp_pkt; - struct htc_frame_hdr *htc_hdr; - int i, n_msg; - struct ath6kl_vif *vif; - vif = ath6kl_vif_first(target->dev->ar); - - spin_lock_bh(&target->rx_lock); - - for (i = 0; i < msg; i++) { - - htc_hdr = (struct htc_frame_hdr *)&lk_ahds[i]; - - if (htc_hdr->eid >= ENDPOINT_MAX) { - ath6kl_err("invalid ep in look-ahead: %d\n", - htc_hdr->eid); - status = -ENOMEM; - break; - } - - if (htc_hdr->eid != endpoint->eid) { - ath6kl_err("invalid ep in look-ahead: %d should be : %d (index:%d)\n", - htc_hdr->eid, endpoint->eid, i); - status = -ENOMEM; - break; - } - - if (le16_to_cpu(htc_hdr->payld_len) > HTC_MAX_PAYLOAD_LENGTH) { - ath6kl_err("payload len %d exceeds max htc : %d !\n", - htc_hdr->payld_len, - (u32) HTC_MAX_PAYLOAD_LENGTH); - status = -ENOMEM; - break; - } - - if (endpoint->svc_id == 0) { - ath6kl_err("ep %d is not connected !\n", htc_hdr->eid); - status = -ENOMEM; - break; - } - - if (htc_hdr->flags & HTC_FLG_RX_BNDL_CNT) { - /* - * HTC header indicates that every packet to follow - * has the same padded length so that it can be - * optimally fetched as a full bundle. - */ - n_msg = (htc_hdr->flags & HTC_FLG_RX_BNDL_CNT) >> - HTC_FLG_RX_BNDL_CNT_S; - - /* the count doesn't include the starter frame */ - n_msg++; - if (n_msg > target->msg_per_bndl_max) { - status = -ENOMEM; - break; - } - - endpoint->ep_st.rx_bundle_from_hdr += 1; - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx bundle pkts %d\n", - n_msg); - } else - /* HTC header only indicates 1 message to fetch */ - n_msg = 1; - - /* Setup packet buffers for each message */ - status = ath6kl_htc_rx_setup(target, endpoint, &lk_ahds[i], - queue, n_msg); - - /* - * This is due to unavailabilty of buffers to rx entire data. - * Return no error so that free buffers from queue can be used - * to receive partial data. - */ - if (status == -ENOSPC) { - spin_unlock_bh(&target->rx_lock); - return 0; - } - - if (status) - break; - } - - spin_unlock_bh(&target->rx_lock); - - if (status) { - list_for_each_entry_safe(packet, tmp_pkt, queue, list) { - list_del(&packet->list); - htc_reclaim_rxbuf(target, packet, - &target->endpoint[packet->endpoint]); - } - } - - return status; -} - -static void htc_ctrl_rx(struct htc_target *context, struct htc_packet *packets) -{ - if (packets->endpoint != ENDPOINT_0) { - WARN_ON(1); - return; - } - - if (packets->status == -ECANCELED) { - reclaim_rx_ctrl_buf(context, packets); - return; - } - - if (packets->act_len > 0) { - ath6kl_err("htc_ctrl_rx, got message with len:%zu\n", - packets->act_len + HTC_HDR_LENGTH); - - ath6kl_dbg_dump(ATH6KL_DBG_HTC, - "htc rx unexpected endpoint 0 message", "", - packets->buf - HTC_HDR_LENGTH, - packets->act_len + HTC_HDR_LENGTH); - } - - htc_reclaim_rxbuf(context, packets, &context->endpoint[0]); -} - -static void htc_proc_cred_rpt(struct htc_target *target, - struct htc_credit_report *rpt, - int n_entries, - enum htc_endpoint_id from_ep) -{ - struct htc_endpoint *endpoint; - int tot_credits = 0, i; - bool dist = false; - - spin_lock_bh(&target->tx_lock); - - for (i = 0; i < n_entries; i++, rpt++) { - if (rpt->eid >= ENDPOINT_MAX) { - WARN_ON(1); - spin_unlock_bh(&target->tx_lock); - return; - } - - endpoint = &target->endpoint[rpt->eid]; - - ath6kl_dbg(ATH6KL_DBG_CREDIT, - "credit report ep %d credits %d\n", - rpt->eid, rpt->credits); - - endpoint->ep_st.tx_cred_rpt += 1; - endpoint->ep_st.cred_retnd += rpt->credits; - - if (from_ep == rpt->eid) { - /* - * This credit report arrived on the same endpoint - * indicating it arrived in an RX packet. - */ - endpoint->ep_st.cred_from_rx += rpt->credits; - endpoint->ep_st.cred_rpt_from_rx += 1; - } else if (from_ep == ENDPOINT_0) { - /* credit arrived on endpoint 0 as a NULL message */ - endpoint->ep_st.cred_from_ep0 += rpt->credits; - endpoint->ep_st.cred_rpt_ep0 += 1; - } else { - endpoint->ep_st.cred_from_other += rpt->credits; - endpoint->ep_st.cred_rpt_from_other += 1; - } - - if (rpt->eid == ENDPOINT_0) - /* always give endpoint 0 credits back */ - endpoint->cred_dist.credits += rpt->credits; - else { - endpoint->cred_dist.cred_to_dist += rpt->credits; - dist = true; - } - - /* - * Refresh tx depth for distribution function that will - * recover these credits NOTE: this is only valid when - * there are credits to recover! - */ - endpoint->cred_dist.txq_depth = - get_queue_depth(&endpoint->txq); - - tot_credits += rpt->credits; - } - - if (dist) { - /* - * This was a credit return based on a completed send - * operations note, this is done with the lock held - */ - ath6kl_credit_distribute(target->credit_info, - &target->cred_dist_list, - HTC_CREDIT_DIST_SEND_COMPLETE); - } - - spin_unlock_bh(&target->tx_lock); - - if (tot_credits) - htc_chk_ep_txq(target); -} - -static int htc_parse_trailer(struct htc_target *target, - struct htc_record_hdr *record, - u8 *record_buf, u32 *next_lk_ahds, - enum htc_endpoint_id endpoint, - int *n_lk_ahds) -{ - struct htc_bundle_lkahd_rpt *bundle_lkahd_rpt; - struct htc_lookahead_report *lk_ahd; - int len; - - switch (record->rec_id) { - case HTC_RECORD_CREDITS: - len = record->len / sizeof(struct htc_credit_report); - if (!len) { - WARN_ON(1); - return -EINVAL; - } - - htc_proc_cred_rpt(target, - (struct htc_credit_report *) record_buf, - len, endpoint); - break; - case HTC_RECORD_LOOKAHEAD: - len = record->len / sizeof(*lk_ahd); - if (!len) { - WARN_ON(1); - return -EINVAL; - } - - lk_ahd = (struct htc_lookahead_report *) record_buf; - if ((lk_ahd->pre_valid == ((~lk_ahd->post_valid) & 0xFF)) - && next_lk_ahds) { - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx lk_ahd found pre_valid 0x%x post_valid 0x%x\n", - lk_ahd->pre_valid, lk_ahd->post_valid); - - /* look ahead bytes are valid, copy them over */ - memcpy((u8 *)&next_lk_ahds[0], lk_ahd->lk_ahd, 4); - - ath6kl_dbg_dump(ATH6KL_DBG_HTC, - "htc rx next look ahead", - "", next_lk_ahds, 4); - - if (n_lk_ahds) - *n_lk_ahds = 1; - } - break; - case HTC_RECORD_LOOKAHEAD_BUNDLE: - len = record->len / sizeof(*bundle_lkahd_rpt); - if (!len || (len > HTC_HOST_MAX_MSG_PER_BUNDLE)) { - WARN_ON(1); - return -EINVAL; - } - - if (next_lk_ahds) { - int i; - - bundle_lkahd_rpt = - (struct htc_bundle_lkahd_rpt *) record_buf; - - ath6kl_dbg_dump(ATH6KL_DBG_HTC, "htc rx bundle lk_ahd", - "", record_buf, record->len); - - for (i = 0; i < len; i++) { - memcpy((u8 *)&next_lk_ahds[i], - bundle_lkahd_rpt->lk_ahd, 4); - bundle_lkahd_rpt++; - } - - if (n_lk_ahds) - *n_lk_ahds = i; - } - break; - default: - ath6kl_err("unhandled record: id:%d len:%d\n", - record->rec_id, record->len); - break; - } - - return 0; - -} - -static int htc_proc_trailer(struct htc_target *target, - u8 *buf, int len, u32 *next_lk_ahds, - int *n_lk_ahds, enum htc_endpoint_id endpoint) -{ - struct htc_record_hdr *record; - int orig_len; - int status; - u8 *record_buf; - u8 *orig_buf; - - ath6kl_dbg(ATH6KL_DBG_HTC, "htc rx trailer len %d\n", len); - ath6kl_dbg_dump(ATH6KL_DBG_HTC, NULL, "", buf, len); - - orig_buf = buf; - orig_len = len; - status = 0; - - while (len > 0) { - - if (len < sizeof(struct htc_record_hdr)) { - status = -ENOMEM; - break; - } - /* these are byte aligned structs */ - record = (struct htc_record_hdr *) buf; - len -= sizeof(struct htc_record_hdr); - buf += sizeof(struct htc_record_hdr); - - if (record->len > len) { - ath6kl_err("invalid record len: %d (id:%d) buf has: %d bytes left\n", - record->len, record->rec_id, len); - status = -ENOMEM; - break; - } - record_buf = buf; - - status = htc_parse_trailer(target, record, record_buf, - next_lk_ahds, endpoint, n_lk_ahds); - - if (status) - break; - - /* advance buffer past this record for next time around */ - buf += record->len; - len -= record->len; - } - - if (status) - ath6kl_dbg_dump(ATH6KL_DBG_HTC, "htc rx bad trailer", - "", orig_buf, orig_len); - - return status; -} - -static int ath6kl_htc_rx_process_hdr(struct htc_target *target, - struct htc_packet *packet, - u32 *next_lkahds, int *n_lkahds) -{ - int status = 0; - u16 payload_len; - u32 lk_ahd; - struct htc_frame_hdr *htc_hdr = (struct htc_frame_hdr *)packet->buf; - - if (n_lkahds != NULL) - *n_lkahds = 0; - - /* - * NOTE: we cannot assume the alignment of buf, so we use the safe - * macros to retrieve 16 bit fields. - */ - payload_len = le16_to_cpu(get_unaligned(&htc_hdr->payld_len)); - - memcpy((u8 *)&lk_ahd, packet->buf, sizeof(lk_ahd)); - - if (packet->info.rx.rx_flags & HTC_RX_PKT_REFRESH_HDR) { - /* - * Refresh the expected header and the actual length as it - * was unknown when this packet was grabbed as part of the - * bundle. - */ - packet->info.rx.exp_hdr = lk_ahd; - packet->act_len = payload_len + HTC_HDR_LENGTH; - - /* validate the actual header that was refreshed */ - if (packet->act_len > packet->buf_len) { - ath6kl_err("refreshed hdr payload len (%d) in bundled recv is invalid (hdr: 0x%X)\n", - payload_len, lk_ahd); - /* - * Limit this to max buffer just to print out some - * of the buffer. - */ - packet->act_len = min(packet->act_len, packet->buf_len); - status = -ENOMEM; - goto fail_rx; - } - - if (packet->endpoint != htc_hdr->eid) { - ath6kl_err("refreshed hdr ep (%d) does not match expected ep (%d)\n", - htc_hdr->eid, packet->endpoint); - status = -ENOMEM; - goto fail_rx; - } - } - - if (lk_ahd != packet->info.rx.exp_hdr) { - ath6kl_err("%s(): lk_ahd mismatch! (pPkt:0x%p flags:0x%X)\n", - __func__, packet, packet->info.rx.rx_flags); - ath6kl_dbg_dump(ATH6KL_DBG_HTC, "htc rx expected lk_ahd", - "", &packet->info.rx.exp_hdr, 4); - ath6kl_dbg_dump(ATH6KL_DBG_HTC, "htc rx current header", - "", (u8 *)&lk_ahd, sizeof(lk_ahd)); - status = -ENOMEM; - goto fail_rx; - } - - if (htc_hdr->flags & HTC_FLG_RX_TRAILER) { - if (htc_hdr->ctrl[0] < sizeof(struct htc_record_hdr) || - htc_hdr->ctrl[0] > payload_len) { - ath6kl_err("%s(): invalid hdr (payload len should be :%d, CB[0] is:%d)\n", - __func__, payload_len, htc_hdr->ctrl[0]); - status = -ENOMEM; - goto fail_rx; - } - - if (packet->info.rx.rx_flags & HTC_RX_PKT_IGNORE_LOOKAHEAD) { - next_lkahds = NULL; - n_lkahds = NULL; - } - - status = htc_proc_trailer(target, packet->buf + HTC_HDR_LENGTH - + payload_len - htc_hdr->ctrl[0], - htc_hdr->ctrl[0], next_lkahds, - n_lkahds, packet->endpoint); - - if (status) - goto fail_rx; - - packet->act_len -= htc_hdr->ctrl[0]; - } - - packet->buf += HTC_HDR_LENGTH; - packet->act_len -= HTC_HDR_LENGTH; - -fail_rx: - if (status) - ath6kl_dbg_dump(ATH6KL_DBG_HTC, "htc rx bad packet", - "", packet->buf, packet->act_len); - - return status; -} - -static void ath6kl_htc_rx_complete(struct htc_endpoint *endpoint, - struct htc_packet *packet) -{ - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx complete ep %d packet 0x%p\n", - endpoint->eid, packet); - endpoint->ep_cb.rx(endpoint->target, packet); -} - -static int ath6kl_htc_rx_bundle(struct htc_target *target, - struct list_head *rxq, - struct list_head *sync_compq, - int *n_pkt_fetched, bool part_bundle) -{ - struct hif_scatter_req *scat_req; - struct htc_packet *packet; - int rem_space = target->max_rx_bndl_sz; - int n_scat_pkt, status = 0, i, len; - - n_scat_pkt = get_queue_depth(rxq); - n_scat_pkt = min(n_scat_pkt, target->msg_per_bndl_max); - - if ((get_queue_depth(rxq) - n_scat_pkt) > 0) { - /* - * We were forced to split this bundle receive operation - * all packets in this partial bundle must have their - * lookaheads ignored. - */ - part_bundle = true; - - /* - * This would only happen if the target ignored our max - * bundle limit. - */ - ath6kl_warn("%s(): partial bundle detected num:%d , %d\n", - __func__, get_queue_depth(rxq), n_scat_pkt); - } - - len = 0; - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx bundle depth %d pkts %d\n", - get_queue_depth(rxq), n_scat_pkt); - - scat_req = hif_scatter_req_get(target->dev->ar); - - if (scat_req == NULL) - goto fail_rx_pkt; - - for (i = 0; i < n_scat_pkt; i++) { - int pad_len; - - packet = list_first_entry(rxq, struct htc_packet, list); - list_del(&packet->list); - - pad_len = CALC_TXRX_PADDED_LEN(target, - packet->act_len); - - if ((rem_space - pad_len) < 0) { - list_add(&packet->list, rxq); - break; - } - - rem_space -= pad_len; - - if (part_bundle || (i < (n_scat_pkt - 1))) - /* - * Packet 0..n-1 cannot be checked for look-aheads - * since we are fetching a bundle the last packet - * however can have it's lookahead used - */ - packet->info.rx.rx_flags |= - HTC_RX_PKT_IGNORE_LOOKAHEAD; - - /* NOTE: 1 HTC packet per scatter entry */ - scat_req->scat_list[i].buf = packet->buf; - scat_req->scat_list[i].len = pad_len; - - packet->info.rx.rx_flags |= HTC_RX_PKT_PART_OF_BUNDLE; - - list_add_tail(&packet->list, sync_compq); - - WARN_ON(!scat_req->scat_list[i].len); - len += scat_req->scat_list[i].len; - } - - scat_req->len = len; - scat_req->scat_entries = i; - - status = ath6kl_hif_submit_scat_req(target->dev, scat_req, true); - - if (!status) - *n_pkt_fetched = i; - - /* free scatter request */ - hif_scatter_req_add(target->dev->ar, scat_req); - -fail_rx_pkt: - - return status; -} - -static int ath6kl_htc_rx_process_packets(struct htc_target *target, - struct list_head *comp_pktq, - u32 lk_ahds[], - int *n_lk_ahd) -{ - struct htc_packet *packet, *tmp_pkt; - struct htc_endpoint *ep; - int status = 0; - - list_for_each_entry_safe(packet, tmp_pkt, comp_pktq, list) { - ep = &target->endpoint[packet->endpoint]; - - /* process header for each of the recv packet */ - status = ath6kl_htc_rx_process_hdr(target, packet, lk_ahds, - n_lk_ahd); - if (status) - return status; - - list_del(&packet->list); - - if (list_empty(comp_pktq)) { - /* - * Last packet's more packet flag is set - * based on the lookahead. - */ - if (*n_lk_ahd > 0) - ath6kl_htc_rx_set_indicate(lk_ahds[0], - ep, packet); - } else - /* - * Packets in a bundle automatically have - * this flag set. - */ - packet->info.rx.indicat_flags |= - HTC_RX_FLAGS_INDICATE_MORE_PKTS; - - ath6kl_htc_rx_update_stats(ep, *n_lk_ahd); - - if (packet->info.rx.rx_flags & HTC_RX_PKT_PART_OF_BUNDLE) - ep->ep_st.rx_bundl += 1; - - ath6kl_htc_rx_complete(ep, packet); - } - - return status; -} - -static int ath6kl_htc_rx_fetch(struct htc_target *target, - struct list_head *rx_pktq, - struct list_head *comp_pktq) -{ - int fetched_pkts; - bool part_bundle = false; - int status = 0; - struct list_head tmp_rxq; - struct htc_packet *packet, *tmp_pkt; - - /* now go fetch the list of HTC packets */ - while (!list_empty(rx_pktq)) { - fetched_pkts = 0; - - INIT_LIST_HEAD(&tmp_rxq); - - if (target->rx_bndl_enable && (get_queue_depth(rx_pktq) > 1)) { - /* - * There are enough packets to attempt a - * bundle transfer and recv bundling is - * allowed. - */ - status = ath6kl_htc_rx_bundle(target, rx_pktq, - &tmp_rxq, - &fetched_pkts, - part_bundle); - if (status) - goto fail_rx; - - if (!list_empty(rx_pktq)) - part_bundle = true; - - list_splice_tail_init(&tmp_rxq, comp_pktq); - } - - if (!fetched_pkts) { - - packet = list_first_entry(rx_pktq, struct htc_packet, - list); - - /* fully synchronous */ - packet->completion = NULL; - - if (!list_is_singular(rx_pktq)) - /* - * look_aheads in all packet - * except the last one in the - * bundle must be ignored - */ - packet->info.rx.rx_flags |= - HTC_RX_PKT_IGNORE_LOOKAHEAD; - - /* go fetch the packet */ - status = ath6kl_htc_rx_packet(target, packet, - packet->act_len); - - list_move_tail(&packet->list, &tmp_rxq); - - if (status) - goto fail_rx; - - list_splice_tail_init(&tmp_rxq, comp_pktq); - } - } - - return 0; - -fail_rx: - - /* - * Cleanup any packets we allocated but didn't use to - * actually fetch any packets. - */ - - list_for_each_entry_safe(packet, tmp_pkt, rx_pktq, list) { - list_del(&packet->list); - htc_reclaim_rxbuf(target, packet, - &target->endpoint[packet->endpoint]); - } - - list_for_each_entry_safe(packet, tmp_pkt, &tmp_rxq, list) { - list_del(&packet->list); - htc_reclaim_rxbuf(target, packet, - &target->endpoint[packet->endpoint]); - } - - return status; -} - -int ath6kl_htc_rxmsg_pending_handler(struct htc_target *target, - u32 msg_look_ahead, int *num_pkts) -{ - struct htc_packet *packets, *tmp_pkt; - struct htc_endpoint *endpoint; - struct list_head rx_pktq, comp_pktq; - int status = 0; - u32 look_aheads[HTC_HOST_MAX_MSG_PER_BUNDLE]; - int num_look_ahead = 1; - enum htc_endpoint_id id; - int n_fetched = 0; - struct ath6kl_vif *vif; - vif = ath6kl_vif_first(target->dev->ar); - - INIT_LIST_HEAD(&comp_pktq); - *num_pkts = 0; - - /* - * On first entry copy the look_aheads into our temp array for - * processing - */ - look_aheads[0] = msg_look_ahead; - - while (true) { - - /* - * First lookahead sets the expected endpoint IDs for all - * packets in a bundle. - */ - id = ((struct htc_frame_hdr *)&look_aheads[0])->eid; - endpoint = &target->endpoint[id]; - - if (id >= ENDPOINT_MAX) { - ath6kl_err("MsgPend, invalid endpoint in look-ahead: %d\n", - id); - status = -ENOMEM; - break; - } - - INIT_LIST_HEAD(&rx_pktq); - INIT_LIST_HEAD(&comp_pktq); - - /* - * Try to allocate as many HTC RX packets indicated by the - * look_aheads. - */ - status = ath6kl_htc_rx_alloc(target, look_aheads, - num_look_ahead, endpoint, - &rx_pktq); - if (status) - break; - - if (get_queue_depth(&rx_pktq) >= 2) - /* - * A recv bundle was detected, force IRQ status - * re-check again - */ - target->chk_irq_status_cnt = 1; - - n_fetched += get_queue_depth(&rx_pktq); - - num_look_ahead = 0; - - status = ath6kl_htc_rx_fetch(target, &rx_pktq, &comp_pktq); - - if (!status) - ath6kl_htc_rx_chk_water_mark(endpoint); - - /* Process fetched packets */ - status = ath6kl_htc_rx_process_packets(target, &comp_pktq, - look_aheads, - &num_look_ahead); - - if (!num_look_ahead || status) - break; - - /* - * For SYNCH processing, if we get here, we are running - * through the loop again due to a detected lookahead. Set - * flag that we should re-check IRQ status registers again - * before leaving IRQ processing, this can net better - * performance in high throughput situations. - */ - target->chk_irq_status_cnt = 1; - } - - if (status) { - ath6kl_err("failed to get pending recv messages: %d\n", - status); - - /* cleanup any packets in sync completion queue */ - list_for_each_entry_safe(packets, tmp_pkt, &comp_pktq, list) { - list_del(&packets->list); - htc_reclaim_rxbuf(target, packets, - &target->endpoint[packets->endpoint]); - } - - if (target->htc_flags & HTC_OP_STATE_STOPPING) { - ath6kl_warn("host is going to stop blocking receiver for htc_stop\n"); - ath6kl_hif_rx_control(target->dev, false); - } - } - - /* - * Before leaving, check to see if host ran out of buffers and - * needs to stop the receiver. - */ - if (target->rx_st_flags & HTC_RECV_WAIT_BUFFERS) { - ath6kl_warn("host has no rx buffers blocking receiver to prevent overrun\n"); - ath6kl_hif_rx_control(target->dev, false); - } - *num_pkts = n_fetched; - - return status; -} - -/* - * Synchronously wait for a control message from the target, - * This function is used at initialization time ONLY. At init messages - * on ENDPOINT 0 are expected. - */ -static struct htc_packet *htc_wait_for_ctrl_msg(struct htc_target *target) -{ - struct htc_packet *packet = NULL; - struct htc_frame_hdr *htc_hdr; - u32 look_ahead; - - if (ath6kl_hif_poll_mboxmsg_rx(target->dev, &look_ahead, - HTC_TARGET_RESPONSE_TIMEOUT)) - return NULL; - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx wait ctrl look_ahead 0x%X\n", look_ahead); - - htc_hdr = (struct htc_frame_hdr *)&look_ahead; - - if (htc_hdr->eid != ENDPOINT_0) - return NULL; - - packet = htc_get_control_buf(target, false); - - if (!packet) - return NULL; - - packet->info.rx.rx_flags = 0; - packet->info.rx.exp_hdr = look_ahead; - packet->act_len = le16_to_cpu(htc_hdr->payld_len) + HTC_HDR_LENGTH; - - if (packet->act_len > packet->buf_len) - goto fail_ctrl_rx; - - /* we want synchronous operation */ - packet->completion = NULL; - - /* get the message from the device, this will block */ - if (ath6kl_htc_rx_packet(target, packet, packet->act_len)) - goto fail_ctrl_rx; - - /* process receive header */ - packet->status = ath6kl_htc_rx_process_hdr(target, packet, NULL, NULL); - - if (packet->status) { - ath6kl_err("htc_wait_for_ctrl_msg, ath6kl_htc_rx_process_hdr failed (status = %d)\n", - packet->status); - goto fail_ctrl_rx; - } - - return packet; - -fail_ctrl_rx: - if (packet != NULL) { - htc_rxpkt_reset(packet); - reclaim_rx_ctrl_buf(target, packet); - } - - return NULL; -} - -int ath6kl_htc_add_rxbuf_multiple(struct htc_target *target, - struct list_head *pkt_queue) -{ - struct htc_endpoint *endpoint; - struct htc_packet *first_pkt; - bool rx_unblock = false; - int status = 0, depth; - - if (list_empty(pkt_queue)) - return -ENOMEM; - - first_pkt = list_first_entry(pkt_queue, struct htc_packet, list); - - if (first_pkt->endpoint >= ENDPOINT_MAX) - return status; - - depth = get_queue_depth(pkt_queue); - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx add multiple ep id %d cnt %d len %d\n", - first_pkt->endpoint, depth, first_pkt->buf_len); - - endpoint = &target->endpoint[first_pkt->endpoint]; - - if (target->htc_flags & HTC_OP_STATE_STOPPING) { - struct htc_packet *packet, *tmp_pkt; - - /* walk through queue and mark each one canceled */ - list_for_each_entry_safe(packet, tmp_pkt, pkt_queue, list) { - packet->status = -ECANCELED; - list_del(&packet->list); - ath6kl_htc_rx_complete(endpoint, packet); - } - - return status; - } - - spin_lock_bh(&target->rx_lock); - - list_splice_tail_init(pkt_queue, &endpoint->rx_bufq); - - /* check if we are blocked waiting for a new buffer */ - if (target->rx_st_flags & HTC_RECV_WAIT_BUFFERS) { - if (target->ep_waiting == first_pkt->endpoint) { - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx blocked on ep %d, unblocking\n", - target->ep_waiting); - target->rx_st_flags &= ~HTC_RECV_WAIT_BUFFERS; - target->ep_waiting = ENDPOINT_MAX; - rx_unblock = true; - } - } - - spin_unlock_bh(&target->rx_lock); - - if (rx_unblock && !(target->htc_flags & HTC_OP_STATE_STOPPING)) - /* TODO : implement a buffer threshold count? */ - ath6kl_hif_rx_control(target->dev, true); - - return status; -} - -void ath6kl_htc_flush_rx_buf(struct htc_target *target) -{ - struct htc_endpoint *endpoint; - struct htc_packet *packet, *tmp_pkt; - int i; - - for (i = ENDPOINT_0; i < ENDPOINT_MAX; i++) { - endpoint = &target->endpoint[i]; - if (!endpoint->svc_id) - /* not in use.. */ - continue; - - spin_lock_bh(&target->rx_lock); - list_for_each_entry_safe(packet, tmp_pkt, - &endpoint->rx_bufq, list) { - list_del(&packet->list); - spin_unlock_bh(&target->rx_lock); - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc rx flush pkt 0x%p len %d ep %d\n", - packet, packet->buf_len, - packet->endpoint); - /* - * packets in rx_bufq of endpoint 0 have originally - * been queued from target->free_ctrl_rxbuf where - * packet and packet->buf_start are allocated - * separately using kmalloc(). For other endpoint - * rx_bufq, it is allocated as skb where packet is - * skb->head. Take care of this difference while freeing - * the memory. - */ - if (packet->endpoint == ENDPOINT_0) { - kfree(packet->buf_start); - kfree(packet); - } else { - dev_kfree_skb(packet->pkt_cntxt); - } - spin_lock_bh(&target->rx_lock); - } - spin_unlock_bh(&target->rx_lock); - } -} - -int ath6kl_htc_conn_service(struct htc_target *target, - struct htc_service_connect_req *conn_req, - struct htc_service_connect_resp *conn_resp) -{ - struct htc_packet *rx_pkt = NULL; - struct htc_packet *tx_pkt = NULL; - struct htc_conn_service_resp *resp_msg; - struct htc_conn_service_msg *conn_msg; - struct htc_endpoint *endpoint; - enum htc_endpoint_id assigned_ep = ENDPOINT_MAX; - unsigned int max_msg_sz = 0; - int status = 0; - - ath6kl_dbg(ATH6KL_DBG_HTC, - "htc connect service target 0x%p service id 0x%x\n", - target, conn_req->svc_id); - - if (conn_req->svc_id == HTC_CTRL_RSVD_SVC) { - /* special case for pseudo control service */ - assigned_ep = ENDPOINT_0; - max_msg_sz = HTC_MAX_CTRL_MSG_LEN; - } else { - /* allocate a packet to send to the target */ - tx_pkt = htc_get_control_buf(target, true); - - if (!tx_pkt) - return -ENOMEM; - - conn_msg = (struct htc_conn_service_msg *)tx_pkt->buf; - memset(conn_msg, 0, sizeof(*conn_msg)); - conn_msg->msg_id = cpu_to_le16(HTC_MSG_CONN_SVC_ID); - conn_msg->svc_id = cpu_to_le16(conn_req->svc_id); - conn_msg->conn_flags = cpu_to_le16(conn_req->conn_flags); - - set_htc_pkt_info(tx_pkt, NULL, (u8 *) conn_msg, - sizeof(*conn_msg) + conn_msg->svc_meta_len, - ENDPOINT_0, HTC_SERVICE_TX_PACKET_TAG); - - /* we want synchronous operation */ - tx_pkt->completion = NULL; - ath6kl_htc_tx_prep_pkt(tx_pkt, 0, 0, 0); - status = ath6kl_htc_tx_issue(target, tx_pkt); - - if (status) - goto fail_tx; - - /* wait for response */ - rx_pkt = htc_wait_for_ctrl_msg(target); - - if (!rx_pkt) { - status = -ENOMEM; - goto fail_tx; - } - - resp_msg = (struct htc_conn_service_resp *)rx_pkt->buf; - - if ((le16_to_cpu(resp_msg->msg_id) != HTC_MSG_CONN_SVC_RESP_ID) - || (rx_pkt->act_len < sizeof(*resp_msg))) { - status = -ENOMEM; - goto fail_tx; - } - - conn_resp->resp_code = resp_msg->status; - /* check response status */ - if (resp_msg->status != HTC_SERVICE_SUCCESS) { - ath6kl_err("target failed service 0x%X connect request (status:%d)\n", - resp_msg->svc_id, resp_msg->status); - status = -ENOMEM; - goto fail_tx; - } - - assigned_ep = (enum htc_endpoint_id)resp_msg->eid; - max_msg_sz = le16_to_cpu(resp_msg->max_msg_sz); - } - - if (assigned_ep >= ENDPOINT_MAX || !max_msg_sz) { - status = -ENOMEM; - goto fail_tx; - } - - endpoint = &target->endpoint[assigned_ep]; - endpoint->eid = assigned_ep; - if (endpoint->svc_id) { - status = -ENOMEM; - goto fail_tx; - } - - /* return assigned endpoint to caller */ - conn_resp->endpoint = assigned_ep; - conn_resp->len_max = max_msg_sz; - - /* setup the endpoint */ - - /* this marks the endpoint in use */ - endpoint->svc_id = conn_req->svc_id; - - endpoint->max_txq_depth = conn_req->max_txq_depth; - endpoint->len_max = max_msg_sz; - endpoint->ep_cb = conn_req->ep_cb; - endpoint->cred_dist.svc_id = conn_req->svc_id; - endpoint->cred_dist.htc_ep = endpoint; - endpoint->cred_dist.endpoint = assigned_ep; - endpoint->cred_dist.cred_sz = target->tgt_cred_sz; - - if (conn_req->max_rxmsg_sz) { - /* - * Override cred_per_msg calculation, this optimizes - * the credit-low indications since the host will actually - * issue smaller messages in the Send path. - */ - if (conn_req->max_rxmsg_sz > max_msg_sz) { - status = -ENOMEM; - goto fail_tx; - } - endpoint->cred_dist.cred_per_msg = - conn_req->max_rxmsg_sz / target->tgt_cred_sz; - } else - endpoint->cred_dist.cred_per_msg = - max_msg_sz / target->tgt_cred_sz; - - if (!endpoint->cred_dist.cred_per_msg) - endpoint->cred_dist.cred_per_msg = 1; - - /* save local connection flags */ - endpoint->conn_flags = conn_req->flags; - -fail_tx: - if (tx_pkt) - htc_reclaim_txctrl_buf(target, tx_pkt); - - if (rx_pkt) { - htc_rxpkt_reset(rx_pkt); - reclaim_rx_ctrl_buf(target, rx_pkt); - } - - return status; -} - -static void reset_ep_state(struct htc_target *target) -{ - struct htc_endpoint *endpoint; - int i; - - for (i = ENDPOINT_0; i < ENDPOINT_MAX; i++) { - endpoint = &target->endpoint[i]; - memset(&endpoint->cred_dist, 0, sizeof(endpoint->cred_dist)); - endpoint->svc_id = 0; - endpoint->len_max = 0; - endpoint->max_txq_depth = 0; - memset(&endpoint->ep_st, 0, - sizeof(endpoint->ep_st)); - INIT_LIST_HEAD(&endpoint->rx_bufq); - INIT_LIST_HEAD(&endpoint->txq); - endpoint->target = target; - } - - /* reset distribution list */ - /* FIXME: free existing entries */ - INIT_LIST_HEAD(&target->cred_dist_list); -} - -int ath6kl_htc_get_rxbuf_num(struct htc_target *target, - enum htc_endpoint_id endpoint) -{ - int num; - - spin_lock_bh(&target->rx_lock); - num = get_queue_depth(&(target->endpoint[endpoint].rx_bufq)); - spin_unlock_bh(&target->rx_lock); - return num; -} - -static void htc_setup_msg_bndl(struct htc_target *target) -{ - /* limit what HTC can handle */ - target->msg_per_bndl_max = min(HTC_HOST_MAX_MSG_PER_BUNDLE, - target->msg_per_bndl_max); - - if (ath6kl_hif_enable_scatter(target->dev->ar)) { - target->msg_per_bndl_max = 0; - return; - } - - /* limit bundle what the device layer can handle */ - target->msg_per_bndl_max = min(target->max_scat_entries, - target->msg_per_bndl_max); - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "htc bundling allowed msg_per_bndl_max %d\n", - target->msg_per_bndl_max); - - /* Max rx bundle size is limited by the max tx bundle size */ - target->max_rx_bndl_sz = target->max_xfer_szper_scatreq; - /* Max tx bundle size if limited by the extended mbox address range */ - target->max_tx_bndl_sz = min(HIF_MBOX0_EXT_WIDTH, - target->max_xfer_szper_scatreq); - - ath6kl_dbg(ATH6KL_DBG_BOOT, "htc max_rx_bndl_sz %d max_tx_bndl_sz %d\n", - target->max_rx_bndl_sz, target->max_tx_bndl_sz); - - if (target->max_tx_bndl_sz) - /* tx_bndl_mask is enabled per AC, each has 1 bit */ - target->tx_bndl_mask = (1 << WMM_NUM_AC) - 1; - - if (target->max_rx_bndl_sz) - target->rx_bndl_enable = true; - - if ((target->tgt_cred_sz % target->block_sz) != 0) { - ath6kl_warn("credit size: %d is not block aligned! Disabling send bundling\n", - target->tgt_cred_sz); - - /* - * Disallow send bundling since the credit size is - * not aligned to a block size the I/O block - * padding will spill into the next credit buffer - * which is fatal. - */ - target->tx_bndl_mask = 0; - } -} - -int ath6kl_htc_wait_target(struct htc_target *target) -{ - struct htc_packet *packet = NULL; - struct htc_ready_ext_msg *rdy_msg; - struct htc_service_connect_req connect; - struct htc_service_connect_resp resp; - int status; - - /* FIXME: remove once USB support is implemented */ - if (target->dev->ar->hif_type == ATH6KL_HIF_TYPE_USB) { - ath6kl_err("HTC doesn't support USB yet. Patience!\n"); - return -EOPNOTSUPP; - } - - /* we should be getting 1 control message that the target is ready */ - packet = htc_wait_for_ctrl_msg(target); - - if (!packet) - return -ENOMEM; - - /* we controlled the buffer creation so it's properly aligned */ - rdy_msg = (struct htc_ready_ext_msg *)packet->buf; - - if ((le16_to_cpu(rdy_msg->ver2_0_info.msg_id) != HTC_MSG_READY_ID) || - (packet->act_len < sizeof(struct htc_ready_msg))) { - status = -ENOMEM; - goto fail_wait_target; - } - - if (!rdy_msg->ver2_0_info.cred_cnt || !rdy_msg->ver2_0_info.cred_sz) { - status = -ENOMEM; - goto fail_wait_target; - } - - target->tgt_creds = le16_to_cpu(rdy_msg->ver2_0_info.cred_cnt); - target->tgt_cred_sz = le16_to_cpu(rdy_msg->ver2_0_info.cred_sz); - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "htc target ready credits %d size %d\n", - target->tgt_creds, target->tgt_cred_sz); - - /* check if this is an extended ready message */ - if (packet->act_len >= sizeof(struct htc_ready_ext_msg)) { - /* this is an extended message */ - target->htc_tgt_ver = rdy_msg->htc_ver; - target->msg_per_bndl_max = rdy_msg->msg_per_htc_bndl; - } else { - /* legacy */ - target->htc_tgt_ver = HTC_VERSION_2P0; - target->msg_per_bndl_max = 0; - } - - ath6kl_dbg(ATH6KL_DBG_BOOT, "htc using protocol %s (%d)\n", - (target->htc_tgt_ver == HTC_VERSION_2P0) ? "2.0" : ">= 2.1", - target->htc_tgt_ver); - - if (target->msg_per_bndl_max > 0) - htc_setup_msg_bndl(target); - - /* setup our pseudo HTC control endpoint connection */ - memset(&connect, 0, sizeof(connect)); - memset(&resp, 0, sizeof(resp)); - connect.ep_cb.rx = htc_ctrl_rx; - connect.ep_cb.rx_refill = NULL; - connect.ep_cb.tx_full = NULL; - connect.max_txq_depth = NUM_CONTROL_BUFFERS; - connect.svc_id = HTC_CTRL_RSVD_SVC; - - /* connect fake service */ - status = ath6kl_htc_conn_service((void *)target, &connect, &resp); - - if (status) - /* - * FIXME: this call doesn't make sense, the caller should - * call ath6kl_htc_cleanup() when it wants remove htc - */ - ath6kl_hif_cleanup_scatter(target->dev->ar); - -fail_wait_target: - if (packet) { - htc_rxpkt_reset(packet); - reclaim_rx_ctrl_buf(target, packet); - } - - return status; -} - -/* - * Start HTC, enable interrupts and let the target know - * host has finished setup. - */ -int ath6kl_htc_start(struct htc_target *target) -{ - struct htc_packet *packet; - int status; - - memset(&target->dev->irq_proc_reg, 0, - sizeof(target->dev->irq_proc_reg)); - - /* Disable interrupts at the chip level */ - ath6kl_hif_disable_intrs(target->dev); - - target->htc_flags = 0; - target->rx_st_flags = 0; - - /* Push control receive buffers into htc control endpoint */ - while ((packet = htc_get_control_buf(target, false)) != NULL) { - status = htc_add_rxbuf(target, packet); - if (status) - return status; - } - - /* NOTE: the first entry in the distribution list is ENDPOINT_0 */ - ath6kl_credit_init(target->credit_info, &target->cred_dist_list, - target->tgt_creds); - - dump_cred_dist_stats(target); - - /* Indicate to the target of the setup completion */ - status = htc_setup_tx_complete(target); - - if (status) - return status; - - /* unmask interrupts */ - status = ath6kl_hif_unmask_intrs(target->dev); - - if (status) - ath6kl_htc_stop(target); - - return status; -} - -static int ath6kl_htc_reset(struct htc_target *target) -{ - u32 block_size, ctrl_bufsz; - struct htc_packet *packet; - int i; - - reset_ep_state(target); - - block_size = target->dev->ar->mbox_info.block_size; - - ctrl_bufsz = (block_size > HTC_MAX_CTRL_MSG_LEN) ? - (block_size + HTC_HDR_LENGTH) : - (HTC_MAX_CTRL_MSG_LEN + HTC_HDR_LENGTH); - - for (i = 0; i < NUM_CONTROL_BUFFERS; i++) { - packet = kzalloc(sizeof(*packet), GFP_KERNEL); - if (!packet) - return -ENOMEM; - - packet->buf_start = kzalloc(ctrl_bufsz, GFP_KERNEL); - if (!packet->buf_start) { - kfree(packet); - return -ENOMEM; - } - - packet->buf_len = ctrl_bufsz; - if (i < NUM_CONTROL_RX_BUFFERS) { - packet->act_len = 0; - packet->buf = packet->buf_start; - packet->endpoint = ENDPOINT_0; - list_add_tail(&packet->list, &target->free_ctrl_rxbuf); - } else - list_add_tail(&packet->list, &target->free_ctrl_txbuf); - } - - return 0; -} - -/* htc_stop: stop interrupt reception, and flush all queued buffers */ -void ath6kl_htc_stop(struct htc_target *target) -{ - spin_lock_bh(&target->htc_lock); - target->htc_flags |= HTC_OP_STATE_STOPPING; - spin_unlock_bh(&target->htc_lock); - - /* - * Masking interrupts is a synchronous operation, when this - * function returns all pending HIF I/O has completed, we can - * safely flush the queues. - */ - ath6kl_hif_mask_intrs(target->dev); - - ath6kl_htc_flush_txep_all(target); - - ath6kl_htc_flush_rx_buf(target); - - ath6kl_htc_reset(target); -} - -void *ath6kl_htc_create(struct ath6kl *ar) -{ - struct htc_target *target = NULL; - int status = 0; - - target = kzalloc(sizeof(*target), GFP_KERNEL); - if (!target) { - ath6kl_err("unable to allocate memory\n"); - return NULL; - } - - target->dev = kzalloc(sizeof(*target->dev), GFP_KERNEL); - if (!target->dev) { - ath6kl_err("unable to allocate memory\n"); - status = -ENOMEM; - goto err_htc_cleanup; - } - - spin_lock_init(&target->htc_lock); - spin_lock_init(&target->rx_lock); - spin_lock_init(&target->tx_lock); - - INIT_LIST_HEAD(&target->free_ctrl_txbuf); - INIT_LIST_HEAD(&target->free_ctrl_rxbuf); - INIT_LIST_HEAD(&target->cred_dist_list); - - target->dev->ar = ar; - target->dev->htc_cnxt = target; - target->ep_waiting = ENDPOINT_MAX; - - status = ath6kl_hif_setup(target->dev); - if (status) - goto err_htc_cleanup; - - status = ath6kl_htc_reset(target); - if (status) - goto err_htc_cleanup; - - return target; - -err_htc_cleanup: - ath6kl_htc_cleanup(target); - - return NULL; -} - -/* cleanup the HTC instance */ -void ath6kl_htc_cleanup(struct htc_target *target) -{ - struct htc_packet *packet, *tmp_packet; - - /* FIXME: remove check once USB support is implemented */ - if (target->dev->ar->hif_type != ATH6KL_HIF_TYPE_USB) - ath6kl_hif_cleanup_scatter(target->dev->ar); - - list_for_each_entry_safe(packet, tmp_packet, - &target->free_ctrl_txbuf, list) { - list_del(&packet->list); - kfree(packet->buf_start); - kfree(packet); - } - - list_for_each_entry_safe(packet, tmp_packet, - &target->free_ctrl_rxbuf, list) { - list_del(&packet->list); - kfree(packet->buf_start); - kfree(packet); - } - - kfree(target->dev); - kfree(target); -} diff --git a/drivers/net/wireless/ath/ath6kl/htc.h b/drivers/net/wireless/ath/ath6kl/htc.h deleted file mode 100755 index 5197665..0000000 --- a/drivers/net/wireless/ath/ath6kl/htc.h +++ /dev/null @@ -1,621 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef HTC_H -#define HTC_H - -#include "common.h" - -/* frame header flags */ - -/* send direction */ -#define HTC_FLAGS_NEED_CREDIT_UPDATE (1 << 0) -#define HTC_FLAGS_SEND_BUNDLE (1 << 1) - -/* receive direction */ -#define HTC_FLG_RX_UNUSED (1 << 0) -#define HTC_FLG_RX_TRAILER (1 << 1) -/* Bundle count maske and shift */ -#define HTC_FLG_RX_BNDL_CNT (0xF0) -#define HTC_FLG_RX_BNDL_CNT_S 4 - -#define HTC_HDR_LENGTH (sizeof(struct htc_frame_hdr)) -#define HTC_MAX_PAYLOAD_LENGTH (4096 - sizeof(struct htc_frame_hdr)) - -/* HTC control message IDs */ - -#define HTC_MSG_READY_ID 1 -#define HTC_MSG_CONN_SVC_ID 2 -#define HTC_MSG_CONN_SVC_RESP_ID 3 -#define HTC_MSG_SETUP_COMPLETE_ID 4 -#define HTC_MSG_SETUP_COMPLETE_EX_ID 5 - -#define HTC_MAX_CTRL_MSG_LEN 256 - -#define HTC_VERSION_2P0 0x00 -#define HTC_VERSION_2P1 0x01 - -#define HTC_SERVICE_META_DATA_MAX_LENGTH 128 - -#define HTC_CONN_FLGS_THRESH_LVL_QUAT 0x0 -#define HTC_CONN_FLGS_THRESH_LVL_HALF 0x1 -#define HTC_CONN_FLGS_THRESH_LVL_THREE_QUAT 0x2 -#define HTC_CONN_FLGS_REDUCE_CRED_DRIB 0x4 -#define HTC_CONN_FLGS_THRESH_MASK 0x3 - -/* connect response status codes */ -#define HTC_SERVICE_SUCCESS 0 -#define HTC_SERVICE_NOT_FOUND 1 -#define HTC_SERVICE_FAILED 2 - -/* no resources (i.e. no more endpoints) */ -#define HTC_SERVICE_NO_RESOURCES 3 - -/* specific service is not allowing any more endpoints */ -#define HTC_SERVICE_NO_MORE_EP 4 - -/* report record IDs */ -#define HTC_RECORD_NULL 0 -#define HTC_RECORD_CREDITS 1 -#define HTC_RECORD_LOOKAHEAD 2 -#define HTC_RECORD_LOOKAHEAD_BUNDLE 3 - -#define HTC_SETUP_COMP_FLG_RX_BNDL_EN (1 << 0) - -#define MAKE_SERVICE_ID(group, index) \ - (int)(((int)group << 8) | (int)(index)) - -/* NOTE: service ID of 0x0000 is reserved and should never be used */ -#define HTC_CTRL_RSVD_SVC MAKE_SERVICE_ID(RSVD_SERVICE_GROUP, 1) -#define WMI_CONTROL_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 0) -#define WMI_DATA_BE_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 1) -#define WMI_DATA_BK_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 2) -#define WMI_DATA_VI_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 3) -#define WMI_DATA_VO_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 4) -#define WMI_MAX_SERVICES 5 - -#define WMM_NUM_AC 4 - -/* reserved and used to flush ALL packets */ -#define HTC_TX_PACKET_TAG_ALL 0 -#define HTC_SERVICE_TX_PACKET_TAG 1 -#define HTC_TX_PACKET_TAG_USER_DEFINED (HTC_SERVICE_TX_PACKET_TAG + 9) - -/* more packets on this endpoint are being fetched */ -#define HTC_RX_FLAGS_INDICATE_MORE_PKTS (1 << 0) - -/* TODO.. for BMI */ -#define ENDPOINT1 0 -/* TODO -remove me, but we have to fix BMI first */ -#define HTC_MAILBOX_NUM_MAX 4 - -/* enable send bundle padding for this endpoint */ -#define HTC_FLGS_TX_BNDL_PAD_EN (1 << 0) -#define HTC_EP_ACTIVE ((u32) (1u << 31)) - -/* HTC operational parameters */ -#define HTC_TARGET_RESPONSE_TIMEOUT 2000 /* in ms */ -#define HTC_TARGET_DEBUG_INTR_MASK 0x01 -#define HTC_TARGET_CREDIT_INTR_MASK 0xF0 - -#define HTC_HOST_MAX_MSG_PER_BUNDLE 8 -#define HTC_MIN_HTC_MSGS_TO_BUNDLE 2 - -/* packet flags */ - -#define HTC_RX_PKT_IGNORE_LOOKAHEAD (1 << 0) -#define HTC_RX_PKT_REFRESH_HDR (1 << 1) -#define HTC_RX_PKT_PART_OF_BUNDLE (1 << 2) -#define HTC_RX_PKT_NO_RECYCLE (1 << 3) - -#define NUM_CONTROL_BUFFERS 8 -#define NUM_CONTROL_TX_BUFFERS 2 -#define NUM_CONTROL_RX_BUFFERS (NUM_CONTROL_BUFFERS - NUM_CONTROL_TX_BUFFERS) - -#define HTC_RECV_WAIT_BUFFERS (1 << 0) -#define HTC_OP_STATE_STOPPING (1 << 0) - -/* - * The frame header length and message formats defined herein were selected - * to accommodate optimal alignment for target processing. This reduces - * code size and improves performance. Any changes to the header length may - * alter the alignment and cause exceptions on the target. When adding to - * the messagestructures insure that fields are properly aligned. - */ - -/* HTC frame header - * - * NOTE: do not remove or re-arrange the fields, these are minimally - * required to take advantage of 4-byte lookaheads in some hardware - * implementations. - */ -struct htc_frame_hdr { - u8 eid; - u8 flags; - - /* length of data (including trailer) that follows the header */ - __le16 payld_len; - - /* end of 4-byte lookahead */ - - u8 ctrl[2]; -} __packed; - -/* HTC ready message */ -struct htc_ready_msg { - __le16 msg_id; - __le16 cred_cnt; - __le16 cred_sz; - u8 max_ep; - u8 pad; -} __packed; - -/* extended HTC ready message */ -struct htc_ready_ext_msg { - struct htc_ready_msg ver2_0_info; - u8 htc_ver; - u8 msg_per_htc_bndl; -} __packed; - -/* connect service */ -struct htc_conn_service_msg { - __le16 msg_id; - __le16 svc_id; - __le16 conn_flags; - u8 svc_meta_len; - u8 pad; -} __packed; - -/* connect response */ -struct htc_conn_service_resp { - __le16 msg_id; - __le16 svc_id; - u8 status; - u8 eid; - __le16 max_msg_sz; - u8 svc_meta_len; - u8 pad; -} __packed; - -struct htc_setup_comp_msg { - __le16 msg_id; -} __packed; - -/* extended setup completion message */ -struct htc_setup_comp_ext_msg { - __le16 msg_id; - __le32 flags; - u8 msg_per_rxbndl; - u8 Rsvd[3]; -} __packed; - -struct htc_record_hdr { - u8 rec_id; - u8 len; -} __packed; - -struct htc_credit_report { - u8 eid; - u8 credits; -} __packed; - -/* - * NOTE: The lk_ahd array is guarded by a pre_valid - * and Post Valid guard bytes. The pre_valid bytes must - * equal the inverse of the post_valid byte. - */ -struct htc_lookahead_report { - u8 pre_valid; - u8 lk_ahd[4]; - u8 post_valid; -} __packed; - -struct htc_bundle_lkahd_rpt { - u8 lk_ahd[4]; -} __packed; - -/* Current service IDs */ - -enum htc_service_grp_ids { - RSVD_SERVICE_GROUP = 0, - WMI_SERVICE_GROUP = 1, - - HTC_TEST_GROUP = 254, - HTC_SERVICE_GROUP_LAST = 255 -}; - -/* ------ endpoint IDS ------ */ - -enum htc_endpoint_id { - ENDPOINT_UNUSED = -1, - ENDPOINT_0 = 0, - ENDPOINT_1 = 1, - ENDPOINT_2 = 2, - ENDPOINT_3, - ENDPOINT_4, - ENDPOINT_5, - ENDPOINT_6, - ENDPOINT_7, - ENDPOINT_8, - ENDPOINT_MAX, -}; - -struct htc_tx_packet_info { - u16 tag; - int cred_used; - u8 flags; - int seqno; -}; - -struct htc_rx_packet_info { - u32 exp_hdr; - u32 rx_flags; - u32 indicat_flags; -}; - -struct htc_target; - -/* wrapper around endpoint-specific packets */ -struct htc_packet { - struct list_head list; - - /* caller's per packet specific context */ - void *pkt_cntxt; - - /* - * the true buffer start , the caller can store the real - * buffer start here. In receive callbacks, the HTC layer - * sets buf to the start of the payload past the header. - * This field allows the caller to reset buf when it recycles - * receive packets back to HTC. - */ - u8 *buf_start; - - /* - * Pointer to the start of the buffer. In the transmit - * direction this points to the start of the payload. In the - * receive direction, however, the buffer when queued up - * points to the start of the HTC header but when returned - * to the caller points to the start of the payload - */ - u8 *buf; - u32 buf_len; - - /* actual length of payload */ - u32 act_len; - - /* endpoint that this packet was sent/recv'd from */ - enum htc_endpoint_id endpoint; - - /* completion status */ - - int status; - union { - struct htc_tx_packet_info tx; - struct htc_rx_packet_info rx; - } info; - - void (*completion) (struct htc_target *, struct htc_packet *); - struct htc_target *context; -}; - -enum htc_send_full_action { - HTC_SEND_FULL_KEEP = 0, - HTC_SEND_FULL_DROP = 1, -}; - -struct htc_ep_callbacks { - void (*rx) (struct htc_target *, struct htc_packet *); - void (*rx_refill) (struct htc_target *, enum htc_endpoint_id endpoint); - enum htc_send_full_action (*tx_full) (struct htc_target *, - struct htc_packet *); - struct htc_packet *(*rx_allocthresh) (struct htc_target *, - enum htc_endpoint_id, int); - int rx_alloc_thresh; - int rx_refill_thresh; -}; - -/* service connection information */ -struct htc_service_connect_req { - u16 svc_id; - u16 conn_flags; - struct htc_ep_callbacks ep_cb; - int max_txq_depth; - u32 flags; - unsigned int max_rxmsg_sz; -}; - -/* service connection response information */ -struct htc_service_connect_resp { - u8 buf_len; - u8 act_len; - enum htc_endpoint_id endpoint; - unsigned int len_max; - u8 resp_code; -}; - -/* endpoint distributionstructure */ -struct htc_endpoint_credit_dist { - struct list_head list; - - /* Service ID (set by HTC) */ - u16 svc_id; - - /* endpoint for this distributionstruct (set by HTC) */ - enum htc_endpoint_id endpoint; - - u32 dist_flags; - - /* - * credits for normal operation, anything above this - * indicates the endpoint is over-subscribed. - */ - int cred_norm; - - /* floor for credit distribution */ - int cred_min; - - int cred_assngd; - - /* current credits available */ - int credits; - - /* - * pending credits to distribute on this endpoint, this - * is set by HTC when credit reports arrive. The credit - * distribution functions sets this to zero when it distributes - * the credits. - */ - int cred_to_dist; - - /* - * the number of credits that the current pending TX packet needs - * to transmit. This is set by HTC when endpoint needs credits in - * order to transmit. - */ - int seek_cred; - - /* size in bytes of each credit */ - int cred_sz; - - /* credits required for a maximum sized messages */ - int cred_per_msg; - - /* reserved for HTC use */ - struct htc_endpoint *htc_ep; - - /* - * current depth of TX queue , i.e. messages waiting for credits - * This field is valid only when HTC_CREDIT_DIST_ACTIVITY_CHANGE - * or HTC_CREDIT_DIST_SEND_COMPLETE is indicated on an endpoint - * that has non-zero credits to recover. - */ - int txq_depth; -}; - -/* - * credit distibution code that is passed into the distrbution function, - * there are mandatory and optional codes that must be handled - */ -enum htc_credit_dist_reason { - HTC_CREDIT_DIST_SEND_COMPLETE = 0, - HTC_CREDIT_DIST_ACTIVITY_CHANGE = 1, - HTC_CREDIT_DIST_SEEK_CREDITS, -}; - -struct ath6kl_htc_credit_info { - int total_avail_credits; - int cur_free_credits; - - /* list of lowest priority endpoints */ - struct list_head lowestpri_ep_dist; -}; - -/* endpoint statistics */ -struct htc_endpoint_stats { - /* - * number of times the host set the credit-low flag in a send - * message on this endpoint - */ - u32 cred_low_indicate; - - u32 tx_issued; - u32 tx_pkt_bundled; - u32 tx_bundles; - u32 tx_dropped; - - /* running count of total credit reports received for this endpoint */ - u32 tx_cred_rpt; - - /* credit reports received from this endpoint's RX packets */ - u32 cred_rpt_from_rx; - - /* credit reports received from RX packets of other endpoints */ - u32 cred_rpt_from_other; - - /* credit reports received from endpoint 0 RX packets */ - u32 cred_rpt_ep0; - - /* count of credits received via Rx packets on this endpoint */ - u32 cred_from_rx; - - /* count of credits received via another endpoint */ - u32 cred_from_other; - - /* count of credits received via another endpoint */ - u32 cred_from_ep0; - - /* count of consummed credits */ - u32 cred_cosumd; - - /* count of credits returned */ - u32 cred_retnd; - - u32 rx_pkts; - - /* count of lookahead records found in Rx msg */ - u32 rx_lkahds; - - /* count of recv packets received in a bundle */ - u32 rx_bundl; - - /* count of number of bundled lookaheads */ - u32 rx_bundle_lkahd; - - /* count of the number of bundle indications from the HTC header */ - u32 rx_bundle_from_hdr; - - /* the number of times the recv allocation threshold was hit */ - u32 rx_alloc_thresh_hit; - - /* total number of bytes */ - u32 rxalloc_thresh_byte; -}; - -struct htc_endpoint { - enum htc_endpoint_id eid; - u16 svc_id; - struct list_head txq; - struct list_head rx_bufq; - struct htc_endpoint_credit_dist cred_dist; - struct htc_ep_callbacks ep_cb; - int max_txq_depth; - int len_max; - int tx_proc_cnt; - int rx_proc_cnt; - struct htc_target *target; - u8 seqno; - u32 conn_flags; - struct htc_endpoint_stats ep_st; -}; - -struct htc_control_buffer { - struct htc_packet packet; - u8 *buf; -}; - -struct ath6kl_device; - -/* our HTC target state */ -struct htc_target { - struct htc_endpoint endpoint[ENDPOINT_MAX]; - - /* contains struct htc_endpoint_credit_dist */ - struct list_head cred_dist_list; - - struct list_head free_ctrl_txbuf; - struct list_head free_ctrl_rxbuf; - struct ath6kl_htc_credit_info *credit_info; - int tgt_creds; - unsigned int tgt_cred_sz; - spinlock_t htc_lock; - spinlock_t rx_lock; - spinlock_t tx_lock; - struct ath6kl_device *dev; - u32 htc_flags; - u32 rx_st_flags; - enum htc_endpoint_id ep_waiting; - u8 htc_tgt_ver; - - /* max messages per bundle for HTC */ - int msg_per_bndl_max; - - u32 tx_bndl_mask; - int rx_bndl_enable; - int max_rx_bndl_sz; - int max_tx_bndl_sz; - - u32 block_sz; - u32 block_mask; - - int max_scat_entries; - int max_xfer_szper_scatreq; - - int chk_irq_status_cnt; - - /* counts the number of Tx without bundling continously per AC */ - u32 ac_tx_count[WMM_NUM_AC]; -}; - -void *ath6kl_htc_create(struct ath6kl *ar); -void ath6kl_htc_set_credit_dist(struct htc_target *target, - struct ath6kl_htc_credit_info *cred_info, - u16 svc_pri_order[], int len); -int ath6kl_htc_wait_target(struct htc_target *target); -int ath6kl_htc_start(struct htc_target *target); -int ath6kl_htc_conn_service(struct htc_target *target, - struct htc_service_connect_req *req, - struct htc_service_connect_resp *resp); -int ath6kl_htc_tx(struct htc_target *target, struct htc_packet *packet); -void ath6kl_htc_stop(struct htc_target *target); -void ath6kl_htc_cleanup(struct htc_target *target); -void ath6kl_htc_flush_txep(struct htc_target *target, - enum htc_endpoint_id endpoint, u16 tag); -void ath6kl_htc_flush_rx_buf(struct htc_target *target); -void ath6kl_htc_indicate_activity_change(struct htc_target *target, - enum htc_endpoint_id endpoint, - bool active); -int ath6kl_htc_get_rxbuf_num(struct htc_target *target, - enum htc_endpoint_id endpoint); -int ath6kl_htc_add_rxbuf_multiple(struct htc_target *target, - struct list_head *pktq); -int ath6kl_htc_rxmsg_pending_handler(struct htc_target *target, - u32 msg_look_ahead, int *n_pkts); - -int ath6kl_credit_setup(void *htc_handle, - struct ath6kl_htc_credit_info *cred_info); - -static inline void set_htc_pkt_info(struct htc_packet *packet, void *context, - u8 *buf, unsigned int len, - enum htc_endpoint_id eid, u16 tag) -{ - packet->pkt_cntxt = context; - packet->buf = buf; - packet->act_len = len; - packet->endpoint = eid; - packet->info.tx.tag = tag; -} - -static inline void htc_rxpkt_reset(struct htc_packet *packet) -{ - packet->buf = packet->buf_start; - packet->act_len = 0; -} - -static inline void set_htc_rxpkt_info(struct htc_packet *packet, void *context, - u8 *buf, unsigned long len, - enum htc_endpoint_id eid) -{ - packet->pkt_cntxt = context; - packet->buf = buf; - packet->buf_start = buf; - packet->buf_len = len; - packet->endpoint = eid; -} - -static inline int get_queue_depth(struct list_head *queue) -{ - struct list_head *tmp_list; - int depth = 0; - - list_for_each(tmp_list, queue) - depth++; - - return depth; -} - -#endif diff --git a/drivers/net/wireless/ath/ath6kl/init.c b/drivers/net/wireless/ath/ath6kl/init.c deleted file mode 100755 index ba587f9..0000000 --- a/drivers/net/wireless/ath/ath6kl/init.c +++ /dev/null @@ -1,2330 +0,0 @@ - -/* - * Copyright (c) 2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -//#include -#include -#include "core.h" -#include "cfg80211.h" -#include "target.h" -#include "debug.h" -#include "hif-ops.h" -#include "pm.h" -#include - -unsigned int debug_mask = ATH6KL_DBG_WMI | ATH6KL_DBG_BOOT | - ATH6KL_DBG_WLAN_CFG | ATH6KL_DBG_SUSPEND | - ATH6KL_DBG_TRC; -static unsigned int testmode; -#ifdef CONFIG_MACH_PX -/* WoW2 (deepsleep), Suspend (WoW) */ -static unsigned int suspend_mode = WLAN_POWER_STATE_WOW; -static unsigned int wow_mode = WLAN_POWER_STATE_DEEP_SLEEP; -#else -static unsigned int suspend_mode; -static unsigned int wow_mode; -#endif -static unsigned int uart_debug; -#ifdef CONFIG_MACH_PX -static unsigned int ar6k_clock = 26000000; -#else -static unsigned int ar6k_clock = 19200000; -#endif - -#ifdef CONFIG_ATH6KL_LOCALE_USA -static unsigned short reg_domain = 0x8348; -#else -static unsigned short reg_domain = 0xffff; -#endif - -static unsigned short lrssi = 10; - -static unsigned short en_ani = 1; - -module_param(debug_mask, uint, 0644); -module_param(testmode, uint, 0644); -module_param(suspend_mode, uint, 0644); -module_param(wow_mode, uint, 0644); -module_param(uart_debug, uint, 0644); -module_param(ar6k_clock, uint, 0644); -module_param(reg_domain, ushort, 0644); -module_param(lrssi, ushort, 0644); -module_param(en_ani, ushort, 0644); - - -static const struct ath6kl_hw hw_list[] = { - { - .id = AR6003_HW_2_0_VERSION, - .name = "ar6003 hw 2.0", - .dataset_patch_addr = 0x57e884, - .app_load_addr = 0x543180, - .board_ext_data_addr = 0x57e500, - .reserved_ram_size = 6912, - .refclk_hz = 26000000, - .uarttx_pin = 8, - - /* hw2.0 needs override address hardcoded */ - .app_start_override_addr = 0x944C00, - - .fw = { - .dir = AR6003_HW_2_0_FW_DIR, - .otp = AR6003_HW_2_0_OTP_FILE, - .fw = AR6003_HW_2_0_FIRMWARE_FILE, - .tcmd = AR6003_HW_2_0_TCMD_FIRMWARE_FILE, - .patch = AR6003_HW_2_0_PATCH_FILE, - }, - - .fw_board = AR6003_HW_2_0_BOARD_DATA_FILE, - .fw_default_board = AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE, - }, - { - .id = AR6003_HW_2_1_1_VERSION, - .name = "ar6003 hw 2.1.1", - .dataset_patch_addr = 0x57ff74, - .app_load_addr = 0x1234, - .board_ext_data_addr = 0x542330, - .reserved_ram_size = 512, - .refclk_hz = 26000000, - .uarttx_pin = 8, - .testscript_addr = 0x57ef74, - - .fw = { - .dir = AR6003_HW_2_1_1_FW_DIR, - .otp = AR6003_HW_2_1_1_OTP_FILE, - .fw = AR6003_HW_2_1_1_FIRMWARE_FILE, - .tcmd = AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE, - .patch = AR6003_HW_2_1_1_PATCH_FILE, - .utf = AR6003_HW_2_1_1_UTF_FIRMWARE_FILE, - .testscript = AR6003_HW_2_1_1_TESTSCRIPT_FILE, - }, - - .fw_board = AR6003_HW_2_1_1_BOARD_DATA_FILE, - .fw_default_board = AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE, - }, - { - .id = AR6004_HW_1_0_VERSION, - .name = "ar6004 hw 1.0", - .dataset_patch_addr = 0x57e884, - .app_load_addr = 0x1234, - .board_ext_data_addr = 0x437000, - .reserved_ram_size = 19456, - .board_addr = 0x433900, - .refclk_hz = 26000000, - .uarttx_pin = 11, - - .fw = { - .dir = AR6004_HW_1_0_FW_DIR, - .fw = AR6004_HW_1_0_FIRMWARE_FILE, - }, - - .fw_board = AR6004_HW_1_0_BOARD_DATA_FILE, - .fw_default_board = AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE, - }, - { - .id = AR6004_HW_1_1_VERSION, - .name = "ar6004 hw 1.1", - .dataset_patch_addr = 0x57e884, - .app_load_addr = 0x1234, - .board_ext_data_addr = 0x437000, - .reserved_ram_size = 11264, - .board_addr = 0x43d400, - .refclk_hz = 40000000, - .uarttx_pin = 11, - - .fw = { - .dir = AR6004_HW_1_1_FW_DIR, - .fw = AR6004_HW_1_1_FIRMWARE_FILE, - }, - - .fw_board = AR6004_HW_1_1_BOARD_DATA_FILE, - .fw_default_board = AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE, - }, -}; - -/* - * Include definitions here that can be used to tune the WLAN module - * behavior. Different customers can tune the behavior as per their needs, - * here. - */ - -/* - * This configuration item enable/disable keepalive support. - * Keepalive support: In the absence of any data traffic to AP, null - * frames will be sent to the AP at periodic interval, to keep the association - * active. This configuration item defines the periodic interval. - * Use value of zero to disable keepalive support - * Default: 60 seconds - */ -#define WLAN_CONFIG_KEEP_ALIVE_INTERVAL 60 - -/* - * This configuration item sets the value of disconnect timeout - * Firmware delays sending the disconnec event to the host for this - * timeout after is gets disconnected from the current AP. - * If the firmware successly roams within the disconnect timeout - * it sends a new connect event - */ -#define WLAN_CONFIG_DISCONNECT_TIMEOUT 10 - - -#define ATH6KL_DATA_OFFSET 64 - -typedef char A_CHAR; -extern int android_readwrite_file(const A_CHAR *filename, A_CHAR *rbuf, const A_CHAR *wbuf, size_t length); - - /* - * Number of bytes in board data that we are interested - * in while setting regulatory domain from host - */ -#define REG_DMN_BOARD_DATA_LEN 16 - -/* Modifies regulatory domain in board data in target RAM */ -static int ath6kl_set_reg_dmn(struct ath6kl *ar) -{ - u8 buf[REG_DMN_BOARD_DATA_LEN]; - __le16 old_sum, old_ver, old_rd, old_rd_next; - __le32 brd_dat_addr = 0, new_sum, new_rd; - int ret; - - ret = ath6kl_bmi_read(ar, AR6003_BOARD_DATA_ADDR, - (u8 *)&brd_dat_addr, 4); - if (ret) - return ret; - - memset(buf, 0, sizeof(buf)); - ret = ath6kl_bmi_read(ar, brd_dat_addr, buf, sizeof(buf)); - if (ret) - return ret; - - memcpy((u8 *)&old_sum, buf + AR6003_BOARD_DATA_OFFSET, 2); - memcpy((u8 *)&old_ver, buf + AR6003_BOARD_DATA_OFFSET + 2, 2); - memcpy((u8 *)&old_rd, buf + AR6003_RD_OFFSET, 2); - memcpy((u8 *)&old_rd_next, buf + AR6003_RD_OFFSET + 2, 2); - - /* - * Overwrite the new regulatory domain and preserve the - * MAC addr which is in the same word. - */ - new_rd = cpu_to_le32((le32_to_cpu(old_rd_next) << 16) + reg_domain); - ret = ath6kl_bmi_write(ar, - cpu_to_le32(le32_to_cpu(brd_dat_addr) + AR6003_RD_OFFSET), - (u8 *)&new_rd, 4); - if (ret) - return ret; - - /* - * Recompute the board data checksum with the new regulatory - * domain, preserve the version information which is in the - * same word. - */ - new_sum = cpu_to_le32((le32_to_cpu(old_ver) << 16) + - (le32_to_cpu(old_sum) ^ le32_to_cpu(old_rd) ^ - reg_domain)); - ret = ath6kl_bmi_write(ar, - cpu_to_le32(le32_to_cpu(brd_dat_addr) + - AR6003_BOARD_DATA_OFFSET), - (u8 *)&new_sum, 4); - - return ret; -} - -struct sk_buff *ath6kl_buf_alloc(int size) -{ - struct sk_buff *skb; - u16 reserved; - - /* Add chacheline space at front and back of buffer */ - reserved = (2 * L1_CACHE_BYTES) + ATH6KL_DATA_OFFSET + - sizeof(struct htc_packet) + ATH6KL_HTC_ALIGN_BYTES; - skb = dev_alloc_skb(size + reserved); - - if (skb) - skb_reserve(skb, reserved - L1_CACHE_BYTES); - return skb; -} - -void ath6kl_init_profile_info(struct ath6kl_vif *vif) -{ - vif->ssid_len = 0; - memset(vif->ssid, 0, sizeof(vif->ssid)); - - vif->dot11_auth_mode = OPEN_AUTH; - vif->auth_mode = NONE_AUTH; - vif->prwise_crypto = NONE_CRYPT; - vif->prwise_crypto_len = 0; - vif->grp_crypto = NONE_CRYPT; - vif->grp_crypto_len = 0; - memset(vif->wep_key_list, 0, sizeof(vif->wep_key_list)); - memset(vif->req_bssid, 0, sizeof(vif->req_bssid)); - memset(vif->bssid, 0, sizeof(vif->bssid)); - vif->bss_ch = 0; -} - -static int ath6kl_set_host_app_area(struct ath6kl *ar) -{ - u32 address, data; - struct host_app_area host_app_area; - - /* Fetch the address of the host_app_area_s - * instance in the host interest area */ - address = ath6kl_get_hi_item_addr(ar, HI_ITEM(hi_app_host_interest)); - address = TARG_VTOP(ar->target_type, address); - - if (ath6kl_diag_read32(ar, address, &data)) - return -EIO; - - address = TARG_VTOP(ar->target_type, data); - host_app_area.wmi_protocol_ver = cpu_to_le32(WMI_PROTOCOL_VERSION); - if (ath6kl_diag_write(ar, address, (u8 *) &host_app_area, - sizeof(struct host_app_area))) - return -EIO; - - return 0; -} - -static inline void set_ac2_ep_map(struct ath6kl *ar, - u8 ac, - enum htc_endpoint_id ep) -{ - ar->ac2ep_map[ac] = ep; - ar->ep2ac_map[ep] = ac; -} - -/* connect to a service */ -static int ath6kl_connectservice(struct ath6kl *ar, - struct htc_service_connect_req *con_req, - char *desc) -{ - int status; - struct htc_service_connect_resp response; - - memset(&response, 0, sizeof(response)); - - status = ath6kl_htc_conn_service(ar->htc_target, con_req, &response); - if (status) { - ath6kl_err("failed to connect to %s service status:%d\n", - desc, status); - return status; - } - - switch (con_req->svc_id) { - case WMI_CONTROL_SVC: - if (test_bit(WMI_ENABLED, &ar->flag)) - ath6kl_wmi_set_control_ep(ar->wmi, response.endpoint); - ar->ctrl_ep = response.endpoint; - break; - case WMI_DATA_BE_SVC: - set_ac2_ep_map(ar, WMM_AC_BE, response.endpoint); - break; - case WMI_DATA_BK_SVC: - set_ac2_ep_map(ar, WMM_AC_BK, response.endpoint); - break; - case WMI_DATA_VI_SVC: - set_ac2_ep_map(ar, WMM_AC_VI, response.endpoint); - break; - case WMI_DATA_VO_SVC: - set_ac2_ep_map(ar, WMM_AC_VO, response.endpoint); - break; - default: - ath6kl_err("service id is not mapped %d\n", con_req->svc_id); - return -EINVAL; - } - - return 0; -} - -static int ath6kl_init_service_ep(struct ath6kl *ar) -{ - struct htc_service_connect_req connect; - - memset(&connect, 0, sizeof(connect)); - - /* these fields are the same for all service endpoints */ - connect.ep_cb.rx = ath6kl_rx; - connect.ep_cb.rx_refill = ath6kl_rx_refill; - connect.ep_cb.tx_full = ath6kl_tx_queue_full; - - /* - * Set the max queue depth so that our ath6kl_tx_queue_full handler - * gets called. - */ - connect.max_txq_depth = MAX_DEFAULT_SEND_QUEUE_DEPTH; - connect.ep_cb.rx_refill_thresh = ATH6KL_MAX_RX_BUFFERS / 4; - if (!connect.ep_cb.rx_refill_thresh) - connect.ep_cb.rx_refill_thresh++; - - /* connect to control service */ - connect.svc_id = WMI_CONTROL_SVC; - if (ath6kl_connectservice(ar, &connect, "WMI CONTROL")) - return -EIO; - - connect.flags |= HTC_FLGS_TX_BNDL_PAD_EN; - - /* - * Limit the HTC message size on the send path, although e can - * receive A-MSDU frames of 4K, we will only send ethernet-sized - * (802.3) frames on the send path. - */ - connect.max_rxmsg_sz = WMI_MAX_TX_DATA_FRAME_LENGTH; - - /* - * To reduce the amount of committed memory for larger A_MSDU - * frames, use the recv-alloc threshold mechanism for larger - * packets. - */ - connect.ep_cb.rx_alloc_thresh = ATH6KL_BUFFER_SIZE; - connect.ep_cb.rx_allocthresh = ath6kl_alloc_amsdu_rxbuf; - - /* - * For the remaining data services set the connection flag to - * reduce dribbling, if configured to do so. - */ - connect.conn_flags |= HTC_CONN_FLGS_REDUCE_CRED_DRIB; - connect.conn_flags &= ~HTC_CONN_FLGS_THRESH_MASK; - connect.conn_flags |= HTC_CONN_FLGS_THRESH_LVL_HALF; - - connect.svc_id = WMI_DATA_BE_SVC; - - if (ath6kl_connectservice(ar, &connect, "WMI DATA BE")) - return -EIO; - - /* connect to back-ground map this to WMI LOW_PRI */ - connect.svc_id = WMI_DATA_BK_SVC; - if (ath6kl_connectservice(ar, &connect, "WMI DATA BK")) - return -EIO; - - /* connect to Video service, map this to to HI PRI */ - connect.svc_id = WMI_DATA_VI_SVC; - if (ath6kl_connectservice(ar, &connect, "WMI DATA VI")) - return -EIO; - - /* - * Connect to VO service, this is currently not mapped to a WMI - * priority stream due to historical reasons. WMI originally - * defined 3 priorities over 3 mailboxes We can change this when - * WMI is reworked so that priorities are not dependent on - * mailboxes. - */ - connect.svc_id = WMI_DATA_VO_SVC; - if (ath6kl_connectservice(ar, &connect, "WMI DATA VO")) - return -EIO; - - return 0; -} - -void ath6kl_init_control_info(struct ath6kl_vif *vif) -{ - ath6kl_init_profile_info(vif); - vif->def_txkey_index = 0; - memset(vif->wep_key_list, 0, sizeof(vif->wep_key_list)); - vif->ch_hint = 0; -} - -/* - * Set HTC/Mbox operational parameters, this can only be called when the - * target is in the BMI phase. - */ -static int ath6kl_set_htc_params(struct ath6kl *ar, u32 mbox_isr_yield_val, - u8 htc_ctrl_buf) -{ - int status; - u32 blk_size; - - blk_size = ar->mbox_info.block_size; - - if (htc_ctrl_buf) - blk_size |= ((u32)htc_ctrl_buf) << 16; - - /* set the host interest area for the block size */ - status = ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_mbox_io_block_sz)), - (u8 *)&blk_size, - 4); - if (status) { - ath6kl_err("bmi_write_memory for IO block size failed\n"); - goto out; - } - - ath6kl_dbg(ATH6KL_DBG_TRC, "block size set: %d (target addr:0x%X)\n", - blk_size, - ath6kl_get_hi_item_addr(ar, HI_ITEM(hi_mbox_io_block_sz))); - - if (mbox_isr_yield_val) { - /* set the host interest area for the mbox ISR yield limit */ - status = ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_mbox_isr_yield_limit)), - (u8 *)&mbox_isr_yield_val, - 4); - if (status) { - ath6kl_err("bmi_write_memory for yield limit failed\n"); - goto out; - } - } - -out: - return status; -} - -static int ath6kl_target_config_wlan_params(struct ath6kl *ar, int idx) -{ - int status = 0; - int ret; -#ifdef CONFIG_MACH_PX - struct ath6kl_vif *vif = ath6kl_get_vif_by_index(ar, idx); -#endif - /* - * Configure the device for rx dot11 header rules. "0,0" are the - * default values. Required if checksum offload is needed. Set - * RxMetaVersion to 2. - */ - if (ath6kl_wmi_set_rx_frame_format_cmd(ar->wmi, idx, - ar->rx_meta_ver, 0, 0)) { - ath6kl_err("unable to set the rx frame format\n"); - status = -EIO; - } - - -#ifdef CONFIG_MACH_PX - if (ar->conf_flags & ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN) { - if ((ath6kl_wmi_pmparams_cmd(ar->wmi, idx, - 0, vif->pspoll_num, 0, 0, 1, - IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN)) != 0) { - ath6kl_err("unable to set power save fail event policy during scan\n"); - status = -EIO; - } - } else { - if ((ath6kl_wmi_pmparams_cmd(ar->wmi, idx, 0, - vif->pspoll_num, 0, 0, 1, 0)) != 0) { - ath6kl_err("unable to set pm params\n"); - status = -EIO; - } - } -#else - if (ar->conf_flags & ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN) - if ((ath6kl_wmi_pmparams_cmd(ar->wmi, idx, 0, 1, 0, 0, 1, - IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN)) != 0) { - ath6kl_err("unable to set power save fail event policy\n"); - status = -EIO; - } -#endif - - - if (!(ar->conf_flags & ATH6KL_CONF_IGNORE_ERP_BARKER)) - if ((ath6kl_wmi_set_lpreamble_cmd(ar->wmi, idx, 0, - WMI_DONOT_IGNORE_BARKER_IN_ERP)) != 0) { - ath6kl_err("unable to set barker preamble policy\n"); - status = -EIO; - } - - if (ath6kl_wmi_set_keepalive_cmd(ar->wmi, idx, - WLAN_CONFIG_KEEP_ALIVE_INTERVAL)) { - ath6kl_err("unable to set keep alive interval\n"); - status = -EIO; - } - - if (ath6kl_wmi_disctimeout_cmd(ar->wmi, idx, - WLAN_CONFIG_DISCONNECT_TIMEOUT)) { - ath6kl_err("unable to set disconnect timeout\n"); - status = -EIO; - } - - if (!(ar->conf_flags & ATH6KL_CONF_ENABLE_TX_BURST)) - if (ath6kl_wmi_set_wmm_txop(ar->wmi, idx, WMI_TXOP_DISABLED)) { - ath6kl_err("unable to set txop bursting\n"); - status = -EIO; - } - - if (ar->p2p && (ar->vif_max == 1 || idx)) { - ret = ath6kl_wmi_info_req_cmd(ar->wmi, idx, - P2P_FLAG_CAPABILITIES_REQ | - P2P_FLAG_MACADDR_REQ | - P2P_FLAG_HMODEL_REQ); - if (ret) { - ath6kl_dbg(ATH6KL_DBG_TRC, "failed to request P2P " - "capabilities (%d) - assuming P2P not " - "supported\n", ret); - ar->p2p = 0; - } - } - - if (ar->p2p && (ar->vif_max == 1 || idx)) { - /* Enable Probe Request reporting for P2P */ - ret = ath6kl_wmi_probe_report_req_cmd(ar->wmi, idx, true); - if (ret) { - ath6kl_dbg(ATH6KL_DBG_TRC, "failed to enable Probe " - "Request reporting (%d)\n", ret); - } - } - -#ifdef CONFIG_MACH_PX - if (vif->nw_type == INFRA_NETWORK) { - ath6kl_dbg(ATH6KL_DBG_TRC, "AR6K: bg scan interval = %d, active dwell time = %d, passive dwell time = %d\n", - vif->scparams.bg_period, - vif->scparams.maxact_chdwell_time, - vif->scparams.pas_chdwell_time); - - ath6kl_wmi_scanparams_cmd(ar->wmi, idx, - vif->scparams.fg_start_period, - vif->scparams.fg_end_period, vif->scparams.bg_period, - vif->scparams.minact_chdwell_time, - vif->scparams.maxact_chdwell_time, - vif->scparams.pas_chdwell_time, - vif->scparams.short_scan_ratio, - vif->scparams.scan_ctrl_flags, - vif->scparams.max_dfsch_act_time, - vif->scparams.maxact_scan_per_ssid); - - ath6kl_wmi_set_roam_lrssi_cmd(ar->wmi, lrssi); - } -#endif - return status; -} - -int ath6kl_configure_target(struct ath6kl *ar) -{ - u32 param, ram_reserved_size; - u8 fw_iftype, fw_mode = 0, fw_submode = 0; - int i, status; - - param = uart_debug; - if (ath6kl_bmi_write(ar, ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_serial_enable)), (u8 *)¶m, 4)) { - ath6kl_err("bmi_write_memory for uart debug failed\n"); - return -EIO; - } - - /* - * Note: Even though the firmware interface type is - * chosen as BSS_STA for all three interfaces, can - * be configured to IBSS/AP as long as the fw submode - * remains normal mode (0 - AP, STA and IBSS). But - * due to an target assert in firmware only one interface is - * configured for now. - */ - fw_iftype = HI_OPTION_FW_MODE_BSS_STA; - - for (i = 0; i < ar->vif_max; i++) - fw_mode |= fw_iftype << (i * HI_OPTION_FW_MODE_BITS); - - /* - * By default, submodes : - * vif[0] - AP/STA/IBSS - * vif[1] - "P2P dev"/"P2P GO"/"P2P Client" - * vif[2] - "P2P dev"/"P2P GO"/"P2P Client" - */ - - for (i = 0; i < ar->max_norm_iface; i++) - fw_submode |= HI_OPTION_FW_SUBMODE_NONE << - (i * HI_OPTION_FW_SUBMODE_BITS); - - for (i = ar->max_norm_iface; i < ar->vif_max; i++) - fw_submode |= HI_OPTION_FW_SUBMODE_P2PDEV << - (i * HI_OPTION_FW_SUBMODE_BITS); - - if (ar->p2p && ar->vif_max == 1) - fw_submode = HI_OPTION_FW_SUBMODE_P2PDEV; - - param = HTC_PROTOCOL_VERSION; - if (ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_app_host_interest)), - (u8 *)¶m, 4) != 0) { - ath6kl_err("bmi_write_memory for htc version failed\n"); - return -EIO; - } - - /* set the firmware mode to STA/IBSS/AP */ - param = 0; - - if (ath6kl_bmi_read(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_option_flag)), - (u8 *)¶m, 4) != 0) { - ath6kl_err("bmi_read_memory for setting fwmode failed\n"); - return -EIO; - } - - param |= (ar->vif_max << HI_OPTION_NUM_DEV_SHIFT); - param |= fw_mode << HI_OPTION_FW_MODE_SHIFT; - param |= fw_submode << HI_OPTION_FW_SUBMODE_SHIFT; - - param |= (0 << HI_OPTION_MAC_ADDR_METHOD_SHIFT); - param |= (0 << HI_OPTION_FW_BRIDGE_SHIFT); - - if (ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_option_flag)), - (u8 *)¶m, - 4) != 0) { - ath6kl_err("bmi_write_memory for setting fwmode failed\n"); - return -EIO; - } - - ath6kl_dbg(ATH6KL_DBG_TRC, "firmware mode set\n"); - - /* - * Hardcode the address use for the extended board data - * Ideally this should be pre-allocate by the OS at boot time - * But since it is a new feature and board data is loaded - * at init time, we have to workaround this from host. - * It is difficult to patch the firmware boot code, - * but possible in theory. - */ - - param = ar->hw.board_ext_data_addr; - ram_reserved_size = ar->hw.reserved_ram_size; - - if (ath6kl_bmi_write(ar, ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_board_ext_data)), - (u8 *)¶m, 4) != 0) { - ath6kl_err("bmi_write_memory for hi_board_ext_data failed\n"); - return -EIO; - } - - if (ath6kl_bmi_write(ar, ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_end_ram_reserve_sz)), - (u8 *)&ram_reserved_size, 4) != 0) { - ath6kl_err("bmi_write_memory for hi_end_ram_reserve_sz failed\n"); - return -EIO; - } - - /* set the block size for the target */ - if (ath6kl_set_htc_params(ar, MBOX_YIELD_LIMIT, 0)) - /* use default number of control buffers */ - return -EIO; - - /* Configure GPIO AR600x UART */ - param = ar->hw.uarttx_pin; - status = ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_dbg_uart_txpin)), - (u8 *)¶m, 4); - if (status) - return status; - - /* Configure target refclk_hz */ - param = ar->hw.refclk_hz; - status = ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_refclk_hz)), - (u8 *)¶m, 4); - if (status) - return status; - - return 0; -} - -void ath6kl_core_free(struct ath6kl *ar) -{ - wiphy_free(ar->wiphy); -} - -void ath6kl_core_cleanup(struct ath6kl *ar) -{ - ath6kl_hif_power_off(ar); - - destroy_workqueue(ar->ath6kl_wq); - - if (ar->htc_target) - ath6kl_htc_cleanup(ar->htc_target); - - ath6kl_cookie_cleanup(ar); - - ath6kl_cleanup_amsdu_rxbufs(ar); - - ath6kl_bmi_cleanup(ar); - - ath6kl_debug_cleanup(ar); - - vfree(ar->fw_board); - vfree(ar->fw_otp); - vfree(ar->fw); - vfree(ar->fw_patch); - vfree(ar->fw_testscript); - - ath6kl_deinit_ieee80211_hw(ar); -} - -/* firmware upload */ -static int ath6kl_get_fw(struct ath6kl *ar, const char *filename, - u8 **fw, size_t *fw_len) -{ - const struct firmware *fw_entry; - int ret; - - ret = request_firmware(&fw_entry, filename, ar->dev); - if (ret) - return ret; - - *fw_len = fw_entry->size; - *fw = vmalloc(fw_entry->size); - - if (*fw == NULL) - ret = -ENOMEM; - - memcpy(*fw, fw_entry->data, fw_entry->size); - - release_firmware(fw_entry); - - return ret; -} - -#if 0 -#ifdef CONFIG_OF -/* - * Check the device tree for a board-id and use it to construct - * the pathname to the firmware file. Used (for now) to find a - * fallback to the "bdata.bin" file--typically a symlink to the - * appropriate board-specific file. - */ -static bool check_device_tree(struct ath6kl *ar) -{ - static const char *board_id_prop = "atheros,board-id"; - struct device_node *node; - char board_filename[64]; - const char *board_id; - int ret; - - for_each_compatible_node(node, NULL, "atheros,ath6kl") { - board_id = of_get_property(node, board_id_prop, NULL); - if (board_id == NULL) { - ath6kl_warn("No \"%s\" property on %s node.\n", - board_id_prop, node->name); - continue; - } - snprintf(board_filename, sizeof(board_filename), - "%s/bdata.%s.bin", ar->hw.fw.dir, board_id); - - ret = ath6kl_get_fw(ar, board_filename, &ar->fw_board, - &ar->fw_board_len); - if (ret) { - ath6kl_err("Failed to get DT board file %s: %d\n", - board_filename, ret); - continue; - } - return true; - } - return false; -} -#else -static bool check_device_tree(struct ath6kl *ar) -{ - return false; -} -#endif /* CONFIG_OF */ -#endif -static int ath6kl_fetch_board_file(struct ath6kl *ar) -{ - const char *filename; - int ret; - - if (ar->fw_board != NULL) - return 0; - - if (WARN_ON(ar->hw.fw_board == NULL)) - return -EINVAL; - - filename = ar->hw.fw_board; - - ret = ath6kl_get_fw(ar, filename, &ar->fw_board, - &ar->fw_board_len); - if (ret == 0) { - /* managed to get proper board file */ - return 0; - } -#if 0 - if (check_device_tree(ar)) { - /* got board file from device tree */ - return 0; - } -#endif - /* there was no proper board file, try to use default instead */ - ath6kl_warn("Failed to get board file %s (%d), trying to find default board file.\n", - filename, ret); - - filename = ar->hw.fw_default_board; - - ret = ath6kl_get_fw(ar, filename, &ar->fw_board, - &ar->fw_board_len); - if (ret) { - ath6kl_err("Failed to get default board file %s: %d\n", - filename, ret); - return ret; - } - - ath6kl_warn("WARNING! No proper board file was not found, instead using a default board file.\n"); - ath6kl_warn("Most likely your hardware won't work as specified. Install correct board file!\n"); - - return 0; -} - -static int ath6kl_fetch_otp_file(struct ath6kl *ar) -{ - char filename[100]; - int ret; - - if (ar->fw_otp != NULL) - return 0; - - if (ar->hw.fw.otp == NULL) { - ath6kl_dbg(ATH6KL_DBG_BOOT, - "no OTP file configured for this hw\n"); - return 0; - } - - snprintf(filename, sizeof(filename), "%s/%s", - ar->hw.fw.dir, ar->hw.fw.otp); - - ret = ath6kl_get_fw(ar, filename, &ar->fw_otp, - &ar->fw_otp_len); - if (ret) { - ath6kl_err("Failed to get OTP file %s: %d\n", - filename, ret); - return ret; - } - - return 0; -} - -static int ath6kl_fetch_testmode_file(struct ath6kl *ar) -{ - char filename[100]; - int ret; - - if (testmode == 0) - return 0; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "testmode %d\n", testmode); - - if (testmode == 2) { - if (ar->hw.fw.utf == NULL) { - ath6kl_warn("testmode 2 not supported\n"); - return -EOPNOTSUPP; - } - - snprintf(filename, sizeof(filename), "%s/%s", - ar->hw.fw.dir, ar->hw.fw.utf); - } else { - if (ar->hw.fw.tcmd == NULL) { - ath6kl_warn("testmode 1 not supported\n"); - return -EOPNOTSUPP; - } - - snprintf(filename, sizeof(filename), "%s/%s", - ar->hw.fw.dir, ar->hw.fw.tcmd); - } - - set_bit(TESTMODE, &ar->flag); - - ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len); - if (ret) { - ath6kl_err("Failed to get testmode %d firmware file %s: %d\n", - testmode, filename, ret); - return ret; - } - - return 0; -} - -static int ath6kl_fetch_fw_file(struct ath6kl *ar) -{ - char filename[100]; - int ret; - - if (ar->fw != NULL) - return 0; - - /* FIXME: remove WARN_ON() as we won't support FW API 1 for long */ - if (WARN_ON(ar->hw.fw.fw == NULL)) - return -EINVAL; - - snprintf(filename, sizeof(filename), "%s/%s", - ar->hw.fw.dir, ar->hw.fw.fw); - - ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len); - if (ret) { - ath6kl_err("Failed to get firmware file %s: %d\n", - filename, ret); - return ret; - } - - return 0; -} - -static int ath6kl_fetch_patch_file(struct ath6kl *ar) -{ - char filename[100]; - int ret; - - if (ar->fw_patch != NULL) - return 0; - - if (ar->hw.fw.patch == NULL) - return 0; - - snprintf(filename, sizeof(filename), "%s/%s", - ar->hw.fw.dir, ar->hw.fw.patch); - - ret = ath6kl_get_fw(ar, filename, &ar->fw_patch, - &ar->fw_patch_len); - if (ret) { - ath6kl_err("Failed to get patch file %s: %d\n", - filename, ret); - return ret; - } - - return 0; -} - -static int ath6kl_fetch_testscript_file(struct ath6kl *ar) -{ - char filename[100]; - int ret; - - if (testmode != 2) - return 0; - - if (ar->fw_testscript != NULL) - return 0; - - if (ar->hw.fw.testscript == NULL) - return 0; - - snprintf(filename, sizeof(filename), "%s/%s", - ar->hw.fw.dir, ar->hw.fw.testscript); - - ret = ath6kl_get_fw(ar, filename, &ar->fw_testscript, - &ar->fw_testscript_len); - if (ret) { - ath6kl_err("Failed to get testscript file %s: %d\n", - filename, ret); - return ret; - } - - return 0; -} - -static int ath6kl_fetch_fw_api1(struct ath6kl *ar) -{ - int ret; - - ret = ath6kl_fetch_otp_file(ar); - if (ret) - return ret; - - ret = ath6kl_fetch_fw_file(ar); - if (ret) - return ret; - - ret = ath6kl_fetch_patch_file(ar); - if (ret) - return ret; - - ret = ath6kl_fetch_testscript_file(ar); - if (ret) - return ret; - - return 0; -} - -static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name) -{ - size_t magic_len, len, ie_len; - const struct firmware *fw; - struct ath6kl_fw_ie *hdr; - char filename[100]; - const u8 *data; - int ret, ie_id, i, index, bit; - __le32 *val; - - snprintf(filename, sizeof(filename), "%s/%s", ar->hw.fw.dir, name); - - ret = request_firmware(&fw, filename, ar->dev); - if (ret) - return ret; - - data = fw->data; - len = fw->size; - - /* magic also includes the null byte, check that as well */ - magic_len = strlen(ATH6KL_FIRMWARE_MAGIC) + 1; - - if (len < magic_len) { - ret = -EINVAL; - goto out; - } - - if (memcmp(data, ATH6KL_FIRMWARE_MAGIC, magic_len) != 0) { - ret = -EINVAL; - goto out; - } - - len -= magic_len; - data += magic_len; - - /* loop elements */ - while (len > sizeof(struct ath6kl_fw_ie)) { - /* hdr is unaligned! */ - hdr = (struct ath6kl_fw_ie *) data; - - ie_id = le32_to_cpup(&hdr->id); - ie_len = le32_to_cpup(&hdr->len); - - len -= sizeof(*hdr); - data += sizeof(*hdr); - - if (len < ie_len) { - ret = -EINVAL; - goto out; - } - - switch (ie_id) { - case ATH6KL_FW_IE_OTP_IMAGE: - ath6kl_dbg(ATH6KL_DBG_BOOT, "found otp image ie (%zd B)\n", - ie_len); - - ar->fw_otp = vmalloc(ie_len); - - if (ar->fw_otp == NULL) { - ret = -ENOMEM; - goto out; - } - - memcpy(ar->fw_otp, data, ie_len); - ar->fw_otp_len = ie_len; - break; - case ATH6KL_FW_IE_FW_IMAGE: - ath6kl_dbg(ATH6KL_DBG_BOOT, "found fw image ie (%zd B)\n", - ie_len); - - /* in testmode we already might have a fw file */ - if (ar->fw != NULL) - break; - - ar->fw = vmalloc(ie_len); - - if (ar->fw == NULL) { - ret = -ENOMEM; - goto out; - - } - memcpy(ar->fw, data, ie_len); - ar->fw_len = ie_len; - break; - case ATH6KL_FW_IE_PATCH_IMAGE: - ath6kl_dbg(ATH6KL_DBG_BOOT, "found patch image ie (%zd B)\n", - ie_len); - - ar->fw_patch = vmalloc(ie_len); - - if (ar->fw_patch == NULL) { - ret = -ENOMEM; - goto out; - } - - memcpy(ar->fw_patch, data, ie_len); - ar->fw_patch_len = ie_len; - break; - case ATH6KL_FW_IE_RESERVED_RAM_SIZE: - val = (__le32 *) data; - ar->hw.reserved_ram_size = le32_to_cpup(val); - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "found reserved ram size ie 0x%d\n", - ar->hw.reserved_ram_size); - break; - case ATH6KL_FW_IE_CAPABILITIES: - if (ie_len < DIV_ROUND_UP(ATH6KL_FW_CAPABILITY_MAX, 8)) - break; - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "found firmware capabilities ie (%zd B)\n", - ie_len); - - for (i = 0; i < ATH6KL_FW_CAPABILITY_MAX; i++) { - index = i / 8; - bit = i % 8; - - if (data[index] & (1 << bit)) - __set_bit(i, ar->fw_capabilities); - } - - ath6kl_dbg_dump(ATH6KL_DBG_BOOT, "capabilities", "", - ar->fw_capabilities, - sizeof(ar->fw_capabilities)); - break; - case ATH6KL_FW_IE_PATCH_ADDR: - if (ie_len != sizeof(*val)) - break; - - val = (__le32 *) data; - ar->hw.dataset_patch_addr = le32_to_cpup(val); - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "found patch address ie 0x%x\n", - ar->hw.dataset_patch_addr); - break; - case ATH6KL_FW_IE_BOARD_ADDR: - if (ie_len != sizeof(*val)) - break; - - val = (__le32 *) data; - ar->hw.board_addr = le32_to_cpup(val); - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "found board address ie 0x%x\n", - ar->hw.board_addr); - break; - case ATH6KL_FW_IE_VIF_MAX: - if (ie_len != sizeof(*val)) - break; - - val = (__le32 *) data; - ar->vif_max = min_t(unsigned int, le32_to_cpup(val), - ATH6KL_VIF_MAX); - - if (ar->vif_max > 1 && !ar->p2p) - ar->max_norm_iface = 2; - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "found vif max ie %d\n", ar->vif_max); - break; - default: - ath6kl_dbg(ATH6KL_DBG_BOOT, "Unknown fw ie: %u\n", - le32_to_cpup(&hdr->id)); - break; - } - - len -= ie_len; - data += ie_len; - }; - - ret = 0; -out: - release_firmware(fw); - - return ret; -} - -static int ath6kl_fetch_firmwares(struct ath6kl *ar) -{ - int ret; - -#ifdef CONFIG_MACH_PX - if (testmode) - ar->hw.fw_board = AR6003_HW_2_1_1_TCMD_BOARD_DATA_FILE; -#endif - - ret = ath6kl_fetch_board_file(ar); - if (ret) - return ret; - - ret = ath6kl_fetch_testmode_file(ar); - if (ret) - return ret; - - ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API3_FILE); - if (ret == 0) { - ar->fw_api = 3; - goto out; - } - - ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API2_FILE); - if (ret == 0) { - ar->fw_api = 2; - goto out; - } - - ret = ath6kl_fetch_fw_api1(ar); - if (ret) - return ret; - - ar->fw_api = 1; - -out: - ath6kl_dbg(ATH6KL_DBG_BOOT, "using fw api %d\n", ar->fw_api); - - return 0; -} - -static int ath6kl_upload_board_file(struct ath6kl *ar) -{ - u32 board_address, board_ext_address, param; - u32 board_data_size, board_ext_data_size; - int ret; - - if (WARN_ON(ar->fw_board == NULL)) - return -ENOENT; - - /* - * Determine where in Target RAM to write Board Data. - * For AR6004, host determine Target RAM address for - * writing board data. - */ - if (ar->hw.board_addr != 0) { - board_address = ar->hw.board_addr; - ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_board_data)), - (u8 *) &board_address, 4); - } else { - ath6kl_bmi_read(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_board_data)), - (u8 *) &board_address, 4); - } - - /* determine where in target ram to write extended board data */ - ath6kl_bmi_read(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_board_ext_data)), - (u8 *) &board_ext_address, 4); - - if (ar->target_type == TARGET_TYPE_AR6003 && - board_ext_address == 0) { - ath6kl_err("Failed to get board file target address.\n"); - return -EINVAL; - } - - switch (ar->target_type) { - case TARGET_TYPE_AR6003: - board_data_size = AR6003_BOARD_DATA_SZ; - board_ext_data_size = AR6003_BOARD_EXT_DATA_SZ; - if (ar->fw_board_len > (board_data_size + board_ext_data_size)) - board_ext_data_size = AR6003_BOARD_EXT_DATA_SZ_V2; - break; - case TARGET_TYPE_AR6004: - board_data_size = AR6004_BOARD_DATA_SZ; - board_ext_data_size = AR6004_BOARD_EXT_DATA_SZ; - break; - default: - WARN_ON(1); - return -EINVAL; - break; - } - - if (board_ext_address && - ar->fw_board_len == (board_data_size + board_ext_data_size)) { - - /* write extended board data */ - ath6kl_dbg(ATH6KL_DBG_BOOT, - "writing extended board data to 0x%x (%d B)\n", - board_ext_address, board_ext_data_size); - - ret = ath6kl_bmi_write(ar, board_ext_address, - ar->fw_board + board_data_size, - board_ext_data_size); - if (ret) { - ath6kl_err("Failed to write extended board data: %d\n", - ret); - return ret; - } - - /* record that extended board data is initialized */ - param = (board_ext_data_size << 16) | 1; - - ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_board_ext_data_config)), - (unsigned char *) ¶m, 4); - } - - if (ar->fw_board_len < board_data_size) { - ath6kl_err("Too small board file: %zu\n", ar->fw_board_len); - ret = -EINVAL; - return ret; - } - - ath6kl_dbg(ATH6KL_DBG_BOOT, "writing board file to 0x%x (%d B)\n", - board_address, board_data_size); - - ret = ath6kl_bmi_write(ar, board_address, ar->fw_board, - board_data_size); - - if (ret) { - ath6kl_err("Board file bmi write failed: %d\n", ret); - return ret; - } - - /* record the fact that Board Data IS initialized */ - param = 1; - ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_board_data_initialized)), - (u8 *)¶m, 4); - - return ret; -} - -static int ath6kl_upload_otp(struct ath6kl *ar) -{ - u32 address, param; - bool from_hw = false; - int ret; - - if (ar->fw_otp == NULL) - return 0; - - address = ar->hw.app_load_addr; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "writing otp to 0x%x (%zd B)\n", address, - ar->fw_otp_len); - - ret = ath6kl_bmi_fast_download(ar, address, ar->fw_otp, - ar->fw_otp_len); - if (ret) { - ath6kl_err("Failed to upload OTP file: %d\n", ret); - return ret; - } - - /* read firmware start address */ - ret = ath6kl_bmi_read(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_app_start)), - (u8 *) &address, sizeof(address)); - - if (ret) { - ath6kl_err("Failed to read hi_app_start: %d\n", ret); - return ret; - } - - if (ar->hw.app_start_override_addr == 0) { - ar->hw.app_start_override_addr = address; - from_hw = true; - } - - ath6kl_dbg(ATH6KL_DBG_BOOT, "app_start_override_addr%s 0x%x\n", - from_hw ? " (from hw)" : "", - ar->hw.app_start_override_addr); - - /* execute the OTP code */ - ath6kl_dbg(ATH6KL_DBG_BOOT, "executing OTP at 0x%x\n", - ar->hw.app_start_override_addr); - -#ifdef CONFIG_MACH_PX - /* SOFTMAC has higher priority than OTP MAC */ - param = 1; -#else - param = 0; -#endif - - ath6kl_bmi_execute(ar, ar->hw.app_start_override_addr, ¶m); - - return ret; -} - -static int ath6kl_upload_firmware(struct ath6kl *ar) -{ - u32 address; - int ret; - - if (WARN_ON(ar->fw == NULL)) - return 0; - - address = ar->hw.app_load_addr; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "writing firmware to 0x%x (%zd B)\n", - address, ar->fw_len); - - ret = ath6kl_bmi_fast_download(ar, address, ar->fw, ar->fw_len); - - if (ret) { - ath6kl_err("Failed to write firmware: %d\n", ret); - return ret; - } - - /* - * Set starting address for firmware - * Don't need to setup app_start override addr on AR6004 - */ - if (ar->target_type != TARGET_TYPE_AR6004) { - address = ar->hw.app_start_override_addr; - ath6kl_bmi_set_app_start(ar, address); - } - return ret; -} - -static int ath6kl_upload_patch(struct ath6kl *ar) -{ - u32 address, param; - int ret; - - if (ar->fw_patch == NULL) - return 0; - - address = ar->hw.dataset_patch_addr; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "writing patch to 0x%x (%zd B)\n", - address, ar->fw_patch_len); - - ret = ath6kl_bmi_write(ar, address, ar->fw_patch, ar->fw_patch_len); - if (ret) { - ath6kl_err("Failed to write patch file: %d\n", ret); - return ret; - } - - param = address; - ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_dset_list_head)), - (unsigned char *) ¶m, 4); - - return 0; -} - -static int ath6kl_upload_testscript(struct ath6kl *ar) -{ - u32 address, param; - int ret; - - if (testmode != 2) - return 0; - - if (ar->fw_testscript == NULL) - return 0; - - address = ar->hw.testscript_addr; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "writing testscript to 0x%x (%zd B)\n", - address, ar->fw_testscript_len); - - ret = ath6kl_bmi_write(ar, address, ar->fw_testscript, - ar->fw_testscript_len); - if (ret) { - ath6kl_err("Failed to write testscript file: %d\n", ret); - return ret; - } - - param = address; - ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_ota_testscript)), - (unsigned char *) ¶m, 4); - - param = 4096; - ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_end_ram_reserve_sz)), - (unsigned char *) ¶m, 4); - - param = 1; - ath6kl_bmi_write(ar, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_test_apps_related)), - (unsigned char *) ¶m, 4); - - return 0; -} - -#ifdef GLOBALCONFIG_WLAN_COUNTRY_CODE -#define COUNTRY_MAX 76 -struct channels { - char country[30]; - char ccode[6]; - unsigned short reg_dmn_code; -} -pArray[COUNTRY_MAX] = { - {"Afghanistan", "AF 0", 0x406a}, - {"Albania", "AL 0", 0x8008}, - {"Algeria", "DZ 0", 0x800c}, - {"Angola", "AD 0", 0x406a}, - {"Austria", "AT 0", 0x8028}, - {"Australia", "AU 0", 0x8024}, - {"Bangladesh", "BD 0", 0x8032}, - {"Belgium", "BE 0", 0x8038}, - {"Bosnia", "BA 0", 0x8046}, - {"Bulgaria", "BG 0", 0x8064}, - {"Croatia", "HR 0", 0x80bf}, - {"Greece", "GR 0", 0x812c}, - {"Czech Republic", "CZ 0", 0x80cb}, - {"Egypt", "EG 0", 0x8332}, - {"Nordic", "FI 0", 0x80f6}, - {"Finland", "FI 0", 0x80f6}, - {"France", "FR 0", 0x80FA}, - {"Gabon", "GA 0", 0x406a}, - {"Germany", "DE 0", 0x8114}, - {"Ghana", "GH 0", 0x406a}, - {"Greece", "GR 0", 0x812c}, - {"Hungary", "HU 0", 0x815c}, - {"Iceland", "IS 0", 0x8160}, - {"India", "IN 0", 0x8164}, - {"Indonesia", "ID 0", 0x8168}, - {"Iraq", "IQ 0", 0x406a}, - {"IE", "IE 0", 0x8174}, - {"Ireland", "IE 0", 0x8174}, - {"Israel", "IL 0", 0x8178}, - {"Italy", "IT 0", 0x817c}, - {"Jamaica", "JM 0", 0x8184}, - {"Jordan", "JO 0", 0x8190}, - {"Central Asia", "KZ 0", 0x818e}, - {"Kazakhstan", "KZ 0", 0x818e}, - {"Kenya", "KE 0", 0x8198}, - {"BALTIC", "LV 0", 0x81ac}, - {"Libya", "LY 0", 0x406a}, - {"Lithuania", "LT 0", 0x81b8}, - {"Luxemburg", "LU 0", 0x81ba}, - {"Macedonia", "MK 0", 0x8327}, - {"Malaysia", "MY 0", 0x81ca}, - {"Mongolia", "MN 0", 0x406a}, - {"Montenegro", "ME 0", 0x837b}, - {"Morocco", "MA 0", 0x81f8}, - {"Nepal", "NP 0", 0x820c}, - {"Netherlands", "NL 0", 0x8210}, - {"The Netherlands", "NL 0", 0x8210}, - {"New Zealand", "NZ 0", 0x822a}, - {"Nigeria", "NG 0", 0x406a}, - {"Norway", "NO 0", 0x8242}, - {"Pakistan", "PK 0", 0x824a}, - {"Philippines", "PH 0", 0x8260}, - {"Poland", "PL 0", 0x8268}, - {"Portugal", "PT 0", 0x826c}, - {"Romania", "RO 0", 0x8282}, - {"Russia", "RU 0", 0x8283}, - {"KSA", "SA 0", 0x82aa}, - {"Senegal", "SN 0", 0x406a}, - {"Serbia", "RS 0", 0x8114}, - {"Singapore", "SG 0", 0x82be}, - {"Slovakia", "SK 0", 0x82bf}, - {"Slovenia", "SI 0", 0x82c1}, - {"South Africa", "ZA 0", 0x82c6}, - {"Spain", "ES 0", 0x82D4}, - {"Sri Lanka", "LK 0", 0x8090}, - {"Sweden", "SE 0", 0x82f0}, - {"Switzerland", "CH 0", 0x82f4}, - {"Thailand", "TH 0", 0x82fc}, - {"Tunisia", "TN 0", 0x8314}, - {"Turkey", "TR 0", 0x8318}, - {"Ukraine", "UA 0", 0x8324}, - {"UK", "GB 0", 0x833A}, - {"UK &IRE", "GB 0", 0x833A}, - {"United Kingdom", "GB 0", 0x833A}, - {"Uzbekistan", "UZ 0", 0x835c}, - {"Vietnam", "VN 0", 0x82c0} -}; - -static unsigned short ath6kl_get_reg_dmn_code(u8 *ccode) -{ - int i = 0; - - for (i = 0; i < COUNTRY_MAX; i++) { - if (strncmp(ccode, pArray[i].ccode, 2) == 0) { - ath6kl_dbg(ATH6KL_DBG_BOOT, "%s: %s %s 0x%x", - __func__, pArray[i].country, pArray[i].ccode, - pArray[i].reg_dmn_code); - return pArray[i].reg_dmn_code; - } - } - - ath6kl_err("%s() Failed to find reg_domain code for %s\n", - __func__, ccode); - - return 0xffff; -} - -static void ath6kl_update_ccodeinfo(struct ath6kl *ar) -{ - char ccode_filename[32]; - - do { - int ret = 0; - size_t length; - u8 *pdata = NULL; - - snprintf(ccode_filename, sizeof(ccode_filename), - "/data/.ccode.info"); - - ret = android_readwrite_file(ccode_filename, NULL, NULL, 0); - - if (ret < 0) - break; - else - length = ret; - - pdata = vmalloc(length + 1); - - if (!pdata) { - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: Cannot allocate buffer for ccode_info (%d)\n", - __func__, length); - break; - } - - if (android_readwrite_file(ccode_filename, - (char *)pdata, NULL, length) != length) { - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: file read error, length %d\n", - __func__, length); - vfree(pdata); - break; - } - pdata[length] = '\0'; - - if (reg_domain == 0xffff) - reg_domain = ath6kl_get_reg_dmn_code(pdata); - - - vfree(pdata); - } while (0); -} -#endif - -static void ath6kl_update_psminfo(struct ath6kl *ar) -{ - char psm_filename[32]; - ar->psminfo = 1; - - do { - int ret = 0; - size_t length; - u8 *pdata = NULL; - - snprintf(psm_filename, sizeof(psm_filename), "/data/.psm.info"); - - ret = android_readwrite_file(psm_filename, NULL, NULL, 0); - - if (ret < 0) - break; - else - length = ret; - - pdata = vmalloc(length); - - if (!pdata) { - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: Cannot allocate buffer for psm_info (%d)\n", - __func__, length); - break; - } - - if (android_readwrite_file(psm_filename, - (char *)pdata, NULL, length) != length) { - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: file read error, length %d\n", - __func__, length); - vfree(pdata); - break; - } - - ar->psminfo = *pdata - '0'; - ath6kl_dbg(ATH6KL_DBG_BOOT,"%s: psm_info is %d\n", __FUNCTION__, ar->psminfo); - vfree(pdata); - } while (0); -} - -static int ath6kl_init_upload(struct ath6kl *ar) -{ - u32 param, options, sleep, address; - int status = 0; - - if (ar->target_type != TARGET_TYPE_AR6003 && - ar->target_type != TARGET_TYPE_AR6004) - return -EINVAL; - - /* temporarily disable system sleep */ - address = MBOX_BASE_ADDRESS + LOCAL_SCRATCH_ADDRESS; - status = ath6kl_bmi_reg_read(ar, address, ¶m); - if (status) - return status; - - options = param; - - param |= ATH6KL_OPTION_SLEEP_DISABLE; - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - - address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS; - status = ath6kl_bmi_reg_read(ar, address, ¶m); - if (status) - return status; - - sleep = param; - - param |= SM(SYSTEM_SLEEP_DISABLE, 1); - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - - ath6kl_dbg(ATH6KL_DBG_TRC, "old options: %d, old sleep: %d\n", - options, sleep); - - /* program analog PLL register */ - /* no need to control 40/44MHz clock on AR6004 */ - if (ar->target_type != TARGET_TYPE_AR6004) { - status = ath6kl_bmi_reg_write(ar, ATH6KL_ANALOG_PLL_REGISTER, - 0xF9104001); - - if (status) - return status; - - /* Run at 80/88MHz by default */ - param = SM(CPU_CLOCK_STANDARD, 1); - - address = RTC_BASE_ADDRESS + CPU_CLOCK_ADDRESS; - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - } - - param = 0; - address = RTC_BASE_ADDRESS + LPO_CAL_ADDRESS; - param = SM(LPO_CAL_ENABLE, 1); - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - - /* WAR to avoid SDIO CRC err */ - if (ar->version.target_ver == AR6003_HW_2_0_VERSION || - ar->version.target_ver == AR6003_HW_2_1_1_VERSION) { - ath6kl_err("temporary war to avoid sdio crc error\n"); - - param = 0x20; - - address = GPIO_BASE_ADDRESS + GPIO_PIN10_ADDRESS; - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - - address = GPIO_BASE_ADDRESS + GPIO_PIN11_ADDRESS; - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - - address = GPIO_BASE_ADDRESS + GPIO_PIN12_ADDRESS; - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - - address = GPIO_BASE_ADDRESS + GPIO_PIN13_ADDRESS; - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - } - - ath6kl_bmi_init(ar); - ath6kl_bmi_reg_write(ar, 0x540678, ar6k_clock); - - /* write EEPROM data to Target RAM */ - status = ath6kl_upload_board_file(ar); - if (status) - return status; - - /* transfer One time Programmable data */ - status = ath6kl_upload_otp(ar); - if (status) - return status; - - /* Download Target firmware */ - status = ath6kl_upload_firmware(ar); - if (status) - return status; - - status = ath6kl_upload_patch(ar); - if (status) - return status; - - /* Download the test script */ - status = ath6kl_upload_testscript(ar); - if (status) - return status; - - /* Restore system sleep */ - address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS; - status = ath6kl_bmi_reg_write(ar, address, sleep); - if (status) - return status; - - address = MBOX_BASE_ADDRESS + LOCAL_SCRATCH_ADDRESS; - - if (en_ani) - param = options & ~0x20; - else - param = options | 0x20; - - status = ath6kl_bmi_reg_write(ar, address, param); - if (status) - return status; - - return status; -} - -static int ath6kl_init_hw_params(struct ath6kl *ar) -{ - const struct ath6kl_hw *hw; - int i; - - for (i = 0; i < ARRAY_SIZE(hw_list); i++) { - hw = &hw_list[i]; - - if (hw->id == ar->version.target_ver) - break; - } - - if (i == ARRAY_SIZE(hw_list)) { - ath6kl_err("Unsupported hardware version: 0x%x\n", - ar->version.target_ver); - return -EINVAL; - } - - ar->hw = *hw; - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "target_ver 0x%x target_type 0x%x dataset_patch 0x%x app_load_addr 0x%x\n", - ar->version.target_ver, ar->target_type, - ar->hw.dataset_patch_addr, ar->hw.app_load_addr); - ath6kl_dbg(ATH6KL_DBG_BOOT, - "app_start_override_addr 0x%x board_ext_data_addr 0x%x reserved_ram_size 0x%x", - ar->hw.app_start_override_addr, ar->hw.board_ext_data_addr, - ar->hw.reserved_ram_size); - ath6kl_dbg(ATH6KL_DBG_BOOT, - "refclk_hz %d uarttx_pin %d", - ar->hw.refclk_hz, ar->hw.uarttx_pin); - - return 0; -} - -static const char *ath6kl_init_get_hif_name(enum ath6kl_hif_type type) -{ - switch (type) { - case ATH6KL_HIF_TYPE_SDIO: - return "sdio"; - case ATH6KL_HIF_TYPE_USB: - return "usb"; - } - - return NULL; -} - -int ath6kl_init_hw_start(struct ath6kl *ar) -{ - long timeleft; - int ret, i; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "hw start\n"); - - ret = ath6kl_hif_power_on(ar); - if (ret) - return ret; - - ret = ath6kl_configure_target(ar); - if (ret) - goto err_power_off; - - ret = ath6kl_init_upload(ar); - if (ret) - goto err_power_off; - - if (reg_domain != 0xffff) { - ret = ath6kl_set_reg_dmn(ar); - if (ret) - goto err_power_off; - } - - /* Do we need to finish the BMI phase */ - /* FIXME: return error from ath6kl_bmi_done() */ - if (ath6kl_bmi_done(ar)) { - ret = -EIO; - goto err_power_off; - } - - /* - * The reason we have to wait for the target here is that the - * driver layer has to init BMI in order to set the host block - * size. - */ - if (ath6kl_htc_wait_target(ar->htc_target)) { - ret = -EIO; - goto err_power_off; - } - - if (ath6kl_init_service_ep(ar)) { - ret = -EIO; - goto err_cleanup_scatter; - } - - /* setup credit distribution */ - ath6kl_credit_setup(ar->htc_target, &ar->credit_state_info); - - /* start HTC */ - ret = ath6kl_htc_start(ar->htc_target); - if (ret) { - /* FIXME: call this */ - ath6kl_cookie_cleanup(ar); - goto err_cleanup_scatter; - } - - /* Wait for Wmi event to be ready */ - timeleft = wait_event_interruptible_timeout(ar->event_wq, - test_bit(WMI_READY, - &ar->flag), - WMI_TIMEOUT); - - ath6kl_dbg(ATH6KL_DBG_BOOT, "firmware booted\n"); - - - if (test_and_clear_bit(FIRST_BOOT, &ar->flag)) { - ath6kl_info("%s %s fw %s api %d%s\n", - ar->hw.name, - ath6kl_init_get_hif_name(ar->hif_type), - ar->wiphy->fw_version, - ar->fw_api, - test_bit(TESTMODE, &ar->flag) ? " testmode" : ""); - } - - if (ar->version.abi_ver != ATH6KL_ABI_VERSION) { - ath6kl_err("abi version mismatch: host(0x%x), target(0x%x)\n", - ATH6KL_ABI_VERSION, ar->version.abi_ver); - ret = -EIO; - goto err_htc_stop; - } - - if (!timeleft || signal_pending(current)) { - ath6kl_err("wmi is not ready or wait was interrupted\n"); - ret = -EIO; - goto err_htc_stop; - } - - ath6kl_dbg(ATH6KL_DBG_TRC, "%s: wmi is ready\n", __func__); - - /* communicate the wmi protocol verision to the target */ - /* FIXME: return error */ - if ((ath6kl_set_host_app_area(ar)) != 0) - ath6kl_err("unable to set the host app area\n"); - - for (i = 0; i < ar->vif_max; i++) { - ret = ath6kl_target_config_wlan_params(ar, i); - if (ret) - goto err_htc_stop; - } - - ar->state = ATH6KL_STATE_ON; -#ifdef CONFIG_MACH_PX - wake_up(&ar->event_wq); -#endif - - return 0; - -err_htc_stop: - ath6kl_htc_stop(ar->htc_target); -err_cleanup_scatter: - ath6kl_hif_cleanup_scatter(ar); -err_power_off: - ath6kl_hif_power_off(ar); - - return ret; -} - -int ath6kl_init_hw_stop(struct ath6kl *ar) -{ - int ret; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "hw stop\n"); - - ath6kl_htc_stop(ar->htc_target); - - ath6kl_hif_stop(ar); - - ath6kl_bmi_reset(ar); - - ret = ath6kl_hif_power_off(ar); - if (ret) - ath6kl_warn("failed to power off hif: %d\n", ret); - - ar->state = ATH6KL_STATE_OFF; - - return 0; -} - -int ath6kl_core_init(struct ath6kl *ar) -{ - struct ath6kl_bmi_target_info targ_info; - struct net_device *ndev; - int ret = 0, i; - - ar->ath6kl_wq = create_singlethread_workqueue("ath6kl"); - if (!ar->ath6kl_wq) - return -ENOMEM; - - ret = ath6kl_bmi_init(ar); - if (ret) - goto err_wq; - - /* - * Turn on power to get hardware (target) version and leave power - * on delibrately as we will boot the hardware anyway within few - * seconds. - */ - ret = ath6kl_hif_power_on(ar); - if (ret) - goto err_bmi_cleanup; - - ret = ath6kl_bmi_get_target_info(ar, &targ_info); - if (ret) - goto err_power_off; - - ar->version.target_ver = le32_to_cpu(targ_info.version); - ar->target_type = le32_to_cpu(targ_info.type); - ar->wiphy->hw_version = le32_to_cpu(targ_info.version); - - ret = ath6kl_init_hw_params(ar); - if (ret) - goto err_power_off; - - ar->htc_target = ath6kl_htc_create(ar); - - if (!ar->htc_target) { - ret = -ENOMEM; - goto err_power_off; - } - - ret = ath6kl_fetch_firmwares(ar); - if (ret) - goto err_htc_cleanup; - - ath6kl_mangle_mac_address(ar); - ath6kl_update_psminfo(ar); -#ifdef GLOBALCONFIG_WLAN_COUNTRY_CODE - ath6kl_update_ccodeinfo(ar); -#endif - - /* FIXME: we should free all firmwares in the error cases below */ - - /* Indicate that WMI is enabled (although not ready yet) */ - set_bit(WMI_ENABLED, &ar->flag); - ar->wmi = ath6kl_wmi_init(ar); - if (!ar->wmi) { - ath6kl_err("failed to initialize wmi\n"); - ret = -EIO; - goto err_htc_cleanup; - } - - ath6kl_dbg(ATH6KL_DBG_TRC, "%s: got wmi @ 0x%p.\n", __func__, ar->wmi); - - ret = ath6kl_register_ieee80211_hw(ar); - if (ret) - goto err_node_cleanup; - - ret = ath6kl_debug_init(ar); - if (ret) { - wiphy_unregister(ar->wiphy); - goto err_node_cleanup; - } - - for (i = 0; i < ar->vif_max; i++) - ar->avail_idx_map |= BIT(i); - - rtnl_lock(); - - /* Add an initial station interface */ - ndev = ath6kl_interface_add(ar, "wlan%d", NL80211_IFTYPE_STATION, 0, - INFRA_NETWORK); - - rtnl_unlock(); - - if (!ndev) { - ath6kl_err("Failed to instantiate a network device\n"); - ret = -ENOMEM; - wiphy_unregister(ar->wiphy); - goto err_debug_init; - } - - - ath6kl_dbg(ATH6KL_DBG_TRC, "%s: name=%s dev=0x%p, ar=0x%p\n", - __func__, ndev->name, ndev, ar); - - /* setup access class priority mappings */ - ar->ac_stream_pri_map[WMM_AC_BK] = 0; /* lowest */ - ar->ac_stream_pri_map[WMM_AC_BE] = 1; - ar->ac_stream_pri_map[WMM_AC_VI] = 2; - ar->ac_stream_pri_map[WMM_AC_VO] = 3; /* highest */ - - /* allocate some buffers that handle larger AMSDU frames */ - ath6kl_refill_amsdu_rxbufs(ar, ATH6KL_MAX_AMSDU_RX_BUFFERS); - - ath6kl_cookie_init(ar); - - ar->conf_flags = ATH6KL_CONF_IGNORE_ERP_BARKER | - ATH6KL_CONF_ENABLE_11N | ATH6KL_CONF_ENABLE_TX_BURST; - - if (suspend_mode && - suspend_mode >= WLAN_POWER_STATE_CUT_PWR && - suspend_mode <= WLAN_POWER_STATE_WOW) - ar->suspend_mode = suspend_mode; - else - ar->suspend_mode = 0; - - if (suspend_mode == WLAN_POWER_STATE_WOW && - (wow_mode == WLAN_POWER_STATE_CUT_PWR || - wow_mode == WLAN_POWER_STATE_DEEP_SLEEP)) - ar->wow_suspend_mode = wow_mode; - else - ar->wow_suspend_mode = 0; - - ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM | - WIPHY_FLAG_HAVE_AP_SME | - WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; - -#ifdef CONFIG_MACH_PX -#else - if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN, ar->fw_capabilities)) - ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; -#endif - - ar->wiphy->probe_resp_offload = - NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS | - NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 | - NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P | - NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U; - - set_bit(FIRST_BOOT, &ar->flag); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) - ndev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_RXCSUM; -#endif - - ret = ath6kl_init_hw_start(ar); - if (ret) { - ath6kl_err("Failed to start hardware: %d\n", ret); - goto err_rxbuf_cleanup; - } - - /* give our connected endpoints some buffers */ - ath6kl_rx_refill(ar->htc_target, ar->ctrl_ep); - ath6kl_rx_refill(ar->htc_target, ar->ac2ep_map[WMM_AC_BE]); - - /* - * Set mac address which is received in ready event - * FIXME: Move to ath6kl_interface_add() - */ - memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN); - - return ret; - -err_rxbuf_cleanup: - ath6kl_htc_flush_rx_buf(ar->htc_target); - ath6kl_cleanup_amsdu_rxbufs(ar); - rtnl_lock(); - ath6kl_deinit_if_data(netdev_priv(ndev)); - rtnl_unlock(); - wiphy_unregister(ar->wiphy); -err_debug_init: - ath6kl_debug_cleanup(ar); -err_node_cleanup: - ath6kl_cleanup_android_resource(ar); - ath6kl_wmi_shutdown(ar->wmi); - clear_bit(WMI_ENABLED, &ar->flag); - ar->wmi = NULL; -err_htc_cleanup: - ath6kl_htc_cleanup(ar->htc_target); -err_power_off: - ath6kl_hif_power_off(ar); -err_bmi_cleanup: - ath6kl_bmi_cleanup(ar); -err_wq: - destroy_workqueue(ar->ath6kl_wq); - - return ret; -} - -void ath6kl_cleanup_vif(struct ath6kl_vif *vif, bool wmi_ready) -{ - static u8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - bool discon_issued; - - netif_stop_queue(vif->ndev); - - clear_bit(WLAN_ENABLED, &vif->flags); - - if (wmi_ready) { - discon_issued = test_bit(CONNECTED, &vif->flags) || - test_bit(CONNECT_PEND, &vif->flags); - ath6kl_disconnect(vif); - del_timer(&vif->disconnect_timer); - - if (discon_issued) - ath6kl_disconnect_event(vif, DISCONNECT_CMD, - (vif->nw_type & AP_NETWORK) ? - bcast_mac : vif->bssid, - 0, NULL, 0); - } - - if (vif->scan_req) { - cfg80211_scan_done(vif->scan_req, true); - vif->scan_req = NULL; - } -} - -void ath6kl_stop_txrx(struct ath6kl *ar) -{ - struct ath6kl_vif *vif, *tmp_vif; - int i; - - set_bit(DESTROY_IN_PROGRESS, &ar->flag); - - if (down_interruptible(&ar->sem)) { - ath6kl_err("down_interruptible failed\n"); - return; - } - - for (i = 0; i < AP_MAX_NUM_STA; i++) - aggr_reset_state(ar->sta_list[i].aggr_conn); - - spin_lock_bh(&ar->list_lock); - list_for_each_entry_safe(vif, tmp_vif, &ar->vif_list, list) { - list_del(&vif->list); - spin_unlock_bh(&ar->list_lock); - ath6kl_cleanup_vif(vif, test_bit(WMI_READY, &ar->flag)); - rtnl_lock(); - ath6kl_deinit_if_data(vif); - rtnl_unlock(); - spin_lock_bh(&ar->list_lock); - } - spin_unlock_bh(&ar->list_lock); - - clear_bit(WMI_READY, &ar->flag); - - /* - * After wmi_shudown all WMI events will be dropped. We - * need to cleanup the buffers allocated in AP mode and - * give disconnect notification to stack, which usually - * happens in the disconnect_event. Simulate the disconnect - * event by calling the function directly. Sometimes - * disconnect_event will be received when the debug logs - * are collected. - */ - ath6kl_wmi_shutdown(ar->wmi); - - clear_bit(WMI_ENABLED, &ar->flag); - if (ar->htc_target) { - ath6kl_dbg(ATH6KL_DBG_TRC, "%s: shut down htc\n", __func__); - ath6kl_htc_stop(ar->htc_target); - } - - /* - * Try to reset the device if we can. The driver may have been - * configure NOT to reset the target during a debug session. - */ - ath6kl_dbg(ATH6KL_DBG_TRC, - "attempting to reset target on instance destroy\n"); - ath6kl_reset_device(ar, ar->target_type, true, true); - - clear_bit(WLAN_ENABLED, &ar->flag); -} diff --git a/drivers/net/wireless/ath/ath6kl/main.c b/drivers/net/wireless/ath/ath6kl/main.c deleted file mode 100755 index 9c674e6..0000000 --- a/drivers/net/wireless/ath/ath6kl/main.c +++ /dev/null @@ -1,1324 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "core.h" -#include "hif-ops.h" -#include "cfg80211.h" -#include "target.h" -#include "debug.h" -#include "wmiconfig.h" - -struct ath6kl_sta *ath6kl_find_sta(struct ath6kl_vif *vif, u8 *node_addr) -{ - struct ath6kl *ar = vif->ar; - struct ath6kl_sta *conn = NULL; - u8 i, max_conn; - - max_conn = (vif->nw_type == AP_NETWORK) ? AP_MAX_NUM_STA : 0; - - for (i = 0; i < max_conn; i++) { - if (memcmp(node_addr, ar->sta_list[i].mac, ETH_ALEN) == 0) { - conn = &ar->sta_list[i]; - break; - } - } - - return conn; -} - -struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid) -{ - struct ath6kl_sta *conn = NULL; - u8 ctr; - - for (ctr = 0; ctr < AP_MAX_NUM_STA; ctr++) { - if (ar->sta_list[ctr].aid == aid) { - conn = &ar->sta_list[ctr]; - break; - } - } - return conn; -} - -static void ath6kl_add_new_sta(struct ath6kl_vif *vif, u8 *mac, u16 aid, - u8 *wpaie, size_t ielen, u8 keymgmt, - u8 ucipher, u8 auth, u8 apsd_info) -{ - struct ath6kl *ar = vif->ar; - struct ath6kl_sta *sta; - u8 free_slot; - - free_slot = aid - 1; - - sta = &ar->sta_list[free_slot]; - memcpy(sta->mac, mac, ETH_ALEN); - if (ielen <= ATH6KL_MAX_IE) - memcpy(sta->wpa_ie, wpaie, ielen); - sta->aid = aid; - sta->keymgmt = keymgmt; - sta->ucipher = ucipher; - sta->auth = auth; - sta->apsd_info = apsd_info; - - ar->sta_list_index = ar->sta_list_index | (1 << free_slot); - ar->ap_stats.sta[free_slot].aid = cpu_to_le32(aid); - aggr_conn_init(vif, vif->aggr_cntxt, sta->aggr_conn); -} - -static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i) -{ - struct ath6kl_sta *sta = &ar->sta_list[i]; - struct ath6kl_mgmt_buff *entry, *tmp; - - /* empty the queued pkts in the PS queue if any */ - spin_lock_bh(&sta->psq_lock); - skb_queue_purge(&sta->psq); - skb_queue_purge(&sta->apsdq); - - if (sta->mgmt_psq_len != 0) { - list_for_each_entry_safe(entry, tmp, &sta->mgmt_psq, list) { - kfree(entry); - } - INIT_LIST_HEAD(&sta->mgmt_psq); - sta->mgmt_psq_len = 0; - } - - spin_unlock_bh(&sta->psq_lock); - - memset(&ar->ap_stats.sta[sta->aid - 1], 0, - sizeof(struct wmi_per_sta_stat)); - memset(sta->mac, 0, ETH_ALEN); - memset(sta->wpa_ie, 0, ATH6KL_MAX_IE); - sta->aid = 0; - sta->sta_flags = 0; - - ar->sta_list_index = ar->sta_list_index & ~(1 << i); - aggr_reset_state(sta->aggr_conn); -} - -static u8 ath6kl_remove_sta(struct ath6kl *ar, u8 *mac, u16 reason) -{ - u8 i, removed = 0; - - if (is_zero_ether_addr(mac)) - return removed; - - if (is_broadcast_ether_addr(mac)) { - ath6kl_dbg(ATH6KL_DBG_TRC, "deleting all station\n"); - - for (i = 0; i < AP_MAX_NUM_STA; i++) { - if (!is_zero_ether_addr(ar->sta_list[i].mac)) { - ath6kl_sta_cleanup(ar, i); - removed = 1; - } - } - } else { - for (i = 0; i < AP_MAX_NUM_STA; i++) { - if (memcmp(ar->sta_list[i].mac, mac, ETH_ALEN) == 0) { - ath6kl_dbg(ATH6KL_DBG_TRC, - "deleting station %s aid=%d reason=%d\n", - sec_conv_mac(mac), - ar->sta_list[i].aid, reason); - ath6kl_sta_cleanup(ar, i); - removed = 1; - break; - } - } - } - - return removed; -} - -enum htc_endpoint_id ath6kl_ac2_endpoint_id(void *devt, u8 ac) -{ - struct ath6kl *ar = devt; - return ar->ac2ep_map[ac]; -} - -struct ath6kl_cookie *ath6kl_alloc_cookie(struct ath6kl *ar) -{ - struct ath6kl_cookie *cookie; - - cookie = ar->cookie_list; - if (cookie != NULL) { - ar->cookie_list = cookie->arc_list_next; - ar->cookie_count--; - } - - return cookie; -} - -void ath6kl_cookie_init(struct ath6kl *ar) -{ - u32 i; - - ar->cookie_list = NULL; - ar->cookie_count = 0; - - memset(ar->cookie_mem, 0, sizeof(ar->cookie_mem)); - - for (i = 0; i < MAX_COOKIE_NUM; i++) - ath6kl_free_cookie(ar, &ar->cookie_mem[i]); -} - -void ath6kl_cookie_cleanup(struct ath6kl *ar) -{ - ar->cookie_list = NULL; - ar->cookie_count = 0; -} - -void ath6kl_free_cookie(struct ath6kl *ar, struct ath6kl_cookie *cookie) -{ - /* Insert first */ - - if (!ar || !cookie) - return; - - cookie->arc_list_next = ar->cookie_list; - ar->cookie_list = cookie; - ar->cookie_count++; -} - -/* - * Read from the hardware through its diagnostic window. No cooperation - * from the firmware is required for this. - */ -int ath6kl_diag_read32(struct ath6kl *ar, u32 address, u32 *value) -{ - int ret; - - ret = ath6kl_hif_diag_read32(ar, address, value); - if (ret) { - ath6kl_warn("failed to read32 through diagnose window: %d\n", - ret); - return ret; - } - - return 0; -} - -/* - * Write to the ATH6KL through its diagnostic window. No cooperation from - * the Target is required for this. - */ -int ath6kl_diag_write32(struct ath6kl *ar, u32 address, __le32 value) -{ - int ret; - - ret = ath6kl_hif_diag_write32(ar, address, value); - - if (ret) { - ath6kl_err("failed to write 0x%x during diagnose window to 0x%d\n", - address, value); - return ret; - } - - return 0; -} - -int ath6kl_diag_read(struct ath6kl *ar, u32 address, void *data, u32 length) -{ - u32 count, *buf = data; - int ret; - - if (WARN_ON(length % 4)) - return -EINVAL; - - for (count = 0; count < length / 4; count++, address += 4) { - ret = ath6kl_diag_read32(ar, address, &buf[count]); - if (ret) - return ret; - } - - return 0; -} - -int ath6kl_diag_write(struct ath6kl *ar, u32 address, void *data, u32 length) -{ - u32 count; - __le32 *buf = data; - int ret; - - if (WARN_ON(length % 4)) - return -EINVAL; - - for (count = 0; count < length / 4; count++, address += 4) { - ret = ath6kl_diag_write32(ar, address, buf[count]); - if (ret) - return ret; - } - - return 0; -} - -int ath6kl_read_fwlogs(struct ath6kl *ar) -{ - struct ath6kl_dbglog_hdr debug_hdr; - struct ath6kl_dbglog_buf debug_buf; - u32 address, length, dropped, firstbuf, debug_hdr_addr; - int ret, loop; - u8 *buf; - - buf = kmalloc(ATH6KL_FWLOG_PAYLOAD_SIZE, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - address = TARG_VTOP(ar->target_type, - ath6kl_get_hi_item_addr(ar, - HI_ITEM(hi_dbglog_hdr))); - - ret = ath6kl_diag_read32(ar, address, &debug_hdr_addr); - if (ret) - goto out; - - /* Get the contents of the ring buffer */ - if (debug_hdr_addr == 0) { - ath6kl_warn("Invalid address for debug_hdr_addr\n"); - ret = -EINVAL; - goto out; - } - - address = TARG_VTOP(ar->target_type, debug_hdr_addr); - ath6kl_diag_read(ar, address, &debug_hdr, sizeof(debug_hdr)); - - address = TARG_VTOP(ar->target_type, - le32_to_cpu(debug_hdr.dbuf_addr)); - firstbuf = address; - dropped = le32_to_cpu(debug_hdr.dropped); - ath6kl_diag_read(ar, address, &debug_buf, sizeof(debug_buf)); - - loop = 100; - - do { - address = TARG_VTOP(ar->target_type, - le32_to_cpu(debug_buf.buffer_addr)); - length = le32_to_cpu(debug_buf.length); - - if (length != 0 && (le32_to_cpu(debug_buf.length) <= - le32_to_cpu(debug_buf.bufsize))) { - length = ALIGN(length, 4); - - ret = ath6kl_diag_read(ar, address, - buf, length); - if (ret) - goto out; - - ath6kl_debug_fwlog_event(ar, buf, length); - } - - address = TARG_VTOP(ar->target_type, - le32_to_cpu(debug_buf.next)); - ath6kl_diag_read(ar, address, &debug_buf, sizeof(debug_buf)); - if (ret) - goto out; - - loop--; - - if (WARN_ON(loop == 0)) { - ret = -ETIMEDOUT; - goto out; - } - } while (address != firstbuf); - -out: - kfree(buf); - - return ret; -} - -#ifdef CONFIG_MACH_PX -void ath6kl_print_ar6k_registers(struct ath6kl *ar) -{ -#if 0 - u32 reg_addr; - u32 epc_addr1, epc_addr2, epc_addr3, epc_addr4; - u32 epc1, epc2, epc3, epc4; - u32 intrs, resetc, ssleep; - int ret; - - epc_addr1 = EPC1_ADDR; - if (epc_addr1 != 0x00) - { - epc_addr2 = epc_addr1 + 4; - epc_addr3 = epc_addr1 + 8; - epc_addr4 = epc_addr1 + 12; - - reg_addr = TARG_VTOP(ar->target_type, le32_to_cpu(epc_addr1)); - - ret = ath6kl_diag_read32(ar, reg_addr, &epc1); - if (ret) - ath6kl_err("diag_read of epc1 is failed\n"); - - - reg_addr = TARG_VTOP(ar->target_type, le32_to_cpu(epc_addr2)); - - ret = ath6kl_diag_read32(ar, reg_addr, &epc2); - if (ret) - ath6kl_err("diag_read of epc2 is failed\n"); - - - reg_addr = TARG_VTOP(ar->target_type, le32_to_cpu(epc_addr3)); - - ret = ath6kl_diag_read32(ar, reg_addr, &epc3); - if (ret) - ath6kl_err("diag_read of epc3 is failed\n"); - - - reg_addr = TARG_VTOP(ar->target_type, le32_to_cpu(epc_addr4)); - - ret = ath6kl_diag_read32(ar, reg_addr, &epc4); - if (ret) - ath6kl_err("diag_read of epc4 is failed\n"); - - ath6kl_dbg(ATH6KL_DBG_TRC, "ath6kl:reg_dump EPC: %x %x %x %x\n", - epc1, epc2, epc3, epc4); - } - - /* Interrupt Status */ - reg_addr = TARG_VTOP(ar->target_type, le32_to_cpu(0x4034)); - - ret = ath6kl_diag_read32(ar, reg_addr, &intrs); - if (ret) - ath6kl_err("diag_read of intrs is failed\n"); - else - ath6kl_dbg(ATH6KL_DBG_TRC, - "ath6kl:reg_dump interrupt status: %x\n", intrs); - - /* Reset Cause */ - reg_addr = TARG_VTOP(ar->target_type, le32_to_cpu(0x40C0)); - - ret = ath6kl_diag_read32(ar, reg_addr, &resetc); - if (ret) - ath6kl_err("diag_read of resetc is failed\n"); - else - ath6kl_dbg(ATH6KL_DBG_TRC, "ath6kl:reg_dump reset cause: %x\n", - resetc); - - - /* System Sleep */ - reg_addr = TARG_VTOP(ar->target_type, le32_to_cpu(0x40C4)); - - ret = ath6kl_diag_read32(ar, reg_addr, &ssleep); - if (ret) - ath6kl_err("diag_read of ssleep is failed\n"); - else - ath6kl_dbg(ATH6KL_DBG_TRC, - "ath6kl:reg_dump system sleep: %x\n", ssleep); -#endif -} -#endif - -/* FIXME: move to a better place, target.h? */ -#define AR6003_RESET_CONTROL_ADDRESS 0x00004000 -#define AR6004_RESET_CONTROL_ADDRESS 0x00004000 - -void ath6kl_reset_device(struct ath6kl *ar, u32 target_type, - bool wait_fot_compltn, bool cold_reset) -{ - int status = 0; - u32 address; - __le32 data; - - if (target_type != TARGET_TYPE_AR6003 && - target_type != TARGET_TYPE_AR6004) - return; - - data = cold_reset ? cpu_to_le32(RESET_CONTROL_COLD_RST) : - cpu_to_le32(RESET_CONTROL_MBOX_RST); - - switch (target_type) { - case TARGET_TYPE_AR6003: - address = AR6003_RESET_CONTROL_ADDRESS; - break; - case TARGET_TYPE_AR6004: - address = AR6004_RESET_CONTROL_ADDRESS; - break; - } - - status = ath6kl_diag_write32(ar, address, data); - - if (status) - ath6kl_err("failed to reset target\n"); -} - -static void ath6kl_install_static_wep_keys(struct ath6kl_vif *vif) -{ - u8 index; - u8 keyusage; - - for (index = 0; index <= WMI_MAX_KEY_INDEX; index++) { - if (vif->wep_key_list[index].key_len) { - keyusage = GROUP_USAGE; - if (index == vif->def_txkey_index) - keyusage |= TX_USAGE; - - ath6kl_wmi_addkey_cmd(vif->ar->wmi, vif->fw_vif_idx, - index, - WEP_CRYPT, - keyusage, - vif->wep_key_list[index].key_len, - NULL, 0, - vif->wep_key_list[index].key, - KEY_OP_INIT_VAL, NULL, - NO_SYNC_WMIFLAG); - } - } -} - -void ath6kl_connect_ap_mode_bss(struct ath6kl_vif *vif, u16 channel) -{ - struct ath6kl *ar = vif->ar; - struct ath6kl_req_key *ik; - int res; - u8 key_rsc[ATH6KL_KEY_SEQ_LEN]; - - ik = &ar->ap_mode_bkey; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "AP mode started on %u MHz\n", channel); - - switch (vif->auth_mode) { - case NONE_AUTH: - if (vif->prwise_crypto == WEP_CRYPT) - ath6kl_install_static_wep_keys(vif); - if (!ik->valid || ik->key_type != WAPI_CRYPT) - break; - /* for WAPI, we need to set the delayed group key, continue: */ - case WPA_PSK_AUTH: - case WPA2_PSK_AUTH: - case (WPA_PSK_AUTH | WPA2_PSK_AUTH): - if (!ik->valid) - break; - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delayed addkey for " - "the initial group key for AP mode\n"); - memset(key_rsc, 0, sizeof(key_rsc)); - res = ath6kl_wmi_addkey_cmd( - ar->wmi, vif->fw_vif_idx, ik->key_index, ik->key_type, - GROUP_USAGE, ik->key_len, key_rsc, ATH6KL_KEY_SEQ_LEN, - ik->key, - KEY_OP_INIT_VAL, NULL, SYNC_BOTH_WMIFLAG); - if (res) { - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delayed " - "addkey failed: %d\n", res); - } - break; - } - - ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, NONE_BSS_FILTER, 0); - set_bit(CONNECTED, &vif->flags); - netif_carrier_on(vif->ndev); -} - -void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr, - u8 keymgmt, u8 ucipher, u8 auth, - u8 assoc_req_len, u8 *assoc_info, u8 apsd_info) -{ - u8 *ies = NULL, *wpa_ie = NULL, *pos; - size_t ies_len = 0; - struct station_info sinfo; - - ath6kl_dbg(ATH6KL_DBG_TRC, "new station %s aid=%d\n", - sec_conv_mac(mac_addr), aid); - - if (assoc_req_len > sizeof(struct ieee80211_hdr_3addr)) { - struct ieee80211_mgmt *mgmt = - (struct ieee80211_mgmt *) assoc_info; - if (ieee80211_is_assoc_req(mgmt->frame_control) && - assoc_req_len >= sizeof(struct ieee80211_hdr_3addr) + - sizeof(mgmt->u.assoc_req)) { - ies = mgmt->u.assoc_req.variable; - ies_len = assoc_info + assoc_req_len - ies; - } else if (ieee80211_is_reassoc_req(mgmt->frame_control) && - assoc_req_len >= sizeof(struct ieee80211_hdr_3addr) - + sizeof(mgmt->u.reassoc_req)) { - ies = mgmt->u.reassoc_req.variable; - ies_len = assoc_info + assoc_req_len - ies; - } - } - - pos = ies; - while (pos && pos + 1 < ies + ies_len) { - if (pos + 2 + pos[1] > ies + ies_len) - break; - if (pos[0] == WLAN_EID_RSN) - wpa_ie = pos; /* RSN IE */ - else if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && - pos[1] >= 4 && - pos[2] == 0x00 && pos[3] == 0x50 && pos[4] == 0xf2) { - if (pos[5] == 0x01) - wpa_ie = pos; /* WPA IE */ - else if (pos[5] == 0x04) { - wpa_ie = pos; /* WPS IE */ - break; /* overrides WPA/RSN IE */ - } - } else if (pos[0] == 0x44 && wpa_ie == NULL) { - /* - * Note: WAPI Parameter Set IE re-uses Element ID that - * was officially allocated for BSS AC Access Delay. As - * such, we need to be a bit more careful on when - * parsing the frame. However, BSS AC Access Delay - * element is not supposed to be included in - * (Re)Association Request frames, so this should not - * cause problems. - */ - wpa_ie = pos; /* WAPI IE */ - break; - } - pos += 2 + pos[1]; - } - - ath6kl_add_new_sta(vif, mac_addr, aid, wpa_ie, - wpa_ie ? 2 + wpa_ie[1] : 0, - keymgmt, ucipher, auth, apsd_info); - - /* send event to application */ - memset(&sinfo, 0, sizeof(sinfo)); - - /* TODO: sinfo.generation */ - - sinfo.assoc_req_ies = ies; - sinfo.assoc_req_ies_len = ies_len; - sinfo.filled |= STATION_INFO_ASSOC_REQ_IES; - - cfg80211_new_sta(vif->ndev, mac_addr, &sinfo, GFP_KERNEL); - - netif_wake_queue(vif->ndev); -} - -void disconnect_timer_handler(unsigned long ptr) -{ - struct net_device *dev = (struct net_device *)ptr; - struct ath6kl_vif *vif = netdev_priv(dev); - - ath6kl_init_profile_info(vif); - ath6kl_disconnect(vif); -} - -void ath6kl_disconnect(struct ath6kl_vif *vif) -{ - if (test_bit(CONNECTED, &vif->flags) || - test_bit(CONNECT_PEND, &vif->flags)) { - ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx); - /* - * Disconnect command is issued, clear the connect pending - * flag. The connected flag will be cleared in - * disconnect event notification. - */ - clear_bit(CONNECT_PEND, &vif->flags); - } -} - -/* WMI Event handlers */ - -void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver) -{ - struct ath6kl *ar = devt; - - memcpy(ar->mac_addr, datap, ETH_ALEN); - ath6kl_dbg(ATH6KL_DBG_TRC, "%s: mac addr = %s\n", - __func__, sec_conv_mac(ar->mac_addr)); - - ar->version.wlan_ver = sw_ver; - ar->version.abi_ver = abi_ver; - - snprintf(ar->wiphy->fw_version, - sizeof(ar->wiphy->fw_version), - "%u.%u.%u.%u", - (ar->version.wlan_ver & 0xf0000000) >> 28, - (ar->version.wlan_ver & 0x0f000000) >> 24, - (ar->version.wlan_ver & 0x00ff0000) >> 16, - (ar->version.wlan_ver & 0x0000ffff)); - - /* indicate to the waiting thread that the ready event was received */ - set_bit(WMI_READY, &ar->flag); - wake_up(&ar->event_wq); -} - -void ath6kl_scan_complete_evt(struct ath6kl_vif *vif, int status) -{ - struct ath6kl *ar = vif->ar; - bool aborted = false; - - if (status != WMI_SCAN_STATUS_SUCCESS) - aborted = true; - - ath6kl_cfg80211_scan_complete_event(vif, aborted); - - if (!ar->usr_bss_filter) { - clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); - ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, - NONE_BSS_FILTER, 0); - } - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "scan complete: %d\n", status); -} - -void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, u8 *bssid, - u16 listen_int, u16 beacon_int, - enum network_type net_type, u8 beacon_ie_len, - u8 assoc_req_len, u8 assoc_resp_len, - u8 *assoc_info) -{ - struct ath6kl *ar = vif->ar; - - ath6kl_cfg80211_connect_event(vif, channel, bssid, - listen_int, beacon_int, - net_type, beacon_ie_len, - assoc_req_len, assoc_resp_len, - assoc_info); - - memcpy(vif->bssid, bssid, sizeof(vif->bssid)); - vif->bss_ch = channel; - - if ((vif->nw_type == INFRA_NETWORK)) - ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, - vif->listen_intvl_t, 0); - - netif_wake_queue(vif->ndev); - - /* Update connect & link status atomically */ - spin_lock_bh(&vif->if_lock); - set_bit(CONNECTED, &vif->flags); - clear_bit(CONNECT_PEND, &vif->flags); - netif_carrier_on(vif->ndev); - spin_unlock_bh(&vif->if_lock); - - aggr_reset_state(vif->aggr_cntxt->aggr_conn); - vif->reconnect_flag = 0; - - if ((vif->nw_type == ADHOC_NETWORK) && ar->ibss_ps_enable) { - memset(ar->node_map, 0, sizeof(ar->node_map)); - ar->node_num = 0; - ar->next_ep_id = ENDPOINT_2; - } - - if (!ar->usr_bss_filter) { - set_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); - ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, - CURRENT_BSS_FILTER, 0); - } -} - -void ath6kl_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid, bool ismcast) -{ - struct ath6kl_sta *sta; - struct ath6kl *ar = vif->ar; - u8 tsc[6]; - - /* - * For AP case, keyid will have aid of STA which sent pkt with - * MIC error. Use this aid to get MAC & send it to hostapd. - */ - if (vif->nw_type == AP_NETWORK) { - sta = ath6kl_find_sta_by_aid(ar, (keyid >> 2)); - if (!sta) - return; - - ath6kl_dbg(ATH6KL_DBG_TRC, - "ap tkip mic error received from aid=%d\n", keyid); - - memset(tsc, 0, sizeof(tsc)); /* FIX: get correct TSC */ - cfg80211_michael_mic_failure(vif->ndev, sta->mac, - NL80211_KEYTYPE_PAIRWISE, keyid, - tsc, GFP_KERNEL); - } else - ath6kl_cfg80211_tkip_micerr_event(vif, keyid, ismcast); - -} - -static void ath6kl_update_target_stats(struct ath6kl_vif *vif, u8 *ptr, u32 len) -{ - struct wmi_target_stats *tgt_stats = - (struct wmi_target_stats *) ptr; - struct ath6kl *ar = vif->ar; - struct target_stats *stats = &vif->target_stats; - struct tkip_ccmp_stats *ccmp_stats; - u8 ac; - - if (len < sizeof(*tgt_stats)) - return; - - ath6kl_dbg(ATH6KL_DBG_TRC, "updating target stats\n"); - - stats->tx_pkt += le32_to_cpu(tgt_stats->stats.tx.pkt); - stats->tx_byte += le32_to_cpu(tgt_stats->stats.tx.byte); - stats->tx_ucast_pkt += le32_to_cpu(tgt_stats->stats.tx.ucast_pkt); - stats->tx_ucast_byte += le32_to_cpu(tgt_stats->stats.tx.ucast_byte); - stats->tx_mcast_pkt += le32_to_cpu(tgt_stats->stats.tx.mcast_pkt); - stats->tx_mcast_byte += le32_to_cpu(tgt_stats->stats.tx.mcast_byte); - stats->tx_bcast_pkt += le32_to_cpu(tgt_stats->stats.tx.bcast_pkt); - stats->tx_bcast_byte += le32_to_cpu(tgt_stats->stats.tx.bcast_byte); - stats->tx_rts_success_cnt += - le32_to_cpu(tgt_stats->stats.tx.rts_success_cnt); - - for (ac = 0; ac < WMM_NUM_AC; ac++) - stats->tx_pkt_per_ac[ac] += - le32_to_cpu(tgt_stats->stats.tx.pkt_per_ac[ac]); - - stats->tx_err += le32_to_cpu(tgt_stats->stats.tx.err); - stats->tx_fail_cnt += le32_to_cpu(tgt_stats->stats.tx.fail_cnt); - stats->tx_retry_cnt += le32_to_cpu(tgt_stats->stats.tx.retry_cnt); - stats->tx_mult_retry_cnt += - le32_to_cpu(tgt_stats->stats.tx.mult_retry_cnt); - stats->tx_rts_fail_cnt += - le32_to_cpu(tgt_stats->stats.tx.rts_fail_cnt); - stats->tx_ucast_rate = - ath6kl_wmi_get_rate(a_sle32_to_cpu(tgt_stats->stats.tx.ucast_rate)); - - stats->rx_pkt += le32_to_cpu(tgt_stats->stats.rx.pkt); - stats->rx_byte += le32_to_cpu(tgt_stats->stats.rx.byte); - stats->rx_ucast_pkt += le32_to_cpu(tgt_stats->stats.rx.ucast_pkt); - stats->rx_ucast_byte += le32_to_cpu(tgt_stats->stats.rx.ucast_byte); - stats->rx_mcast_pkt += le32_to_cpu(tgt_stats->stats.rx.mcast_pkt); - stats->rx_mcast_byte += le32_to_cpu(tgt_stats->stats.rx.mcast_byte); - stats->rx_bcast_pkt += le32_to_cpu(tgt_stats->stats.rx.bcast_pkt); - stats->rx_bcast_byte += le32_to_cpu(tgt_stats->stats.rx.bcast_byte); - stats->rx_frgment_pkt += le32_to_cpu(tgt_stats->stats.rx.frgment_pkt); - stats->rx_err += le32_to_cpu(tgt_stats->stats.rx.err); - stats->rx_crc_err += le32_to_cpu(tgt_stats->stats.rx.crc_err); - stats->rx_key_cache_miss += - le32_to_cpu(tgt_stats->stats.rx.key_cache_miss); - stats->rx_decrypt_err += le32_to_cpu(tgt_stats->stats.rx.decrypt_err); - stats->rx_dupl_frame += le32_to_cpu(tgt_stats->stats.rx.dupl_frame); - stats->rx_ucast_rate = - ath6kl_wmi_get_rate(a_sle32_to_cpu(tgt_stats->stats.rx.ucast_rate)); - - ccmp_stats = &tgt_stats->stats.tkip_ccmp_stats; - - stats->tkip_local_mic_fail += - le32_to_cpu(ccmp_stats->tkip_local_mic_fail); - stats->tkip_cnter_measures_invoked += - le32_to_cpu(ccmp_stats->tkip_cnter_measures_invoked); - stats->tkip_fmt_err += le32_to_cpu(ccmp_stats->tkip_fmt_err); - - stats->ccmp_fmt_err += le32_to_cpu(ccmp_stats->ccmp_fmt_err); - stats->ccmp_replays += le32_to_cpu(ccmp_stats->ccmp_replays); - - stats->pwr_save_fail_cnt += - le32_to_cpu(tgt_stats->pm_stats.pwr_save_failure_cnt); - stats->noise_floor_calib = - a_sle32_to_cpu(tgt_stats->noise_floor_calib); - - stats->cs_bmiss_cnt += - le32_to_cpu(tgt_stats->cserv_stats.cs_bmiss_cnt); - stats->cs_low_rssi_cnt += - le32_to_cpu(tgt_stats->cserv_stats.cs_low_rssi_cnt); - stats->cs_connect_cnt += - le16_to_cpu(tgt_stats->cserv_stats.cs_connect_cnt); - stats->cs_discon_cnt += - le16_to_cpu(tgt_stats->cserv_stats.cs_discon_cnt); - - stats->cs_ave_beacon_rssi = - a_sle16_to_cpu(tgt_stats->cserv_stats.cs_ave_beacon_rssi); - - stats->cs_last_roam_msec = - tgt_stats->cserv_stats.cs_last_roam_msec; - stats->cs_snr = tgt_stats->cserv_stats.cs_snr; - stats->cs_rssi = a_sle16_to_cpu(tgt_stats->cserv_stats.cs_rssi); - - stats->lq_val = le32_to_cpu(tgt_stats->lq_val); - - stats->wow_pkt_dropped += - le32_to_cpu(tgt_stats->wow_stats.wow_pkt_dropped); - stats->wow_host_pkt_wakeups += - tgt_stats->wow_stats.wow_host_pkt_wakeups; - stats->wow_host_evt_wakeups += - tgt_stats->wow_stats.wow_host_evt_wakeups; - stats->wow_evt_discarded += - le16_to_cpu(tgt_stats->wow_stats.wow_evt_discarded); - - stats->arp_received = le32_to_cpu(tgt_stats->arp_stats.arp_received); - stats->arp_replied = le32_to_cpu(tgt_stats->arp_stats.arp_replied); - stats->arp_matched = le32_to_cpu(tgt_stats->arp_stats.arp_matched); - - ath6kl_wmicfg_send_stats(vif, stats); - - if (test_bit(STATS_UPDATE_PEND, &vif->flags)) { - clear_bit(STATS_UPDATE_PEND, &vif->flags); - wake_up(&ar->event_wq); - } -} - -static void ath6kl_add_le32(__le32 *var, __le32 val) -{ - *var = cpu_to_le32(le32_to_cpu(*var) + le32_to_cpu(val)); -} - -void ath6kl_tgt_stats_event(struct ath6kl_vif *vif, u8 *ptr, u32 len) -{ - struct wmi_ap_mode_stat *p = (struct wmi_ap_mode_stat *) ptr; - struct ath6kl *ar = vif->ar; - struct wmi_ap_mode_stat *ap = &ar->ap_stats; - struct wmi_per_sta_stat *st_ap, *st_p; - u8 ac; - - if (vif->nw_type == AP_NETWORK) { - if (len < sizeof(*p)) - return; - - for (ac = 0; ac < AP_MAX_NUM_STA; ac++) { - st_ap = &ap->sta[ac]; - st_p = &p->sta[ac]; - - ath6kl_add_le32(&st_ap->tx_bytes, st_p->tx_bytes); - ath6kl_add_le32(&st_ap->tx_pkts, st_p->tx_pkts); - ath6kl_add_le32(&st_ap->tx_error, st_p->tx_error); - ath6kl_add_le32(&st_ap->tx_discard, st_p->tx_discard); - ath6kl_add_le32(&st_ap->rx_bytes, st_p->rx_bytes); - ath6kl_add_le32(&st_ap->rx_pkts, st_p->rx_pkts); - ath6kl_add_le32(&st_ap->rx_error, st_p->rx_error); - ath6kl_add_le32(&st_ap->rx_discard, st_p->rx_discard); - } - - } else { - ath6kl_update_target_stats(vif, ptr, len); - } -} - -void ath6kl_wakeup_event(void *dev) -{ - struct ath6kl *ar = (struct ath6kl *) dev; - - wake_up(&ar->event_wq); -} - -void ath6kl_txpwr_rx_evt(void *devt, u8 tx_pwr) -{ - struct ath6kl *ar = (struct ath6kl *) devt; - - ar->tx_pwr = tx_pwr; - wake_up(&ar->event_wq); -} - -void ath6kl_pspoll_event(struct ath6kl_vif *vif, u8 aid) -{ - struct ath6kl_sta *conn; - struct sk_buff *skb; - bool psq_empty = false; - struct ath6kl *ar = vif->ar; - struct ath6kl_mgmt_buff *mgmt_buf; - - conn = ath6kl_find_sta_by_aid(ar, aid); - - if (!conn) - return; - /* - * Send out a packet queued on ps queue. When the ps queue - * becomes empty update the PVB for this station. - */ - spin_lock_bh(&conn->psq_lock); - psq_empty = skb_queue_empty(&conn->psq) && (conn->mgmt_psq_len == 0); - spin_unlock_bh(&conn->psq_lock); - - if (psq_empty) - /* TODO: Send out a NULL data frame */ - return; - - spin_lock_bh(&conn->psq_lock); - if (conn->mgmt_psq_len > 0) { - mgmt_buf = list_first_entry(&conn->mgmt_psq, - struct ath6kl_mgmt_buff, list); - list_del(&mgmt_buf->list); - conn->mgmt_psq_len--; - spin_unlock_bh(&conn->psq_lock); - - conn->sta_flags |= STA_PS_POLLED; - ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, - mgmt_buf->id, mgmt_buf->freq, - mgmt_buf->wait, mgmt_buf->buf, - mgmt_buf->len, mgmt_buf->no_cck); - conn->sta_flags &= ~STA_PS_POLLED; - kfree(mgmt_buf); - } else { - skb = skb_dequeue(&conn->psq); - spin_unlock_bh(&conn->psq_lock); - - conn->sta_flags |= STA_PS_POLLED; - ath6kl_data_tx(skb, vif->ndev); - conn->sta_flags &= ~STA_PS_POLLED; - } - - spin_lock_bh(&conn->psq_lock); - psq_empty = skb_queue_empty(&conn->psq) && (conn->mgmt_psq_len == 0); - spin_unlock_bh(&conn->psq_lock); - - if (psq_empty) - ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, conn->aid, 0); -} - -void ath6kl_dtimexpiry_event(struct ath6kl_vif *vif) -{ - bool mcastq_empty = false; - struct sk_buff *skb; - struct ath6kl *ar = vif->ar; - - /* - * If there are no associated STAs, ignore the DTIM expiry event. - * There can be potential race conditions where the last associated - * STA may disconnect & before the host could clear the 'Indicate - * DTIM' request to the firmware, the firmware would have just - * indicated a DTIM expiry event. The race is between 'clear DTIM - * expiry cmd' going from the host to the firmware & the DTIM - * expiry event happening from the firmware to the host. - */ - if (!ar->sta_list_index) - return; - - spin_lock_bh(&ar->mcastpsq_lock); - mcastq_empty = skb_queue_empty(&ar->mcastpsq); - spin_unlock_bh(&ar->mcastpsq_lock); - - if (mcastq_empty) - return; - - /* set the STA flag to dtim_expired for the frame to go out */ - set_bit(DTIM_EXPIRED, &vif->flags); - - spin_lock_bh(&ar->mcastpsq_lock); - while ((skb = skb_dequeue(&ar->mcastpsq)) != NULL) { - spin_unlock_bh(&ar->mcastpsq_lock); - - ath6kl_data_tx(skb, vif->ndev); - - spin_lock_bh(&ar->mcastpsq_lock); - } - spin_unlock_bh(&ar->mcastpsq_lock); - - clear_bit(DTIM_EXPIRED, &vif->flags); - - /* clear the LSB of the BitMapCtl field of the TIM IE */ - ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, MCAST_AID, 0); -} - -void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason, u8 *bssid, - u8 assoc_resp_len, u8 *assoc_info, - u16 prot_reason_status) -{ - struct ath6kl *ar = vif->ar; - - if (vif->nw_type == AP_NETWORK) { - if (!ath6kl_remove_sta(ar, bssid, prot_reason_status)) - return; - - /* if no more associated STAs, empty the mcast PS q */ - if (ar->sta_list_index == 0) { - spin_lock_bh(&ar->mcastpsq_lock); - skb_queue_purge(&ar->mcastpsq); - spin_unlock_bh(&ar->mcastpsq_lock); - - /* clear the LSB of the TIM IE's BitMapCtl field */ - if (test_bit(WMI_READY, &ar->flag)) - ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, - MCAST_AID, 0); - } - - if (!is_broadcast_ether_addr(bssid)) { - /* send event to application */ - cfg80211_del_sta(vif->ndev, bssid, GFP_KERNEL); - } - - if (memcmp(vif->ndev->dev_addr, bssid, ETH_ALEN) == 0) { - memset(vif->wep_key_list, 0, sizeof(vif->wep_key_list)); - clear_bit(CONNECTED, &vif->flags); - } - return; - } - - ath6kl_cfg80211_disconnect_event(vif, reason, bssid, - assoc_resp_len, assoc_info, - prot_reason_status); - - aggr_reset_state(vif->aggr_cntxt->aggr_conn); - - del_timer(&vif->disconnect_timer); - - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "disconnect reason is %d\n", reason); - - /* - * If the event is due to disconnect cmd from the host, only they - * the target would stop trying to connect. Under any other - * condition, target would keep trying to connect. - */ - if (reason == DISCONNECT_CMD) { - if (!ar->usr_bss_filter && test_bit(WMI_READY, &ar->flag)) - ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, - NONE_BSS_FILTER, 0); - } else { - set_bit(CONNECT_PEND, &vif->flags); - if (((reason == ASSOC_FAILED) && - (prot_reason_status == 0x11)) || - ((reason == ASSOC_FAILED) && (prot_reason_status == 0x0) - && (vif->reconnect_flag == 1))) { - set_bit(CONNECTED, &vif->flags); - return; - } - } - - /* update connect & link status atomically */ - spin_lock_bh(&vif->if_lock); - clear_bit(CONNECTED, &vif->flags); - netif_carrier_off(vif->ndev); - spin_unlock_bh(&vif->if_lock); - - if ((reason != CSERV_DISCONNECT) || (vif->reconnect_flag != 1)) - vif->reconnect_flag = 0; - - if (reason != CSERV_DISCONNECT) - ar->user_key_ctrl = 0; - - netif_stop_queue(vif->ndev); - memset(vif->bssid, 0, sizeof(vif->bssid)); - vif->bss_ch = 0; - - ath6kl_tx_data_cleanup(ar); -} - -struct ath6kl_vif *ath6kl_vif_first(struct ath6kl *ar) -{ - struct ath6kl_vif *vif; - - spin_lock_bh(&ar->list_lock); - if (list_empty(&ar->vif_list)) { - spin_unlock_bh(&ar->list_lock); - return NULL; - } - - vif = list_first_entry(&ar->vif_list, struct ath6kl_vif, list); - - spin_unlock_bh(&ar->list_lock); - - return vif; -} - -static int ath6kl_open(struct net_device *dev) -{ - struct ath6kl_vif *vif = netdev_priv(dev); - - set_bit(WLAN_ENABLED, &vif->flags); - - if (test_bit(CONNECTED, &vif->flags)) { - netif_carrier_on(dev); - netif_wake_queue(dev); - } else - netif_carrier_off(dev); - - return 0; -} - -static int ath6kl_close(struct net_device *dev) -{ - struct ath6kl_vif *vif = netdev_priv(dev); - - netif_stop_queue(dev); - - ath6kl_cfg80211_stop(vif); - - clear_bit(WLAN_ENABLED, &vif->flags); - - return 0; -} - -static struct net_device_stats *ath6kl_get_stats(struct net_device *dev) -{ - struct ath6kl_vif *vif = netdev_priv(dev); - - return &vif->net_stats; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) -static int ath6kl_set_features(struct net_device *dev, u32 features) -{ - struct ath6kl_vif *vif = netdev_priv(dev); - struct ath6kl *ar = vif->ar; - int err = 0; - - if ((features & NETIF_F_RXCSUM) && - (ar->rx_meta_ver != WMI_META_VERSION_2)) { - ar->rx_meta_ver = WMI_META_VERSION_2; - err = ath6kl_wmi_set_rx_frame_format_cmd(ar->wmi, - vif->fw_vif_idx, - ar->rx_meta_ver, 0, 0); - if (err) { - dev->features = features & ~NETIF_F_RXCSUM; - return err; - } - } else if (!(features & NETIF_F_RXCSUM) && - (ar->rx_meta_ver == WMI_META_VERSION_2)) { - ar->rx_meta_ver = 0; - err = ath6kl_wmi_set_rx_frame_format_cmd(ar->wmi, - vif->fw_vif_idx, - ar->rx_meta_ver, 0, 0); - if (err) { - dev->features = features | NETIF_F_RXCSUM; - return err; - } - - } - - return err; -} -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) */ - -static void ath6kl_set_multicast_list(struct net_device *ndev) -{ - struct ath6kl_vif *vif = netdev_priv(ndev); - bool mc_all_on = false; - int mc_count = netdev_mc_count(ndev); - struct netdev_hw_addr *ha; - bool found; - struct ath6kl_mc_filter *mc_filter, *tmp; - struct list_head mc_filter_new; - int ret; - - if (!test_bit(WMI_READY, &vif->ar->flag) || - !test_bit(WLAN_ENABLED, &vif->flags)) - return; - - /* Enable multicast-all filter. */ - mc_all_on = !!(ndev->flags & IFF_PROMISC) || - !!(ndev->flags & IFF_ALLMULTI) || - !!(mc_count > ATH6K_MAX_MC_FILTERS_PER_LIST) || - (vif->ar->state == ATH6KL_STATE_ON); - - if (!(ndev->flags & IFF_MULTICAST)) - mc_all_on = false; - - ath6kl_dbg(ATH6KL_DBG_TRC, "multicast state IFF_ALLMULTI = %d , IFF_MULTICAST = %d, " - "mc_count = %d, mc_all_on = %d", - ndev->flags & IFF_ALLMULTI, ndev->flags & IFF_MULTICAST, mc_count, - mc_all_on); - - /* Enable/disable "multicast-all" filter*/ - ath6kl_dbg(ATH6KL_DBG_TRC, "%s multicast-all filter\n", - mc_all_on ? "enabling" : "disabling"); - - ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi, vif->fw_vif_idx, - mc_all_on); - - if (ret) { - ath6kl_warn("Failed to %s multicast receive\n", - mc_all_on ? "enable" : "disable"); - return; - } - - /* Keep the driver and firmware mcast list in sync. */ - list_for_each_entry_safe(mc_filter, tmp, &vif->mc_filter, list) { - found = false; - netdev_for_each_mc_addr(ha, ndev) { - if (memcmp(ha->addr, mc_filter->hw_addr, - ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE) == 0) { - found = true; - break; - } - } - - if (!found) { - /* - * Delete the filter which was previously set - * but not in the new request. - */ - ath6kl_dbg(ATH6KL_DBG_TRC, - "Removing %s from multicast filter\n", - sec_conv_mac(mc_filter->hw_addr)); - ret = ath6kl_wmi_add_del_mcast_filter_cmd(vif->ar->wmi, - vif->fw_vif_idx, mc_filter->hw_addr, - false); - if (ret) { - ath6kl_warn("Failed to remove multicast filter:%s\n", - sec_conv_mac(mc_filter->hw_addr)); - return; - } - - list_del(&mc_filter->list); - kfree(mc_filter); - } - } - - INIT_LIST_HEAD(&mc_filter_new); - - netdev_for_each_mc_addr(ha, ndev) { - found = false; - list_for_each_entry(mc_filter, &vif->mc_filter, list) { - if (memcmp(ha->addr, mc_filter->hw_addr, - ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE) == 0) { - found = true; - break; - } - } - - if (!found) { - mc_filter = kzalloc(sizeof(struct ath6kl_mc_filter), - GFP_ATOMIC); - if (!mc_filter) { - WARN_ON(1); - goto out; - } - - if (memcmp(ha->addr, "\x33\x33\x00\x00\x00\x01", ETH_ALEN) == 0) { - ath6kl_warn("Skipped : %s\n", sec_conv_mac(ha->addr)); - kfree(mc_filter); - continue; - } else { - memcpy(mc_filter->hw_addr, ha->addr, - ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE); - /* Set the multicast filter */ - ath6kl_dbg(ATH6KL_DBG_TRC, - "Adding %s to multicast filter list\n", - sec_conv_mac(mc_filter->hw_addr)); - ret = ath6kl_wmi_add_del_mcast_filter_cmd(vif->ar->wmi, - vif->fw_vif_idx, mc_filter->hw_addr, - true); - if (ret) { - ath6kl_warn("Failed to add multicast filter :%s\n", - sec_conv_mac(mc_filter->hw_addr)); - kfree(mc_filter); - goto out; - } - } - - list_add_tail(&mc_filter->list, &mc_filter_new); - } - } - -out: - list_splice_tail(&mc_filter_new, &vif->mc_filter); -} - -static struct net_device_ops ath6kl_netdev_ops = { - .ndo_open = ath6kl_open, - .ndo_stop = ath6kl_close, - .ndo_start_xmit = ath6kl_data_tx, - .ndo_get_stats = ath6kl_get_stats, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) - .ndo_set_features = ath6kl_set_features, -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) */ - .ndo_set_rx_mode = ath6kl_set_multicast_list, -}; - -void init_netdev(struct net_device *dev) -{ - netdev_attach_ops(dev, &ath6kl_netdev_ops); - dev->destructor = free_netdev; - dev->watchdog_timeo = ATH6KL_TX_TIMEOUT; - - dev->needed_headroom = ETH_HLEN; - dev->needed_headroom += sizeof(struct ath6kl_llc_snap_hdr) + - sizeof(struct wmi_data_hdr) + HTC_HDR_LENGTH - + WMI_MAX_TX_META_SZ + ATH6KL_HTC_ALIGN_BYTES; - - return; -} diff --git a/drivers/net/wireless/ath/ath6kl/msm.c b/drivers/net/wireless/ath/ath6kl/msm.c deleted file mode 100644 index c9013bf..0000000 --- a/drivers/net/wireless/ath/ath6kl/msm.c +++ /dev/null @@ -1,425 +0,0 @@ -#include -#include -#include -#include - -#ifdef CONFIG_ARCH_MSM7X27A -#include -#include -#else -#include -/* replace with plaftform specific changes */ -#endif - -#include "core.h" - -typedef int A_BOOL; -typedef unsigned char A_UCHAR; -typedef unsigned long A_ATH_TIMER; -typedef int8_t A_INT8; -typedef int16_t A_INT16; -typedef int32_t A_INT32; -typedef u_int8_t A_UINT8; -typedef u_int16_t A_UINT16; -typedef u_int32_t A_UINT32; - -#define WMI_MAX_SSID_LEN 32 -#define ATH_MAC_LEN 6 /* length of mac in bytes */ - -#define __ATTRIB_PACK -#define POSTPACK __ATTRIB_PACK -#define PREPACK - -typedef PREPACK struct { - PREPACK union { - A_UINT8 ie[17]; - A_INT32 wac_status; - } POSTPACK info; -} POSTPACK WMI_GET_WAC_INFO; - -struct ar_wep_key { - A_UINT8 arKeyIndex; - A_UINT8 arKeyLen; - A_UINT8 arKey[64]; -} ; - -#ifdef CONFIG_ARCH_MSM7X27A -/* BeginMMC polling stuff */ -#define MMC_MSM_DEV "msm_sdcc.2" -#define A_MDELAY(msecs) mdelay(msecs) -/* End MMC polling stuff */ -#else -/* replace with plaftform specific changes */ -#endif - -#define WMI_MAX_RATE_MASK 2 - - - -#define GET_INODE_FROM_FILEP(filp) \ - (filp)->f_path.dentry->d_inode -typedef char A_CHAR; -int android_readwrite_file(const A_CHAR *filename, A_CHAR *rbuf, const A_CHAR *wbuf, size_t length) -{ - int ret = 0; - struct file *filp = (struct file *)-ENOENT; - mm_segment_t oldfs; - oldfs = get_fs(); - set_fs(KERNEL_DS); - - do { - int mode = (wbuf) ? O_RDWR : O_RDONLY; - filp = filp_open(filename, mode, S_IRUSR); - - if (IS_ERR(filp) || !filp->f_op) { - ret = -ENOENT; - break; - } - - if (length == 0) { - /* Read the length of the file only */ - struct inode *inode; - - inode = GET_INODE_FROM_FILEP(filp); - if (!inode) { - printk(KERN_ERR "android_readwrite_file: Error 2\n"); - ret = -ENOENT; - break; - } - ret = i_size_read(inode->i_mapping->host); - break; - } - - if (wbuf) { - if ((ret=filp->f_op->write(filp, wbuf, length, &filp->f_pos)) < 0) { - printk(KERN_ERR "android_readwrite_file: Error 3\n"); - break; - } - } else { - if ((ret=filp->f_op->read(filp, rbuf, length, &filp->f_pos)) < 0) { - printk(KERN_ERR "android_readwrite_file: Error 4\n"); - break; - } - } - } while (0); - - if (!IS_ERR(filp)) { - filp_close(filp, NULL); - } - - set_fs(oldfs); - printk(KERN_ERR "android_readwrite_file: ret=%d\n", ret); - - return ret; -} - - -#ifdef CONFIG_ARCH_MSM7X27A - -#define WLAN_GPIO_EXT_POR_N 134 -#define A0_CLOCK -static const char *id = "WLAN"; - -enum { - WLAN_VREG_L17 = 0, - WLAN_VREG_L19 -}; - -struct wlan_vreg_info { - const char *vreg_id; - unsigned int level_min; - unsigned int level_max; - unsigned int pmapp_id; - unsigned int is_vreg_pin_controlled; - struct regulator *reg; -}; - - -static struct wlan_vreg_info vreg_info[] = { - {"bt", 3300000, 3300000, 21, 1, NULL}, - {"wlan4", 1800000, 1800000, 23, 1, NULL}, -}; - -static int qrf6285_init_regs(void) -{ - struct regulator_bulk_data regs[ARRAY_SIZE(vreg_info)]; - int i, rc; - - for (i = 0; i < ARRAY_SIZE(regs); i++) { - regs[i].supply = vreg_info[i].vreg_id; - regs[i].min_uV = vreg_info[i].level_min; - regs[i].max_uV = vreg_info[i].level_max; - } - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs), regs); - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - goto out; - } - - for (i = 0; i < ARRAY_SIZE(regs); i++) - vreg_info[i].reg = regs[i].consumer; - - return 0; - -out: - return rc; -} - -int msm7x27a_wifi_power(bool on) -{ - - int rc = 0, index = 0; - static bool init_done; - static int resultFlag = 0, flag = 1; - - if (unlikely(!init_done)) { - rc = qrf6285_init_regs(); - if (rc) - return rc; - else - init_done = true; - } - - for (index = 0; index < ARRAY_SIZE(vreg_info); index++) { - if (on) { - - rc = regulator_set_voltage(vreg_info[index].reg, - vreg_info[index].level_min, - vreg_info[index].level_max); - if (rc) { - pr_err("%s:%s set voltage failed %d\n", - __func__, vreg_info[index].vreg_id, rc); - - goto vreg_fail; - } - - rc = regulator_enable(vreg_info[index].reg); - if (rc) { - pr_err("%s:%s vreg enable failed %d\n", - __func__, vreg_info[index].vreg_id, rc); - - goto vreg_fail; - } - - if (vreg_info[index].is_vreg_pin_controlled) { - rc = pmapp_vreg_lpm_pincntrl_vote(id, - vreg_info[index].pmapp_id, - PMAPP_CLOCK_ID_A0, 1); - if (rc) { - pr_err("%s:%s pmapp_vreg_lpm_pincntrl" - " for enable failed %d\n", - __func__, - vreg_info[index].vreg_id, rc); - goto vreg_clock_vote_fail; - } - } - - if (index == WLAN_VREG_L17) - usleep(5); - else if (index == WLAN_VREG_L19) - usleep(10); - - } else { - - if (vreg_info[index].is_vreg_pin_controlled) { - rc = pmapp_vreg_lpm_pincntrl_vote(id, - vreg_info[index].pmapp_id, - PMAPP_CLOCK_ID_A0, 0); - if (rc) { - pr_err("%s:%s pmapp_vreg_lpm_pincntrl" - " for disable failed %d\n", - __func__, - vreg_info[index].vreg_id, rc); - } - } - rc = regulator_disable(vreg_info[index].reg); - if (rc) { - pr_err("%s:%s vreg disable failed %d\n", - __func__, vreg_info[index].vreg_id, rc); - } - } - - } - - if (on) { - rc = gpio_request(WLAN_GPIO_EXT_POR_N, "WLAN_DEEP_SLEEP_N"); - if (rc) { - pr_err("WLAN reset GPIO %d request failed %d\n", - WLAN_GPIO_EXT_POR_N, rc); - goto fail; - } - - if(flag) - { - flag=0; - rc = gpio_direction_output(WLAN_GPIO_EXT_POR_N, 1); - if (rc < 0) { - pr_err("WLAN reset GPIO %d set direction failed %d\n", - WLAN_GPIO_EXT_POR_N, rc); - goto fail_gpio_dir_out; - } - } - printk("\n vote for WLAN GPIO 134 done. \n"); -#ifdef A0_CLOCK - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_A0, PMAPP_CLOCK_VOTE_ON); - if (rc) { - pr_err("%s: Configuring A0 to turn on" - " failed %d\n", __func__, rc); - } - printk("\nVote for A0 clock done\n"); - /* - * Configure A0 clock to be slave to - * WLAN_CLK_PWR_REQ - */ - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_A0, - PMAPP_CLOCK_VOTE_PIN_CTRL); - if (rc) { - pr_err("%s: Configuring A0 to Pin" - " controllable failed %d\n", - __func__, rc); - goto vreg_clock_vote_fail; - } -#else - - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_A0, PMAPP_CLOCK_VOTE_OFF); - if (rc) { - pr_err("%s: Configuring A0 to turn off" - " failed %d\n", __func__, rc); - } - printk("\n Vote against A0 clock done\n"); -#endif - - } else { - - if(!resultFlag){ - gpio_set_value_cansleep(WLAN_GPIO_EXT_POR_N, 0); - rc = gpio_direction_input(WLAN_GPIO_EXT_POR_N); - if (rc) { - pr_err("WLAN reset GPIO %d set direction failed %d\n", - WLAN_GPIO_EXT_POR_N, rc); - } - gpio_free(WLAN_GPIO_EXT_POR_N); - printk("\n vote against WLAN GPIO 134 done. \n"); - } - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_A0, - PMAPP_CLOCK_VOTE_OFF); - if (rc) { - pr_err("%s: Configuring A0 to turn OFF" - " failed %d\n", __func__, rc); - } - } - - printk("Interface %s success \n",on?"initialization":"deinitialization"); - resultFlag = 0; - return 0; - -fail_gpio_dir_out: - gpio_free(WLAN_GPIO_EXT_POR_N); -vreg_fail: - index--; -vreg_clock_vote_fail: - while (index >= 0) { - rc = regulator_disable(vreg_info[index].reg); - if (rc) { - pr_err("%s:%s vreg disable failed %d\n", - __func__, vreg_info[index].vreg_id, rc); - } - index--; - } -fail: - resultFlag = 1; - printk("Interface %s failed \n",on?"initialization":"deinitialization"); - return 0; -} - -#else -/* replace with plaftform specific changes */ -#endif - -static int ath6kl_pm_probe(struct platform_device *pdev) -{ -#ifdef CONFIG_ARCH_MSM7X27A - msm7x27a_wifi_power(1); -#else - /* replace with plaftform specific changes */ -#endif - - return 0; -} - -static int ath6kl_pm_remove(struct platform_device *pdev) -{ -#ifdef CONFIG_ARCH_MSM7X27A - msm7x27a_wifi_power(0); -#else - /* replace with plaftform specific changes */ -#endif - - return 0; -} - -static int ath6kl_pm_suspend(struct platform_device *pdev, pm_message_t state) -{ - return 0; -} - -static inline void *ar6k_priv(struct net_device *dev) -{ - return (wdev_priv(dev->ieee80211_ptr)); -} - -static int ath6kl_pm_resume(struct platform_device *pdev) -{ - return 0; -} - - -static struct platform_driver ath6kl_pm_device = { - .probe = ath6kl_pm_probe, - .remove = ath6kl_pm_remove, - .suspend = ath6kl_pm_suspend, - .resume = ath6kl_pm_resume, - .driver = { - .name = "wlan_ar6000_pm_dev", - }, -}; - -void __init ath6kl_sdio_init_platform(void) -{ - char buf[3]; - int length; - - platform_driver_register(&ath6kl_pm_device); - -#ifdef CONFIG_ARCH_MSM7X27A - length = snprintf(buf, sizeof(buf), "%d\n", 1 ? 1 : 0); - android_readwrite_file("/sys/devices/platform/" MMC_MSM_DEV "/polling", NULL, buf, length); - length = snprintf(buf, sizeof(buf), "%d\n", 0 ? 1 : 0); - android_readwrite_file("/sys/devices/platform/" MMC_MSM_DEV "/polling", NULL, buf, length); - - A_MDELAY(50); -#else - /* replace with plaftform specific changes */ -#endif -} - -void __exit ath6kl_sdio_exit_platform(void) -{ - char buf[3]; - int length; - platform_driver_unregister(&ath6kl_pm_device); - -#ifdef CONFIG_ARCH_MSM7X27A - length = snprintf(buf, sizeof(buf), "%d\n", 1 ? 1 : 0); - /* fall back to polling */ - android_readwrite_file("/sys/devices/platform/" MMC_MSM_DEV "/polling", NULL, buf, length); - length = snprintf(buf, sizeof(buf), "%d\n", 0 ? 1 : 0); - /* fall back to polling */ - android_readwrite_file("/sys/devices/platform/" MMC_MSM_DEV "/polling", NULL, buf, length); - - A_MDELAY(1000); -#else - /* replace with plaftform specific changes */ -#endif -} diff --git a/drivers/net/wireless/ath/ath6kl/pm.c b/drivers/net/wireless/ath/ath6kl/pm.c deleted file mode 100644 index 5238f30..0000000 --- a/drivers/net/wireless/ath/ath6kl/pm.c +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "core.h" -#include "debug.h" - -static bool ath6kl_parse_event_pkt_for_wake_lock(struct ath6kl *ar, - struct sk_buff *skb) -{ - u16 cmd_id; - bool need_wake = false; - - if (skb->len < sizeof(u16)) - return need_wake; - - cmd_id = *(const u16 *) skb->data; - cmd_id = le16_to_cpu(cmd_id); - - if (test_and_clear_bit(WOW_RESUME_PRINT, &ar->flag)) { - if (cmd_id == WMI_CONNECT_EVENTID) - ath6kl_dbg(ATH6KL_DBG_SUSPEND, - "(wow) WMI_CONNECT_EVENTID\n"); - else - ath6kl_dbg(ATH6KL_DBG_SUSPEND, - "(wow) wmi event id : 0x%x\n", cmd_id); - } - - switch (cmd_id) { - case WMI_CONNECT_EVENTID: - need_wake = true; - break; - default: - /* Don't wake lock the system for other events */ - break; - } - - return need_wake; -} - -static bool ath6kl_parse_ip_pkt_for_wake_lock(struct sk_buff *skb) -{ - const u8 ipsec_keepalve[] = { 0x11, 0x94, 0x11, 0x94, 0x00, - 0x09, 0x00, 0x00, 0xff }; - bool need_wake = true; - u16 size; - u8 *udp; - u8 ihl; - - if (skb->len >= 24 && (*((u8 *)skb->data + 23) == 0x11)) { - - udp = (u8 *)skb->data + 14; - ihl = (*udp & 0x0f) * sizeof(u32); - udp += ihl; - size = 14 + ihl + sizeof(ipsec_keepalve); - - if ((skb->len >= size) && - !memcmp(udp, ipsec_keepalve, sizeof(ipsec_keepalve) - 3) && - udp[8] == 0xff) { - /* - * RFC 3948 UDP Encapsulation of IPsec ESP Packets - * src and dest port must be 4500 - * Receivers MUST NOT depend upon the UDP checksum - * being zero - * Sender must use 1 byte payload with 0xff - * Receiver SHOULD ignore a received NAT-keepalive pkt - * - * IPSec over UDP NAT keepalive packet. Just ignore - */ - need_wake = false; - } - } - - return need_wake; -} - -static bool ath6kl_parse_data_pkt_for_wake_lock(struct ath6kl *ar, - struct sk_buff *skb) -{ - struct net_device *ndev; - struct ath6kl_vif *vif; - struct ethhdr *hdr; - bool need_wake = false; - u16 dst_port; - - vif = ath6kl_vif_first(ar); - if (!vif) - return need_wake; - - if (skb->len < sizeof(struct ethhdr)) - return need_wake; - - hdr = (struct ethhdr *) skb->data; - - if (test_and_clear_bit(WOW_RESUME_PRINT, &ar->flag)) { - ath6kl_dbg(ATH6KL_DBG_SUSPEND, - "(wow) dest mac:%s, src mac:%s, type/len :%04x\n", - sec_conv_mac(hdr->h_dest), - sec_conv_mac(hdr->h_source), - be16_to_cpu(hdr->h_proto)); - } - - if (!is_multicast_ether_addr(hdr->h_dest)) { - switch (ntohs(hdr->h_proto)) { - case 0x0800: /* IP */ - need_wake = ath6kl_parse_ip_pkt_for_wake_lock(skb); - break; - case 0x888e: /* EAPOL */ - case 0x88c7: /* RSN_PREAUTH */ - case 0x88b4: /* WAPI */ - need_wake = true; - break; - default: - break; - } - } else if (!is_broadcast_ether_addr(hdr->h_dest)) { - if (skb->len >= 14 + 20) { /* mDNS packets */ - u8 *dst_ipaddr = (u8 *)(skb->data + 14 + 20 - 4); - ndev = vif->ndev; - if (((dst_ipaddr[3] & 0xf8) == 0xf8) && - (vif->nw_type == AP_NETWORK || - (ndev->flags & IFF_ALLMULTI || - ndev->flags & IFF_MULTICAST))) - need_wake = true; - } - } else if (vif->nw_type == AP_NETWORK) { - switch (ntohs(hdr->h_proto)) { - case 0x0800: /* IP */ - if (skb->len >= 14 + 20 + 2) { - dst_port = *(u16 *)(skb->data + 14 + 20); - /* dhcp req */ - need_wake = (ntohs(dst_port) == 0x43); - } - break; - case 0x0806: - need_wake = true; - default: - break; - } - } - - return need_wake; -} - -void ath6kl_config_suspend_wake_lock(struct ath6kl *ar, struct sk_buff *skb, - bool is_event_pkt) -{ - struct ath6kl_vif *vif; -#ifdef CONFIG_HAS_WAKELOCK - unsigned long wl_timeout = 5; -#endif - bool need_wake = false; - - vif = ath6kl_vif_first(ar); - if (!vif) - return; - - if ( -#ifdef CONFIG_HAS_EARLYSUSPEND - ar->screen_off && -#endif - skb && test_bit(CONNECTED, &vif->flags)) { - if (is_event_pkt) { /* Ctrl pkt received */ - need_wake = - ath6kl_parse_event_pkt_for_wake_lock(ar, skb); - if (need_wake) { -#ifdef CONFIG_HAS_WAKELOCK - wl_timeout = 3 * HZ; -#endif - } - } else /* Data pkt received */ - need_wake = ath6kl_parse_data_pkt_for_wake_lock(ar, - skb); - } - - if (need_wake) { -#ifdef CONFIG_HAS_WAKELOCK - /* - * Keep the host wake up if there is any event - * and pkt comming in. - */ - wake_lock_timeout(&ar->wake_lock, wl_timeout); -#endif - } -} -#ifdef CONFIG_HAS_WAKELOCK -void ath6kl_p2p_acquire_wakelock(struct ath6kl *ar, int wl_timeout) -{ - if (!wake_lock_active(&ar->p2p_wake_lock)) - wake_lock_timeout(&ar->p2p_wake_lock, wl_timeout); - return; -} - -void ath6kl_p2p_release_wakelock(struct ath6kl *ar) -{ - if (wake_lock_active(&ar->p2p_wake_lock)) - wake_unlock(&ar->p2p_wake_lock); - return; -} -#endif - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void ath6kl_early_suspend(struct early_suspend *handler) -{ - struct ath6kl *ar = container_of(handler, struct ath6kl, early_suspend); - - if (ar) - ar->screen_off = true; -} - -static void ath6kl_late_resume(struct early_suspend *handler) -{ - struct ath6kl *ar = container_of(handler, struct ath6kl, early_suspend); - - if (ar) - ar->screen_off = false; -} -#endif - -void ath6kl_setup_android_resource(struct ath6kl *ar) -{ -#ifdef CONFIG_HAS_EARLYSUSPEND - ar->screen_off = false; - ar->early_suspend.suspend = ath6kl_early_suspend; - ar->early_suspend.resume = ath6kl_late_resume; - ar->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; - register_early_suspend(&ar->early_suspend); -#endif -#ifdef CONFIG_HAS_WAKELOCK - wake_lock_init(&ar->wake_lock, WAKE_LOCK_SUSPEND, "ath6kl_suspend_wl"); - wake_lock_init(&ar->p2p_wake_lock, - WAKE_LOCK_SUSPEND, - "ath6kl_p2p_suspend_wl"); -#endif -} - -void ath6kl_cleanup_android_resource(struct ath6kl *ar) -{ -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&ar->early_suspend); -#endif -#ifdef CONFIG_HAS_WAKELOCK - wake_lock_destroy(&ar->wake_lock); - wake_lock_destroy(&ar->p2p_wake_lock); -#endif -} diff --git a/drivers/net/wireless/ath/ath6kl/pm.h b/drivers/net/wireless/ath/ath6kl/pm.h deleted file mode 100644 index 1ac989b..0000000 --- a/drivers/net/wireless/ath/ath6kl/pm.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -void ath6kl_config_suspend_wake_lock(struct ath6kl *ar, struct sk_buff *skb, - bool is_event_pkt); -void ath6kl_setup_android_resource(struct ath6kl *ar); -void ath6kl_cleanup_android_resource(struct ath6kl *ar); -#ifdef CONFIG_HAS_WAKELOCK -void ath6kl_p2p_acquire_wakelock(struct ath6kl *ar, int wl_timeout); -void ath6kl_p2p_release_wakelock(struct ath6kl *ar); -#endif diff --git a/drivers/net/wireless/ath/ath6kl/sdio.c b/drivers/net/wireless/ath/ath6kl/sdio.c deleted file mode 100755 index d4ea7ad..0000000 --- a/drivers/net/wireless/ath/ath6kl/sdio.c +++ /dev/null @@ -1,1534 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "hif.h" -#include "hif-ops.h" -#include "target.h" -#include "debug.h" -#include "cfg80211.h" - -#define CMD53_ARG_READ 0 -#define CMD53_ARG_WRITE 1 -#define CMD53_ARG_BLOCK_BASIS 1 -#define CMD53_ARG_FIXED_ADDRESS 0 -#define CMD53_ARG_INCR_ADDRESS 1 - -/* - * Macro to check if DMA buffer is WORD-aligned and DMA-able. - * Most host controllers assume the buffer is DMA'able and will - * bug-check otherwise (i.e. buffers on the stack). virt_addr_valid - * check fails on stack memory. - */ -static inline bool buf_needs_bounce(u8 *buf) -{ - return ((unsigned long) buf & 0x3) || !virt_addr_valid(buf); -} - -static void ath6kl_sdio_set_mbox_info(struct ath6kl *ar) -{ - struct ath6kl_mbox_info *mbox_info = &ar->mbox_info; - - /* EP1 has an extended range */ - mbox_info->htc_addr = HIF_MBOX_BASE_ADDR; - mbox_info->htc_ext_addr = HIF_MBOX0_EXT_BASE_ADDR; - mbox_info->htc_ext_sz = HIF_MBOX0_EXT_WIDTH; - mbox_info->block_size = HIF_MBOX_BLOCK_SIZE; - mbox_info->gmbox_addr = HIF_GMBOX_BASE_ADDR; - mbox_info->gmbox_sz = HIF_GMBOX_WIDTH; -} - -static inline void ath6kl_sdio_set_cmd53_arg(u32 *arg, u8 rw, u8 func, - u8 mode, u8 opcode, u32 addr, - u16 blksz) -{ - *arg = (((rw & 1) << 31) | - ((func & 0x7) << 28) | - ((mode & 1) << 27) | - ((opcode & 1) << 26) | - ((addr & 0x1FFFF) << 9) | - (blksz & 0x1FF)); -} - -static inline void ath6kl_sdio_set_cmd52_arg(u32 *arg, u8 write, u8 raw, - unsigned int address, - unsigned char val) -{ - const u8 func = 0; - - *arg = ((write & 1) << 31) | - ((func & 0x7) << 28) | - ((raw & 1) << 27) | - (1 << 26) | - ((address & 0x1FFFF) << 9) | - (1 << 8) | - (val & 0xFF); -} - -static int ath6kl_sdio_func0_cmd52_wr_byte(struct mmc_card *card, - unsigned int address, - unsigned char byte) -{ - struct mmc_command io_cmd; - - memset(&io_cmd, 0, sizeof(io_cmd)); - ath6kl_sdio_set_cmd52_arg(&io_cmd.arg, 1, 0, address, byte); - io_cmd.opcode = SD_IO_RW_DIRECT; - io_cmd.flags = MMC_RSP_R5 | MMC_CMD_AC; - - return mmc_wait_for_cmd(card->host, &io_cmd, 0); -} - -static int ath6kl_sdio_io(struct sdio_func *func, u32 request, u32 addr, - u8 *buf, u32 len) -{ - int ret = 0; - - - if (request & HIF_WRITE) { - /* FIXME: looks like ugly workaround for something */ - if (addr >= HIF_MBOX_BASE_ADDR && - addr <= HIF_MBOX_END_ADDR) - addr += (HIF_MBOX_WIDTH - len); - - /* FIXME: this also looks like ugly workaround */ - if (addr == HIF_MBOX0_EXT_BASE_ADDR) - addr += HIF_MBOX0_EXT_WIDTH - len; - - if (request & HIF_FIXED_ADDRESS) - ret = sdio_writesb(func, addr, buf, len); - else - ret = sdio_memcpy_toio(func, addr, buf, len); - } else { - if (request & HIF_FIXED_ADDRESS) - ret = sdio_readsb(func, buf, addr, len); - else - ret = sdio_memcpy_fromio(func, buf, addr, len); - } - - - ath6kl_dbg(ATH6KL_DBG_SDIO, "%s addr 0x%x%s buf 0x%p len %d\n", - request & HIF_WRITE ? "wr" : "rd", addr, - request & HIF_FIXED_ADDRESS ? " (fixed)" : "", buf, len); - ath6kl_dbg_dump(ATH6KL_DBG_SDIO_DUMP, NULL, "sdio ", buf, len); - - return ret; -} - -static struct bus_request *ath6kl_sdio_alloc_busreq(struct ath6kl_sdio *ar_sdio) -{ - struct bus_request *bus_req; - - spin_lock_bh(&ar_sdio->lock); - - if (list_empty(&ar_sdio->bus_req_freeq)) { - spin_unlock_bh(&ar_sdio->lock); - return NULL; - } - - bus_req = list_first_entry(&ar_sdio->bus_req_freeq, - struct bus_request, list); - list_del(&bus_req->list); - - spin_unlock_bh(&ar_sdio->lock); - ath6kl_dbg(ATH6KL_DBG_SCATTER, "%s: bus request 0x%p\n", - __func__, bus_req); - - return bus_req; -} - -static void ath6kl_sdio_free_bus_req(struct ath6kl_sdio *ar_sdio, - struct bus_request *bus_req) -{ - ath6kl_dbg(ATH6KL_DBG_SCATTER, "%s: bus request 0x%p\n", - __func__, bus_req); - - spin_lock_bh(&ar_sdio->lock); - list_add_tail(&bus_req->list, &ar_sdio->bus_req_freeq); - spin_unlock_bh(&ar_sdio->lock); -} - -static void ath6kl_sdio_setup_scat_data(struct hif_scatter_req *scat_req, - struct mmc_data *data) -{ - struct scatterlist *sg; - int i; - - data->blksz = HIF_MBOX_BLOCK_SIZE; - data->blocks = scat_req->len / HIF_MBOX_BLOCK_SIZE; - - ath6kl_dbg(ATH6KL_DBG_SCATTER, - "hif-scatter: (%s) addr: 0x%X, (block len: %d, block count: %d) , (tot:%d,sg:%d)\n", - (scat_req->req & HIF_WRITE) ? "WR" : "RD", scat_req->addr, - data->blksz, data->blocks, scat_req->len, - scat_req->scat_entries); - - data->flags = (scat_req->req & HIF_WRITE) ? MMC_DATA_WRITE : - MMC_DATA_READ; - - /* fill SG entries */ - sg = scat_req->sgentries; - sg_init_table(sg, scat_req->scat_entries); - - /* assemble SG list */ - for (i = 0; i < scat_req->scat_entries; i++, sg++) { - ath6kl_dbg(ATH6KL_DBG_SCATTER, "%d: addr:0x%p, len:%d\n", - i, scat_req->scat_list[i].buf, - scat_req->scat_list[i].len); - - sg_set_buf(sg, scat_req->scat_list[i].buf, - scat_req->scat_list[i].len); - } - - /* set scatter-gather table for request */ - data->sg = scat_req->sgentries; - data->sg_len = scat_req->scat_entries; -} - -static int ath6kl_sdio_scat_rw(struct ath6kl_sdio *ar_sdio, - struct bus_request *req) -{ - struct mmc_request mmc_req; - struct mmc_command cmd; - struct mmc_data data; - struct hif_scatter_req *scat_req; - u8 opcode, rw; - int status, len; - - scat_req = req->scat_req; - - if (scat_req->virt_scat) { - len = scat_req->len; - if (scat_req->req & HIF_BLOCK_BASIS) - len = round_down(len, HIF_MBOX_BLOCK_SIZE); - - status = ath6kl_sdio_io(ar_sdio->func, scat_req->req, - scat_req->addr, scat_req->virt_dma_buf, - len); - goto scat_complete; - } - - memset(&mmc_req, 0, sizeof(struct mmc_request)); - memset(&cmd, 0, sizeof(struct mmc_command)); - memset(&data, 0, sizeof(struct mmc_data)); - - ath6kl_sdio_setup_scat_data(scat_req, &data); - - opcode = (scat_req->req & HIF_FIXED_ADDRESS) ? - CMD53_ARG_FIXED_ADDRESS : CMD53_ARG_INCR_ADDRESS; - - rw = (scat_req->req & HIF_WRITE) ? CMD53_ARG_WRITE : CMD53_ARG_READ; - - /* Fixup the address so that the last byte will fall on MBOX EOM */ - if (scat_req->req & HIF_WRITE) { - if (scat_req->addr == HIF_MBOX_BASE_ADDR) - scat_req->addr += HIF_MBOX_WIDTH - scat_req->len; - else - /* Uses extended address range */ - scat_req->addr += HIF_MBOX0_EXT_WIDTH - scat_req->len; - } - - /* set command argument */ - ath6kl_sdio_set_cmd53_arg(&cmd.arg, rw, ar_sdio->func->num, - CMD53_ARG_BLOCK_BASIS, opcode, scat_req->addr, - data.blocks); - - cmd.opcode = SD_IO_RW_EXTENDED; - cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC; - - mmc_req.cmd = &cmd; - mmc_req.data = &data; - - mmc_set_data_timeout(&data, ar_sdio->func->card); - /* synchronous call to process request */ - mmc_wait_for_req(ar_sdio->func->card->host, &mmc_req); - - status = cmd.error ? cmd.error : data.error; - -scat_complete: - scat_req->status = status; - - if (scat_req->status) - ath6kl_err("Scatter write request failed:%d\n", - scat_req->status); - - if (scat_req->req & HIF_ASYNCHRONOUS) - scat_req->complete(ar_sdio->ar->htc_target, scat_req); - - return status; -} - -static int ath6kl_sdio_alloc_prep_scat_req(struct ath6kl_sdio *ar_sdio, - int n_scat_entry, int n_scat_req, - bool virt_scat) -{ - struct hif_scatter_req *s_req; - struct bus_request *bus_req; - int i, scat_req_sz, scat_list_sz, sg_sz = 0, buf_sz; - u8 *virt_buf; - - scat_list_sz = (n_scat_entry - 1) * sizeof(struct hif_scatter_item); - scat_req_sz = sizeof(*s_req) + scat_list_sz; - - if (!virt_scat) - sg_sz = sizeof(struct scatterlist) * n_scat_entry; - else - buf_sz = 2 * L1_CACHE_BYTES + - ATH6KL_MAX_TRANSFER_SIZE_PER_SCATTER; - - for (i = 0; i < n_scat_req; i++) { - /* allocate the scatter request */ - s_req = kzalloc(scat_req_sz, GFP_KERNEL); - if (!s_req) - return -ENOMEM; - - if (virt_scat) { - virt_buf = kzalloc(buf_sz, GFP_KERNEL); - if (!virt_buf) { - kfree(s_req); - return -ENOMEM; - } - - s_req->virt_dma_buf = - (u8 *)L1_CACHE_ALIGN((unsigned long)virt_buf); - } else { - /* allocate sglist */ - s_req->sgentries = kzalloc(sg_sz, GFP_KERNEL); - - if (!s_req->sgentries) { - kfree(s_req); - return -ENOMEM; - } - } - - /* allocate a bus request for this scatter request */ - bus_req = ath6kl_sdio_alloc_busreq(ar_sdio); - if (!bus_req) { - kfree(s_req->sgentries); - kfree(s_req->virt_dma_buf); - kfree(s_req); - return -ENOMEM; - } - - /* assign the scatter request to this bus request */ - bus_req->scat_req = s_req; - s_req->busrequest = bus_req; - - s_req->virt_scat = virt_scat; - - /* add it to the scatter pool */ - hif_scatter_req_add(ar_sdio->ar, s_req); - } - - return 0; -} - -static int ath6kl_sdio_read_write_sync(struct ath6kl *ar, u32 addr, u8 *buf, - u32 len, u32 request) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - u8 *tbuf = NULL; - int ret; - bool bounced = false; - - if (request & HIF_BLOCK_BASIS) - len = round_down(len, HIF_MBOX_BLOCK_SIZE); - - if (buf_needs_bounce(buf)) { - if (!ar_sdio->dma_buffer) - return -ENOMEM; - mutex_lock(&ar_sdio->dma_buffer_mutex); - tbuf = ar_sdio->dma_buffer; - - if (request & HIF_WRITE) - memcpy(tbuf, buf, len); - - bounced = true; - } else - tbuf = buf; - - ret = ath6kl_sdio_io(ar_sdio->func, request, addr, tbuf, len); - if ((request & HIF_READ) && bounced) - memcpy(buf, tbuf, len); - - if (bounced) - mutex_unlock(&ar_sdio->dma_buffer_mutex); - - return ret; -} - -static int ath6kl_sdio_read_write_sync_pri(struct ath6kl *ar, u32 addr, u8 *buf, - u32 len, u32 request) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - int ret; - - sdio_claim_host(ar_sdio->func); - ret = ath6kl_sdio_read_write_sync(ar, addr, buf, len, request); - sdio_release_host(ar_sdio->func); - return ret; -} - - -static void __ath6kl_sdio_write_async(struct ath6kl_sdio *ar_sdio, - struct bus_request *req) -{ - if (req->scat_req) - ath6kl_sdio_scat_rw(ar_sdio, req); - else { - void *context; - int status; - u32 addr, len, request; - u8 *buf; - - addr = req->address; - len = req->length; - request = req->request; - buf = req->buffer; - - context = req->packet; - ath6kl_sdio_free_bus_req(ar_sdio, req); - - status = ath6kl_sdio_read_write_sync(ar_sdio->ar, addr, buf, - len, request); - ath6kl_hif_rw_comp_handler(context, status); - } -} - -static void ath6kl_sdio_write_async_work(struct work_struct *work) -{ - struct ath6kl_sdio *ar_sdio; - struct bus_request *req, *tmp_req; - - ar_sdio = container_of(work, struct ath6kl_sdio, wr_async_work); - - spin_lock_bh(&ar_sdio->wr_async_lock); - list_for_each_entry_safe(req, tmp_req, &ar_sdio->wr_asyncq, list) { - list_del(&req->list); - spin_unlock_bh(&ar_sdio->wr_async_lock); - sdio_claim_host(ar_sdio->func); - __ath6kl_sdio_write_async(ar_sdio, req); - sdio_release_host(ar_sdio->func); - spin_lock_bh(&ar_sdio->wr_async_lock); - } - spin_unlock_bh(&ar_sdio->wr_async_lock); -} - -static void ath6kl_sdio_irq_handler(struct sdio_func *func) -{ - int status; - struct ath6kl_sdio *ar_sdio; - - ath6kl_dbg(ATH6KL_DBG_SDIO, "irq\n"); - - ar_sdio = sdio_get_drvdata(func); - atomic_set(&ar_sdio->irq_handling, 1); - /* - * Release the host during interrups so we can pick it back up when - * we process commands. - */ - sdio_release_host(ar_sdio->func); - - status = ath6kl_hif_intr_bh_handler(ar_sdio->ar); - sdio_claim_host(ar_sdio->func); - atomic_set(&ar_sdio->irq_handling, 0); - wake_up(&ar_sdio->irq_wq); - - WARN_ON_ONCE(status && status != -ECANCELED); -} - -static int ath6kl_sdio_power_on(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct sdio_func *func = ar_sdio->func; - int ret = 0; - - if (!ar_sdio->is_disabled) - return 0; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "sdio power on\n"); - - sdio_claim_host(func); - - ret = sdio_enable_func(func); - if (ret) { - ath6kl_err("Unable to enable sdio func: %d)\n", ret); - sdio_release_host(func); - return ret; - } - - sdio_release_host(func); - - /* - * Wait for hardware to initialise. It should take a lot less than - * 10 ms but let's be conservative here. - */ - msleep(10); - - ar_sdio->is_disabled = false; - - return ret; -} - -static int ath6kl_sdio_power_off(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - int ret; - - if (ar_sdio->is_disabled) - return 0; - - ath6kl_dbg(ATH6KL_DBG_BOOT, "sdio power off\n"); - - /* Disable the card */ - sdio_claim_host(ar_sdio->func); - ret = sdio_disable_func(ar_sdio->func); - sdio_release_host(ar_sdio->func); - - if (ret) - return ret; - - ar_sdio->is_disabled = true; - - return ret; -} - -static int ath6kl_sdio_write_async(struct ath6kl *ar, u32 address, u8 *buffer, - u32 length, u32 request, - struct htc_packet *packet) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct bus_request *bus_req; - - bus_req = ath6kl_sdio_alloc_busreq(ar_sdio); - - if (!bus_req) - return -ENOMEM; - - bus_req->address = address; - bus_req->buffer = buffer; - bus_req->length = length; - bus_req->request = request; - bus_req->packet = packet; - - spin_lock_bh(&ar_sdio->wr_async_lock); - list_add_tail(&bus_req->list, &ar_sdio->wr_asyncq); - spin_unlock_bh(&ar_sdio->wr_async_lock); - queue_work(ar->ath6kl_wq, &ar_sdio->wr_async_work); - - return 0; -} - -static void ath6kl_sdio_irq_enable(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - int ret; - - sdio_claim_host(ar_sdio->func); - - /* Register the isr */ - ret = sdio_claim_irq(ar_sdio->func, ath6kl_sdio_irq_handler); - if (ret) - ath6kl_err("Failed to claim sdio irq: %d\n", ret); - - sdio_release_host(ar_sdio->func); -} - -static bool ath6kl_sdio_is_on_irq(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - - return !atomic_read(&ar_sdio->irq_handling); -} - -static void ath6kl_sdio_irq_disable(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - int ret; - - sdio_claim_host(ar_sdio->func); - - if (atomic_read(&ar_sdio->irq_handling)) { - sdio_release_host(ar_sdio->func); - - ret = wait_event_interruptible(ar_sdio->irq_wq, - ath6kl_sdio_is_on_irq(ar)); - if (ret) - return; - - sdio_claim_host(ar_sdio->func); - } - - ret = sdio_release_irq(ar_sdio->func); - if (ret) - ath6kl_err("Failed to release sdio irq: %d\n", ret); - - sdio_release_host(ar_sdio->func); -} - -static struct hif_scatter_req *ath6kl_sdio_scatter_req_get(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct hif_scatter_req *node = NULL; - - spin_lock_bh(&ar_sdio->scat_lock); - - if (!list_empty(&ar_sdio->scat_req)) { - node = list_first_entry(&ar_sdio->scat_req, - struct hif_scatter_req, list); - list_del(&node->list); - - node->scat_q_depth = get_queue_depth(&ar_sdio->scat_req); - } - - spin_unlock_bh(&ar_sdio->scat_lock); - - return node; -} - -static void ath6kl_sdio_scatter_req_add(struct ath6kl *ar, - struct hif_scatter_req *s_req) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - - spin_lock_bh(&ar_sdio->scat_lock); - - list_add_tail(&s_req->list, &ar_sdio->scat_req); - - spin_unlock_bh(&ar_sdio->scat_lock); - -} - -/* scatter gather read write request */ -static int ath6kl_sdio_async_rw_scatter(struct ath6kl *ar, - struct hif_scatter_req *scat_req) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - u32 request = scat_req->req; - int status = 0; - - if (!scat_req->len) - return -EINVAL; - - ath6kl_dbg(ATH6KL_DBG_SCATTER, - "hif-scatter: total len: %d scatter entries: %d\n", - scat_req->len, scat_req->scat_entries); - - if (request & HIF_SYNCHRONOUS) { - sdio_claim_host(ar_sdio->func); - status = ath6kl_sdio_scat_rw(ar_sdio, scat_req->busrequest); - sdio_release_host(ar_sdio->func); - } - else { - spin_lock_bh(&ar_sdio->wr_async_lock); - list_add_tail(&scat_req->busrequest->list, &ar_sdio->wr_asyncq); - spin_unlock_bh(&ar_sdio->wr_async_lock); - queue_work(ar->ath6kl_wq, &ar_sdio->wr_async_work); - } - - return status; -} - -/* clean up scatter support */ -static void ath6kl_sdio_cleanup_scatter(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct hif_scatter_req *s_req, *tmp_req; - - /* empty the free list */ - spin_lock_bh(&ar_sdio->scat_lock); - list_for_each_entry_safe(s_req, tmp_req, &ar_sdio->scat_req, list) { - list_del(&s_req->list); - spin_unlock_bh(&ar_sdio->scat_lock); - - /* - * FIXME: should we also call completion handler with - * ath6kl_hif_rw_comp_handler() with status -ECANCELED so - * that the packet is properly freed? - */ - if (s_req->busrequest) - ath6kl_sdio_free_bus_req(ar_sdio, s_req->busrequest); - kfree(s_req->virt_dma_buf); - kfree(s_req->sgentries); - kfree(s_req); - - spin_lock_bh(&ar_sdio->scat_lock); - } - spin_unlock_bh(&ar_sdio->scat_lock); -} - -/* setup of HIF scatter resources */ -static int ath6kl_sdio_enable_scatter(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct htc_target *target = ar->htc_target; - int ret; - bool virt_scat = false; - - if (ar_sdio->scatter_enabled) - return 0; - - ar_sdio->scatter_enabled = true; - - /* check if host supports scatter and it meets our requirements */ - if (ar_sdio->func->card->host->max_segs < MAX_SCATTER_ENTRIES_PER_REQ) { - ath6kl_err("host only supports scatter of :%d entries, need: %d\n", - ar_sdio->func->card->host->max_segs, - MAX_SCATTER_ENTRIES_PER_REQ); - virt_scat = true; - } - - if (!virt_scat) { - ret = ath6kl_sdio_alloc_prep_scat_req(ar_sdio, - MAX_SCATTER_ENTRIES_PER_REQ, - MAX_SCATTER_REQUESTS, virt_scat); - - if (!ret) { - ath6kl_dbg(ATH6KL_DBG_BOOT, - "hif-scatter enabled requests %d entries %d\n", - MAX_SCATTER_REQUESTS, - MAX_SCATTER_ENTRIES_PER_REQ); - - target->max_scat_entries = MAX_SCATTER_ENTRIES_PER_REQ; - target->max_xfer_szper_scatreq = - MAX_SCATTER_REQ_TRANSFER_SIZE; - } else { - ath6kl_sdio_cleanup_scatter(ar); - ath6kl_warn("hif scatter resource setup failed, trying virtual scatter method\n"); - } - } - - if (virt_scat || ret) { - ret = ath6kl_sdio_alloc_prep_scat_req(ar_sdio, - ATH6KL_SCATTER_ENTRIES_PER_REQ, - ATH6KL_SCATTER_REQS, virt_scat); - - if (ret) { - ath6kl_err("failed to alloc virtual scatter resources !\n"); - ath6kl_sdio_cleanup_scatter(ar); - return ret; - } - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "virtual scatter enabled requests %d entries %d\n", - ATH6KL_SCATTER_REQS, ATH6KL_SCATTER_ENTRIES_PER_REQ); - - target->max_scat_entries = ATH6KL_SCATTER_ENTRIES_PER_REQ; - target->max_xfer_szper_scatreq = - ATH6KL_MAX_TRANSFER_SIZE_PER_SCATTER; - } - - return 0; -} - -static int ath6kl_sdio_config(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct sdio_func *func = ar_sdio->func; - int ret; - - sdio_claim_host(func); - - /* give us some time to enable, in ms */ - func->enable_timeout = 100; - - ret = sdio_set_block_size(func, HIF_MBOX_BLOCK_SIZE); - if (ret) { - ath6kl_err("Set sdio block size %d failed: %d)\n", - HIF_MBOX_BLOCK_SIZE, ret); - goto out; - } - -out: - sdio_release_host(func); - - return ret; -} - -static int ath6kl_sdio_setup_irq_mode(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct sdio_func *func = ar_sdio->func; - int ret = 0; - - sdio_claim_host(func); - - if ((ar_sdio->id->device & MANUFACTURER_ID_ATH6KL_BASE_MASK) >= - MANUFACTURER_ID_AR6003_BASE) { - /* enable 4-bit ASYNC interrupt on AR6003 or later */ - ret = ath6kl_sdio_func0_cmd52_wr_byte(func->card, - CCCR_SDIO_IRQ_MODE_REG, - SDIO_IRQ_MODE_ASYNC_4BIT_IRQ); - if (ret) { - ath6kl_err("Failed to enable 4-bit async irq mode %d\n", - ret); - goto out; - } - - ath6kl_dbg(ATH6KL_DBG_BOOT, "4-bit async irq mode enabled\n"); - } - -out: - sdio_release_host(func); - - return ret; -} - -static int ath6kl_set_sdio_pm_caps(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct sdio_func *func = ar_sdio->func; - mmc_pm_flag_t flags; - int ret; - - flags = sdio_get_host_pm_caps(func); - - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio suspend pm_caps 0x%x\n", flags); -#ifdef CONFIG_MACH_PX -#else - if (!(flags & MMC_PM_WAKE_SDIO_IRQ) || - !(flags & MMC_PM_KEEP_POWER)) - return -EINVAL; -#endif - - ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); - if (ret) { - ath6kl_err("set sdio keep pwr flag failed: %d\n", ret); - return ret; - } - - /* sdio irq wakes up host */ - ret = sdio_set_host_pm_flags(func, MMC_PM_WAKE_SDIO_IRQ); - if (ret) - ath6kl_err("set sdio wake irq flag failed: %d\n", ret); - - return ret; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) -static int ath6kl_sdio_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct sdio_func *func = ar_sdio->func; - mmc_pm_flag_t flags; - bool try_deepsleep = false; - int ret; - struct ath6kl_vif *vif; - int connected = 0; - int force_sleep_policy = 0; - - vif = ath6kl_vif_first(ar); - connected = test_bit(CONNECTED, &vif->flags); - force_sleep_policy = test_bit(SLEEP_POLICY_ENABLED, &vif->flags); - - if (force_sleep_policy) { - try_deepsleep = true; - goto deep_sleep; - } - - if (ar->state == ATH6KL_STATE_SCHED_SCAN) { - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sched scan is in progress\n"); - - ret = ath6kl_set_sdio_pm_caps(ar); - - if (ret) - return ret; - - ret = ath6kl_cfg80211_suspend(ar, - ATH6KL_CFG_SUSPEND_SCHED_SCAN, - NULL); - return ret; - - } - - if (ar->suspend_mode == WLAN_POWER_STATE_WOW || - (!ar->suspend_mode && wow)) { - - ret = ath6kl_set_sdio_pm_caps(ar); - if (ret) - return ret; - - if (connected) { - ret = ath6kl_cfg80211_suspend(ar, - ATH6KL_CFG_SUSPEND_WOW, wow); - return ret; - } else { - if (!ar->wow_suspend_mode || - ar->wow_suspend_mode == WLAN_POWER_STATE_DEEP_SLEEP) - try_deepsleep = true; - else if (ar->wow_suspend_mode \ - == WLAN_POWER_STATE_CUT_PWR) - goto cut_pwr; - } - } - -deep_sleep: - if (ar->suspend_mode == WLAN_POWER_STATE_DEEP_SLEEP || - !ar->suspend_mode || try_deepsleep) { - -#ifdef CONFIG_MACH_PX - ret = ath6kl_set_sdio_pm_caps(ar); - if (ret) - return ret; -#else - flags = sdio_get_host_pm_caps(func); - if (!(flags & MMC_PM_KEEP_POWER)) - return -1; - - ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); - if (ret) - return ret; - - /* - * Workaround to support Deep Sleep with MSM, set the host pm - * flag as MMC_PM_WAKE_SDIO_IRQ to allow SDCC deiver to disable - * the sdc2_clock and internally allows MSM to enter - * TCXO shutdown properly. - */ - if ((flags & MMC_PM_WAKE_SDIO_IRQ)) { - ret = sdio_set_host_pm_flags(func, - MMC_PM_WAKE_SDIO_IRQ); - if (ret) - return ret; - } -#endif - ret = ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_DEEPSLEEP, - NULL); - - return ret; - } - -cut_pwr: - return ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_CUTPOWER, NULL); -} - -static int ath6kl_sdio_resume(struct ath6kl *ar) -{ - -#if !defined(CONFIG_MACH_P8LTE) - ath6kl_sdio_setup_irq_mode(ar); -#endif - - switch (ar->state) { - case ATH6KL_STATE_OFF: - case ATH6KL_STATE_CUTPOWER: - ath6kl_dbg(ATH6KL_DBG_SUSPEND, - "sdio resume configuring sdio\n"); - - /* need to set sdio settings after power is cut from sdio */ - ath6kl_sdio_config(ar); - break; - - case ATH6KL_STATE_ON: - break; - - case ATH6KL_STATE_DEEPSLEEP: - break; - - case ATH6KL_STATE_WOW: - break; - - case ATH6KL_STATE_SCHED_SCAN: - break; - - case ATH6KL_STATE_SUSPENDING: - break; - - case ATH6KL_STATE_RESUMING: - break; - } - - ath6kl_cfg80211_resume(ar); - - return 0; -} -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ - -/* set the window address register (using 4-byte register access ). */ -static int ath6kl_set_addrwin_reg(struct ath6kl *ar, u32 reg_addr, u32 addr) -{ - int status; - u8 addr_val[4]; - s32 i; - - /* - * Write bytes 1,2,3 of the register to set the upper address bytes, - * the LSB is written last to initiate the access cycle - */ - - for (i = 1; i <= 3; i++) { - /* - * Fill the buffer with the address byte value we want to - * hit 4 times. - */ - memset(addr_val, ((u8 *)&addr)[i], 4); - - /* - * Hit each byte of the register address with a 4-byte - * write operation to the same address, this is a harmless - * operation. - */ - status = ath6kl_sdio_read_write_sync_pri(ar, reg_addr + i, addr_val, - 4, HIF_WR_SYNC_BYTE_FIX); - if (status) - break; - } - - if (status) { - ath6kl_err("%s: failed to write initial bytes of 0x%x " - "to window reg: 0x%X\n", __func__, - addr, reg_addr); - return status; - } - - /* - * Write the address register again, this time write the whole - * 4-byte value. The effect here is that the LSB write causes the - * cycle to start, the extra 3 byte write to bytes 1,2,3 has no - * effect since we are writing the same values again - */ - status = ath6kl_sdio_read_write_sync_pri(ar, reg_addr, (u8 *)(&addr), - 4, HIF_WR_SYNC_BYTE_INC); - - if (status) { - ath6kl_err("%s: failed to write 0x%x to window reg: 0x%X\n", - __func__, addr, reg_addr); - return status; - } - - return 0; -} - -static int ath6kl_sdio_diag_read32(struct ath6kl *ar, u32 address, u32 *data) -{ - int status; - - /* set window register to start read cycle */ - status = ath6kl_set_addrwin_reg(ar, WINDOW_READ_ADDR_ADDRESS, - address); - - if (status) - return status; - - /* read the data */ - status = ath6kl_sdio_read_write_sync_pri(ar, WINDOW_DATA_ADDRESS, - (u8 *)data, sizeof(u32), HIF_RD_SYNC_BYTE_INC); - if (status) { - ath6kl_err("%s: failed to read from window data addr\n", - __func__); - return status; - } - - return status; -} - -static int ath6kl_sdio_diag_write32(struct ath6kl *ar, u32 address, - __le32 data) -{ - int status; - u32 val = (__force u32) data; - - /* set write data */ - status = ath6kl_sdio_read_write_sync_pri(ar, WINDOW_DATA_ADDRESS, - (u8 *) &val, sizeof(u32), HIF_WR_SYNC_BYTE_INC); - if (status) { - ath6kl_err("%s: failed to write 0x%x to window data addr\n", - __func__, data); - return status; - } - - /* set window register, which starts the write cycle */ - return ath6kl_set_addrwin_reg(ar, WINDOW_WRITE_ADDR_ADDRESS, - address); -} - -static int ath6kl_sdio_bmi_credits(struct ath6kl *ar) -{ - u32 addr; - unsigned long timeout; - int ret; - - ar->bmi.cmd_credits = 0; - - /* Read the counter register to get the command credits */ - addr = COUNT_DEC_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 4; - - timeout = jiffies + msecs_to_jiffies(BMI_COMMUNICATION_TIMEOUT); - while (time_before(jiffies, timeout) && !ar->bmi.cmd_credits) { - - /* - * Hit the credit counter with a 4-byte access, the first byte - * read will hit the counter and cause a decrement, while the - * remaining 3 bytes has no effect. The rationale behind this - * is to make all HIF accesses 4-byte aligned. - */ - ret = ath6kl_sdio_read_write_sync_pri(ar, addr, - (u8 *)&ar->bmi.cmd_credits, 4, - HIF_RD_SYNC_BYTE_INC); - if (ret) { - ath6kl_err("Unable to decrement the command credit " - "count register: %d\n", ret); - return ret; - } - - /* The counter is only 8 bits. - * Ignore anything in the upper 3 bytes - */ - ar->bmi.cmd_credits &= 0xFF; - } - - if (!ar->bmi.cmd_credits) { - ath6kl_err("bmi communication timeout\n"); - return -ETIMEDOUT; - } - - return 0; -} - -static int ath6kl_bmi_get_rx_lkahd(struct ath6kl *ar) -{ - unsigned long timeout; - u32 rx_word = 0; - int ret = 0; - - timeout = jiffies + msecs_to_jiffies(BMI_COMMUNICATION_TIMEOUT); - while ((time_before(jiffies, timeout)) && !rx_word) { - ret = ath6kl_sdio_read_write_sync_pri(ar, - RX_LOOKAHEAD_VALID_ADDRESS, - (u8 *)&rx_word, sizeof(rx_word), - HIF_RD_SYNC_BYTE_INC); - if (ret) { - ath6kl_err("unable to read RX_LOOKAHEAD_VALID\n"); - return ret; - } - - /* all we really want is one bit */ - rx_word &= (1 << ENDPOINT1); - } - - if (!rx_word) { - ath6kl_err("bmi_recv_buf FIFO empty\n"); - return -EINVAL; - } - - return ret; -} - -static int ath6kl_sdio_bmi_write(struct ath6kl *ar, u8 *buf, u32 len) -{ - int ret; - u32 addr; - - ret = ath6kl_sdio_bmi_credits(ar); - if (ret) - return ret; - - addr = ar->mbox_info.htc_addr; - - ret = ath6kl_sdio_read_write_sync_pri(ar, addr, buf, len, - HIF_WR_SYNC_BYTE_INC); - if (ret) - ath6kl_err("unable to send the bmi data to the device\n"); - - return ret; -} - -static int ath6kl_sdio_bmi_read(struct ath6kl *ar, u8 *buf, u32 len) -{ - int ret; - u32 addr; - - /* - * During normal bootup, small reads may be required. - * Rather than issue an HIF Read and then wait as the Target - * adds successive bytes to the FIFO, we wait here until - * we know that response data is available. - * - * This allows us to cleanly timeout on an unexpected - * Target failure rather than risk problems at the HIF level. - * In particular, this avoids SDIO timeouts and possibly garbage - * data on some host controllers. And on an interconnect - * such as Compact Flash (as well as some SDIO masters) which - * does not provide any indication on data timeout, it avoids - * a potential hang or garbage response. - * - * Synchronization is more difficult for reads larger than the - * size of the MBOX FIFO (128B), because the Target is unable - * to push the 129th byte of data until AFTER the Host posts an - * HIF Read and removes some FIFO data. So for large reads the - * Host proceeds to post an HIF Read BEFORE all the data is - * actually available to read. Fortunately, large BMI reads do - * not occur in practice -- they're supported for debug/development. - * - * So Host/Target BMI synchronization is divided into these cases: - * CASE 1: length < 4 - * Should not happen - * - * CASE 2: 4 <= length <= 128 - * Wait for first 4 bytes to be in FIFO - * If CONSERVATIVE_BMI_READ is enabled, also wait for - * a BMI command credit, which indicates that the ENTIRE - * response is available in the the FIFO - * - * CASE 3: length > 128 - * Wait for the first 4 bytes to be in FIFO - * - * For most uses, a small timeout should be sufficient and we will - * usually see a response quickly; but there may be some unusual - * (debug) cases of BMI_EXECUTE where we want an larger timeout. - * For now, we use an unbounded busy loop while waiting for - * BMI_EXECUTE. - * - * If BMI_EXECUTE ever needs to support longer-latency execution, - * especially in production, this code needs to be enhanced to sleep - * and yield. Also note that BMI_COMMUNICATION_TIMEOUT is currently - * a function of Host processor speed. - */ - if (len >= 4) { /* NB: Currently, always true */ - ret = ath6kl_bmi_get_rx_lkahd(ar); - if (ret) - return ret; - } - - addr = ar->mbox_info.htc_addr; - ret = ath6kl_sdio_read_write_sync_pri(ar, addr, buf, len, - HIF_RD_SYNC_BYTE_INC); - if (ret) { - ath6kl_err("Unable to read the bmi data from the device: %d\n", - ret); - return ret; - } - - return 0; -} - -static void ath6kl_sdio_stop(struct ath6kl *ar) -{ - struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); - struct bus_request *req, *tmp_req; - void *context; - - /* FIXME: make sure that wq is not queued again */ - - cancel_work_sync(&ar_sdio->wr_async_work); - - spin_lock_bh(&ar_sdio->wr_async_lock); - - list_for_each_entry_safe(req, tmp_req, &ar_sdio->wr_asyncq, list) { - list_del(&req->list); - - if (req->scat_req) { - /* this is a scatter gather request */ - req->scat_req->status = -ECANCELED; - req->scat_req->complete(ar_sdio->ar->htc_target, - req->scat_req); - } else { - context = req->packet; - ath6kl_sdio_free_bus_req(ar_sdio, req); - ath6kl_hif_rw_comp_handler(context, -ECANCELED); - } - } - - spin_unlock_bh(&ar_sdio->wr_async_lock); - - WARN_ON(get_queue_depth(&ar_sdio->scat_req) != 4); -} - -static const struct ath6kl_hif_ops ath6kl_sdio_ops = { - .read_write_sync = ath6kl_sdio_read_write_sync_pri, - .write_async = ath6kl_sdio_write_async, - .irq_enable = ath6kl_sdio_irq_enable, - .irq_disable = ath6kl_sdio_irq_disable, - .scatter_req_get = ath6kl_sdio_scatter_req_get, - .scatter_req_add = ath6kl_sdio_scatter_req_add, - .enable_scatter = ath6kl_sdio_enable_scatter, - .scat_req_rw = ath6kl_sdio_async_rw_scatter, - .cleanup_scatter = ath6kl_sdio_cleanup_scatter, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) - .suspend = ath6kl_sdio_suspend, - .resume = ath6kl_sdio_resume, -#endif - .diag_read32 = ath6kl_sdio_diag_read32, - .diag_write32 = ath6kl_sdio_diag_write32, - .bmi_read = ath6kl_sdio_bmi_read, - .bmi_write = ath6kl_sdio_bmi_write, - .power_on = ath6kl_sdio_power_on, - .power_off = ath6kl_sdio_power_off, - .stop = ath6kl_sdio_stop, -}; - -#if defined(CONFIG_PM_SLEEP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) - -/* - * Empty handlers so that mmc subsystem doesn't remove us entirely during - * suspend. We instead follow cfg80211 suspend/resume handlers. - */ -static int ath6kl_sdio_pm_suspend(struct device *device) -{ -#ifdef CONFIG_MACH_PX - struct sdio_func *func; - struct ath6kl_sdio *ar_sdio; - int ret; - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio pm suspend\n"); - - func = dev_to_sdio_func(device); - ar_sdio = sdio_get_drvdata(func); - - sdio_release_host(func); - ret = ath6kl_sdio_suspend(ar_sdio->ar, NULL); - sdio_claim_host(func); - - return ret; -#else - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio pm suspend\n"); - - return 0; -#endif -} - -static int ath6kl_sdio_pm_resume(struct device *device) -{ -#ifdef CONFIG_MACH_PX - struct sdio_func *func; - struct ath6kl_sdio *ar_sdio; - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio pm resume\n"); - - func = dev_to_sdio_func(device); - ar_sdio = sdio_get_drvdata(func); - - return ath6kl_sdio_resume(ar_sdio->ar); -#else - ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio pm resume\n"); - - return 0; -#endif -} - -#ifdef CONFIG_MACH_PX -static struct dev_pm_ops ath6kl_sdio_pm_ops = { - .suspend = ath6kl_sdio_pm_suspend, - .resume = ath6kl_sdio_pm_resume, -}; -#else -static SIMPLE_DEV_PM_OPS(ath6kl_sdio_pm_ops, ath6kl_sdio_pm_suspend, - ath6kl_sdio_pm_resume); -#endif - -#define ATH6KL_SDIO_PM_OPS (&ath6kl_sdio_pm_ops) - -#else - -#define ATH6KL_SDIO_PM_OPS NULL - -#endif /* CONFIG_PM_SLEEP */ - -static int ath6kl_sdio_probe(struct sdio_func *func, - const struct sdio_device_id *id) -{ - int ret; - struct ath6kl_sdio *ar_sdio; - struct ath6kl *ar; - int count; - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "sdio new func %d vendor 0x%x device 0x%x block 0x%x/0x%x\n", - func->num, func->vendor, func->device, - func->max_blksize, func->cur_blksize); - - ar_sdio = kzalloc(sizeof(struct ath6kl_sdio), GFP_KERNEL); - if (!ar_sdio) - return -ENOMEM; - - ar_sdio->dma_buffer = kzalloc(HIF_DMA_BUFFER_SIZE, GFP_KERNEL); - if (!ar_sdio->dma_buffer) { - ret = -ENOMEM; - goto err_hif; - } - - ar_sdio->func = func; - sdio_set_drvdata(func, ar_sdio); - - ar_sdio->id = id; - ar_sdio->is_disabled = true; - - spin_lock_init(&ar_sdio->lock); - spin_lock_init(&ar_sdio->scat_lock); - spin_lock_init(&ar_sdio->wr_async_lock); - mutex_init(&ar_sdio->dma_buffer_mutex); - - INIT_LIST_HEAD(&ar_sdio->scat_req); - INIT_LIST_HEAD(&ar_sdio->bus_req_freeq); - INIT_LIST_HEAD(&ar_sdio->wr_asyncq); - - INIT_WORK(&ar_sdio->wr_async_work, ath6kl_sdio_write_async_work); - init_waitqueue_head(&ar_sdio->irq_wq); - - for (count = 0; count < BUS_REQUEST_MAX_NUM; count++) - ath6kl_sdio_free_bus_req(ar_sdio, &ar_sdio->bus_req[count]); - - ar = ath6kl_core_alloc(&ar_sdio->func->dev); - if (!ar) { - ath6kl_err("Failed to alloc ath6kl core\n"); - ret = -ENOMEM; - goto err_dma; - } - - ar_sdio->ar = ar; - ar->hif_type = ATH6KL_HIF_TYPE_SDIO; - ar->hif_priv = ar_sdio; - ar->hif_ops = &ath6kl_sdio_ops; - ar->bmi.max_data_size = 256; - - ath6kl_sdio_set_mbox_info(ar); - - ret = ath6kl_sdio_setup_irq_mode(ar); - if (ret) { - ath6kl_err("Failed to setup sdio irq mode: %d\n", ret); - goto err_core_alloc; - } - - ret = ath6kl_sdio_config(ar); - if (ret) { - ath6kl_err("Failed to config sdio: %d\n", ret); - goto err_core_alloc; - } - - ret = ath6kl_core_init(ar); - if (ret) { - ath6kl_err("Failed to init ath6kl core\n"); - goto err_core_alloc; - } - - return ret; - -err_core_alloc: - ath6kl_core_free(ar_sdio->ar); -err_dma: - kfree(ar_sdio->dma_buffer); -err_hif: - kfree(ar_sdio); - - return ret; -} - -static void ath6kl_sdio_remove(struct sdio_func *func) -{ - struct ath6kl_sdio *ar_sdio; - struct ath6kl_vif *vif; - long timeleft; - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "sdio removed func %d vendor 0x%x device 0x%x\n", - func->num, func->vendor, func->device); - - ar_sdio = sdio_get_drvdata(func); -#ifdef CONFIG_MACH_PX - vif = ath6kl_vif_first(ar_sdio->ar); - /* Wait for Wmi event to be ready */ - timeleft = wait_event_interruptible_timeout(ar_sdio->ar->event_wq, - ar_sdio->ar->state == ATH6KL_STATE_ON, - WMI_TIMEOUT); - - ath6kl_hif_rx_control(ar_sdio->ar->htc_target->dev, false); - vif->sdio_remove = true; -#endif - - ath6kl_stop_txrx(ar_sdio->ar); - cancel_work_sync(&ar_sdio->wr_async_work); - - ath6kl_core_cleanup(ar_sdio->ar); - - kfree(ar_sdio->dma_buffer); - kfree(ar_sdio); -} - -static const struct sdio_device_id ath6kl_sdio_devices[] = { - {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6003_BASE | 0x0))}, - {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6003_BASE | 0x1))}, - {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x0))}, - {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x1))}, - {}, -}; - -MODULE_DEVICE_TABLE(sdio, ath6kl_sdio_devices); - -static struct sdio_driver ath6kl_sdio_driver = { - .name = "ath6kl_sdio", - .id_table = ath6kl_sdio_devices, - .probe = ath6kl_sdio_probe, - .remove = ath6kl_sdio_remove, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) - .drv.pm = ATH6KL_SDIO_PM_OPS, -#endif -}; - -static int __init ath6kl_sdio_init(void) -{ - int ret; -#ifdef CONFIG_MACH_PX - ath6kl_sdio_init_c210(); -#else - ath6kl_sdio_init_msm(); -#endif - ret = sdio_register_driver(&ath6kl_sdio_driver); - if (ret) - ath6kl_err("sdio driver registration failed: %d\n", ret); - - return ret; -} - -static void __exit ath6kl_sdio_exit(void) -{ - sdio_unregister_driver(&ath6kl_sdio_driver); -#ifdef CONFIG_MACH_PX - ath6kl_sdio_exit_c210(); -#else - ath6kl_sdio_exit_msm(); -#endif - -} - -module_init(ath6kl_sdio_init); -module_exit(ath6kl_sdio_exit); - -MODULE_AUTHOR("Atheros Communications, Inc."); -MODULE_DESCRIPTION("Driver support for Atheros AR600x SDIO devices"); -MODULE_LICENSE("Dual BSD/GPL"); - -MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_OTP_FILE); -MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_FIRMWARE_FILE); -MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_PATCH_FILE); -MODULE_FIRMWARE(AR6003_HW_2_0_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_OTP_FILE); -MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_FIRMWARE_FILE); -MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_PATCH_FILE); -MODULE_FIRMWARE(AR6003_HW_2_1_1_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6004_HW_1_0_FW_DIR "/" AR6004_HW_1_0_FIRMWARE_FILE); -MODULE_FIRMWARE(AR6004_HW_1_0_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6004_HW_1_1_FW_DIR "/" AR6004_HW_1_1_FIRMWARE_FILE); -MODULE_FIRMWARE(AR6004_HW_1_1_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE); diff --git a/drivers/net/wireless/ath/ath6kl/softmac.c b/drivers/net/wireless/ath/ath6kl/softmac.c deleted file mode 100644 index 3725871..0000000 --- a/drivers/net/wireless/ath/ath6kl/softmac.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (c) 2011 Atheros Communications Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "core.h" -#include "debug.h" -#include -#include -#define MAC_FILE "ath6k/AR6003/hw2.1.1/softmac" - -typedef char A_CHAR; -extern int android_readwrite_file(const A_CHAR *filename, A_CHAR *rbuf, const A_CHAR *wbuf, size_t length); - -/* Bleh, same offsets. */ -#define AR6003_MAC_ADDRESS_OFFSET 0x16 -#define AR6004_MAC_ADDRESS_OFFSET 0x16 - -/* Global variables, sane coding be damned. */ -u8 *ath6kl_softmac; -size_t ath6kl_softmac_len; - -static void ath6kl_calculate_crc(u32 target_type, u8 *data, size_t len) -{ - u16 *crc, *data_idx; - u16 checksum; - int i; - - if (target_type == TARGET_TYPE_AR6003) { - crc = (u16 *)(data + 0x04); - } else if (target_type == TARGET_TYPE_AR6004) { - len = 1024; - crc = (u16 *)(data + 0x04); - } else { - ath6kl_err("Invalid target type\n"); - return; - } - - ath6kl_dbg(ATH6KL_DBG_BOOT, "Old Checksum: %u\n", *crc); - - *crc = 0; - checksum = 0; - data_idx = (u16 *)data; - - for (i = 0; i < len; i += 2) { - checksum = checksum ^ (*data_idx); - data_idx++; - } - - *crc = cpu_to_le16(checksum); - - ath6kl_dbg(ATH6KL_DBG_BOOT, "New Checksum: %u\n", checksum); -} - -#ifdef CONFIG_MACH_PX -static int ath6kl_fetch_nvmac_info(struct ath6kl *ar) -{ - char softmac_temp[64]; - int ret = 0, ath6kl_softmac_len = 0; - int isnvmac_imei = 0, isnvmac_wifi = 0; - int isnvmac_file = 0, ismac_file = 0; - - char nvfilepath[32] = {0}; - char *nvfilepath_imei = "/efs/imei/.nvmac.info"; - char *nvfilepath_wifi = "/efs/wifi/.nvmac.info"; - char *softmac_filename = "/efs/wifi/.mac.info"; - char *softmac_old_filename = "/data/.mac.info"; - - do { - /* - isnvmac_imei = android_readwrite_file(nvfilepath_imei, - NULL, NULL, 0); - isnvmac_wifi = android_readwrite_file(nvfilepath_wifi, - NULL, NULL, 0); */ - ismac_file = android_readwrite_file(softmac_filename, - NULL, NULL, 0); - - /* - if (isnvmac_imei >= 16 && isnvmac_wifi >= 16) { - strcpy(nvfilepath, nvfilepath_wifi); - isnvmac_file = isnvmac_wifi; - } else if (isnvmac_wifi >= 16) { - strcpy(nvfilepath, nvfilepath_wifi); - isnvmac_file = isnvmac_wifi; - } else if (isnvmac_imei >= 16) { - strcpy(nvfilepath, nvfilepath_imei); - isnvmac_file = isnvmac_imei; - } */ - - /* copy .nvmac.info file to .mac.info - wifi driver will use .mac.info finally */ - /* - if (isnvmac_file >= 16) { - ret = android_readwrite_file(nvfilepath, - (char *)softmac_temp, NULL, isnvmac_file); - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: Read Mac Address on nvmac.info - %d\n", - __func__, ret); - ret = android_readwrite_file(softmac_filename, - NULL, (char *)softmac_temp, ret); - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: Write Mac Address on mac.info - %d\n", - __func__, ret); - ret = android_readwrite_file(softmac_old_filename, - NULL, (char *)softmac_temp, ret); - } */ - - //if (isnvmac_file < 16 && ismac_file < 16) { - if (ismac_file < 16) { - snprintf(softmac_temp, sizeof(softmac_temp), - "00:12:34:%02x:%02x:%02x", - random32() & 0xff, - random32() & 0xff, - random32() & 0xff); - - ret = android_readwrite_file(softmac_filename, NULL, - (char *)softmac_temp, strlen(softmac_temp)); - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: Write Random Mac on mac.info - %d\n", - __func__, ret); - ret = android_readwrite_file(softmac_old_filename, NULL, - (char *)softmac_temp, strlen(softmac_temp)); - } - - - ret = android_readwrite_file(softmac_filename, NULL, NULL, 0); - if (ret < 0) - break; - else - ath6kl_softmac_len = ret; - - ath6kl_softmac = vmalloc(ath6kl_softmac_len); - if (!ath6kl_softmac) { - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: Cannot allocate buffer for %s (%d)\n", - __func__, softmac_filename, ath6kl_softmac_len); - ret = -ENOMEM; - break; - } - - ret = android_readwrite_file(softmac_filename, - (char *)ath6kl_softmac, - NULL, ath6kl_softmac_len); - - if (ret != ath6kl_softmac_len) { - ath6kl_dbg(ATH6KL_DBG_BOOT, - "%s: file read error, length %d\n", - __func__, ath6kl_softmac_len); - vfree(ath6kl_softmac); - ret = -1; - break; - } - - if (!strncmp(ath6kl_softmac, "00:00:00:00:00:00", 17)) { - ath6kl_dbg(ATH6KL_DBG_BOOT, "%s: mac address is zero\n", - __func__); - vfree(ath6kl_softmac); - ret = -1; - break; - } - - ret = 0; - } while (0); - - return ret; -} - -#else -static int ath6kl_fetch_mac_file(struct ath6kl *ar) -{ - const struct firmware *fw_entry; - int ret = 0; - - - ret = request_firmware(&fw_entry, MAC_FILE, ar->dev); - if (ret) - return ret; - - ath6kl_softmac_len = fw_entry->size; - ath6kl_softmac = kmemdup(fw_entry->data, fw_entry->size, GFP_KERNEL); - - if (ath6kl_softmac == NULL) - ret = -ENOMEM; - - release_firmware(fw_entry); - - return ret; -} -#endif - -void ath6kl_mangle_mac_address(struct ath6kl *ar) -{ - u8 *ptr_mac; - int i, ret; -#ifdef CONFIG_MACH_PX - unsigned int softmac[6]; -#endif - - switch (ar->target_type) { - case TARGET_TYPE_AR6003: - ptr_mac = ar->fw_board + AR6003_MAC_ADDRESS_OFFSET; - break; - case TARGET_TYPE_AR6004: - ptr_mac = ar->fw_board + AR6004_MAC_ADDRESS_OFFSET; - break; - default: - ath6kl_err("Invalid Target Type\n"); - return; - } - -#if 0 - ath6kl_dbg(ATH6KL_DBG_BOOT, - "MAC from EEPROM %02X:%02X:%02X:%02X:%02X:%02X\n", - ptr_mac[0], ptr_mac[1], ptr_mac[2], - ptr_mac[3], ptr_mac[4], ptr_mac[5]); -#endif - -#ifdef CONFIG_MACH_PX - ret = ath6kl_fetch_nvmac_info(ar); - - if (ret) { - ath6kl_err("MAC address file not found\n"); - return; - } - - if (sscanf(ath6kl_softmac, "%02x:%02x:%02x:%02x:%02x:%02x", - &softmac[0], &softmac[1], &softmac[2], - &softmac[3], &softmac[4], &softmac[5])==6) { - - for (i=0; i<6; ++i) { - ptr_mac[i] = softmac[i] & 0xff; - } - } - - ath6kl_dbg(ATH6KL_DBG_BOOT, - "MAC from SoftMAC %02X_%02X:%02X\n", - ptr_mac[0], ptr_mac[4], ptr_mac[5]); - vfree(ath6kl_softmac); -#else - ret = ath6kl_fetch_mac_file(ar); - if (ret) { - ath6kl_err("MAC address file not found\n"); - return; - } - - for (i = 0; i < ETH_ALEN; ++i) { - ptr_mac[i] = ath6kl_softmac[i] & 0xff; - } - - kfree(ath6kl_softmac); -#endif - - ath6kl_calculate_crc(ar->target_type, ar->fw_board, ar->fw_board_len); -} diff --git a/drivers/net/wireless/ath/ath6kl/target.h b/drivers/net/wireless/ath/ath6kl/target.h deleted file mode 100755 index fa0faa4..0000000 --- a/drivers/net/wireless/ath/ath6kl/target.h +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright (c) 2004-2010 Atheros Communications Inc. - * Copyright (c) 2011 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef TARGET_H -#define TARGET_H - -#define AR6003_BOARD_DATA_ADDR 0x00540654 -#define AR6003_BOARD_DATA_INIT_ADDR 0x00540658 -#define AR6003_BOARD_DATA_OFFSET 4 -#define AR6003_RD_OFFSET 12 - -#define AR6003_BOARD_DATA_SZ 1024 -#define AR6003_BOARD_EXT_DATA_SZ 768 -#define AR6003_BOARD_EXT_DATA_SZ_V2 1024 - -#define AR6004_BOARD_DATA_SZ 6144 -#define AR6004_BOARD_EXT_DATA_SZ 0 - -#define RESET_CONTROL_ADDRESS 0x00000000 -#define RESET_CONTROL_COLD_RST 0x00000100 -#define RESET_CONTROL_MBOX_RST 0x00000004 - -#define CPU_CLOCK_STANDARD_S 0 -#define CPU_CLOCK_STANDARD 0x00000003 -#define CPU_CLOCK_ADDRESS 0x00000020 - -#define CLOCK_CONTROL_ADDRESS 0x00000028 -#define CLOCK_CONTROL_LF_CLK32_S 2 -#define CLOCK_CONTROL_LF_CLK32 0x00000004 - -#define SYSTEM_SLEEP_ADDRESS 0x000000c4 -#define SYSTEM_SLEEP_DISABLE_S 0 -#define SYSTEM_SLEEP_DISABLE 0x00000001 - -#define LPO_CAL_ADDRESS 0x000000e0 -#define LPO_CAL_ENABLE_S 20 -#define LPO_CAL_ENABLE 0x00100000 - -#define GPIO_PIN10_ADDRESS 0x00000050 -#define GPIO_PIN11_ADDRESS 0x00000054 -#define GPIO_PIN12_ADDRESS 0x00000058 -#define GPIO_PIN13_ADDRESS 0x0000005c - -#define HOST_INT_STATUS_ADDRESS 0x00000400 -#define HOST_INT_STATUS_ERROR_S 7 -#define HOST_INT_STATUS_ERROR 0x00000080 - -#define HOST_INT_STATUS_CPU_S 6 -#define HOST_INT_STATUS_CPU 0x00000040 - -#define HOST_INT_STATUS_COUNTER_S 4 -#define HOST_INT_STATUS_COUNTER 0x00000010 - -#define CPU_INT_STATUS_ADDRESS 0x00000401 - -#define ERROR_INT_STATUS_ADDRESS 0x00000402 -#define ERROR_INT_STATUS_WAKEUP_S 2 -#define ERROR_INT_STATUS_WAKEUP 0x00000004 - -#define ERROR_INT_STATUS_RX_UNDERFLOW_S 1 -#define ERROR_INT_STATUS_RX_UNDERFLOW 0x00000002 - -#define ERROR_INT_STATUS_TX_OVERFLOW_S 0 -#define ERROR_INT_STATUS_TX_OVERFLOW 0x00000001 - -#define COUNTER_INT_STATUS_ADDRESS 0x00000403 -#define COUNTER_INT_STATUS_COUNTER_S 0 -#define COUNTER_INT_STATUS_COUNTER 0x000000ff - -#define RX_LOOKAHEAD_VALID_ADDRESS 0x00000405 - -#define INT_STATUS_ENABLE_ADDRESS 0x00000418 -#define INT_STATUS_ENABLE_ERROR_S 7 -#define INT_STATUS_ENABLE_ERROR 0x00000080 - -#define INT_STATUS_ENABLE_CPU_S 6 -#define INT_STATUS_ENABLE_CPU 0x00000040 - -#define INT_STATUS_ENABLE_INT_S 5 -#define INT_STATUS_ENABLE_INT 0x00000020 -#define INT_STATUS_ENABLE_COUNTER_S 4 -#define INT_STATUS_ENABLE_COUNTER 0x00000010 - -#define INT_STATUS_ENABLE_MBOX_DATA_S 0 -#define INT_STATUS_ENABLE_MBOX_DATA 0x0000000f - -#define CPU_INT_STATUS_ENABLE_ADDRESS 0x00000419 -#define CPU_INT_STATUS_ENABLE_BIT_S 0 -#define CPU_INT_STATUS_ENABLE_BIT 0x000000ff - -#define ERROR_STATUS_ENABLE_ADDRESS 0x0000041a -#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_S 1 -#define ERROR_STATUS_ENABLE_RX_UNDERFLOW 0x00000002 - -#define ERROR_STATUS_ENABLE_TX_OVERFLOW_S 0 -#define ERROR_STATUS_ENABLE_TX_OVERFLOW 0x00000001 - -#define COUNTER_INT_STATUS_ENABLE_ADDRESS 0x0000041b -#define COUNTER_INT_STATUS_ENABLE_BIT_S 0 -#define COUNTER_INT_STATUS_ENABLE_BIT 0x000000ff - -#define COUNT_ADDRESS 0x00000420 - -#define COUNT_DEC_ADDRESS 0x00000440 - -#define WINDOW_DATA_ADDRESS 0x00000474 -#define WINDOW_WRITE_ADDR_ADDRESS 0x00000478 -#define WINDOW_READ_ADDR_ADDRESS 0x0000047c -#define CPU_DBG_SEL_ADDRESS 0x00000483 -#define CPU_DBG_ADDRESS 0x00000484 - -#define LOCAL_SCRATCH_ADDRESS 0x000000c0 -#define ATH6KL_OPTION_SLEEP_DISABLE 0x08 - -#define RTC_BASE_ADDRESS 0x00004000 -#define GPIO_BASE_ADDRESS 0x00014000 -#define MBOX_BASE_ADDRESS 0x00018000 -#define ANALOG_INTF_BASE_ADDRESS 0x0001c000 - -/* real name of the register is unknown */ -#define ATH6KL_ANALOG_PLL_REGISTER (ANALOG_INTF_BASE_ADDRESS + 0x284) - -#define SM(f, v) (((v) << f##_S) & f) -#define MS(f, v) (((v) & f) >> f##_S) - -/* - * xxx_HOST_INTEREST_ADDRESS is the address in Target RAM of the - * host_interest structure. - * - * Host Interest is shared between Host and Target in order to coordinate - * between the two, and is intended to remain constant (with additions only - * at the end). - */ -#define ATH6KL_AR6003_HI_START_ADDR 0x00540600 -#define ATH6KL_AR6004_HI_START_ADDR 0x00400800 - -/* - * These are items that the Host may need to access - * via BMI or via the Diagnostic Window. The position - * of items in this structure must remain constant. - * across firmware revisions! - * - * Types for each item must be fixed size across target and host platforms. - * The structure is used only to calculate offset for each register with - * HI_ITEM() macro, no values are stored to it. - * - * More items may be added at the end. - */ -struct host_interest { - /* - * Pointer to application-defined area, if any. - * Set by Target application during startup. - */ - u32 hi_app_host_interest; /* 0x00 */ - - /* Pointer to register dump area, valid after Target crash. */ - u32 hi_failure_state; /* 0x04 */ - - /* Pointer to debug logging header */ - u32 hi_dbglog_hdr; /* 0x08 */ - - u32 hi_unused1; /* 0x0c */ - - /* - * General-purpose flag bits, similar to ATH6KL_OPTION_* flags. - * Can be used by application rather than by OS. - */ - u32 hi_option_flag; /* 0x10 */ - - /* - * Boolean that determines whether or not to - * display messages on the serial port. - */ - u32 hi_serial_enable; /* 0x14 */ - - /* Start address of DataSet index, if any */ - u32 hi_dset_list_head; /* 0x18 */ - - /* Override Target application start address */ - u32 hi_app_start; /* 0x1c */ - - /* Clock and voltage tuning */ - u32 hi_skip_clock_init; /* 0x20 */ - u32 hi_core_clock_setting; /* 0x24 */ - u32 hi_cpu_clock_setting; /* 0x28 */ - u32 hi_system_sleep_setting; /* 0x2c */ - u32 hi_xtal_control_setting; /* 0x30 */ - u32 hi_pll_ctrl_setting_24ghz; /* 0x34 */ - u32 hi_pll_ctrl_setting_5ghz; /* 0x38 */ - u32 hi_ref_voltage_trim_setting; /* 0x3c */ - u32 hi_clock_info; /* 0x40 */ - - /* - * Flash configuration overrides, used only - * when firmware is not executing from flash. - * (When using flash, modify the global variables - * with equivalent names.) - */ - u32 hi_bank0_addr_value; /* 0x44 */ - u32 hi_bank0_read_value; /* 0x48 */ - u32 hi_bank0_write_value; /* 0x4c */ - u32 hi_bank0_config_value; /* 0x50 */ - - /* Pointer to Board Data */ - u32 hi_board_data; /* 0x54 */ - u32 hi_board_data_initialized; /* 0x58 */ - - u32 hi_dset_ram_index_tbl; /* 0x5c */ - - u32 hi_desired_baud_rate; /* 0x60 */ - u32 hi_dbglog_config; /* 0x64 */ - u32 hi_end_ram_reserve_sz; /* 0x68 */ - u32 hi_mbox_io_block_sz; /* 0x6c */ - - u32 hi_num_bpatch_streams; /* 0x70 -- unused */ - u32 hi_mbox_isr_yield_limit; /* 0x74 */ - - u32 hi_refclk_hz; /* 0x78 */ - u32 hi_ext_clk_detected; /* 0x7c */ - u32 hi_dbg_uart_txpin; /* 0x80 */ - u32 hi_dbg_uart_rxpin; /* 0x84 */ - u32 hi_hci_uart_baud; /* 0x88 */ - u32 hi_hci_uart_pin_assignments; /* 0x8C */ - /* - * NOTE: byte [0] = tx pin, [1] = rx pin, [2] = rts pin, [3] = cts - * pin - */ - u32 hi_hci_uart_baud_scale_val; /* 0x90 */ - u32 hi_hci_uart_baud_step_val; /* 0x94 */ - - u32 hi_allocram_start; /* 0x98 */ - u32 hi_allocram_sz; /* 0x9c */ - u32 hi_hci_bridge_flags; /* 0xa0 */ - u32 hi_hci_uart_support_pins; /* 0xa4 */ - /* - * NOTE: byte [0] = RESET pin (bit 7 is polarity), - * bytes[1]..bytes[3] are for future use - */ - u32 hi_hci_uart_pwr_mgmt_params; /* 0xa8 */ - /* - * 0xa8 - [1]: 0 = UART FC active low, 1 = UART FC active high - * [31:16]: wakeup timeout in ms - */ - - /* Pointer to extended board data */ - u32 hi_board_ext_data; /* 0xac */ - u32 hi_board_ext_data_config; /* 0xb0 */ - - /* - * Bit [0] : valid - * Bit[31:16: size - */ - /* - * hi_reset_flag is used to do some stuff when target reset. - * such as restore app_start after warm reset or - * preserve host Interest area, or preserve ROM data, literals etc. - */ - u32 hi_reset_flag; /* 0xb4 */ - /* indicate hi_reset_flag is valid */ - u32 hi_reset_flag_valid; /* 0xb8 */ - u32 hi_hci_uart_pwr_mgmt_params_ext; /* 0xbc */ - /* - * 0xbc - [31:0]: idle timeout in ms - */ - /* ACS flags */ - u32 hi_acs_flags; /* 0xc0 */ - u32 hi_console_flags; /* 0xc4 */ - u32 hi_nvram_state; /* 0xc8 */ - u32 hi_option_flag2; /* 0xcc */ - - /* If non-zero, override values sent to Host in WMI_READY event. */ - u32 hi_sw_version_override; /* 0xd0 */ - u32 hi_abi_version_override; /* 0xd4 */ - - /* - * Percentage of high priority RX traffic to total expected RX traffic - - * applicable only to ar6004 - */ - u32 hi_hp_rx_traffic_ratio; /* 0xd8 */ - - /* test applications flags */ - u32 hi_test_apps_related ; /* 0xdc */ - /* location of test script */ - u32 hi_ota_testscript; /* 0xe0 */ - /* location of CAL data */ - u32 hi_cal_data; /* 0xe4 */ - /* Number of packet log buffers */ - u32 hi_pktlog_num_buffers; /* 0xe8 */ - -} __packed; - -#define HI_ITEM(item) offsetof(struct host_interest, item) - -#define HI_OPTION_MAC_ADDR_METHOD_SHIFT 3 - -#define HI_OPTION_FW_MODE_IBSS 0x0 -#define HI_OPTION_FW_MODE_BSS_STA 0x1 -#define HI_OPTION_FW_MODE_AP 0x2 - -#define HI_OPTION_FW_SUBMODE_NONE 0x0 -#define HI_OPTION_FW_SUBMODE_P2PDEV 0x1 -#define HI_OPTION_FW_SUBMODE_P2PCLIENT 0x2 -#define HI_OPTION_FW_SUBMODE_P2PGO 0x3 - -#define HI_OPTION_NUM_DEV_SHIFT 0x9 - -#define HI_OPTION_FW_BRIDGE_SHIFT 0x04 - -/* Fw Mode/SubMode Mask -|------------------------------------------------------------------------------| -| SUB | SUB | SUB | SUB | | | | -| MODE[3] | MODE[2] | MODE[1] | MODE[0] | MODE[3] | MODE[2] | MODE[1] | MODE[0| -| (2) | (2) | (2) | (2) | (2) | (2) | (2) | (2) -|------------------------------------------------------------------------------| -*/ -#define HI_OPTION_FW_MODE_BITS 0x2 -#define HI_OPTION_FW_MODE_SHIFT 0xC - -#define HI_OPTION_FW_SUBMODE_BITS 0x2 -#define HI_OPTION_FW_SUBMODE_SHIFT 0x14 - -/* Convert a Target virtual address into a Target physical address */ -#define AR6003_VTOP(vaddr) ((vaddr) & 0x001fffff) -#define AR6004_VTOP(vaddr) (vaddr) - -#define TARG_VTOP(target_type, vaddr) \ - (((target_type) == TARGET_TYPE_AR6003) ? AR6003_VTOP(vaddr) : \ - (((target_type) == TARGET_TYPE_AR6004) ? AR6004_VTOP(vaddr) : 0)) - -#define ATH6KL_FWLOG_PAYLOAD_SIZE 1500 - -struct ath6kl_dbglog_buf { - __le32 next; - __le32 buffer_addr; - __le32 bufsize; - __le32 length; - __le32 count; - __le32 free; -} __packed; - -struct ath6kl_dbglog_hdr { - __le32 dbuf_addr; - __le32 dropped; -} __packed; - -#endif diff --git a/drivers/net/wireless/ath/ath6kl/testmode.c b/drivers/net/wireless/ath/ath6kl/testmode.c deleted file mode 100755 index f4a5cc3..0000000 --- a/drivers/net/wireless/ath/ath6kl/testmode.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2010-2011 Atheros Communications Inc. - * Copyright (c) 2011 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "testmode.h" -#include "debug.h" - -#include -#include "wmiconfig.h" - -enum ath6kl_tm_attr { - __ATH6KL_TM_ATTR_INVALID = 0, - ATH6KL_TM_ATTR_CMD = 1, - ATH6KL_TM_ATTR_DATA = 2, - - /* keep last */ - __ATH6KL_TM_ATTR_AFTER_LAST, - ATH6KL_TM_ATTR_MAX = __ATH6KL_TM_ATTR_AFTER_LAST - 1, -}; - -enum ath6kl_tm_cmd { - ATH6KL_TM_CMD_TCMD = 0, - ATH6KL_TM_CMD_RX_REPORT = 1, /* not used anymore */ - ATH6KL_TM_CMD_WMI_CMD = 0xF000, -}; - -#define ATH6KL_TM_DATA_MAX_LEN 5000 - -static const struct nla_policy ath6kl_tm_policy[ATH6KL_TM_ATTR_MAX + 1] = { - [ATH6KL_TM_ATTR_CMD] = { .type = NLA_U32 }, - [ATH6KL_TM_ATTR_DATA] = { .type = NLA_BINARY, - .len = ATH6KL_TM_DATA_MAX_LEN }, -}; - - -void ath6kl_tm_rx_event(struct ath6kl *ar, void *buf, size_t buf_len) -{ - struct sk_buff *skb; - - if (!buf || buf_len == 0) - return; - - skb = cfg80211_testmode_alloc_event_skb(ar->wiphy, buf_len, GFP_KERNEL); - if (!skb) { - ath6kl_warn("failed to allocate testmode rx skb!\n"); - return; - } - NLA_PUT_U32(skb, ATH6KL_TM_ATTR_CMD, ATH6KL_TM_CMD_TCMD); - NLA_PUT(skb, ATH6KL_TM_ATTR_DATA, buf_len, buf); - cfg80211_testmode_event(skb, GFP_KERNEL); - return; - -nla_put_failure: - kfree_skb(skb); - ath6kl_warn("nla_put failed on testmode rx skb!\n"); -} - -int ath6kl_tm_cmd(struct wiphy *wiphy, void *data, int len) -{ - struct ath6kl *ar = wiphy_priv(wiphy); - struct nlattr *tb[ATH6KL_TM_ATTR_MAX + 1]; - int err, buf_len; - void *buf; - u32 wmi_cmd; - struct sk_buff *skb; - - err = nla_parse(tb, ATH6KL_TM_ATTR_MAX, data, len, - ath6kl_tm_policy); - if (err) - return err; - - if (!tb[ATH6KL_TM_ATTR_CMD]) - return -EINVAL; - - switch (nla_get_u32(tb[ATH6KL_TM_ATTR_CMD])) { - case ATH6KL_TM_CMD_WMI_CMD: - if (!tb[ATH6KL_TM_ATTR_DATA]) - return -EINVAL; - - buf = nla_data(tb[ATH6KL_TM_ATTR_DATA]); - buf_len = nla_len(tb[ATH6KL_TM_ATTR_DATA]); - - /* First four bytes hold the wmi_cmd and the rest is the data */ - skb = ath6kl_wmi_get_buf(buf_len-4); - if (!skb) - return -ENOMEM; - - memcpy(&wmi_cmd, buf, sizeof(wmi_cmd)); - memcpy(skb->data, (u32 *)buf + 1, buf_len - 4); - ath6kl_wmi_cmd_send(ar->wmi, 0, skb, wmi_cmd, NO_SYNC_WMIFLAG); - - return 0; - - break; - case ATH6KL_TM_CMD_TCMD: - if (!tb[ATH6KL_TM_ATTR_DATA]) - return -EINVAL; - - buf = nla_data(tb[ATH6KL_TM_ATTR_DATA]); - buf_len = nla_len(tb[ATH6KL_TM_ATTR_DATA]); - - ath6kl_wmi_test_cmd(ar->wmi, buf, buf_len); - - return 0; - - break; - case ATH6KL_TM_CMD_RX_REPORT: - default: - return -EOPNOTSUPP; - } -} diff --git a/drivers/net/wireless/ath/ath6kl/testmode.h b/drivers/net/wireless/ath/ath6kl/testmode.h deleted file mode 100755 index fe651d6..0000000 --- a/drivers/net/wireless/ath/ath6kl/testmode.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2010-2011 Atheros Communications Inc. - * Copyright (c) 2011 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "core.h" - -#ifdef CONFIG_NL80211_TESTMODE - -void ath6kl_tm_rx_event(struct ath6kl *ar, void *buf, size_t buf_len); -int ath6kl_tm_cmd(struct wiphy *wiphy, void *data, int len); - -#else - -static inline void ath6kl_tm_rx_event(struct ath6kl *ar, void *buf, - size_t buf_len) -{ -} - -static inline int ath6kl_tm_cmd(struct wiphy *wiphy, void *data, int len) -{ - return 0; -} - -#endif diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c deleted file mode 100644 index b8924dd..0000000 --- a/drivers/net/wireless/ath/ath6kl/txrx.c +++ /dev/null @@ -1,1853 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "core.h" -#include "debug.h" - -/* - * tid - tid_mux0..tid_mux3 - * aid - tid_mux4..tid_mux7 - */ -#define ATH6KL_TID_MASK 0xf -#define ATH6KL_AID_SHIFT 4 - -static inline u8 ath6kl_get_tid(u8 tid_mux) -{ - return tid_mux & ATH6KL_TID_MASK; -} - -static inline u8 ath6kl_get_aid(u8 tid_mux) -{ - return tid_mux >> ATH6KL_AID_SHIFT; -} - -static u8 ath6kl_ibss_map_epid(struct sk_buff *skb, struct net_device *dev, - u32 *map_no) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ethhdr *eth_hdr; - u32 i, ep_map = -1; - u8 *datap; - - *map_no = 0; - datap = skb->data; - eth_hdr = (struct ethhdr *) (datap + sizeof(struct wmi_data_hdr)); - - if (is_multicast_ether_addr(eth_hdr->h_dest)) - return ENDPOINT_2; - - for (i = 0; i < ar->node_num; i++) { - if (memcmp(eth_hdr->h_dest, ar->node_map[i].mac_addr, - ETH_ALEN) == 0) { - *map_no = i + 1; - ar->node_map[i].tx_pend++; - return ar->node_map[i].ep_id; - } - - if ((ep_map == -1) && !ar->node_map[i].tx_pend) - ep_map = i; - } - - if (ep_map == -1) { - ep_map = ar->node_num; - ar->node_num++; - if (ar->node_num > MAX_NODE_NUM) - return ENDPOINT_UNUSED; - } - - memcpy(ar->node_map[ep_map].mac_addr, eth_hdr->h_dest, ETH_ALEN); - - for (i = ENDPOINT_2; i <= ENDPOINT_5; i++) { - if (!ar->tx_pending[i]) { - ar->node_map[ep_map].ep_id = i; - break; - } - - /* - * No free endpoint is available, start redistribution on - * the inuse endpoints. - */ - if (i == ENDPOINT_5) { - ar->node_map[ep_map].ep_id = ar->next_ep_id; - ar->next_ep_id++; - if (ar->next_ep_id > ENDPOINT_5) - ar->next_ep_id = ENDPOINT_2; - } - } - - *map_no = ep_map + 1; - ar->node_map[ep_map].tx_pend++; - - return ar->node_map[ep_map].ep_id; -} - -static bool ath6kl_process_uapsdq(struct ath6kl_sta *conn, - struct ath6kl_vif *vif, - struct sk_buff *skb, - u32 *flags) -{ - struct ath6kl *ar = vif->ar; - bool is_apsdq_empty = false; - struct ethhdr *datap = (struct ethhdr *) skb->data; - u8 up = 0, traffic_class, *ip_hdr; - u16 ether_type; - struct ath6kl_llc_snap_hdr *llc_hdr; - - if (conn->sta_flags & STA_PS_APSD_TRIGGER) { - /* - * This tx is because of a uAPSD trigger, determine - * more and EOSP bit. Set EOSP if queue is empty - * or sufficient frames are delivered for this trigger. - */ - spin_lock_bh(&conn->psq_lock); - if (!skb_queue_empty(&conn->apsdq)) - *flags |= WMI_DATA_HDR_FLAGS_MORE; - else if (conn->sta_flags & STA_PS_APSD_EOSP) - *flags |= WMI_DATA_HDR_FLAGS_EOSP; - *flags |= WMI_DATA_HDR_FLAGS_UAPSD; - spin_unlock_bh(&conn->psq_lock); - return false; - } else if (!conn->apsd_info) - return false; - - if (test_bit(WMM_ENABLED, &vif->flags)) { - ether_type = be16_to_cpu(datap->h_proto); - if (is_ethertype(ether_type)) { - /* packet is in DIX format */ - ip_hdr = (u8 *)(datap + 1); - } else { - /* packet is in 802.3 format */ - llc_hdr = (struct ath6kl_llc_snap_hdr *) - (datap + 1); - ether_type = be16_to_cpu(llc_hdr->eth_type); - ip_hdr = (u8 *)(llc_hdr + 1); - } - - if (ether_type == IP_ETHERTYPE) - up = ath6kl_wmi_determine_user_priority( - ip_hdr, 0); - } else { - up = 0; - } - - traffic_class = ath6kl_wmi_get_traffic_class(up); - - if ((conn->apsd_info & (1 << traffic_class)) == 0) - return false; - - /* Queue the frames if the STA is sleeping */ - spin_lock_bh(&conn->psq_lock); - is_apsdq_empty = skb_queue_empty(&conn->apsdq); - skb_queue_tail(&conn->apsdq, skb); - spin_unlock_bh(&conn->psq_lock); - - /* - * If this is the first pkt getting queued - * for this STA, update the PVB for this STA - */ - if (is_apsdq_empty) { - ath6kl_wmi_set_apsd_bfrd_traf(ar->wmi, - vif->fw_vif_idx, - conn->aid, 1, 0); - } - *flags |= WMI_DATA_HDR_FLAGS_UAPSD; - - return true; -} - -static bool ath6kl_process_psq(struct ath6kl_sta *conn, - struct ath6kl_vif *vif, - struct sk_buff *skb, - u32 *flags) -{ - bool is_psq_empty = false; - struct ath6kl *ar = vif->ar; - - if (conn->sta_flags & STA_PS_POLLED) { - spin_lock_bh(&conn->psq_lock); - if (!skb_queue_empty(&conn->psq)) - *flags |= WMI_DATA_HDR_FLAGS_MORE; - spin_unlock_bh(&conn->psq_lock); - return false; - } - - /* Queue the frames if the STA is sleeping */ - spin_lock_bh(&conn->psq_lock); - is_psq_empty = skb_queue_empty(&conn->psq); - skb_queue_tail(&conn->psq, skb); - spin_unlock_bh(&conn->psq_lock); - - /* - * If this is the first pkt getting queued - * for this STA, update the PVB for this - * STA. - */ - if (is_psq_empty) - ath6kl_wmi_set_pvb_cmd(ar->wmi, - vif->fw_vif_idx, - conn->aid, 1); - return true; -} - -static bool ath6kl_powersave_ap(struct ath6kl_vif *vif, struct sk_buff *skb, - u32 *flags) -{ - struct ethhdr *datap = (struct ethhdr *) skb->data; - struct ath6kl_sta *conn = NULL; - bool ps_queued = false; - struct ath6kl *ar = vif->ar; - - if (is_multicast_ether_addr(datap->h_dest)) { - u8 ctr = 0; - bool q_mcast = false; - - for (ctr = 0; ctr < AP_MAX_NUM_STA; ctr++) { - if (ar->sta_list[ctr].sta_flags & STA_PS_SLEEP) { - q_mcast = true; - break; - } - } - - if (q_mcast) { - /* - * If this transmit is not because of a Dtim Expiry - * q it. - */ - if (!test_bit(DTIM_EXPIRED, &vif->flags)) { - bool is_mcastq_empty = false; - - spin_lock_bh(&ar->mcastpsq_lock); - is_mcastq_empty = - skb_queue_empty(&ar->mcastpsq); - skb_queue_tail(&ar->mcastpsq, skb); - spin_unlock_bh(&ar->mcastpsq_lock); - - /* - * If this is the first Mcast pkt getting - * queued indicate to the target to set the - * BitmapControl LSB of the TIM IE. - */ - if (is_mcastq_empty) - ath6kl_wmi_set_pvb_cmd(ar->wmi, - vif->fw_vif_idx, - MCAST_AID, 1); - - ps_queued = true; - } else { - /* - * This transmit is because of Dtim expiry. - * Determine if MoreData bit has to be set. - */ - spin_lock_bh(&ar->mcastpsq_lock); - if (!skb_queue_empty(&ar->mcastpsq)) - *flags |= WMI_DATA_HDR_FLAGS_MORE; - spin_unlock_bh(&ar->mcastpsq_lock); - } - } - } else { - conn = ath6kl_find_sta(vif, datap->h_dest); - if (!conn) { - dev_kfree_skb(skb); - - /* Inform the caller that the skb is consumed */ - return true; - } - - if (conn->sta_flags & STA_PS_SLEEP) { - ps_queued = ath6kl_process_uapsdq(conn, - vif, skb, flags); - if (!(*flags & WMI_DATA_HDR_FLAGS_UAPSD)) - ps_queued = ath6kl_process_psq(conn, - vif, skb, flags); - } - } - return ps_queued; -} - -/* Tx functions */ - -int ath6kl_control_tx(void *devt, struct sk_buff *skb, - enum htc_endpoint_id eid) -{ - struct ath6kl *ar = devt; - int status = 0; - struct ath6kl_cookie *cookie = NULL; - struct ath6kl_vif *vif; - vif = ath6kl_vif_first(ar); - - if (WARN_ON_ONCE(ar->state == ATH6KL_STATE_WOW)) - goto fail_ctrl_tx; - - if (!test_bit(WMI_READY, &ar->flag)) - goto fail_ctrl_tx; - - spin_lock_bh(&ar->lock); - - ath6kl_dbg(ATH6KL_DBG_WLAN_TX, - "%s: skb=0x%p, len=0x%x eid =%d\n", __func__, - skb, skb->len, eid); - - if (test_bit(WMI_CTRL_EP_FULL, &ar->flag) && (eid == ar->ctrl_ep)) { - /* - * Control endpoint is full, don't allocate resources, we - * are just going to drop this packet. - */ - cookie = NULL; - ath6kl_err("wmi ctrl ep full, dropping pkt : 0x%p, len:%d\n", - skb, skb->len); -#ifdef CONFIG_MACH_PX - if (vif->nw_type == INFRA_NETWORK) - vif->force_reload = true; -#endif - } else - cookie = ath6kl_alloc_cookie(ar); - - if (cookie == NULL) { - spin_unlock_bh(&ar->lock); - status = -ENOMEM; - goto fail_ctrl_tx; - } - - ar->tx_pending[eid]++; - - if (eid != ar->ctrl_ep) - ar->total_tx_data_pend++; - - spin_unlock_bh(&ar->lock); - - cookie->skb = skb; - cookie->map_no = 0; - set_htc_pkt_info(&cookie->htc_pkt, cookie, skb->data, skb->len, - eid, ATH6KL_CONTROL_PKT_TAG); - - /* - * This interface is asynchronous, if there is an error, cleanup - * will happen in the TX completion callback. - */ - ath6kl_htc_tx(ar->htc_target, &cookie->htc_pkt); - - return 0; - -fail_ctrl_tx: - dev_kfree_skb(skb); - return status; -} - -int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev) -{ - struct ath6kl *ar = ath6kl_priv(dev); - struct ath6kl_cookie *cookie = NULL; - enum htc_endpoint_id eid = ENDPOINT_UNUSED; - struct ath6kl_vif *vif = netdev_priv(dev); - u32 map_no = 0; - u16 htc_tag = ATH6KL_DATA_PKT_TAG; - u8 ac = 99 ; /* initialize to unmapped ac */ - bool chk_adhoc_ps_mapping = false; - int ret; - struct wmi_tx_meta_v2 meta_v2; - void *meta; - u8 csum_start = 0, csum_dest = 0, csum = skb->ip_summed; - u8 meta_ver = 0; - u32 flags = 0; - - ath6kl_dbg(ATH6KL_DBG_WLAN_TX, - "%s: skb=0x%p, data=0x%p, len=0x%x, actual_len=0x%x\n", __func__, - skb, skb->data, skb->len, skb->tail - skb->data); - - /* If target is not associated */ - if (!test_bit(CONNECTED, &vif->flags)) { - dev_kfree_skb(skb); - return 0; - } - - if (WARN_ON_ONCE(ar->state != ATH6KL_STATE_ON)) { - dev_kfree_skb(skb); - return 0; - } - - if (!test_bit(WMI_READY, &ar->flag)) - goto fail_tx; - - /* AP mode Power saving processing */ - if (vif->nw_type == AP_NETWORK) { - if (ath6kl_powersave_ap(vif, skb, &flags)) - return 0; - } - - if (test_bit(WMI_ENABLED, &ar->flag)) { - if ((dev->features & NETIF_F_IP_CSUM) && - (csum == CHECKSUM_PARTIAL)) { - csum_start = skb->csum_start - - (skb_network_header(skb) - skb->head) + - sizeof(struct ath6kl_llc_snap_hdr); - csum_dest = skb->csum_offset + csum_start; - } - - if (skb_headroom(skb) < dev->needed_headroom) - { - struct sk_buff *tmp_skb = skb; - - skb = skb_realloc_headroom(skb, dev->needed_headroom); - kfree_skb(tmp_skb); - if (skb == NULL) { - vif->net_stats.tx_dropped++; - return 0; - } - } - - if (ath6kl_wmi_dix_2_dot3(ar->wmi, skb)) { - ath6kl_err("ath6kl_wmi_dix_2_dot3 failed\n"); - goto fail_tx; - } - - if ((dev->features & NETIF_F_IP_CSUM) && - (csum == CHECKSUM_PARTIAL)) { - meta_v2.csum_start = csum_start; - meta_v2.csum_dest = csum_dest; - - /* instruct target to calculate checksum */ - meta_v2.csum_flags = WMI_META_V2_FLAG_CSUM_OFFLOAD; - meta_ver = WMI_META_VERSION_2; - meta = &meta_v2; - } else { - meta_ver = 0; - meta = NULL; - } - - ret = ath6kl_wmi_data_hdr_add(ar->wmi, skb, - DATA_MSGTYPE, flags, 0, - meta_ver, - meta, vif->fw_vif_idx); - - if (ret) { - ath6kl_warn("failed to add wmi data header:%d\n" - , ret); - goto fail_tx; - } - - if ((vif->nw_type == ADHOC_NETWORK) && - ar->ibss_ps_enable && test_bit(CONNECTED, &vif->flags)) - chk_adhoc_ps_mapping = true; - else { - /* get the stream mapping */ - ret = ath6kl_wmi_implicit_create_pstream(ar->wmi, - vif->fw_vif_idx, skb, - 0, test_bit(WMM_ENABLED, &vif->flags), &ac); - if (ret) - goto fail_tx; - } - } else - goto fail_tx; - - spin_lock_bh(&ar->lock); - - if (chk_adhoc_ps_mapping) - eid = ath6kl_ibss_map_epid(skb, dev, &map_no); - else - eid = ar->ac2ep_map[ac]; - - if (eid == 0 || eid == ENDPOINT_UNUSED) { - ath6kl_err("eid %d is not mapped!\n", eid); - spin_unlock_bh(&ar->lock); - goto fail_tx; - } - - /* allocate resource for this packet */ - cookie = ath6kl_alloc_cookie(ar); - - if (!cookie) { - spin_unlock_bh(&ar->lock); - goto fail_tx; - } - - /* update counts while the lock is held */ - ar->tx_pending[eid]++; - ar->total_tx_data_pend++; - - spin_unlock_bh(&ar->lock); - - if (!IS_ALIGNED((unsigned long) skb->data - HTC_HDR_LENGTH, 4) && - skb_cloned(skb)) { - /* - * We will touch (move the buffer data to align it. Since the - * skb buffer is cloned and not only the header is changed, we - * have to copy it to allow the changes. Since we are copying - * the data here, we may as well align it by reserving suitable - * headroom to avoid the memmove in ath6kl_htc_tx_buf_align(). - */ - struct sk_buff *nskb; - - nskb = skb_copy_expand(skb, HTC_HDR_LENGTH, 0, GFP_ATOMIC); - if (nskb == NULL) - goto fail_tx; - kfree_skb(skb); - skb = nskb; - } - - cookie->skb = skb; - cookie->map_no = map_no; - set_htc_pkt_info(&cookie->htc_pkt, cookie, skb->data, skb->len, - eid, htc_tag); - - ath6kl_dbg_dump(ATH6KL_DBG_RAW_BYTES, __func__, "tx ", - skb->data, skb->len); - /* - * HTC interface is asynchronous, if this fails, cleanup will - * happen in the ath6kl_tx_complete callback. - */ - ath6kl_htc_tx(ar->htc_target, &cookie->htc_pkt); - - return 0; - -fail_tx: - dev_kfree_skb(skb); - - vif->net_stats.tx_dropped++; - vif->net_stats.tx_aborted_errors++; - - return 0; -} - -/* indicate tx activity or inactivity on a WMI stream */ -void ath6kl_indicate_tx_activity(void *devt, u8 traffic_class, bool active) -{ - struct ath6kl *ar = devt; - enum htc_endpoint_id eid; - int i; - - eid = ar->ac2ep_map[traffic_class]; - - if (!test_bit(WMI_ENABLED, &ar->flag)) - goto notify_htc; - - spin_lock_bh(&ar->lock); - - ar->ac_stream_active[traffic_class] = active; - - if (active) { - /* - * Keep track of the active stream with the highest - * priority. - */ - if (ar->ac_stream_pri_map[traffic_class] > - ar->hiac_stream_active_pri) - /* set the new highest active priority */ - ar->hiac_stream_active_pri = - ar->ac_stream_pri_map[traffic_class]; - - } else { - /* - * We may have to search for the next active stream - * that is the highest priority. - */ - if (ar->hiac_stream_active_pri == - ar->ac_stream_pri_map[traffic_class]) { - /* - * The highest priority stream just went inactive - * reset and search for the "next" highest "active" - * priority stream. - */ - ar->hiac_stream_active_pri = 0; - - for (i = 0; i < WMM_NUM_AC; i++) { - if (ar->ac_stream_active[i] && - (ar->ac_stream_pri_map[i] > - ar->hiac_stream_active_pri)) - /* - * Set the new highest active - * priority. - */ - ar->hiac_stream_active_pri = - ar->ac_stream_pri_map[i]; - } - } - } - - spin_unlock_bh(&ar->lock); - -notify_htc: - /* notify HTC, this may cause credit distribution changes */ - ath6kl_htc_indicate_activity_change(ar->htc_target, eid, active); -} - -enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target, - struct htc_packet *packet) -{ - struct ath6kl *ar = target->dev->ar; - struct ath6kl_vif *vif; - enum htc_endpoint_id endpoint = packet->endpoint; - enum htc_send_full_action action = HTC_SEND_FULL_KEEP; - - if (endpoint == ar->ctrl_ep) { - /* - * Under normal WMI if this is getting full, then something - * is running rampant the host should not be exhausting the - * WMI queue with too many commands the only exception to - * this is during testing using endpointping. - */ - set_bit(WMI_CTRL_EP_FULL, &ar->flag); - ath6kl_err("wmi ctrl ep is full\n"); - return action; - } - - if (packet->info.tx.tag == ATH6KL_CONTROL_PKT_TAG) - return action; - - /* - * The last MAX_HI_COOKIE_NUM "batch" of cookies are reserved for - * the highest active stream. - */ - if (ar->ac_stream_pri_map[ar->ep2ac_map[endpoint]] < - ar->hiac_stream_active_pri && - ar->cookie_count <= MAX_HI_COOKIE_NUM) - /* - * Give preference to the highest priority stream by - * dropping the packets which overflowed. - */ - action = HTC_SEND_FULL_DROP; - - /* FIXME: Locking */ - spin_lock_bh(&ar->list_lock); - list_for_each_entry(vif, &ar->vif_list, list) { - if (vif->nw_type == ADHOC_NETWORK || - action != HTC_SEND_FULL_DROP) { - spin_unlock_bh(&ar->list_lock); - - set_bit(NETQ_STOPPED, &vif->flags); - netif_stop_queue(vif->ndev); - - return action; - } - } - spin_unlock_bh(&ar->list_lock); - - return action; -} - -/* TODO this needs to be looked at */ -static void ath6kl_tx_clear_node_map(struct ath6kl_vif *vif, - enum htc_endpoint_id eid, u32 map_no) -{ - struct ath6kl *ar = vif->ar; - u32 i; - - if (vif->nw_type != ADHOC_NETWORK) - return; - - if (!ar->ibss_ps_enable) - return; - - if (eid == ar->ctrl_ep) - return; - - if (map_no == 0) - return; - - map_no--; - ar->node_map[map_no].tx_pend--; - - if (ar->node_map[map_no].tx_pend) - return; - - if (map_no != (ar->node_num - 1)) - return; - - for (i = ar->node_num; i > 0; i--) { - if (ar->node_map[i - 1].tx_pend) - break; - - memset(&ar->node_map[i - 1], 0, - sizeof(struct ath6kl_node_mapping)); - ar->node_num--; - } -} - -void ath6kl_tx_complete(void *context, struct list_head *packet_queue) -{ - struct ath6kl *ar = context; - struct sk_buff_head skb_queue; - struct htc_packet *packet; - struct sk_buff *skb; - struct ath6kl_cookie *ath6kl_cookie; - u32 map_no = 0; - int status; - enum htc_endpoint_id eid; - bool wake_event = false; - bool flushing[ATH6KL_VIF_MAX] = {false}; - u8 if_idx; - struct ath6kl_vif *vif; - bool ctrl_ep = false; - - skb_queue_head_init(&skb_queue); - - /* lock the driver as we update internal state */ - spin_lock_bh(&ar->lock); - - /* reap completed packets */ - while (!list_empty(packet_queue)) { - - packet = list_first_entry(packet_queue, struct htc_packet, - list); - list_del(&packet->list); - - ath6kl_cookie = (struct ath6kl_cookie *)packet->pkt_cntxt; - if (!ath6kl_cookie) - goto fatal; - - status = packet->status; - skb = ath6kl_cookie->skb; - eid = packet->endpoint; - map_no = ath6kl_cookie->map_no; - - if (!skb || !skb->data) - goto fatal; - - __skb_queue_tail(&skb_queue, skb); - - if (!status && (packet->act_len != skb->len)) - goto fatal; - - ar->tx_pending[eid]--; - - if (eid != ar->ctrl_ep) - ar->total_tx_data_pend--; - - if (eid == ar->ctrl_ep) { - if (test_bit(WMI_CTRL_EP_FULL, &ar->flag)) - clear_bit(WMI_CTRL_EP_FULL, &ar->flag); - - if (ar->tx_pending[eid] == 0) - wake_event = true; - ctrl_ep = true; - - } else { - if_idx = wmi_data_hdr_get_if_idx( - (struct wmi_data_hdr *) packet->buf); - - vif = ath6kl_get_vif_by_index(ar, if_idx); - if (!vif) { - ath6kl_free_cookie(ar, ath6kl_cookie); - continue; - } - - if (status) { - if (status == -ECANCELED) - /* a packet was flushed */ - flushing[if_idx] = true; - - vif->net_stats.tx_errors++; - - if (status != -ENOSPC && status != -ECANCELED) - ath6kl_warn("tx complete error: %d\n", status); - - ath6kl_dbg(ATH6KL_DBG_WLAN_TX, - "%s: skb=0x%p data=0x%p len=0x%x eid=%d %s\n", - __func__, skb, packet->buf, packet->act_len, - eid, "error!"); - } else { - ath6kl_dbg(ATH6KL_DBG_WLAN_TX, - "%s: skb=0x%p data=0x%p len=0x%x eid=%d %s\n", - __func__, skb, packet->buf, packet->act_len, - eid, "OK"); - - flushing[if_idx] = false; - vif->net_stats.tx_packets++; - vif->net_stats.tx_bytes += skb->len; - } - - ath6kl_tx_clear_node_map(vif, eid, map_no); - if (test_bit(NETQ_STOPPED, &vif->flags)) - clear_bit(NETQ_STOPPED, &vif->flags); - } - - - ath6kl_free_cookie(ar, ath6kl_cookie); - } - - spin_unlock_bh(&ar->lock); - - __skb_queue_purge(&skb_queue); - - /* FIXME: Locking */ - if (!ctrl_ep) { - spin_lock_bh(&ar->list_lock); - list_for_each_entry(vif, &ar->vif_list, list) { - if (test_bit(CONNECTED, &vif->flags) && - !flushing[vif->fw_vif_idx]) { - spin_unlock_bh(&ar->list_lock); - netif_wake_queue(vif->ndev); - spin_lock_bh(&ar->list_lock); - } - } - spin_unlock_bh(&ar->list_lock); - } - - if (wake_event) - wake_up(&ar->event_wq); - - return; - -fatal: - WARN_ON(1); - spin_unlock_bh(&ar->lock); - return; -} - -void ath6kl_tx_data_cleanup(struct ath6kl *ar) -{ - int i; - - /* flush all the data (non-control) streams */ - for (i = 0; i < WMM_NUM_AC; i++) - ath6kl_htc_flush_txep(ar->htc_target, ar->ac2ep_map[i], - ATH6KL_DATA_PKT_TAG); -} - -/* Rx functions */ - -static void ath6kl_deliver_frames_to_nw_stack(struct net_device *dev, - struct sk_buff *skb) -{ - if (!skb) - return; - - skb->dev = dev; - - if (!(skb->dev->flags & IFF_UP)) { - dev_kfree_skb(skb); - return; - } - - skb->protocol = eth_type_trans(skb, skb->dev); - -#ifdef CONFIG_MACH_PX - skb->len = skb->tail - skb->data; -#endif - - netif_rx_ni(skb); -} - -static void ath6kl_alloc_netbufs(struct sk_buff_head *q, u16 num) -{ - struct sk_buff *skb; - - while (num) { - skb = ath6kl_buf_alloc(ATH6KL_BUFFER_SIZE); - if (!skb) { - ath6kl_err("netbuf allocation failed\n"); - return; - } - skb_queue_tail(q, skb); - num--; - } -} - -static struct sk_buff *aggr_get_free_skb(struct aggr_info *p_aggr) -{ - struct sk_buff *skb = NULL; - - if (skb_queue_len(&p_aggr->rx_amsdu_freeq) < - (AGGR_NUM_OF_FREE_NETBUFS >> 2)) - ath6kl_alloc_netbufs(&p_aggr->rx_amsdu_freeq, - AGGR_NUM_OF_FREE_NETBUFS); - - skb = skb_dequeue(&p_aggr->rx_amsdu_freeq); - - return skb; -} - -void ath6kl_rx_refill(struct htc_target *target, enum htc_endpoint_id endpoint) -{ - struct ath6kl *ar = target->dev->ar; - struct sk_buff *skb; - int rx_buf; - int n_buf_refill; - struct htc_packet *packet; - struct list_head queue; - - n_buf_refill = ATH6KL_MAX_RX_BUFFERS - - ath6kl_htc_get_rxbuf_num(ar->htc_target, endpoint); - - if (n_buf_refill <= 0) - return; - - INIT_LIST_HEAD(&queue); - - ath6kl_dbg(ATH6KL_DBG_WLAN_RX, - "%s: providing htc with %d buffers at eid=%d\n", - __func__, n_buf_refill, endpoint); - - for (rx_buf = 0; rx_buf < n_buf_refill; rx_buf++) { - skb = ath6kl_buf_alloc(ATH6KL_BUFFER_SIZE); - if (!skb) - break; - - packet = (struct htc_packet *) skb->head; - if (!IS_ALIGNED((unsigned long) skb->data, 4)) - skb->data = PTR_ALIGN(skb->data - 4, 4); - set_htc_rxpkt_info(packet, skb, skb->data, - ATH6KL_BUFFER_SIZE, endpoint); - list_add_tail(&packet->list, &queue); - } - - if (!list_empty(&queue)) - ath6kl_htc_add_rxbuf_multiple(ar->htc_target, &queue); -} - -void ath6kl_refill_amsdu_rxbufs(struct ath6kl *ar, int count) -{ - struct htc_packet *packet; - struct sk_buff *skb; - - while (count) { - skb = ath6kl_buf_alloc(ATH6KL_AMSDU_BUFFER_SIZE); - if (!skb) - return; - - packet = (struct htc_packet *) skb->head; - if (!IS_ALIGNED((unsigned long) skb->data, 4)) - skb->data = PTR_ALIGN(skb->data - 4, 4); - set_htc_rxpkt_info(packet, skb, skb->data, - ATH6KL_AMSDU_BUFFER_SIZE, 0); - spin_lock_bh(&ar->lock); - list_add_tail(&packet->list, &ar->amsdu_rx_buffer_queue); - spin_unlock_bh(&ar->lock); - count--; - } -} - -/* - * Callback to allocate a receive buffer for a pending packet. We use a - * pre-allocated list of buffers of maximum AMSDU size (4K). - */ -struct htc_packet *ath6kl_alloc_amsdu_rxbuf(struct htc_target *target, - enum htc_endpoint_id endpoint, - int len) -{ - struct ath6kl *ar = target->dev->ar; - struct htc_packet *packet = NULL; - struct list_head *pkt_pos; - int refill_cnt = 0, depth = 0; - - ath6kl_dbg(ATH6KL_DBG_WLAN_RX, "%s: eid=%d, len:%d\n", - __func__, endpoint, len); - - if ((len <= ATH6KL_BUFFER_SIZE) || - (len > ATH6KL_AMSDU_BUFFER_SIZE)) - return NULL; - - spin_lock_bh(&ar->lock); - - if (list_empty(&ar->amsdu_rx_buffer_queue)) { - spin_unlock_bh(&ar->lock); - refill_cnt = ATH6KL_MAX_AMSDU_RX_BUFFERS; - goto refill_buf; - } - - packet = list_first_entry(&ar->amsdu_rx_buffer_queue, - struct htc_packet, list); - list_del(&packet->list); - list_for_each(pkt_pos, &ar->amsdu_rx_buffer_queue) - depth++; - - refill_cnt = ATH6KL_MAX_AMSDU_RX_BUFFERS - depth; - spin_unlock_bh(&ar->lock); - - /* set actual endpoint ID */ - packet->endpoint = endpoint; - -refill_buf: - if (refill_cnt >= ATH6KL_AMSDU_REFILL_THRESHOLD) - ath6kl_refill_amsdu_rxbufs(ar, refill_cnt); - - return packet; -} - -static void aggr_slice_amsdu(struct aggr_info *p_aggr, - struct rxtid *rxtid, struct sk_buff *skb) -{ - struct sk_buff *new_skb; - struct ethhdr *hdr; - u16 frame_8023_len, payload_8023_len, mac_hdr_len, amsdu_len; - u8 *framep; - - mac_hdr_len = sizeof(struct ethhdr); - framep = skb->data + mac_hdr_len; - amsdu_len = skb->len - mac_hdr_len; - - while (amsdu_len > mac_hdr_len) { - hdr = (struct ethhdr *) framep; - payload_8023_len = ntohs(hdr->h_proto); - - if (payload_8023_len < MIN_MSDU_SUBFRAME_PAYLOAD_LEN || - payload_8023_len > MAX_MSDU_SUBFRAME_PAYLOAD_LEN) { - ath6kl_err("802.3 AMSDU frame bound check failed. len %d\n", - payload_8023_len); - break; - } - - frame_8023_len = payload_8023_len + mac_hdr_len; - new_skb = aggr_get_free_skb(p_aggr); - if (!new_skb) { - ath6kl_err("no buffer available\n"); - break; - } - - memcpy(new_skb->data, framep, frame_8023_len); - skb_put(new_skb, frame_8023_len); - if (ath6kl_wmi_dot3_2_dix(new_skb)) { - ath6kl_err("dot3_2_dix error\n"); - dev_kfree_skb(new_skb); - break; - } - - skb_queue_tail(&rxtid->q, new_skb); - - /* Is this the last subframe within this aggregate ? */ - if ((amsdu_len - frame_8023_len) == 0) - break; - - /* Add the length of A-MSDU subframe padding bytes - - * Round to nearest word. - */ - frame_8023_len = ALIGN(frame_8023_len, 4); - - framep += frame_8023_len; - amsdu_len -= frame_8023_len; - } - - dev_kfree_skb(skb); -} - -static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid, - u16 seq_no, u8 order) -{ - struct sk_buff *skb; - struct rxtid *rxtid; - struct skb_hold_q *node; - u16 idx, idx_end, seq_end; - struct rxtid_stats *stats; - - rxtid = &agg_conn->rx_tid[tid]; - stats = &agg_conn->stat[tid]; - - idx = AGGR_WIN_IDX(rxtid->seq_next, rxtid->hold_q_sz); - - /* - * idx_end is typically the last possible frame in the window, - * but changes to 'the' seq_no, when BAR comes. If seq_no - * is non-zero, we will go up to that and stop. - * Note: last seq no in current window will occupy the same - * index position as index that is just previous to start. - * An imp point : if win_sz is 7, for seq_no space of 4095, - * then, there would be holes when sequence wrap around occurs. - * Target should judiciously choose the win_sz, based on - * this condition. For 4095, (TID_WINDOW_SZ = 2 x win_sz - * 2, 4, 8, 16 win_sz works fine). - * We must deque from "idx" to "idx_end", including both. - */ - seq_end = seq_no ? seq_no : rxtid->seq_next; - idx_end = AGGR_WIN_IDX(seq_end, rxtid->hold_q_sz); - - spin_lock_bh(&rxtid->lock); - - do { - node = &rxtid->hold_q[idx]; - if ((order == 1) && (!node->skb)) - break; - - if (node->skb) { - if (node->is_amsdu) - aggr_slice_amsdu(agg_conn->aggr_info, rxtid, - node->skb); - else - skb_queue_tail(&rxtid->q, node->skb); - node->skb = NULL; - } else - stats->num_hole++; - - rxtid->seq_next = ATH6KL_NEXT_SEQ_NO(rxtid->seq_next); - idx = AGGR_WIN_IDX(rxtid->seq_next, rxtid->hold_q_sz); - } while (idx != idx_end); - - spin_unlock_bh(&rxtid->lock); - - stats->num_delivered += skb_queue_len(&rxtid->q); - - while ((skb = skb_dequeue(&rxtid->q))) - ath6kl_deliver_frames_to_nw_stack(agg_conn->dev, skb); -} - -static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid, - u16 seq_no, - bool is_amsdu, struct sk_buff *frame) -{ - struct rxtid *rxtid; - struct rxtid_stats *stats; - struct sk_buff *skb; - struct skb_hold_q *node; - u16 idx, st, cur, end; - bool is_queued = false; - u16 extended_end; - - rxtid = &agg_conn->rx_tid[tid]; - stats = &agg_conn->stat[tid]; - - stats->num_into_aggr++; - - if (!rxtid->aggr) { - if (is_amsdu) { - aggr_slice_amsdu(agg_conn->aggr_info, rxtid, frame); - is_queued = true; - stats->num_amsdu++; - while ((skb = skb_dequeue(&rxtid->q))) - ath6kl_deliver_frames_to_nw_stack(agg_conn->dev, - skb); - } - return is_queued; - } - - /* Check the incoming sequence no, if it's in the window */ - st = rxtid->seq_next; - cur = seq_no; - end = (st + rxtid->hold_q_sz-1) & ATH6KL_MAX_SEQ_NO; - - if (((st < end) && (cur < st || cur > end)) || - ((st > end) && (cur > end) && (cur < st))) { - extended_end = (end + rxtid->hold_q_sz - 1) & - ATH6KL_MAX_SEQ_NO; - - if (((end < extended_end) && - (cur < end || cur > extended_end)) || - ((end > extended_end) && (cur > extended_end) && - (cur < end))) { - aggr_deque_frms(agg_conn, tid, 0, 0); - if (cur >= rxtid->hold_q_sz - 1) - rxtid->seq_next = cur - (rxtid->hold_q_sz - 1); - else - rxtid->seq_next = ATH6KL_MAX_SEQ_NO - - (rxtid->hold_q_sz - 2 - cur); - } else { - /* - * Dequeue only those frames that are outside the - * new shifted window. - */ - if (cur >= rxtid->hold_q_sz - 1) - st = cur - (rxtid->hold_q_sz - 1); - else - st = ATH6KL_MAX_SEQ_NO - - (rxtid->hold_q_sz - 2 - cur); - - aggr_deque_frms(agg_conn, tid, st, 0); - } - - stats->num_oow++; - } - - idx = AGGR_WIN_IDX(seq_no, rxtid->hold_q_sz); - - node = &rxtid->hold_q[idx]; - - spin_lock_bh(&rxtid->lock); - - /* - * Is the cur frame duplicate or something beyond our window(hold_q - * -> which is 2x, already)? - * - * 1. Duplicate is easy - drop incoming frame. - * 2. Not falling in current sliding window. - * 2a. is the frame_seq_no preceding current tid_seq_no? - * -> drop the frame. perhaps sender did not get our ACK. - * this is taken care of above. - * 2b. is the frame_seq_no beyond window(st, TID_WINDOW_SZ); - * -> Taken care of it above, by moving window forward. - */ - dev_kfree_skb(node->skb); - stats->num_dups++; - - node->skb = frame; - is_queued = true; - node->is_amsdu = is_amsdu; - node->seq_no = seq_no; - - if (node->is_amsdu) - stats->num_amsdu++; - else - stats->num_mpdu++; - - spin_unlock_bh(&rxtid->lock); - - aggr_deque_frms(agg_conn, tid, 0, 1); - - if (agg_conn->timer_scheduled) - rxtid->progress = true; - else - for (idx = 0 ; idx < rxtid->hold_q_sz; idx++) { - if (rxtid->hold_q[idx].skb) { - /* - * There is a frame in the queue and no - * timer so start a timer to ensure that - * the frame doesn't remain stuck - * forever. - */ - agg_conn->timer_scheduled = true; - mod_timer(&agg_conn->timer, - (jiffies + - HZ * (AGGR_RX_TIMEOUT) / 1000)); - rxtid->progress = false; - rxtid->timer_mon = true; - break; - } - } - - return is_queued; -} - -static void ath6kl_uapsd_trigger_frame_rx(struct ath6kl_vif *vif, - struct ath6kl_sta *conn) -{ - struct ath6kl *ar = vif->ar; - bool is_apsdq_empty, is_apsdq_empty_at_start; - u32 num_frames_to_deliver, flags; - struct sk_buff *skb = NULL; - - /* - * If the APSD q for this STA is not empty, dequeue and - * send a pkt from the head of the q. Also update the - * More data bit in the WMI_DATA_HDR if there are - * more pkts for this STA in the APSD q. - * If there are no more pkts for this STA, - * update the APSD bitmap for this STA. - */ - - num_frames_to_deliver = (conn->apsd_info >> ATH6KL_APSD_NUM_OF_AC) & - ATH6KL_APSD_FRAME_MASK; - /* - * Number of frames to send in a service period is - * indicated by the station - * in the QOS_INFO of the association request - * If it is zero, send all frames - */ - if (!num_frames_to_deliver) - num_frames_to_deliver = ATH6KL_APSD_ALL_FRAME; - - spin_lock_bh(&conn->psq_lock); - is_apsdq_empty = skb_queue_empty(&conn->apsdq); - spin_unlock_bh(&conn->psq_lock); - is_apsdq_empty_at_start = is_apsdq_empty; - - while ((!is_apsdq_empty) && (num_frames_to_deliver)) { - - spin_lock_bh(&conn->psq_lock); - skb = skb_dequeue(&conn->apsdq); - is_apsdq_empty = skb_queue_empty(&conn->apsdq); - spin_unlock_bh(&conn->psq_lock); - - /* - * Set the STA flag to Trigger delivery, - * so that the frame will go out - */ - conn->sta_flags |= STA_PS_APSD_TRIGGER; - num_frames_to_deliver--; - - /* Last frame in the service period, set EOSP or queue empty */ - if ((is_apsdq_empty) || (!num_frames_to_deliver)) - conn->sta_flags |= STA_PS_APSD_EOSP; - - ath6kl_data_tx(skb, vif->ndev); - conn->sta_flags &= ~(STA_PS_APSD_TRIGGER); - conn->sta_flags &= ~(STA_PS_APSD_EOSP); - } - - if (is_apsdq_empty) { - if (is_apsdq_empty_at_start) - flags = WMI_AP_APSD_NO_DELIVERY_FRAMES; - else - flags = 0; - - ath6kl_wmi_set_apsd_bfrd_traf(ar->wmi, - vif->fw_vif_idx, - conn->aid, 0, flags); - } - - return; -} - -void ath6kl_rx(struct htc_target *target, struct htc_packet *packet) -{ - struct ath6kl *ar = target->dev->ar; - struct sk_buff *skb = packet->pkt_cntxt; - struct wmi_rx_meta_v2 *meta; - struct wmi_data_hdr *dhdr; - int min_hdr_len; - u8 meta_type, dot11_hdr = 0; - int status = packet->status; - enum htc_endpoint_id ept = packet->endpoint; - bool is_amsdu, prev_ps, ps_state = false; - bool trig_state = false; - struct ath6kl_sta *conn = NULL; - struct sk_buff *skb1 = NULL; - struct ethhdr *datap = NULL; - struct ath6kl_vif *vif; - struct aggr_info_conn *aggr_conn; - u16 seq_no, offset; - u8 tid, if_idx; - - ath6kl_dbg(ATH6KL_DBG_WLAN_RX, - "%s: ar=0x%p eid=%d, skb=0x%p, data=0x%p, len=0x%x status:%d", - __func__, ar, ept, skb, packet->buf, - packet->act_len, status); - - if (status || !(skb->data + HTC_HDR_LENGTH)) { - dev_kfree_skb(skb); - return; - } - - skb_put(skb, packet->act_len + HTC_HDR_LENGTH); - skb_pull(skb, HTC_HDR_LENGTH); - - if (ept == ar->ctrl_ep) { - if_idx = - wmi_cmd_hdr_get_if_idx((struct wmi_cmd_hdr *) skb->data); - } else { - if_idx = - wmi_data_hdr_get_if_idx((struct wmi_data_hdr *) skb->data); - } - - vif = ath6kl_get_vif_by_index(ar, if_idx); - if (!vif) { - dev_kfree_skb(skb); - return; - } - - /* - * Take lock to protect buffer counts and adaptive power throughput - * state. - */ - spin_lock_bh(&vif->if_lock); - - vif->net_stats.rx_packets++; - vif->net_stats.rx_bytes += packet->act_len; - - spin_unlock_bh(&vif->if_lock); - - - //ath6kl_dbg_dump(ATH6KL_DBG_RAW_BYTES, __func__, "rx ", - // skb->data, skb->len); - - skb->dev = vif->ndev; - - if (!test_bit(WMI_ENABLED, &ar->flag)) { - if (EPPING_ALIGNMENT_PAD > 0) - skb_pull(skb, EPPING_ALIGNMENT_PAD); - ath6kl_deliver_frames_to_nw_stack(vif->ndev, skb); - return; - } - - if (ept == ar->ctrl_ep) { - ath6kl_check_wow_status(ar, skb, true); - ath6kl_wmi_control_rx(ar->wmi, skb); - return; - } - - min_hdr_len = sizeof(struct ethhdr) + sizeof(struct wmi_data_hdr) + - sizeof(struct ath6kl_llc_snap_hdr); - - dhdr = (struct wmi_data_hdr *) skb->data; - - ath6kl_check_wow_status(ar, skb, false); - - /* - * In the case of AP mode we may receive NULL data frames - * that do not have LLC hdr. They are 16 bytes in size. - * Allow these frames in the AP mode. - */ - if (vif->nw_type != AP_NETWORK && - ((packet->act_len < min_hdr_len) || - (packet->act_len > WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH))) { - ath6kl_info("frame len is too short or too long\n"); - vif->net_stats.rx_errors++; - vif->net_stats.rx_length_errors++; - dev_kfree_skb(skb); - return; - } - - /* Get the Power save state of the STA */ - if (vif->nw_type == AP_NETWORK) { - meta_type = wmi_data_hdr_get_meta(dhdr); - - ps_state = !!((dhdr->info >> WMI_DATA_HDR_PS_SHIFT) & - WMI_DATA_HDR_PS_MASK); - - offset = sizeof(struct wmi_data_hdr); - trig_state = !!(le16_to_cpu(dhdr->info3) & WMI_DATA_HDR_TRIG); - - switch (meta_type) { - case 0: - break; - case WMI_META_VERSION_1: - offset += sizeof(struct wmi_rx_meta_v1); - break; - case WMI_META_VERSION_2: - offset += sizeof(struct wmi_rx_meta_v2); - break; - default: - break; - } - - datap = (struct ethhdr *) (skb->data + offset); - conn = ath6kl_find_sta(vif, datap->h_source); - - if (!conn) { - dev_kfree_skb(skb); - return; - } - - /* - * If there is a change in PS state of the STA, - * take appropriate steps: - * - * 1. If Sleep-->Awake, flush the psq for the STA - * Clear the PVB for the STA. - * 2. If Awake-->Sleep, Starting queueing frames - * the STA. - */ - prev_ps = !!(conn->sta_flags & STA_PS_SLEEP); - - if (ps_state) - conn->sta_flags |= STA_PS_SLEEP; - else - conn->sta_flags &= ~STA_PS_SLEEP; - - /* Accept trigger only when the station is in sleep */ - if ((conn->sta_flags & STA_PS_SLEEP) && trig_state) - ath6kl_uapsd_trigger_frame_rx(vif, conn); - - if (prev_ps ^ !!(conn->sta_flags & STA_PS_SLEEP)) { - if (!(conn->sta_flags & STA_PS_SLEEP)) { - struct sk_buff *skbuff = NULL; - bool is_apsdq_empty; - struct ath6kl_mgmt_buff *mgmt; - u8 idx; - - spin_lock_bh(&conn->psq_lock); - while (conn->mgmt_psq_len > 0) { - mgmt = list_first_entry( - &conn->mgmt_psq, - struct ath6kl_mgmt_buff, - list); - list_del(&mgmt->list); - conn->mgmt_psq_len--; - spin_unlock_bh(&conn->psq_lock); - idx = vif->fw_vif_idx; - - ath6kl_wmi_send_mgmt_cmd(ar->wmi, - idx, - mgmt->id, - mgmt->freq, - mgmt->wait, - mgmt->buf, - mgmt->len, - mgmt->no_cck); - - kfree(mgmt); - spin_lock_bh(&conn->psq_lock); - } - conn->mgmt_psq_len = 0; - while ((skbuff = skb_dequeue(&conn->psq))) { - spin_unlock_bh(&conn->psq_lock); - ath6kl_data_tx(skbuff, vif->ndev); - spin_lock_bh(&conn->psq_lock); - } - - is_apsdq_empty = skb_queue_empty(&conn->apsdq); - while ((skbuff = skb_dequeue(&conn->apsdq))) { - spin_unlock_bh(&conn->psq_lock); - ath6kl_data_tx(skbuff, vif->ndev); - spin_lock_bh(&conn->psq_lock); - } - spin_unlock_bh(&conn->psq_lock); - - if (!is_apsdq_empty) - ath6kl_wmi_set_apsd_bfrd_traf( - ar->wmi, - vif->fw_vif_idx, - conn->aid, 0, 0); - - /* Clear the PVB for this STA */ - ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, - conn->aid, 0); - } - } - - /* drop NULL data frames here */ - if ((packet->act_len < min_hdr_len) || - (packet->act_len > - WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH)) { - dev_kfree_skb(skb); - return; - } - } - - is_amsdu = wmi_data_hdr_is_amsdu(dhdr) ? true : false; - tid = wmi_data_hdr_get_up(dhdr); - seq_no = wmi_data_hdr_get_seqno(dhdr); - meta_type = wmi_data_hdr_get_meta(dhdr); - dot11_hdr = wmi_data_hdr_get_dot11(dhdr); - skb_pull(skb, sizeof(struct wmi_data_hdr)); - - switch (meta_type) { - case WMI_META_VERSION_1: - skb_pull(skb, sizeof(struct wmi_rx_meta_v1)); - break; - case WMI_META_VERSION_2: - meta = (struct wmi_rx_meta_v2 *) skb->data; - if (meta->csum_flags & 0x1) { - skb->ip_summed = CHECKSUM_COMPLETE; - skb->csum = (__force __wsum) meta->csum; - } - skb_pull(skb, sizeof(struct wmi_rx_meta_v2)); - break; - default: - break; - } - - if (dot11_hdr) - status = ath6kl_wmi_dot11_hdr_remove(ar->wmi, skb); - else if (!is_amsdu) - status = ath6kl_wmi_dot3_2_dix(skb); - - if (status) { - /* - * Drop frames that could not be processed (lack of - * memory, etc.) - */ - dev_kfree_skb(skb); - return; - } - - if (!(vif->ndev->flags & IFF_UP)) { - dev_kfree_skb(skb); - return; - } - - if (vif->nw_type == AP_NETWORK) { - datap = (struct ethhdr *) skb->data; - if (is_multicast_ether_addr(datap->h_dest)) - /* - * Bcast/Mcast frames should be sent to the - * OS stack as well as on the air. - */ - skb1 = skb_copy(skb, GFP_ATOMIC); - else { - /* - * Search for a connected STA with dstMac - * as the Mac address. If found send the - * frame to it on the air else send the - * frame up the stack. - */ - conn = ath6kl_find_sta(vif, datap->h_dest); - - if (conn && ar->intra_bss) { - skb1 = skb; - skb = NULL; - } else if (conn && !ar->intra_bss) { - dev_kfree_skb(skb); - skb = NULL; - } - } - if (skb1) - ath6kl_data_tx(skb1, vif->ndev); - - if (skb == NULL) { - /* nothing to deliver up the stack */ - return; - } - } - - datap = (struct ethhdr *) skb->data; - - if (is_unicast_ether_addr(datap->h_dest)) { - if (vif->nw_type == AP_NETWORK) { - conn = ath6kl_find_sta(vif, datap->h_source); - if (!conn) - return; - aggr_conn = conn->aggr_conn; - } else - aggr_conn = vif->aggr_cntxt->aggr_conn; - - if (aggr_process_recv_frm(aggr_conn, tid, seq_no, - is_amsdu, skb)) { - /* aggregation code will handle the skb */ - return; - } - } - - ath6kl_deliver_frames_to_nw_stack(vif->ndev, skb); -} - -static void aggr_timeout(unsigned long arg) -{ - u8 i, j; - struct aggr_info_conn *aggr_conn = (struct aggr_info_conn *) arg; - struct rxtid *rxtid; - struct rxtid_stats *stats; - - for (i = 0; i < NUM_OF_TIDS; i++) { - rxtid = &aggr_conn->rx_tid[i]; - stats = &aggr_conn->stat[i]; - - if (!rxtid->aggr || !rxtid->timer_mon || rxtid->progress) - continue; - - stats->num_timeouts++; - ath6kl_dbg(ATH6KL_DBG_AGGR, - "aggr timeout (st %d end %d)\n", - rxtid->seq_next, - ((rxtid->seq_next + rxtid->hold_q_sz-1) & - ATH6KL_MAX_SEQ_NO)); - aggr_deque_frms(aggr_conn, i, 0, 0); - } - - aggr_conn->timer_scheduled = false; - - for (i = 0; i < NUM_OF_TIDS; i++) { - rxtid = &aggr_conn->rx_tid[i]; - - if (rxtid->aggr && rxtid->hold_q) { - for (j = 0; j < rxtid->hold_q_sz; j++) { - if (rxtid->hold_q[j].skb) { - aggr_conn->timer_scheduled = true; - rxtid->timer_mon = true; - rxtid->progress = false; - break; - } - } - - if (j >= rxtid->hold_q_sz) - rxtid->timer_mon = false; - } - } - - if (aggr_conn->timer_scheduled) - mod_timer(&aggr_conn->timer, - jiffies + msecs_to_jiffies(AGGR_RX_TIMEOUT)); -} - -static void aggr_delete_tid_state(struct aggr_info_conn *aggr_conn, u8 tid) -{ - struct rxtid *rxtid; - struct rxtid_stats *stats; - - if (!aggr_conn || tid >= NUM_OF_TIDS) - return; - - rxtid = &aggr_conn->rx_tid[tid]; - stats = &aggr_conn->stat[tid]; - - if (rxtid->aggr) - aggr_deque_frms(aggr_conn, tid, 0, 0); - - rxtid->aggr = false; - rxtid->progress = false; - rxtid->timer_mon = false; - rxtid->win_sz = 0; - rxtid->seq_next = 0; - rxtid->hold_q_sz = 0; - - kfree(rxtid->hold_q); - rxtid->hold_q = NULL; - - memset(stats, 0, sizeof(struct rxtid_stats)); -} - -void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid_mux, u16 seq_no, - u8 win_sz) -{ - struct ath6kl_sta *sta; - struct aggr_info_conn *aggr_conn = NULL; - struct rxtid *rxtid; - struct rxtid_stats *stats; - u16 hold_q_size; - u8 tid, aid; - - if (vif->nw_type == AP_NETWORK) { - aid = ath6kl_get_aid(tid_mux); - sta = ath6kl_find_sta_by_aid(vif->ar, aid); - if (sta) - aggr_conn = sta->aggr_conn; - } else - aggr_conn = vif->aggr_cntxt->aggr_conn; - - if (!aggr_conn) - return; - - tid = ath6kl_get_tid(tid_mux); - if (tid >= NUM_OF_TIDS) - return; - - rxtid = &aggr_conn->rx_tid[tid]; - stats = &aggr_conn->stat[tid]; - - if (win_sz < AGGR_WIN_SZ_MIN || win_sz > AGGR_WIN_SZ_MAX) - ath6kl_dbg(ATH6KL_DBG_WLAN_RX, "%s: win_sz %d, tid %d\n", - __func__, win_sz, tid); - - if (rxtid->aggr) - aggr_delete_tid_state(aggr_conn, tid); - - rxtid->seq_next = seq_no; - hold_q_size = TID_WINDOW_SZ(win_sz) * sizeof(struct skb_hold_q); - rxtid->hold_q = kzalloc(hold_q_size, GFP_KERNEL); - if (!rxtid->hold_q) - return; - - rxtid->win_sz = win_sz; - rxtid->hold_q_sz = TID_WINDOW_SZ(win_sz); - if (!skb_queue_empty(&rxtid->q)) - return; - - rxtid->aggr = true; -} - -void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info, - struct aggr_info_conn *aggr_conn) -{ - struct rxtid *rxtid; - u8 i; - - aggr_conn->aggr_sz = AGGR_SZ_DEFAULT; - aggr_conn->dev = vif->ndev; - init_timer(&aggr_conn->timer); - aggr_conn->timer.function = aggr_timeout; - aggr_conn->timer.data = (unsigned long) aggr_conn; - aggr_conn->aggr_info = aggr_info; - - aggr_conn->timer_scheduled = false; - - for (i = 0; i < NUM_OF_TIDS; i++) { - rxtid = &aggr_conn->rx_tid[i]; - rxtid->aggr = false; - rxtid->progress = false; - rxtid->timer_mon = false; - skb_queue_head_init(&rxtid->q); - spin_lock_init(&rxtid->lock); - } - -} - -struct aggr_info *aggr_init(struct ath6kl_vif *vif) -{ - struct aggr_info *p_aggr = NULL; - - p_aggr = kzalloc(sizeof(struct aggr_info), GFP_KERNEL); - if (!p_aggr) { - ath6kl_err("failed to alloc memory for aggr_node\n"); - return NULL; - } - - p_aggr->aggr_conn = kzalloc(sizeof(struct aggr_info_conn), GFP_KERNEL); - if (!p_aggr->aggr_conn) { - ath6kl_err("failed to alloc memory for connection specific aggr info\n"); - kfree(p_aggr); - return NULL; - } - - aggr_conn_init(vif, p_aggr, p_aggr->aggr_conn); - - skb_queue_head_init(&p_aggr->rx_amsdu_freeq); - ath6kl_alloc_netbufs(&p_aggr->rx_amsdu_freeq, AGGR_NUM_OF_FREE_NETBUFS); - - return p_aggr; -} - -void aggr_recv_delba_req_evt(struct ath6kl_vif *vif, u8 tid_mux) -{ - struct ath6kl_sta *sta; - struct rxtid *rxtid; - struct aggr_info_conn *aggr_conn = NULL; - u8 tid, aid; - - if (vif->nw_type == AP_NETWORK) { - aid = ath6kl_get_aid(tid_mux); - sta = ath6kl_find_sta_by_aid(vif->ar, aid); - if (sta) - aggr_conn = sta->aggr_conn; - } else - aggr_conn = vif->aggr_cntxt->aggr_conn; - - if (!aggr_conn) - return; - - tid = ath6kl_get_tid(tid_mux); - if (tid >= NUM_OF_TIDS) - return; - - rxtid = &aggr_conn->rx_tid[tid]; - - if (rxtid->aggr) - aggr_delete_tid_state(aggr_conn, tid); -} - -void aggr_reset_state(struct aggr_info_conn *aggr_conn) -{ - u8 tid; - - if (!aggr_conn) - return; - - if (aggr_conn->timer_scheduled) { - del_timer(&aggr_conn->timer); - aggr_conn->timer_scheduled = false; - } - - for (tid = 0; tid < NUM_OF_TIDS; tid++) - aggr_delete_tid_state(aggr_conn, tid); -} - -/* clean up our amsdu buffer list */ -void ath6kl_cleanup_amsdu_rxbufs(struct ath6kl *ar) -{ - struct htc_packet *packet, *tmp_pkt; - - spin_lock_bh(&ar->lock); - if (list_empty(&ar->amsdu_rx_buffer_queue)) { - spin_unlock_bh(&ar->lock); - return; - } - - list_for_each_entry_safe(packet, tmp_pkt, &ar->amsdu_rx_buffer_queue, - list) { - list_del(&packet->list); - spin_unlock_bh(&ar->lock); - dev_kfree_skb(packet->pkt_cntxt); - spin_lock_bh(&ar->lock); - } - - spin_unlock_bh(&ar->lock); -} - -void aggr_module_destroy(struct aggr_info *aggr_info) -{ - if (!aggr_info) - return; - - aggr_reset_state(aggr_info->aggr_conn); - skb_queue_purge(&aggr_info->rx_amsdu_freeq); - kfree(aggr_info->aggr_conn); - kfree(aggr_info); -} diff --git a/drivers/net/wireless/ath/ath6kl/usb.c b/drivers/net/wireless/ath/ath6kl/usb.c deleted file mode 100755 index daf5122..0000000 --- a/drivers/net/wireless/ath/ath6kl/usb.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (c) 2007-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include - -#include "debug.h" -#include "core.h" - -/* usb device object */ -struct ath6kl_usb { - struct usb_device *udev; - struct usb_interface *interface; - u8 *diag_cmd_buffer; - u8 *diag_resp_buffer; - struct ath6kl *ar; -}; - -/* diagnostic command defnitions */ -#define ATH6KL_USB_CONTROL_REQ_SEND_BMI_CMD 1 -#define ATH6KL_USB_CONTROL_REQ_RECV_BMI_RESP 2 -#define ATH6KL_USB_CONTROL_REQ_DIAG_CMD 3 -#define ATH6KL_USB_CONTROL_REQ_DIAG_RESP 4 - -#define ATH6KL_USB_CTRL_DIAG_CC_READ 0 -#define ATH6KL_USB_CTRL_DIAG_CC_WRITE 1 - -struct ath6kl_usb_ctrl_diag_cmd_write { - __le32 cmd; - __le32 address; - __le32 value; - __le32 _pad[1]; -} __packed; - -struct ath6kl_usb_ctrl_diag_cmd_read { - __le32 cmd; - __le32 address; -} __packed; - -struct ath6kl_usb_ctrl_diag_resp_read { - __le32 value; -} __packed; - -#define ATH6KL_USB_MAX_DIAG_CMD (sizeof(struct ath6kl_usb_ctrl_diag_cmd_write)) -#define ATH6KL_USB_MAX_DIAG_RESP (sizeof(struct ath6kl_usb_ctrl_diag_resp_read)) - -static void ath6kl_usb_destroy(struct ath6kl_usb *ar_usb) -{ - usb_set_intfdata(ar_usb->interface, NULL); - - kfree(ar_usb->diag_cmd_buffer); - kfree(ar_usb->diag_resp_buffer); - - kfree(ar_usb); -} - -static struct ath6kl_usb *ath6kl_usb_create(struct usb_interface *interface) -{ - struct ath6kl_usb *ar_usb = NULL; - struct usb_device *dev = interface_to_usbdev(interface); - int status = 0; - - ar_usb = kzalloc(sizeof(struct ath6kl_usb), GFP_KERNEL); - if (ar_usb == NULL) - goto fail_ath6kl_usb_create; - - memset(ar_usb, 0, sizeof(struct ath6kl_usb)); - usb_set_intfdata(interface, ar_usb); - ar_usb->udev = dev; - ar_usb->interface = interface; - - ar_usb->diag_cmd_buffer = kzalloc(ATH6KL_USB_MAX_DIAG_CMD, GFP_KERNEL); - if (ar_usb->diag_cmd_buffer == NULL) { - status = -ENOMEM; - goto fail_ath6kl_usb_create; - } - - ar_usb->diag_resp_buffer = kzalloc(ATH6KL_USB_MAX_DIAG_RESP, - GFP_KERNEL); - if (ar_usb->diag_resp_buffer == NULL) { - status = -ENOMEM; - goto fail_ath6kl_usb_create; - } - -fail_ath6kl_usb_create: - if (status != 0) { - ath6kl_usb_destroy(ar_usb); - ar_usb = NULL; - } - return ar_usb; -} - -static void ath6kl_usb_device_detached(struct usb_interface *interface) -{ - struct ath6kl_usb *ar_usb; - - ar_usb = usb_get_intfdata(interface); - if (ar_usb == NULL) - return; - - ath6kl_stop_txrx(ar_usb->ar); - - ath6kl_core_cleanup(ar_usb->ar); - - ath6kl_usb_destroy(ar_usb); -} - -static int ath6kl_usb_submit_ctrl_out(struct ath6kl_usb *ar_usb, - u8 req, u16 value, u16 index, void *data, - u32 size) -{ - u8 *buf = NULL; - int ret; - - if (size > 0) { - buf = kmalloc(size, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - memcpy(buf, data, size); - } - - /* note: if successful returns number of bytes transfered */ - ret = usb_control_msg(ar_usb->udev, - usb_sndctrlpipe(ar_usb->udev, 0), - req, - USB_DIR_OUT | USB_TYPE_VENDOR | - USB_RECIP_DEVICE, value, index, buf, - size, 1000); - - if (ret < 0) { - ath6kl_dbg(ATH6KL_DBG_USB, "%s failed,result = %d\n", - __func__, ret); - } - - kfree(buf); - - return 0; -} - -static int ath6kl_usb_submit_ctrl_in(struct ath6kl_usb *ar_usb, - u8 req, u16 value, u16 index, void *data, - u32 size) -{ - u8 *buf = NULL; - int ret; - - if (size > 0) { - buf = kmalloc(size, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - } - - /* note: if successful returns number of bytes transfered */ - ret = usb_control_msg(ar_usb->udev, - usb_rcvctrlpipe(ar_usb->udev, 0), - req, - USB_DIR_IN | USB_TYPE_VENDOR | - USB_RECIP_DEVICE, value, index, buf, - size, 2 * HZ); - - if (ret < 0) { - ath6kl_dbg(ATH6KL_DBG_USB, "%s failed,result = %d\n", - __func__, ret); - } - - memcpy((u8 *) data, buf, size); - - kfree(buf); - - return 0; -} - -static int ath6kl_usb_ctrl_msg_exchange(struct ath6kl_usb *ar_usb, - u8 req_val, u8 *req_buf, u32 req_len, - u8 resp_val, u8 *resp_buf, u32 *resp_len) -{ - int ret; - - /* send command */ - ret = ath6kl_usb_submit_ctrl_out(ar_usb, req_val, 0, 0, - req_buf, req_len); - - if (ret != 0) - return ret; - - if (resp_buf == NULL) { - /* no expected response */ - return ret; - } - - /* get response */ - ret = ath6kl_usb_submit_ctrl_in(ar_usb, resp_val, 0, 0, - resp_buf, *resp_len); - - return ret; -} - -static int ath6kl_usb_diag_read32(struct ath6kl *ar, u32 address, u32 *data) -{ - struct ath6kl_usb *ar_usb = ar->hif_priv; - struct ath6kl_usb_ctrl_diag_resp_read *resp; - struct ath6kl_usb_ctrl_diag_cmd_read *cmd; - u32 resp_len; - int ret; - - cmd = (struct ath6kl_usb_ctrl_diag_cmd_read *) ar_usb->diag_cmd_buffer; - - memset(cmd, 0, sizeof(*cmd)); - cmd->cmd = ATH6KL_USB_CTRL_DIAG_CC_READ; - cmd->address = cpu_to_le32(address); - resp_len = sizeof(*resp); - - ret = ath6kl_usb_ctrl_msg_exchange(ar_usb, - ATH6KL_USB_CONTROL_REQ_DIAG_CMD, - (u8 *) cmd, - sizeof(struct ath6kl_usb_ctrl_diag_cmd_write), - ATH6KL_USB_CONTROL_REQ_DIAG_RESP, - ar_usb->diag_resp_buffer, &resp_len); - - if (ret) - return ret; - - resp = (struct ath6kl_usb_ctrl_diag_resp_read *) - ar_usb->diag_resp_buffer; - - *data = le32_to_cpu(resp->value); - - return ret; -} - -static int ath6kl_usb_diag_write32(struct ath6kl *ar, u32 address, __le32 data) -{ - struct ath6kl_usb *ar_usb = ar->hif_priv; - struct ath6kl_usb_ctrl_diag_cmd_write *cmd; - - cmd = (struct ath6kl_usb_ctrl_diag_cmd_write *) ar_usb->diag_cmd_buffer; - - memset(cmd, 0, sizeof(struct ath6kl_usb_ctrl_diag_cmd_write)); - cmd->cmd = cpu_to_le32(ATH6KL_USB_CTRL_DIAG_CC_WRITE); - cmd->address = cpu_to_le32(address); - cmd->value = data; - - return ath6kl_usb_ctrl_msg_exchange(ar_usb, - ATH6KL_USB_CONTROL_REQ_DIAG_CMD, - (u8 *) cmd, - sizeof(*cmd), - 0, NULL, NULL); - -} - -static int ath6kl_usb_bmi_read(struct ath6kl *ar, u8 *buf, u32 len) -{ - struct ath6kl_usb *ar_usb = ar->hif_priv; - int ret; - - /* get response */ - ret = ath6kl_usb_submit_ctrl_in(ar_usb, - ATH6KL_USB_CONTROL_REQ_RECV_BMI_RESP, - 0, 0, buf, len); - if (ret != 0) { - ath6kl_err("Unable to read the bmi data from the device: %d\n", - ret); - return ret; - } - - return 0; -} - -static int ath6kl_usb_bmi_write(struct ath6kl *ar, u8 *buf, u32 len) -{ - struct ath6kl_usb *ar_usb = ar->hif_priv; - int ret; - - /* send command */ - ret = ath6kl_usb_submit_ctrl_out(ar_usb, - ATH6KL_USB_CONTROL_REQ_SEND_BMI_CMD, - 0, 0, buf, len); - if (ret != 0) { - ath6kl_err("unable to send the bmi data to the device: %d\n", - ret); - return ret; - } - - return 0; -} - -static int ath6kl_usb_power_on(struct ath6kl *ar) -{ - return 0; -} - -static int ath6kl_usb_power_off(struct ath6kl *ar) -{ - return 0; -} - -static const struct ath6kl_hif_ops ath6kl_usb_ops = { - .diag_read32 = ath6kl_usb_diag_read32, - .diag_write32 = ath6kl_usb_diag_write32, - .bmi_read = ath6kl_usb_bmi_read, - .bmi_write = ath6kl_usb_bmi_write, - .power_on = ath6kl_usb_power_on, - .power_off = ath6kl_usb_power_off, -}; - -/* ath6kl usb driver registered functions */ -static int ath6kl_usb_probe(struct usb_interface *interface, - const struct usb_device_id *id) -{ - struct usb_device *dev = interface_to_usbdev(interface); - struct ath6kl *ar; - struct ath6kl_usb *ar_usb = NULL; - int vendor_id, product_id; - int ret = 0; - - usb_get_dev(dev); - - vendor_id = le16_to_cpu(dev->descriptor.idVendor); - product_id = le16_to_cpu(dev->descriptor.idProduct); - - ath6kl_dbg(ATH6KL_DBG_USB, "vendor_id = %04x\n", vendor_id); - ath6kl_dbg(ATH6KL_DBG_USB, "product_id = %04x\n", product_id); - - if (interface->cur_altsetting) - ath6kl_dbg(ATH6KL_DBG_USB, "USB Interface %d\n", - interface->cur_altsetting->desc.bInterfaceNumber); - - - if (dev->speed == USB_SPEED_HIGH) - ath6kl_dbg(ATH6KL_DBG_USB, "USB 2.0 Host\n"); - else - ath6kl_dbg(ATH6KL_DBG_USB, "USB 1.1 Host\n"); - - ar_usb = ath6kl_usb_create(interface); - - if (ar_usb == NULL) { - ret = -ENOMEM; - goto err_usb_put; - } - - ar = ath6kl_core_alloc(&ar_usb->udev->dev); - if (ar == NULL) { - ath6kl_err("Failed to alloc ath6kl core\n"); - ret = -ENOMEM; - goto err_usb_destroy; - } - - ar->hif_priv = ar_usb; - ar->hif_type = ATH6KL_HIF_TYPE_USB; - ar->hif_ops = &ath6kl_usb_ops; - ar->mbox_info.block_size = 16; - ar->bmi.max_data_size = 252; - - ar_usb->ar = ar; - - ret = ath6kl_core_init(ar); - if (ret) { - ath6kl_err("Failed to init ath6kl core: %d\n", ret); - goto err_core_free; - } - - return ret; - -err_core_free: - ath6kl_core_free(ar); -err_usb_destroy: - ath6kl_usb_destroy(ar_usb); -err_usb_put: - usb_put_dev(dev); - - return ret; -} - -static void ath6kl_usb_remove(struct usb_interface *interface) -{ - usb_put_dev(interface_to_usbdev(interface)); - ath6kl_usb_device_detached(interface); -} - -/* table of devices that work with this driver */ -static struct usb_device_id ath6kl_usb_ids[] = { - {USB_DEVICE(0x0cf3, 0x9374)}, - { /* Terminating entry */ }, -}; - -MODULE_DEVICE_TABLE(usb, ath6kl_usb_ids); - -static struct usb_driver ath6kl_usb_driver = { - .name = "ath6kl_usb", - .probe = ath6kl_usb_probe, - .disconnect = ath6kl_usb_remove, - .id_table = ath6kl_usb_ids, -}; - -static int ath6kl_usb_init(void) -{ - usb_register(&ath6kl_usb_driver); - return 0; -} - -static void ath6kl_usb_exit(void) -{ - usb_deregister(&ath6kl_usb_driver); -} - -module_init(ath6kl_usb_init); -module_exit(ath6kl_usb_exit); - -MODULE_AUTHOR("Atheros Communications, Inc."); -MODULE_DESCRIPTION("Driver support for Atheros AR600x USB devices"); -MODULE_LICENSE("Dual BSD/GPL"); - -MODULE_FIRMWARE(AR6004_HW_1_0_FW_DIR "/" AR6004_HW_1_0_FIRMWARE_FILE); -MODULE_FIRMWARE(AR6004_HW_1_0_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6004_HW_1_1_FW_DIR "/" AR6004_HW_1_1_FIRMWARE_FILE); -MODULE_FIRMWARE(AR6004_HW_1_1_BOARD_DATA_FILE); -MODULE_FIRMWARE(AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE); diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c deleted file mode 100755 index f7afb1d..0000000 --- a/drivers/net/wireless/ath/ath6kl/wmi.c +++ /dev/null @@ -1,3947 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include "core.h" -#include "debug.h" -#include "testmode.h" -#include "../regd.h" -#include "../regd_common.h" -#include "btc.h" -#include "debugfs_pri.h" - -static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx); - -static const s32 wmi_rate_tbl[][2] = { - /* {W/O SGI, with SGI} */ - {1000, 1000}, - {2000, 2000}, - {5500, 5500}, - {11000, 11000}, - {6000, 6000}, - {9000, 9000}, - {12000, 12000}, - {18000, 18000}, - {24000, 24000}, - {36000, 36000}, - {48000, 48000}, - {54000, 54000}, - {6500, 7200}, - {13000, 14400}, - {19500, 21700}, - {26000, 28900}, - {39000, 43300}, - {52000, 57800}, - {58500, 65000}, - {65000, 72200}, - {13500, 15000}, - {27000, 30000}, - {40500, 45000}, - {54000, 60000}, - {81000, 90000}, - {108000, 120000}, - {121500, 135000}, - {135000, 150000}, - {0, 0} -}; - -/* 802.1d to AC mapping. Refer pg 57 of WMM-test-plan-v1.2 */ -static const u8 up_to_ac[] = { - WMM_AC_BE, - WMM_AC_BK, - WMM_AC_BK, - WMM_AC_BE, - WMM_AC_VI, - WMM_AC_VI, - WMM_AC_VO, - WMM_AC_VO, -}; - -void ath6kl_wmi_set_control_ep(struct wmi *wmi, enum htc_endpoint_id ep_id) -{ - if (WARN_ON(ep_id == ENDPOINT_UNUSED || ep_id >= ENDPOINT_MAX)) - return; - - wmi->ep_id = ep_id; -} - -enum htc_endpoint_id ath6kl_wmi_get_control_ep(struct wmi *wmi) -{ - return wmi->ep_id; -} - -struct ath6kl_vif *ath6kl_get_vif_by_index(struct ath6kl *ar, u8 if_idx) -{ - struct ath6kl_vif *vif, *found = NULL; - - if (WARN_ON(if_idx > (ar->vif_max - 1))) - return NULL; - - /* FIXME: Locking */ - spin_lock_bh(&ar->list_lock); - list_for_each_entry(vif, &ar->vif_list, list) { - if (vif->fw_vif_idx == if_idx) { - found = vif; - break; - } - } - spin_unlock_bh(&ar->list_lock); - - return found; -} - -/* Performs DIX to 802.3 encapsulation for transmit packets. - * Assumes the entire DIX header is contigous and that there is - * enough room in the buffer for a 802.3 mac header and LLC+SNAP headers. - */ -int ath6kl_wmi_dix_2_dot3(struct wmi *wmi, struct sk_buff *skb) -{ - struct ath6kl_llc_snap_hdr *llc_hdr; - struct ethhdr *eth_hdr; - size_t new_len; - __be16 type; - u8 *datap; - u16 size; - - if (WARN_ON(skb == NULL)) - return -EINVAL; - - size = sizeof(struct ath6kl_llc_snap_hdr) + sizeof(struct wmi_data_hdr); - if (skb_headroom(skb) < size) - return -ENOMEM; - - eth_hdr = (struct ethhdr *) skb->data; - type = eth_hdr->h_proto; - - if (!is_ethertype(be16_to_cpu(type))) { - ath6kl_dbg(ATH6KL_DBG_WMI, - "%s: pkt is already in 802.3 format\n", __func__); - return 0; - } - - new_len = skb->len - sizeof(*eth_hdr) + sizeof(*llc_hdr); - - skb_push(skb, sizeof(struct ath6kl_llc_snap_hdr)); - datap = skb->data; - - eth_hdr->h_proto = cpu_to_be16(new_len); - - memcpy(datap, eth_hdr, sizeof(*eth_hdr)); - - llc_hdr = (struct ath6kl_llc_snap_hdr *)(datap + sizeof(*eth_hdr)); - llc_hdr->dsap = 0xAA; - llc_hdr->ssap = 0xAA; - llc_hdr->cntl = 0x03; - llc_hdr->org_code[0] = 0x0; - llc_hdr->org_code[1] = 0x0; - llc_hdr->org_code[2] = 0x0; - llc_hdr->eth_type = type; - - return 0; -} - -static int ath6kl_wmi_meta_add(struct wmi *wmi, struct sk_buff *skb, - u8 *version, void *tx_meta_info) -{ - struct wmi_tx_meta_v1 *v1; - struct wmi_tx_meta_v2 *v2; - - if (WARN_ON(skb == NULL || version == NULL)) - return -EINVAL; - - switch (*version) { - case WMI_META_VERSION_1: - skb_push(skb, WMI_MAX_TX_META_SZ); - v1 = (struct wmi_tx_meta_v1 *) skb->data; - v1->pkt_id = 0; - v1->rate_plcy_id = 0; - *version = WMI_META_VERSION_1; - break; - case WMI_META_VERSION_2: - skb_push(skb, WMI_MAX_TX_META_SZ); - v2 = (struct wmi_tx_meta_v2 *) skb->data; - memcpy(v2, (struct wmi_tx_meta_v2 *) tx_meta_info, - sizeof(struct wmi_tx_meta_v2)); - break; - } - - return 0; -} - -int ath6kl_wmi_data_hdr_add(struct wmi *wmi, struct sk_buff *skb, - u8 msg_type, u32 flags, - enum wmi_data_hdr_data_type data_type, - u8 meta_ver, void *tx_meta_info, u8 if_idx) -{ - struct wmi_data_hdr *data_hdr; - int ret; - - if (WARN_ON(skb == NULL || (if_idx > wmi->parent_dev->vif_max - 1))) - return -EINVAL; - - if (tx_meta_info) { - ret = ath6kl_wmi_meta_add(wmi, skb, &meta_ver, tx_meta_info); - if (ret) - return ret; - } - - skb_push(skb, sizeof(struct wmi_data_hdr)); - - data_hdr = (struct wmi_data_hdr *)skb->data; - memset(data_hdr, 0, sizeof(struct wmi_data_hdr)); - - data_hdr->info = msg_type << WMI_DATA_HDR_MSG_TYPE_SHIFT; - data_hdr->info |= data_type << WMI_DATA_HDR_DATA_TYPE_SHIFT; - - if (flags & WMI_DATA_HDR_FLAGS_MORE) - data_hdr->info |= WMI_DATA_HDR_MORE; - - if (flags & WMI_DATA_HDR_FLAGS_EOSP) - data_hdr->info3 |= cpu_to_le16(WMI_DATA_HDR_EOSP); - - data_hdr->info2 |= cpu_to_le16(meta_ver << WMI_DATA_HDR_META_SHIFT); - data_hdr->info3 |= cpu_to_le16(if_idx & WMI_DATA_HDR_IF_IDX_MASK); - - return 0; -} - -u8 ath6kl_wmi_determine_user_priority(u8 *pkt, u32 layer2_pri) -{ - struct iphdr *ip_hdr = (struct iphdr *) pkt; - u8 ip_pri; - - /* - * Determine IPTOS priority - * - * IP-TOS - 8bits - * : DSCP(6-bits) ECN(2-bits) - * : DSCP - P2 P1 P0 X X X - * where (P2 P1 P0) form 802.1D - */ - ip_pri = ip_hdr->tos >> 5; - ip_pri &= 0x7; - - if ((layer2_pri & 0x7) > ip_pri) - return (u8) layer2_pri & 0x7; - else - return ip_pri; -} - -u8 ath6kl_wmi_get_traffic_class(u8 user_priority) -{ - return up_to_ac[user_priority & 0x7]; -} - -int ath6kl_wmi_implicit_create_pstream(struct wmi *wmi, u8 if_idx, - struct sk_buff *skb, - u32 layer2_priority, bool wmm_enabled, - u8 *ac) -{ - struct wmi_data_hdr *data_hdr; - struct ath6kl_llc_snap_hdr *llc_hdr; - struct wmi_create_pstream_cmd cmd; - u32 meta_size, hdr_size; - u16 ip_type = IP_ETHERTYPE; - u8 stream_exist, usr_pri; - u8 traffic_class = WMM_AC_BE; - u8 *datap; - - if (WARN_ON(skb == NULL)) - return -EINVAL; - - datap = skb->data; - data_hdr = (struct wmi_data_hdr *) datap; - - meta_size = ((le16_to_cpu(data_hdr->info2) >> WMI_DATA_HDR_META_SHIFT) & - WMI_DATA_HDR_META_MASK) ? WMI_MAX_TX_META_SZ : 0; - - if (!wmm_enabled) { - /* If WMM is disabled all traffic goes as BE traffic */ - usr_pri = 0; - } else { - hdr_size = sizeof(struct ethhdr); - - llc_hdr = (struct ath6kl_llc_snap_hdr *)(datap + - sizeof(struct - wmi_data_hdr) + - meta_size + hdr_size); - - if (llc_hdr->eth_type == htons(ip_type)) { - /* - * Extract the endpoint info from the TOS field - * in the IP header. - */ - usr_pri = - ath6kl_wmi_determine_user_priority(((u8 *) llc_hdr) + - sizeof(struct ath6kl_llc_snap_hdr), - layer2_priority); - } else - usr_pri = layer2_priority & 0x7; - - /* - * Queue the EAPOL frames in the same WMM_AC_VO queue - * as that of management frames. - */ - if (skb->protocol == cpu_to_be16(ETH_P_PAE)) - usr_pri = WMI_VOICE_USER_PRIORITY; - } - - /* - * workaround for WMM S5 - * - * FIXME: wmi->traffic_class is always 100 so this test doesn't - * make sense - */ - if ((wmi->traffic_class == WMM_AC_VI) && - ((usr_pri == 5) || (usr_pri == 4))) - usr_pri = 1; - - /* Convert user priority to traffic class */ - traffic_class = up_to_ac[usr_pri & 0x7]; - - wmi_data_hdr_set_up(data_hdr, usr_pri); - - spin_lock_bh(&wmi->lock); - stream_exist = wmi->fat_pipe_exist; - spin_unlock_bh(&wmi->lock); - - if (!(stream_exist & (1 << traffic_class))) { - memset(&cmd, 0, sizeof(cmd)); - cmd.traffic_class = traffic_class; - cmd.user_pri = usr_pri; - cmd.inactivity_int = - cpu_to_le32(WMI_IMPLICIT_PSTREAM_INACTIVITY_INT); - /* Implicit streams are created with TSID 0xFF */ - cmd.tsid = WMI_IMPLICIT_PSTREAM; - ath6kl_wmi_create_pstream_cmd(wmi, if_idx, &cmd); - } - - *ac = traffic_class; - - return 0; -} - -int ath6kl_wmi_dot11_hdr_remove(struct wmi *wmi, struct sk_buff *skb) -{ - struct ieee80211_hdr_3addr *pwh, wh; - struct ath6kl_llc_snap_hdr *llc_hdr; - struct ethhdr eth_hdr; - u32 hdr_size; - u8 *datap; - __le16 sub_type; - - if (WARN_ON(skb == NULL)) - return -EINVAL; - - datap = skb->data; - pwh = (struct ieee80211_hdr_3addr *) datap; - - sub_type = pwh->frame_control & cpu_to_le16(IEEE80211_FCTL_STYPE); - - memcpy((u8 *) &wh, datap, sizeof(struct ieee80211_hdr_3addr)); - - /* Strip off the 802.11 header */ - if (sub_type == cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { - hdr_size = roundup(sizeof(struct ieee80211_qos_hdr), - sizeof(u32)); - skb_pull(skb, hdr_size); - } else if (sub_type == cpu_to_le16(IEEE80211_STYPE_DATA)) - skb_pull(skb, sizeof(struct ieee80211_hdr_3addr)); - - datap = skb->data; - llc_hdr = (struct ath6kl_llc_snap_hdr *)(datap); - - memset(ð_hdr, 0, sizeof(eth_hdr)); - eth_hdr.h_proto = llc_hdr->eth_type; - - switch ((le16_to_cpu(wh.frame_control)) & - (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { - case 0: - memcpy(eth_hdr.h_dest, wh.addr1, ETH_ALEN); - memcpy(eth_hdr.h_source, wh.addr2, ETH_ALEN); - break; - case IEEE80211_FCTL_TODS: - memcpy(eth_hdr.h_dest, wh.addr3, ETH_ALEN); - memcpy(eth_hdr.h_source, wh.addr2, ETH_ALEN); - break; - case IEEE80211_FCTL_FROMDS: - memcpy(eth_hdr.h_dest, wh.addr1, ETH_ALEN); - memcpy(eth_hdr.h_source, wh.addr3, ETH_ALEN); - break; - case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS: - break; - } - - skb_pull(skb, sizeof(struct ath6kl_llc_snap_hdr)); - skb_push(skb, sizeof(eth_hdr)); - - datap = skb->data; - - memcpy(datap, ð_hdr, sizeof(eth_hdr)); - - return 0; -} - -/* - * Performs 802.3 to DIX encapsulation for received packets. - * Assumes the entire 802.3 header is contigous. - */ -int ath6kl_wmi_dot3_2_dix(struct sk_buff *skb) -{ - struct ath6kl_llc_snap_hdr *llc_hdr; - struct ethhdr eth_hdr; - u8 *datap; - - if (WARN_ON(skb == NULL)) - return -EINVAL; - - datap = skb->data; - - memcpy(ð_hdr, datap, sizeof(eth_hdr)); - - llc_hdr = (struct ath6kl_llc_snap_hdr *) (datap + sizeof(eth_hdr)); - eth_hdr.h_proto = llc_hdr->eth_type; - - skb_pull(skb, sizeof(struct ath6kl_llc_snap_hdr)); - datap = skb->data; - - memcpy(datap, ð_hdr, sizeof(eth_hdr)); - - return 0; -} - -static int ath6kl_wmi_tx_complete_event_rx(u8 *datap, int len) -{ - struct tx_complete_msg_v1 *msg_v1; - struct wmi_tx_complete_event *evt; - int index; - u16 size; - - evt = (struct wmi_tx_complete_event *) datap; - - ath6kl_dbg(ATH6KL_DBG_WMI, "comp: %d %d %d\n", - evt->num_msg, evt->msg_len, evt->msg_type); - - if (!AR_DBG_LVL_CHECK(ATH6KL_DBG_WMI)) - return 0; - - for (index = 0; index < evt->num_msg; index++) { - size = sizeof(struct wmi_tx_complete_event) + - (index * sizeof(struct tx_complete_msg_v1)); - msg_v1 = (struct tx_complete_msg_v1 *)(datap + size); - - ath6kl_dbg(ATH6KL_DBG_WMI, "msg: %d %d %d %d\n", - msg_v1->status, msg_v1->pkt_id, - msg_v1->rate_idx, msg_v1->ack_failures); - } - - return 0; -} - -static int ath6kl_wmi_remain_on_chnl_event_rx(struct wmi *wmi, u8 *datap, - int len, struct ath6kl_vif *vif) -{ - struct wmi_remain_on_chnl_event *ev; - u32 freq; - u32 dur; - struct ieee80211_channel *chan; - struct ath6kl *ar = wmi->parent_dev; - u32 id; - - if (len < sizeof(*ev)) - return -EINVAL; - - ev = (struct wmi_remain_on_chnl_event *) datap; - freq = le32_to_cpu(ev->freq); - dur = le32_to_cpu(ev->duration); - ath6kl_dbg(ATH6KL_DBG_WMI, "remain_on_chnl: freq=%u dur=%u\n", - freq, dur); - chan = ieee80211_get_channel(ar->wiphy, freq); - if (!chan) { - ath6kl_dbg(ATH6KL_DBG_WMI, "remain_on_chnl: Unknown channel " - "(freq=%u)\n", freq); - return -EINVAL; - } - id = vif->last_roc_id; - cfg80211_ready_on_channel(vif->ndev, id, chan, NL80211_CHAN_NO_HT, - dur, GFP_ATOMIC); - - return 0; -} - -static int ath6kl_wmi_cancel_remain_on_chnl_event_rx(struct wmi *wmi, - u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_cancel_remain_on_chnl_event *ev; - u32 freq; - u32 dur; - struct ieee80211_channel *chan; - struct ath6kl *ar = wmi->parent_dev; - u32 id; - - if (len < sizeof(*ev)) - return -EINVAL; - - ev = (struct wmi_cancel_remain_on_chnl_event *) datap; - freq = le32_to_cpu(ev->freq); - dur = le32_to_cpu(ev->duration); - ath6kl_dbg(ATH6KL_DBG_WMI, "cancel_remain_on_chnl: freq=%u dur=%u " - "status=%u\n", freq, dur, ev->status); - chan = ieee80211_get_channel(ar->wiphy, freq); - if (!chan) { - ath6kl_dbg(ATH6KL_DBG_WMI, "cancel_remain_on_chnl: Unknown " - "channel (freq=%u)\n", freq); - return -EINVAL; - } - if (vif->last_cancel_roc_id && - vif->last_cancel_roc_id + 1 == vif->last_roc_id) - id = vif->last_cancel_roc_id; /* event for cancel command */ - else - id = vif->last_roc_id; /* timeout on uncanceled r-o-c */ - vif->last_cancel_roc_id = 0; - cfg80211_remain_on_channel_expired(vif->ndev, id, chan, - NL80211_CHAN_NO_HT, GFP_ATOMIC); - - return 0; -} - -static int ath6kl_wmi_tx_status_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_tx_status_event *ev; - u32 id; - - if (len < sizeof(*ev)) - return -EINVAL; - - ev = (struct wmi_tx_status_event *) datap; - id = le32_to_cpu(ev->id); - ath6kl_dbg(ATH6KL_DBG_WMI, "tx_status: id=%x ack_status=%u\n", - id, ev->ack_status); - - mutex_lock(&wmi->lock_mgmt); - if (wmi->last_mgmt_tx_frame) { - cfg80211_mgmt_tx_status(vif->ndev, id, - wmi->last_mgmt_tx_frame, - wmi->last_mgmt_tx_frame_len, - !!ev->ack_status, GFP_ATOMIC); - kfree(wmi->last_mgmt_tx_frame); - wmi->last_mgmt_tx_frame = NULL; - wmi->last_mgmt_tx_frame_len = 0; - } - mutex_unlock(&wmi->lock_mgmt); - - return 0; -} - -static int ath6kl_wmi_rx_probe_req_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_p2p_rx_probe_req_event *ev; - u32 freq; - u16 dlen; - - if (len < sizeof(*ev)) - return -EINVAL; - - ev = (struct wmi_p2p_rx_probe_req_event *) datap; - freq = le32_to_cpu(ev->freq); - dlen = le16_to_cpu(ev->len); - if (datap + len < ev->data + dlen) { - ath6kl_err("invalid wmi_p2p_rx_probe_req_event: " - "len=%d dlen=%u\n", len, dlen); - return -EINVAL; - } - ath6kl_dbg(ATH6KL_DBG_WMI, "rx_probe_req: len=%u freq=%u " - "probe_req_report=%d\n", - dlen, freq, vif->probe_req_report); - - if (vif->probe_req_report || vif->nw_type == AP_NETWORK) - cfg80211_rx_mgmt(vif->ndev, freq, ev->data, dlen, GFP_ATOMIC); - - return 0; -} - -static int ath6kl_wmi_p2p_capabilities_event_rx(u8 *datap, int len) -{ - struct wmi_p2p_capabilities_event *ev; - u16 dlen; - - if (len < sizeof(*ev)) - return -EINVAL; - - ev = (struct wmi_p2p_capabilities_event *) datap; - dlen = le16_to_cpu(ev->len); - ath6kl_dbg(ATH6KL_DBG_WMI, "p2p_capab: len=%u\n", dlen); - - return 0; -} - -static int ath6kl_wmi_rx_action_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_rx_action_event *ev; - u32 freq; - u16 dlen; - - if (len < sizeof(*ev)) - return -EINVAL; - - ev = (struct wmi_rx_action_event *) datap; - freq = le32_to_cpu(ev->freq); - dlen = le16_to_cpu(ev->len); - if (datap + len < ev->data + dlen) { - ath6kl_err("invalid wmi_rx_action_event: " - "len=%d dlen=%u\n", len, dlen); - return -EINVAL; - } - ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq); - cfg80211_rx_mgmt(vif->ndev, freq, ev->data, dlen, GFP_ATOMIC); - - return 0; -} - -static int ath6kl_wmi_p2p_info_event_rx(u8 *datap, int len) -{ - struct wmi_p2p_info_event *ev; - u32 flags; - u16 dlen; - - if (len < sizeof(*ev)) - return -EINVAL; - - ev = (struct wmi_p2p_info_event *) datap; - flags = le32_to_cpu(ev->info_req_flags); - dlen = le16_to_cpu(ev->len); - ath6kl_dbg(ATH6KL_DBG_WMI, "p2p_info: flags=%x len=%d\n", flags, dlen); - - if (flags & P2P_FLAG_CAPABILITIES_REQ) { - struct wmi_p2p_capabilities *cap; - if (dlen < sizeof(*cap)) - return -EINVAL; - cap = (struct wmi_p2p_capabilities *) ev->data; - ath6kl_dbg(ATH6KL_DBG_WMI, "p2p_info: GO Power Save = %d\n", - cap->go_power_save); - } - - if (flags & P2P_FLAG_MACADDR_REQ) { - struct wmi_p2p_macaddr *mac; - if (dlen < sizeof(*mac)) - return -EINVAL; - mac = (struct wmi_p2p_macaddr *) ev->data; - ath6kl_dbg(ATH6KL_DBG_WMI, "p2p_info: MAC Address = %s\n", - sec_conv_mac(mac->mac_addr)); - } - - if (flags & P2P_FLAG_HMODEL_REQ) { - struct wmi_p2p_hmodel *mod; - if (dlen < sizeof(*mod)) - return -EINVAL; - mod = (struct wmi_p2p_hmodel *) ev->data; - ath6kl_dbg(ATH6KL_DBG_WMI, "p2p_info: P2P Model = %d (%s)\n", - mod->p2p_model, - mod->p2p_model ? "host" : "firmware"); - } - return 0; -} - -static inline struct sk_buff *ath6kl_wmi_get_new_buf(u32 size) -{ - struct sk_buff *skb; - - skb = ath6kl_buf_alloc(size); - if (!skb) - return NULL; - - skb_put(skb, size); - if (size) - memset(skb->data, 0, size); - - return skb; -} - -/* Send a "simple" wmi command -- one with no arguments */ -static int ath6kl_wmi_simple_cmd(struct wmi *wmi, u8 if_idx, - enum wmi_cmd_id cmd_id) -{ - struct sk_buff *skb; - int ret; - - skb = ath6kl_wmi_get_new_buf(0); - if (!skb) - return -ENOMEM; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, cmd_id, NO_SYNC_WMIFLAG); - - return ret; -} - -static int ath6kl_wmi_ready_event_rx(struct wmi *wmi, u8 *datap, int len) -{ - struct wmi_ready_event_2 *ev = (struct wmi_ready_event_2 *) datap; - - if (len < sizeof(struct wmi_ready_event_2)) - return -EINVAL; - - ath6kl_ready_event(wmi->parent_dev, ev->mac_addr, - le32_to_cpu(ev->sw_version), - le32_to_cpu(ev->abi_version)); - - return 0; -} - -/* - * Mechanism to modify the roaming behavior in the firmware. The lower rssi - * at which the station has to roam can be passed with - * WMI_SET_LRSSI_SCAN_PARAMS. Subtract 96 from RSSI to get the signal level - * in dBm. - */ -int ath6kl_wmi_set_roam_lrssi_cmd(struct wmi *wmi, u8 lrssi) -{ - struct sk_buff *skb; - struct roam_ctrl_cmd *cmd; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct roam_ctrl_cmd *) skb->data; - -#ifdef CONFIG_MACH_PX - if (wmi->parent_dev->psminfo == 0) - cmd->info.params.lrssi_scan_period = 0xFFFF; - else - cmd->info.params.lrssi_scan_period = cpu_to_le16(DEF_LRSSI_SCAN_PERIOD); -#else - cmd->info.params.lrssi_scan_period = cpu_to_le16(DEF_LRSSI_SCAN_PERIOD); -#endif - - cmd->info.params.lrssi_scan_threshold = a_cpu_to_sle16(lrssi + - DEF_SCAN_FOR_ROAM_INTVL); - cmd->info.params.lrssi_roam_threshold = a_cpu_to_sle16(lrssi); - cmd->info.params.roam_rssi_floor = DEF_LRSSI_ROAM_FLOOR; - cmd->roam_ctrl = WMI_SET_LRSSI_SCAN_PARAMS; - - ath6kl_dbg(ATH6KL_DBG_WMI, "lrssi_scan_period %d, lrssi_scan_threshold = %d, " - "lrssi_roam_threshold = %d, roam_rssi_floor = %d\n", - cmd->info.params.lrssi_scan_period, cmd->info.params.lrssi_scan_threshold, - cmd->info.params.lrssi_roam_threshold, cmd->info.params.roam_rssi_floor); - - ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SET_ROAM_CTRL_CMDID, - NO_SYNC_WMIFLAG); - - return 0; -} - -int ath6kl_wmi_set_roam_lrssi_config_cmd(struct wmi *wmi, - struct low_rssi_scan_params *params) -{ - struct sk_buff *skb; - struct roam_ctrl_cmd *cmd; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct roam_ctrl_cmd *) skb->data; - ath6kl_dbg(ATH6KL_DBG_WMI, "lrssi_scan_period %d, lrssi_scan_threshold = %d, " - "lrssi_roam_threshold = %d, roam_rssi_floor = %d\n", - params->lrssi_scan_period, params->lrssi_scan_threshold, - params->lrssi_roam_threshold, params->roam_rssi_floor); - - if (params->lrssi_scan_period == 0) - cmd->info.params.lrssi_scan_period = 0xFFFF; - else - cmd->info.params.lrssi_scan_period = params->lrssi_scan_period; - cmd->info.params.lrssi_scan_threshold = params->lrssi_scan_threshold; - cmd->info.params.lrssi_roam_threshold = params->lrssi_roam_threshold; - cmd->info.params.roam_rssi_floor = params->roam_rssi_floor; - cmd->roam_ctrl = WMI_SET_LRSSI_SCAN_PARAMS; - - ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SET_ROAM_CTRL_CMDID, - NO_SYNC_WMIFLAG); - - return 0; -} - -int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid) -{ - struct sk_buff *skb; - struct roam_ctrl_cmd *cmd; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct roam_ctrl_cmd *) skb->data; - memset(cmd, 0, sizeof(*cmd)); - - memcpy(cmd->info.bssid, bssid, ETH_ALEN); - cmd->roam_ctrl = WMI_FORCE_ROAM; - - ath6kl_dbg(ATH6KL_DBG_WMI, "force roam to %s\n", sec_conv_mac(bssid)); - return ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SET_ROAM_CTRL_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_set_roam_mode_cmd(struct wmi *wmi, enum wmi_roam_mode mode) -{ - struct sk_buff *skb; - struct roam_ctrl_cmd *cmd; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct roam_ctrl_cmd *) skb->data; - memset(cmd, 0, sizeof(*cmd)); - - cmd->info.roam_mode = mode; - cmd->roam_ctrl = WMI_SET_ROAM_MODE; - - ath6kl_dbg(ATH6KL_DBG_WMI, "set roam mode %d\n", mode); - return ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SET_ROAM_CTRL_CMDID, - NO_SYNC_WMIFLAG); -} - -static int ath6kl_wmi_connect_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_connect_event *ev; - u8 *pie, *peie; - - if (len < sizeof(struct wmi_connect_event)) - return -EINVAL; - - ev = (struct wmi_connect_event *) datap; - - if (vif->nw_type == AP_NETWORK) { - /* AP mode start/STA connected event */ - struct net_device *dev = vif->ndev; - if (memcmp(dev->dev_addr, ev->u.ap_bss.bssid, ETH_ALEN) == 0) { - ath6kl_dbg(ATH6KL_DBG_WMI, "%s: freq %d bssid %s " - "(AP started)\n", - __func__, le16_to_cpu(ev->u.ap_bss.ch), - sec_conv_mac(ev->u.ap_bss.bssid)); - ath6kl_connect_ap_mode_bss( - vif, le16_to_cpu(ev->u.ap_bss.ch)); - } else { - ath6kl_dbg(ATH6KL_DBG_WMI, "%s: aid %u mac_addr %s " - "auth=%u keymgmt=%u cipher=%u apsd_info=%u " - "(STA connected)\n", - __func__, ev->u.ap_sta.aid, - sec_conv_mac(ev->u.ap_sta.mac_addr), - ev->u.ap_sta.auth, - ev->u.ap_sta.keymgmt, - le16_to_cpu(ev->u.ap_sta.cipher), - ev->u.ap_sta.apsd_info); - - ath6kl_connect_ap_mode_sta( - vif, ev->u.ap_sta.aid, ev->u.ap_sta.mac_addr, - ev->u.ap_sta.keymgmt, - le16_to_cpu(ev->u.ap_sta.cipher), - ev->u.ap_sta.auth, ev->assoc_req_len, - ev->assoc_info + ev->beacon_ie_len, - ev->u.ap_sta.apsd_info); - } - return 0; - } - - /* STA/IBSS mode connection event */ - - ath6kl_dbg(ATH6KL_DBG_WMI, - "wmi event connect freq %d bssid %s listen_intvl %d beacon_intvl %d type %d\n", - le16_to_cpu(ev->u.sta.ch), sec_conv_mac(ev->u.sta.bssid), - le16_to_cpu(ev->u.sta.listen_intvl), - le16_to_cpu(ev->u.sta.beacon_intvl), - le32_to_cpu(ev->u.sta.nw_type)); - - /* Start of assoc rsp IEs */ - pie = ev->assoc_info + ev->beacon_ie_len + - ev->assoc_req_len + (sizeof(u16) * 3); /* capinfo, status, aid */ - - /* End of assoc rsp IEs */ - peie = ev->assoc_info + ev->beacon_ie_len + ev->assoc_req_len + - ev->assoc_resp_len; - - while (pie < peie) { - switch (*pie) { - case WLAN_EID_VENDOR_SPECIFIC: - if (pie[1] > 3 && pie[2] == 0x00 && pie[3] == 0x50 && - pie[4] == 0xf2 && pie[5] == WMM_OUI_TYPE) { - /* WMM OUT (00:50:F2) */ - if (pie[1] > 5 - && pie[6] == WMM_PARAM_OUI_SUBTYPE) - wmi->is_wmm_enabled = true; - } - break; - } - - if (wmi->is_wmm_enabled) - break; - - pie += pie[1] + 2; - } - - ath6kl_connect_event(vif, le16_to_cpu(ev->u.sta.ch), - ev->u.sta.bssid, - le16_to_cpu(ev->u.sta.listen_intvl), - le16_to_cpu(ev->u.sta.beacon_intvl), - le32_to_cpu(ev->u.sta.nw_type), - ev->beacon_ie_len, ev->assoc_req_len, - ev->assoc_resp_len, ev->assoc_info); - - return 0; -} - -static struct country_code_to_enum_rd * -ath6kl_regd_find_country(u16 countryCode) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(allCountries); i++) { - if (allCountries[i].countryCode == countryCode) - return &allCountries[i]; - } - - return NULL; -} - -static struct reg_dmn_pair_mapping * -ath6kl_get_regpair(u16 regdmn) -{ - int i; - - if (regdmn == NO_ENUMRD) - return NULL; - - for (i = 0; i < ARRAY_SIZE(regDomainPairs); i++) { - if (regDomainPairs[i].regDmnEnum == regdmn) - return ®DomainPairs[i]; - } - - return NULL; -} - -static struct country_code_to_enum_rd * -ath6kl_regd_find_country_by_rd(u16 regdmn) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(allCountries); i++) { - if (allCountries[i].regDmnEnum == regdmn) - return &allCountries[i]; - } - - return NULL; -} - -static void ath6kl_wmi_regdomain_event(struct wmi *wmi, u8 *datap, int len) -{ - - struct ath6kl_wmi_regdomain *ev; - struct country_code_to_enum_rd *country = NULL; - struct reg_dmn_pair_mapping *regpair = NULL; - char alpha2[2]; - u32 reg_code; - - ev = (struct ath6kl_wmi_regdomain *) datap; - reg_code = le32_to_cpu(ev->reg_code); - - if ((reg_code >> ATH6KL_COUNTRY_RD_SHIFT) & COUNTRY_ERD_FLAG) - country = ath6kl_regd_find_country((u16) reg_code); - else if (!(((u16) reg_code & WORLD_SKU_MASK) == WORLD_SKU_PREFIX)) { - - regpair = ath6kl_get_regpair((u16) reg_code); - country = ath6kl_regd_find_country_by_rd((u16) reg_code); - ath6kl_dbg(ATH6KL_DBG_WMI, "Regpair used: 0x%0x\n", - regpair->regDmnEnum); - } - - if (country) { - alpha2[0] = country->isoName[0]; - alpha2[1] = country->isoName[1]; - - regulatory_hint(wmi->parent_dev->wiphy, alpha2); - - ath6kl_dbg(ATH6KL_DBG_WMI, "Country alpha2 being used: %c%c\n", - alpha2[0], alpha2[1]); - } -} - -static int ath6kl_wmi_disconnect_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_disconnect_event *ev; - wmi->traffic_class = 100; - - if (len < sizeof(struct wmi_disconnect_event)) - return -EINVAL; - - ev = (struct wmi_disconnect_event *) datap; - - ath6kl_dbg(ATH6KL_DBG_WMI, - "wmi event disconnect proto_reason %d bssid %s wmi_reason %d assoc_resp_len %d\n", - le16_to_cpu(ev->proto_reason_status), - sec_conv_mac(ev->bssid), - ev->disconn_reason, ev->assoc_resp_len); - - wmi->is_wmm_enabled = false; - - ath6kl_disconnect_event(vif, ev->disconn_reason, - ev->bssid, ev->assoc_resp_len, ev->assoc_info, - le16_to_cpu(ev->proto_reason_status)); - - return 0; -} - -static int ath6kl_wmi_peer_node_event_rx(struct wmi *wmi, u8 *datap, int len) -{ - struct wmi_peer_node_event *ev; - - if (len < sizeof(struct wmi_peer_node_event)) - return -EINVAL; - - ev = (struct wmi_peer_node_event *) datap; - - if (ev->event_code == PEER_NODE_JOIN_EVENT) - ath6kl_dbg(ATH6KL_DBG_WMI, "joined node with mac addr: %s\n", - sec_conv_mac(ev->peer_mac_addr)); - else if (ev->event_code == PEER_NODE_LEAVE_EVENT) - ath6kl_dbg(ATH6KL_DBG_WMI, "left node with mac addr: %s\n", - sec_conv_mac(ev->peer_mac_addr)); - - return 0; -} - -static int ath6kl_wmi_tkip_micerr_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_tkip_micerr_event *ev; - - if (len < sizeof(struct wmi_tkip_micerr_event)) - return -EINVAL; - - ev = (struct wmi_tkip_micerr_event *) datap; - - ath6kl_tkip_micerr_event(vif, ev->key_id, ev->is_mcast); - - return 0; -} - -void ath6kl_wmi_sscan_timer(unsigned long ptr) -{ - struct ath6kl_vif *vif = (struct ath6kl_vif *) ptr; - - cfg80211_sched_scan_results(vif->ar->wiphy); -} - -static int ath6kl_wmi_bssinfo_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_bss_info_hdr2 *bih; - u8 *buf; - struct ieee80211_channel *channel; - struct ath6kl *ar = wmi->parent_dev; - struct ieee80211_mgmt *mgmt; - struct cfg80211_bss *bss; - - if (len <= sizeof(struct wmi_bss_info_hdr2)) - return -EINVAL; - - bih = (struct wmi_bss_info_hdr2 *) datap; - buf = datap + sizeof(struct wmi_bss_info_hdr2); - len -= sizeof(struct wmi_bss_info_hdr2); - -#if 0 - ath6kl_dbg(ATH6KL_DBG_WMI, - "bss info evt - ch %u, snr %d, rssi %d, bssid \"%pM\" " - "frame_type=%d\n", - bih->ch, bih->snr, bih->snr - 95, bih->bssid, - bih->frame_type); -#endif - - if (bih->frame_type != BEACON_FTYPE && - bih->frame_type != PROBERESP_FTYPE) - return 0; /* Only update BSS table for now */ - - if (bih->frame_type == BEACON_FTYPE && - test_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags)) { - clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); - ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, - NONE_BSS_FILTER, 0); - } - - channel = ieee80211_get_channel(ar->wiphy, le16_to_cpu(bih->ch)); - if (channel == NULL) - return -EINVAL; - - if (len < 8 + 2 + 2) - return -EINVAL; - - if (bih->frame_type == BEACON_FTYPE && test_bit(CONNECTED, &vif->flags) - && memcmp(bih->bssid, vif->bssid, ETH_ALEN) == 0) { - const u8 *tim; - tim = cfg80211_find_ie(WLAN_EID_TIM, buf + 8 + 2 + 2, - len - 8 - 2 - 2); - if (tim && tim[1] >= 2) { - vif->assoc_bss_dtim_period = tim[3]; - set_bit(DTIM_PERIOD_AVAIL, &vif->flags); - } - } - - /* - * In theory, use of cfg80211_inform_bss() would be more natural here - * since we do not have the full frame. However, at least for now, - * cfg80211 can only distinguish Beacon and Probe Response frames from - * each other when using cfg80211_inform_bss_frame(), so let's build a - * fake IEEE 802.11 header to be able to take benefit of this. - */ - mgmt = kmalloc(24 + len, GFP_ATOMIC); - if (mgmt == NULL) - return -EINVAL; - - if (bih->frame_type == BEACON_FTYPE) { - mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | - IEEE80211_STYPE_BEACON); - memset(mgmt->da, 0xff, ETH_ALEN); - } else { - struct net_device *dev = vif->ndev; - - mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | - IEEE80211_STYPE_PROBE_RESP); - memcpy(mgmt->da, dev->dev_addr, ETH_ALEN); - } - mgmt->duration = cpu_to_le16(0); - memcpy(mgmt->sa, bih->bssid, ETH_ALEN); - memcpy(mgmt->bssid, bih->bssid, ETH_ALEN); - mgmt->seq_ctrl = cpu_to_le16(0); - - memcpy(&mgmt->u.beacon, buf, len); - - bss = cfg80211_inform_bss_frame(ar->wiphy, channel, mgmt, - 24 + len, (bih->snr - 95) * 100, - GFP_ATOMIC); - kfree(mgmt); - if (bss == NULL) - return -ENOMEM; - cfg80211_put_bss(bss); - - /* - * Firmware doesn't return any event when scheduled scan has - * finished, so we need to use a timer to find out when there are - * no more results. - * - * The timer is started from the first bss info received, otherwise - * the timer would not ever fire if the scan interval is short - * enough. - */ - if (ar->state == ATH6KL_STATE_SCHED_SCAN && - !timer_pending(&vif->sched_scan_timer)) { - mod_timer(&vif->sched_scan_timer, jiffies + - msecs_to_jiffies(ATH6KL_SCHED_SCAN_RESULT_DELAY)); - } - - return 0; -} - -/* Inactivity timeout of a fatpipe(pstream) at the target */ -static int ath6kl_wmi_pstream_timeout_event_rx(struct wmi *wmi, u8 *datap, - int len) -{ - struct wmi_pstream_timeout_event *ev; - - if (len < sizeof(struct wmi_pstream_timeout_event)) - return -EINVAL; - - ev = (struct wmi_pstream_timeout_event *) datap; - - /* - * When the pstream (fat pipe == AC) timesout, it means there were - * no thinStreams within this pstream & it got implicitly created - * due to data flow on this AC. We start the inactivity timer only - * for implicitly created pstream. Just reset the host state. - */ - spin_lock_bh(&wmi->lock); - wmi->stream_exist_for_ac[ev->traffic_class] = 0; - wmi->fat_pipe_exist &= ~(1 << ev->traffic_class); - spin_unlock_bh(&wmi->lock); - - /* Indicate inactivity to driver layer for this fatpipe (pstream) */ - ath6kl_indicate_tx_activity(wmi->parent_dev, ev->traffic_class, false); - - return 0; -} - -static int ath6kl_wmi_bitrate_reply_rx(struct wmi *wmi, u8 *datap, int len) -{ - struct wmi_bit_rate_reply *reply; - s32 rate; - u32 sgi, index; - - if (len < sizeof(struct wmi_bit_rate_reply)) - return -EINVAL; - - reply = (struct wmi_bit_rate_reply *) datap; - - ath6kl_dbg(ATH6KL_DBG_WMI, "rateindex %d\n", reply->rate_index); - - if (reply->rate_index == (s8) RATE_AUTO) { - rate = RATE_AUTO; - } else { - index = reply->rate_index & 0x7f; - sgi = (reply->rate_index & 0x80) ? 1 : 0; - rate = wmi_rate_tbl[index][sgi]; - } - - ath6kl_wakeup_event(wmi->parent_dev); - - return 0; -} - -static int ath6kl_wmi_test_rx(struct wmi *wmi, u8 *datap, int len) -{ - ath6kl_tm_rx_event(wmi->parent_dev, datap, len); - - return 0; -} - -static int ath6kl_wmi_ratemask_reply_rx(struct wmi *wmi, u8 *datap, int len) -{ - if (len < sizeof(struct wmi_fix_rates_reply)) - return -EINVAL; - - ath6kl_wakeup_event(wmi->parent_dev); - - return 0; -} - -static int ath6kl_wmi_ch_list_reply_rx(struct wmi *wmi, u8 *datap, int len) -{ - if (len < sizeof(struct wmi_channel_list_reply)) - return -EINVAL; - - ath6kl_wakeup_event(wmi->parent_dev); - - return 0; -} - -static int ath6kl_wmi_tx_pwr_reply_rx(struct wmi *wmi, u8 *datap, int len) -{ - struct wmi_tx_pwr_reply *reply; - - if (len < sizeof(struct wmi_tx_pwr_reply)) - return -EINVAL; - - reply = (struct wmi_tx_pwr_reply *) datap; - ath6kl_txpwr_rx_evt(wmi->parent_dev, reply->dbM); - - return 0; -} - -static int ath6kl_wmi_keepalive_reply_rx(struct wmi *wmi, u8 *datap, int len) -{ - if (len < sizeof(struct wmi_get_keepalive_cmd)) - return -EINVAL; - - ath6kl_wakeup_event(wmi->parent_dev); - - return 0; -} - -static int ath6kl_wmi_scan_complete_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_scan_complete_event *ev; - - ev = (struct wmi_scan_complete_event *) datap; - - ath6kl_scan_complete_evt(vif, a_sle32_to_cpu(ev->status)); - wmi->is_probe_ssid = false; - - return 0; -} - -static int ath6kl_wmi_neighbor_report_event_rx(struct wmi *wmi, u8 *datap, - int len, struct ath6kl_vif *vif) -{ - struct wmi_neighbor_report_event *ev; - u8 i; - - if (len < sizeof(*ev)) - return -EINVAL; - ev = (struct wmi_neighbor_report_event *) datap; - if (sizeof(*ev) + ev->num_neighbors * sizeof(struct wmi_neighbor_info) - > len) { - ath6kl_dbg(ATH6KL_DBG_WMI, "truncated neighbor event " - "(num=%d len=%d)\n", ev->num_neighbors, len); - return -EINVAL; - } - for (i = 0; i < ev->num_neighbors; i++) { - ath6kl_dbg(ATH6KL_DBG_WMI, "neighbor %d/%d - %s 0x%x\n", - i + 1, ev->num_neighbors, - sec_conv_mac(ev->neighbor[i].bssid), - ev->neighbor[i].bss_flags); - cfg80211_pmksa_candidate_notify(vif->ndev, i, - ev->neighbor[i].bssid, - !!(ev->neighbor[i].bss_flags & - WMI_PREAUTH_CAPABLE_BSS), - GFP_ATOMIC); - } - - return 0; -} - -/* - * Target is reporting a programming error. This is for - * developer aid only. Target only checks a few common violations - * and it is responsibility of host to do all error checking. - * Behavior of target after wmi error event is undefined. - * A reset is recommended. - */ -static int ath6kl_wmi_error_event_rx(struct wmi *wmi, u8 *datap, int len) -{ - const char *type = "unknown error"; - struct wmi_cmd_error_event *ev; - ev = (struct wmi_cmd_error_event *) datap; - - switch (ev->err_code) { - case INVALID_PARAM: - type = "invalid parameter"; - break; - case ILLEGAL_STATE: - type = "invalid state"; - break; - case INTERNAL_ERROR: - type = "internal error"; - break; - } - - ath6kl_dbg(ATH6KL_DBG_WMI, "programming error, cmd=%d %s\n", - ev->cmd_id, type); - - return 0; -} - -static int ath6kl_wmi_stats_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - ath6kl_tgt_stats_event(vif, datap, len); - - return 0; -} - -static u8 ath6kl_wmi_get_upper_threshold(s16 rssi, - struct sq_threshold_params *sq_thresh, - u32 size) -{ - u32 index; - u8 threshold = (u8) sq_thresh->upper_threshold[size - 1]; - - /* The list is already in sorted order. Get the next lower value */ - for (index = 0; index < size; index++) { - if (rssi < sq_thresh->upper_threshold[index]) { - threshold = (u8) sq_thresh->upper_threshold[index]; - break; - } - } - - return threshold; -} - -static u8 ath6kl_wmi_get_lower_threshold(s16 rssi, - struct sq_threshold_params *sq_thresh, - u32 size) -{ - u32 index; - u8 threshold = (u8) sq_thresh->lower_threshold[size - 1]; - - /* The list is already in sorted order. Get the next lower value */ - for (index = 0; index < size; index++) { - if (rssi > sq_thresh->lower_threshold[index]) { - threshold = (u8) sq_thresh->lower_threshold[index]; - break; - } - } - - return threshold; -} - -static int ath6kl_wmi_send_rssi_threshold_params(struct wmi *wmi, - struct wmi_rssi_threshold_params_cmd *rssi_cmd) -{ - struct sk_buff *skb; - struct wmi_rssi_threshold_params_cmd *cmd; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_rssi_threshold_params_cmd *) skb->data; - memcpy(cmd, rssi_cmd, sizeof(struct wmi_rssi_threshold_params_cmd)); - - return ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_RSSI_THRESHOLD_PARAMS_CMDID, - NO_SYNC_WMIFLAG); -} - -static int ath6kl_wmi_rssi_threshold_event_rx(struct wmi *wmi, u8 *datap, - int len) -{ - struct wmi_rssi_threshold_event *reply; - struct wmi_rssi_threshold_params_cmd cmd; - struct sq_threshold_params *sq_thresh; - enum wmi_rssi_threshold_val new_threshold; - u8 upper_rssi_threshold, lower_rssi_threshold; - s16 rssi; - int ret; - - if (len < sizeof(struct wmi_rssi_threshold_event)) - return -EINVAL; - - reply = (struct wmi_rssi_threshold_event *) datap; - new_threshold = (enum wmi_rssi_threshold_val) reply->range; - rssi = a_sle16_to_cpu(reply->rssi); - - sq_thresh = &wmi->sq_threshld[SIGNAL_QUALITY_METRICS_RSSI]; - - /* - * Identify the threshold breached and communicate that to the app. - * After that install a new set of thresholds based on the signal - * quality reported by the target - */ - if (new_threshold) { - /* Upper threshold breached */ - if (rssi < sq_thresh->upper_threshold[0]) { - ath6kl_dbg(ATH6KL_DBG_WMI, - "spurious upper rssi threshold event: %d\n", - rssi); - } else if ((rssi < sq_thresh->upper_threshold[1]) && - (rssi >= sq_thresh->upper_threshold[0])) { - new_threshold = WMI_RSSI_THRESHOLD1_ABOVE; - } else if ((rssi < sq_thresh->upper_threshold[2]) && - (rssi >= sq_thresh->upper_threshold[1])) { - new_threshold = WMI_RSSI_THRESHOLD2_ABOVE; - } else if ((rssi < sq_thresh->upper_threshold[3]) && - (rssi >= sq_thresh->upper_threshold[2])) { - new_threshold = WMI_RSSI_THRESHOLD3_ABOVE; - } else if ((rssi < sq_thresh->upper_threshold[4]) && - (rssi >= sq_thresh->upper_threshold[3])) { - new_threshold = WMI_RSSI_THRESHOLD4_ABOVE; - } else if ((rssi < sq_thresh->upper_threshold[5]) && - (rssi >= sq_thresh->upper_threshold[4])) { - new_threshold = WMI_RSSI_THRESHOLD5_ABOVE; - } else if (rssi >= sq_thresh->upper_threshold[5]) { - new_threshold = WMI_RSSI_THRESHOLD6_ABOVE; - } - } else { - /* Lower threshold breached */ - if (rssi > sq_thresh->lower_threshold[0]) { - ath6kl_dbg(ATH6KL_DBG_WMI, - "spurious lower rssi threshold event: %d %d\n", - rssi, sq_thresh->lower_threshold[0]); - } else if ((rssi > sq_thresh->lower_threshold[1]) && - (rssi <= sq_thresh->lower_threshold[0])) { - new_threshold = WMI_RSSI_THRESHOLD6_BELOW; - } else if ((rssi > sq_thresh->lower_threshold[2]) && - (rssi <= sq_thresh->lower_threshold[1])) { - new_threshold = WMI_RSSI_THRESHOLD5_BELOW; - } else if ((rssi > sq_thresh->lower_threshold[3]) && - (rssi <= sq_thresh->lower_threshold[2])) { - new_threshold = WMI_RSSI_THRESHOLD4_BELOW; - } else if ((rssi > sq_thresh->lower_threshold[4]) && - (rssi <= sq_thresh->lower_threshold[3])) { - new_threshold = WMI_RSSI_THRESHOLD3_BELOW; - } else if ((rssi > sq_thresh->lower_threshold[5]) && - (rssi <= sq_thresh->lower_threshold[4])) { - new_threshold = WMI_RSSI_THRESHOLD2_BELOW; - } else if (rssi <= sq_thresh->lower_threshold[5]) { - new_threshold = WMI_RSSI_THRESHOLD1_BELOW; - } - } - - /* Calculate and install the next set of thresholds */ - lower_rssi_threshold = ath6kl_wmi_get_lower_threshold(rssi, sq_thresh, - sq_thresh->lower_threshold_valid_count); - upper_rssi_threshold = ath6kl_wmi_get_upper_threshold(rssi, sq_thresh, - sq_thresh->upper_threshold_valid_count); - - /* Issue a wmi command to install the thresholds */ - cmd.thresh_above1_val = a_cpu_to_sle16(upper_rssi_threshold); - cmd.thresh_below1_val = a_cpu_to_sle16(lower_rssi_threshold); - cmd.weight = sq_thresh->weight; - cmd.poll_time = cpu_to_le32(sq_thresh->polling_interval); - - ret = ath6kl_wmi_send_rssi_threshold_params(wmi, &cmd); - if (ret) { - ath6kl_err("unable to configure rssi thresholds\n"); - return -EIO; - } - - return 0; -} - -static int ath6kl_wmi_cac_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_cac_event *reply; - struct ieee80211_tspec_ie *ts; - u16 active_tsids, tsinfo; - u8 tsid, index; - u8 ts_id; - - if (len < sizeof(struct wmi_cac_event)) - return -EINVAL; - - reply = (struct wmi_cac_event *) datap; - - if ((reply->cac_indication == CAC_INDICATION_ADMISSION_RESP) && - (reply->status_code != IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED)) { - - ts = (struct ieee80211_tspec_ie *) &(reply->tspec_suggestion); - tsinfo = le16_to_cpu(ts->tsinfo); - tsid = (tsinfo >> IEEE80211_WMM_IE_TSPEC_TID_SHIFT) & - IEEE80211_WMM_IE_TSPEC_TID_MASK; - - ath6kl_wmi_delete_pstream_cmd(wmi, vif->fw_vif_idx, - reply->ac, tsid); - } else if (reply->cac_indication == CAC_INDICATION_NO_RESP) { - /* - * Following assumes that there is only one outstanding - * ADDTS request when this event is received - */ - spin_lock_bh(&wmi->lock); - active_tsids = wmi->stream_exist_for_ac[reply->ac]; - spin_unlock_bh(&wmi->lock); - - for (index = 0; index < sizeof(active_tsids) * 8; index++) { - if ((active_tsids >> index) & 1) - break; - } - if (index < (sizeof(active_tsids) * 8)) - ath6kl_wmi_delete_pstream_cmd(wmi, vif->fw_vif_idx, - reply->ac, index); - } - - /* - * Clear active tsids and Add missing handling - * for delete qos stream from AP - */ - else if (reply->cac_indication == CAC_INDICATION_DELETE) { - - ts = (struct ieee80211_tspec_ie *) &(reply->tspec_suggestion); - tsinfo = le16_to_cpu(ts->tsinfo); - ts_id = ((tsinfo >> IEEE80211_WMM_IE_TSPEC_TID_SHIFT) & - IEEE80211_WMM_IE_TSPEC_TID_MASK); - - spin_lock_bh(&wmi->lock); - wmi->stream_exist_for_ac[reply->ac] &= ~(1 << ts_id); - active_tsids = wmi->stream_exist_for_ac[reply->ac]; - spin_unlock_bh(&wmi->lock); - - /* Indicate stream inactivity to driver layer only if all tsids - * within this AC are deleted. - */ - if (!active_tsids) { - ath6kl_indicate_tx_activity(wmi->parent_dev, reply->ac, - false); - wmi->fat_pipe_exist &= ~(1 << reply->ac); - } - } - - return 0; -} - -static int ath6kl_wmi_send_snr_threshold_params(struct wmi *wmi, - struct wmi_snr_threshold_params_cmd *snr_cmd) -{ - struct sk_buff *skb; - struct wmi_snr_threshold_params_cmd *cmd; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_snr_threshold_params_cmd *) skb->data; - memcpy(cmd, snr_cmd, sizeof(struct wmi_snr_threshold_params_cmd)); - - return ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SNR_THRESHOLD_PARAMS_CMDID, - NO_SYNC_WMIFLAG); -} - -static int ath6kl_wmi_snr_threshold_event_rx(struct wmi *wmi, u8 *datap, - int len) -{ - struct wmi_snr_threshold_event *reply; - struct sq_threshold_params *sq_thresh; - struct wmi_snr_threshold_params_cmd cmd; - enum wmi_snr_threshold_val new_threshold; - u8 upper_snr_threshold, lower_snr_threshold; - s16 snr; - int ret; - - if (len < sizeof(struct wmi_snr_threshold_event)) - return -EINVAL; - - reply = (struct wmi_snr_threshold_event *) datap; - - new_threshold = (enum wmi_snr_threshold_val) reply->range; - snr = reply->snr; - - sq_thresh = &wmi->sq_threshld[SIGNAL_QUALITY_METRICS_SNR]; - - /* - * Identify the threshold breached and communicate that to the app. - * After that install a new set of thresholds based on the signal - * quality reported by the target. - */ - if (new_threshold) { - /* Upper threshold breached */ - if (snr < sq_thresh->upper_threshold[0]) { - ath6kl_dbg(ATH6KL_DBG_WMI, - "spurious upper snr threshold event: %d\n", - snr); - } else if ((snr < sq_thresh->upper_threshold[1]) && - (snr >= sq_thresh->upper_threshold[0])) { - new_threshold = WMI_SNR_THRESHOLD1_ABOVE; - } else if ((snr < sq_thresh->upper_threshold[2]) && - (snr >= sq_thresh->upper_threshold[1])) { - new_threshold = WMI_SNR_THRESHOLD2_ABOVE; - } else if ((snr < sq_thresh->upper_threshold[3]) && - (snr >= sq_thresh->upper_threshold[2])) { - new_threshold = WMI_SNR_THRESHOLD3_ABOVE; - } else if (snr >= sq_thresh->upper_threshold[3]) { - new_threshold = WMI_SNR_THRESHOLD4_ABOVE; - } - } else { - /* Lower threshold breached */ - if (snr > sq_thresh->lower_threshold[0]) { - ath6kl_dbg(ATH6KL_DBG_WMI, - "spurious lower snr threshold event: %d\n", - sq_thresh->lower_threshold[0]); - } else if ((snr > sq_thresh->lower_threshold[1]) && - (snr <= sq_thresh->lower_threshold[0])) { - new_threshold = WMI_SNR_THRESHOLD4_BELOW; - } else if ((snr > sq_thresh->lower_threshold[2]) && - (snr <= sq_thresh->lower_threshold[1])) { - new_threshold = WMI_SNR_THRESHOLD3_BELOW; - } else if ((snr > sq_thresh->lower_threshold[3]) && - (snr <= sq_thresh->lower_threshold[2])) { - new_threshold = WMI_SNR_THRESHOLD2_BELOW; - } else if (snr <= sq_thresh->lower_threshold[3]) { - new_threshold = WMI_SNR_THRESHOLD1_BELOW; - } - } - - /* Calculate and install the next set of thresholds */ - lower_snr_threshold = ath6kl_wmi_get_lower_threshold(snr, sq_thresh, - sq_thresh->lower_threshold_valid_count); - upper_snr_threshold = ath6kl_wmi_get_upper_threshold(snr, sq_thresh, - sq_thresh->upper_threshold_valid_count); - - /* Issue a wmi command to install the thresholds */ - cmd.thresh_above1_val = upper_snr_threshold; - cmd.thresh_below1_val = lower_snr_threshold; - cmd.weight = sq_thresh->weight; - cmd.poll_time = cpu_to_le32(sq_thresh->polling_interval); - - ath6kl_dbg(ATH6KL_DBG_WMI, - "snr: %d, threshold: %d, lower: %d, upper: %d\n", - snr, new_threshold, - lower_snr_threshold, upper_snr_threshold); - - ret = ath6kl_wmi_send_snr_threshold_params(wmi, &cmd); - if (ret) { - ath6kl_err("unable to configure snr threshold\n"); - return -EIO; - } - - return 0; -} - -static int ath6kl_wmi_aplist_event_rx(struct wmi *wmi, u8 *datap, int len) -{ - u16 ap_info_entry_size; - struct wmi_aplist_event *ev = (struct wmi_aplist_event *) datap; - struct wmi_ap_info_v1 *ap_info_v1; - u8 index; - - if (len < sizeof(struct wmi_aplist_event) || - ev->ap_list_ver != APLIST_VER1) - return -EINVAL; - - ap_info_entry_size = sizeof(struct wmi_ap_info_v1); - ap_info_v1 = (struct wmi_ap_info_v1 *) ev->ap_list; - - ath6kl_dbg(ATH6KL_DBG_WMI, - "number of APs in aplist event: %d\n", ev->num_ap); - - if (len < (int) (sizeof(struct wmi_aplist_event) + - (ev->num_ap - 1) * ap_info_entry_size)) - return -EINVAL; - - /* AP list version 1 contents */ - for (index = 0; index < ev->num_ap; index++) { - ath6kl_dbg(ATH6KL_DBG_WMI, "AP#%d BSSID %s Channel %d\n", - index, sec_conv_mac(ap_info_v1->bssid), - ap_info_v1->channel); - ap_info_v1++; - } - - return 0; -} - -int ath6kl_wmi_cmd_send(struct wmi *wmi, u8 if_idx, struct sk_buff *skb, - enum wmi_cmd_id cmd_id, enum wmi_sync_flag sync_flag) -{ - struct wmi_cmd_hdr *cmd_hdr; - enum htc_endpoint_id ep_id = wmi->ep_id; - int ret; - u16 info1; - - if (WARN_ON(skb == NULL || (if_idx > (wmi->parent_dev->vif_max - 1)))) - return -EINVAL; - - ath6kl_dbg(ATH6KL_DBG_WMI, "wmi tx id %d len %d flag %d\n", - cmd_id, skb->len, sync_flag); - ath6kl_dbg_dump(ATH6KL_DBG_WMI_DUMP, NULL, "wmi tx ", - skb->data, skb->len); - - if (sync_flag >= END_WMIFLAG) { - dev_kfree_skb(skb); - return -EINVAL; - } - - if ((sync_flag == SYNC_BEFORE_WMIFLAG) || - (sync_flag == SYNC_BOTH_WMIFLAG)) { - /* - * Make sure all data currently queued is transmitted before - * the cmd execution. Establish a new sync point. - */ - ath6kl_wmi_sync_point(wmi, if_idx); - } - - skb_push(skb, sizeof(struct wmi_cmd_hdr)); - - cmd_hdr = (struct wmi_cmd_hdr *) skb->data; - cmd_hdr->cmd_id = cpu_to_le16(cmd_id); - info1 = if_idx & WMI_CMD_HDR_IF_ID_MASK; - cmd_hdr->info1 = cpu_to_le16(info1); - - /* Only for OPT_TX_CMD, use BE endpoint. */ - if (cmd_id == WMI_OPT_TX_FRAME_CMDID) { - ret = ath6kl_wmi_data_hdr_add(wmi, skb, OPT_MSGTYPE, - false, false, 0, NULL, if_idx); - if (ret) { - dev_kfree_skb(skb); - return ret; - } - ep_id = ath6kl_ac2_endpoint_id(wmi->parent_dev, WMM_AC_BE); - } - - ath6kl_control_tx(wmi->parent_dev, skb, ep_id); - - if ((sync_flag == SYNC_AFTER_WMIFLAG) || - (sync_flag == SYNC_BOTH_WMIFLAG)) { - /* - * Make sure all new data queued waits for the command to - * execute. Establish a new sync point. - */ - ath6kl_wmi_sync_point(wmi, if_idx); - } - - return 0; -} - -int ath6kl_wmi_connect_cmd(struct wmi *wmi, u8 if_idx, - enum network_type nw_type, - enum dot11_auth_mode dot11_auth_mode, - enum auth_mode auth_mode, - enum crypto_type pairwise_crypto, - u8 pairwise_crypto_len, - enum crypto_type group_crypto, - u8 group_crypto_len, int ssid_len, u8 *ssid, - u8 *bssid, u16 channel, u32 ctrl_flags, - u8 nw_subtype) -{ - struct sk_buff *skb; - struct wmi_connect_cmd *cc; - int ret; - - ath6kl_dbg(ATH6KL_DBG_WMI, - "wmi connect bssid %s freq %d flags 0x%x ssid_len %d " - "type %d dot11_auth %d auth %d pairwise %d group %d\n", - sec_conv_mac(bssid), channel, ctrl_flags, ssid_len, nw_type, - dot11_auth_mode, auth_mode, pairwise_crypto, group_crypto); - ath6kl_dbg_dump(ATH6KL_DBG_WMI, NULL, "ssid ", ssid, ssid_len); - - wmi->traffic_class = 100; - - if ((pairwise_crypto == NONE_CRYPT) && (group_crypto != NONE_CRYPT)) - return -EINVAL; - - if ((pairwise_crypto != NONE_CRYPT) && (group_crypto == NONE_CRYPT)) - return -EINVAL; - - skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_connect_cmd)); - if (!skb) - return -ENOMEM; - - cc = (struct wmi_connect_cmd *) skb->data; - - if (ssid_len) - memcpy(cc->ssid, ssid, ssid_len); - - cc->ssid_len = ssid_len; - cc->nw_type = nw_type; - cc->dot11_auth_mode = dot11_auth_mode; - cc->auth_mode = auth_mode; - cc->prwise_crypto_type = pairwise_crypto; - cc->prwise_crypto_len = pairwise_crypto_len; - cc->grp_crypto_type = group_crypto; - cc->grp_crypto_len = group_crypto_len; - cc->ch = cpu_to_le16(channel); - cc->ctrl_flags = cpu_to_le32(ctrl_flags); - cc->nw_subtype = nw_subtype; - - if (bssid != NULL) - memcpy(cc->bssid, bssid, ETH_ALEN); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_CONNECT_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_reconnect_cmd(struct wmi *wmi, u8 if_idx, u8 *bssid, - u16 channel) -{ - struct sk_buff *skb; - struct wmi_reconnect_cmd *cc; - int ret; - - ath6kl_dbg(ATH6KL_DBG_WMI, "wmi reconnect bssid %s freq %d\n", - sec_conv_mac(bssid), channel); - - wmi->traffic_class = 100; - - skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_reconnect_cmd)); - if (!skb) - return -ENOMEM; - - cc = (struct wmi_reconnect_cmd *) skb->data; - cc->channel = cpu_to_le16(channel); - - if (bssid != NULL) - memcpy(cc->bssid, bssid, ETH_ALEN); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_RECONNECT_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_disconnect_cmd(struct wmi *wmi, u8 if_idx) -{ - int ret; - - ath6kl_dbg(ATH6KL_DBG_WMI, "wmi disconnect\n"); - - wmi->traffic_class = 100; - - /* Disconnect command does not need to do a SYNC before. */ - ret = ath6kl_wmi_simple_cmd(wmi, if_idx, WMI_DISCONNECT_CMDID); - - return ret; -} - -int ath6kl_wmi_beginscan_cmd(struct wmi *wmi, u8 if_idx, - enum wmi_scan_type scan_type, - u32 force_fgscan, u32 is_legacy, - u32 home_dwell_time, u32 force_scan_interval, - s8 num_chan, u16 *ch_list, u32 no_cck, u32 *rates) -{ - struct sk_buff *skb; - struct wmi_begin_scan_cmd *sc; -#ifdef CONFIG_MACH_PX - unsigned int size; -#else - s8 size; -#endif - int i, band, ret; - struct ath6kl *ar = wmi->parent_dev; - int num_rates; - - size = sizeof(struct wmi_begin_scan_cmd); - - if ((scan_type != WMI_LONG_SCAN) && (scan_type != WMI_SHORT_SCAN)) - return -EINVAL; - -#ifdef CONFIG_MACH_PX -#else - if (num_chan > WMI_MAX_CHANNELS) - return -EINVAL; -#endif - - if (num_chan) - size += sizeof(u16) * (num_chan - 1); - - skb = ath6kl_wmi_get_new_buf(size); - if (!skb) - return -ENOMEM; - - sc = (struct wmi_begin_scan_cmd *) skb->data; - sc->scan_type = scan_type; - sc->force_fg_scan = cpu_to_le32(force_fgscan); - sc->is_legacy = cpu_to_le32(is_legacy); - sc->home_dwell_time = cpu_to_le32(home_dwell_time); - sc->force_scan_intvl = cpu_to_le32(force_scan_interval); - sc->no_cck = cpu_to_le32(no_cck); - sc->num_ch = num_chan; - - for (band = 0; band < IEEE80211_NUM_BANDS; band++) { - struct ieee80211_supported_band *sband = - ar->wiphy->bands[band]; - u32 ratemask = rates[band]; - u8 *supp_rates = sc->supp_rates[band].rates; - num_rates = 0; - - for (i = 0; i < sband->n_bitrates; i++) { - if ((BIT(i) & ratemask) == 0) - continue; /* skip rate */ - supp_rates[num_rates++] = - (u8) (sband->bitrates[i].bitrate / 5); - } - sc->supp_rates[band].nrates = num_rates; - } - - for (i = 0; i < num_chan; i++) - sc->ch_list[i] = cpu_to_le16(ch_list[i]); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_BEGIN_SCAN_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -/* ath6kl_wmi_start_scan_cmd is to be deprecated. Use - * ath6kl_wmi_begin_scan_cmd instead. The new function supports P2P - * mgmt operations using station interface. - */ -int ath6kl_wmi_startscan_cmd(struct wmi *wmi, u8 if_idx, - enum wmi_scan_type scan_type, - u32 force_fgscan, u32 is_legacy, - u32 home_dwell_time, u32 force_scan_interval, - s8 num_chan, u16 *ch_list) -{ - struct sk_buff *skb; - struct wmi_start_scan_cmd *sc; - s8 size; - int i, ret; - - size = sizeof(struct wmi_start_scan_cmd); - - if ((scan_type != WMI_LONG_SCAN) && (scan_type != WMI_SHORT_SCAN)) - return -EINVAL; - - if (num_chan > WMI_MAX_CHANNELS) - return -EINVAL; - - if (num_chan) - size += sizeof(u16) * (num_chan - 1); - - skb = ath6kl_wmi_get_new_buf(size); - if (!skb) - return -ENOMEM; - - sc = (struct wmi_start_scan_cmd *) skb->data; - sc->scan_type = scan_type; - sc->force_fg_scan = cpu_to_le32(force_fgscan); - sc->is_legacy = cpu_to_le32(is_legacy); - sc->home_dwell_time = cpu_to_le32(home_dwell_time); - sc->force_scan_intvl = cpu_to_le32(force_scan_interval); - sc->num_ch = num_chan; - - for (i = 0; i < num_chan; i++) - sc->ch_list[i] = cpu_to_le16(ch_list[i]); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_START_SCAN_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_scanparams_cmd(struct wmi *wmi, u8 if_idx, - u16 fg_start_sec, - u16 fg_end_sec, u16 bg_sec, - u16 minact_chdw_msec, u16 maxact_chdw_msec, - u16 pas_chdw_msec, u8 short_scan_ratio, - u8 scan_ctrl_flag, u32 max_dfsch_act_time, - u16 maxact_scan_per_ssid) -{ - struct sk_buff *skb; - struct wmi_scan_params_cmd *sc; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*sc)); - if (!skb) - return -ENOMEM; - - sc = (struct wmi_scan_params_cmd *) skb->data; - sc->fg_start_period = cpu_to_le16(fg_start_sec); - sc->fg_end_period = cpu_to_le16(fg_end_sec); - sc->bg_period = cpu_to_le16(bg_sec); - sc->minact_chdwell_time = cpu_to_le16(minact_chdw_msec); - sc->maxact_chdwell_time = cpu_to_le16(maxact_chdw_msec); - sc->pas_chdwell_time = cpu_to_le16(pas_chdw_msec); - sc->short_scan_ratio = short_scan_ratio; - sc->scan_ctrl_flags = scan_ctrl_flag; - sc->max_dfsch_act_time = cpu_to_le32(max_dfsch_act_time); - sc->maxact_scan_per_ssid = cpu_to_le16(maxact_scan_per_ssid); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_SCAN_PARAMS_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_bssfilter_cmd(struct wmi *wmi, u8 if_idx, u8 filter, u32 ie_mask) -{ - struct sk_buff *skb; - struct wmi_bss_filter_cmd *cmd; - int ret; - - if (filter >= LAST_BSS_FILTER) - return -EINVAL; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_bss_filter_cmd *) skb->data; - cmd->bss_filter = filter; - cmd->ie_mask = cpu_to_le32(ie_mask); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_BSS_FILTER_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_probedssid_cmd(struct wmi *wmi, u8 if_idx, u8 index, u8 flag, - u8 ssid_len, u8 *ssid) -{ - struct sk_buff *skb; - struct wmi_probed_ssid_cmd *cmd; - int ret; - - if (index > MAX_PROBED_SSIDS) - return -EINVAL; - - if (ssid_len > sizeof(cmd->ssid)) - return -EINVAL; - - if ((flag & (DISABLE_SSID_FLAG | ANY_SSID_FLAG)) && (ssid_len > 0)) - return -EINVAL; - - if ((flag & SPECIFIC_SSID_FLAG) && !ssid_len) - return -EINVAL; - - if (flag & SPECIFIC_SSID_FLAG) - wmi->is_probe_ssid = true; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_probed_ssid_cmd *) skb->data; - cmd->entry_index = index; - cmd->flag = flag; - cmd->ssid_len = ssid_len; - memcpy(cmd->ssid, ssid, ssid_len); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_PROBED_SSID_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_listeninterval_cmd(struct wmi *wmi, u8 if_idx, - u16 listen_interval, - u16 listen_beacons) -{ - struct sk_buff *skb; - struct wmi_listen_int_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_listen_int_cmd *) skb->data; - cmd->listen_intvl = cpu_to_le16(listen_interval); - cmd->num_beacons = cpu_to_le16(listen_beacons); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_LISTEN_INT_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_mcastrate_cmd(struct wmi *wmi, u8 if_idx, - u16 bitrate) -{ - struct sk_buff *skb; - struct wmi_set_mcastrate_cmd *cmd; - int ret; - - printk(KERN_INFO "\tmcastrate = %d\n", bitrate); - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_mcastrate_cmd *) skb->data; - cmd->bitrate = bitrate; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_MCASTRATE_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_bmisstime_cmd(struct wmi *wmi, u8 if_idx, - u16 bmiss_time, - u16 num_beacons) -{ - struct sk_buff *skb; - struct wmi_bmiss_time_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_bmiss_time_cmd *) skb->data; - cmd->bmiss_time = cpu_to_le16(bmiss_time); - cmd->num_beacons = cpu_to_le16(num_beacons); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_BMISS_TIME_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_powermode_cmd(struct wmi *wmi, u8 if_idx, u8 pwr_mode) -{ - struct sk_buff *skb; - struct wmi_power_mode_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_power_mode_cmd *) skb->data; - - if(wmi->parent_dev->psminfo == 0) - { - pwr_mode = MAX_PERF_POWER; - ath6kl_dbg(ATH6KL_DBG_WMI, "%s() pwr_mode = %d\n", - __func__, pwr_mode); - } - - cmd->pwr_mode = pwr_mode; - wmi->pwr_mode = pwr_mode; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_POWER_MODE_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_pmparams_cmd(struct wmi *wmi, u8 if_idx, u16 idle_period, - u16 ps_poll_num, u16 dtim_policy, - u16 tx_wakeup_policy, u16 num_tx_to_wakeup, - u16 ps_fail_event_policy) -{ - struct sk_buff *skb; - struct wmi_power_params_cmd *pm; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*pm)); - if (!skb) - return -ENOMEM; - - pm = (struct wmi_power_params_cmd *)skb->data; - pm->idle_period = cpu_to_le16(idle_period); - pm->pspoll_number = cpu_to_le16(ps_poll_num); - pm->dtim_policy = cpu_to_le16(dtim_policy); - pm->tx_wakeup_policy = cpu_to_le16(tx_wakeup_policy); - pm->num_tx_to_wakeup = cpu_to_le16(num_tx_to_wakeup); - pm->ps_fail_event_policy = cpu_to_le16(ps_fail_event_policy); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_POWER_PARAMS_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_disctimeout_cmd(struct wmi *wmi, u8 if_idx, u8 timeout) -{ - struct sk_buff *skb; - struct wmi_disc_timeout_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_disc_timeout_cmd *) skb->data; - cmd->discon_timeout = timeout; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_DISC_TIMEOUT_CMDID, - NO_SYNC_WMIFLAG); - - if (ret == 0) - ath6kl_debug_set_disconnect_timeout(wmi->parent_dev, timeout); - - return ret; -} - -int ath6kl_wmi_addkey_cmd(struct wmi *wmi, u8 if_idx, u8 key_index, - enum crypto_type key_type, - u8 key_usage, u8 key_len, - u8 *key_rsc, unsigned int key_rsc_len, - u8 *key_material, - u8 key_op_ctrl, u8 *mac_addr, - enum wmi_sync_flag sync_flag) -{ - struct sk_buff *skb; - struct wmi_add_cipher_key_cmd *cmd; - int ret; - - ath6kl_dbg(ATH6KL_DBG_WMI, "addkey cmd: key_index=%u key_type=%d " - "key_usage=%d key_len=%d key_op_ctrl=%d\n", - key_index, key_type, key_usage, key_len, key_op_ctrl); - - if ((key_index > WMI_MAX_KEY_INDEX) || (key_len > WMI_MAX_KEY_LEN) || - (key_material == NULL) || key_rsc_len > 8) - return -EINVAL; - - if ((WEP_CRYPT != key_type) && (NULL == key_rsc)) - return -EINVAL; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_add_cipher_key_cmd *) skb->data; - cmd->key_index = key_index; - cmd->key_type = key_type; - cmd->key_usage = key_usage; - cmd->key_len = key_len; - memcpy(cmd->key, key_material, key_len); - - if (key_rsc != NULL) - memcpy(cmd->key_rsc, key_rsc, key_rsc_len); - - cmd->key_op_ctrl = key_op_ctrl; - - if (mac_addr) - memcpy(cmd->key_mac_addr, mac_addr, ETH_ALEN); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_ADD_CIPHER_KEY_CMDID, - sync_flag); - - return ret; -} - -int ath6kl_wmi_add_krk_cmd(struct wmi *wmi, u8 if_idx, u8 *krk) -{ - struct sk_buff *skb; - struct wmi_add_krk_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_add_krk_cmd *) skb->data; - memcpy(cmd->krk, krk, WMI_KRK_LEN); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_ADD_KRK_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_deletekey_cmd(struct wmi *wmi, u8 if_idx, u8 key_index) -{ - struct sk_buff *skb; - struct wmi_delete_cipher_key_cmd *cmd; - int ret; - - if (key_index > WMI_MAX_KEY_INDEX) - return -EINVAL; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_delete_cipher_key_cmd *) skb->data; - cmd->key_index = key_index; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_DELETE_CIPHER_KEY_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_setpmkid_cmd(struct wmi *wmi, u8 if_idx, const u8 *bssid, - const u8 *pmkid, bool set) -{ - struct sk_buff *skb; - struct wmi_setpmkid_cmd *cmd; - int ret; - - if (bssid == NULL) - return -EINVAL; - - if (set && pmkid == NULL) - return -EINVAL; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_setpmkid_cmd *) skb->data; - memcpy(cmd->bssid, bssid, ETH_ALEN); - if (set) { - memcpy(cmd->pmkid, pmkid, sizeof(cmd->pmkid)); - cmd->enable = PMKID_ENABLE; - } else { - memset(cmd->pmkid, 0, sizeof(cmd->pmkid)); - cmd->enable = PMKID_DISABLE; - } - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_PMKID_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -static int ath6kl_wmi_data_sync_send(struct wmi *wmi, struct sk_buff *skb, - enum htc_endpoint_id ep_id, u8 if_idx) -{ - struct wmi_data_hdr *data_hdr; - int ret; - - if (WARN_ON(skb == NULL || ep_id == wmi->ep_id)) - return -EINVAL; - - skb_push(skb, sizeof(struct wmi_data_hdr)); - - data_hdr = (struct wmi_data_hdr *) skb->data; - data_hdr->info = SYNC_MSGTYPE << WMI_DATA_HDR_MSG_TYPE_SHIFT; - data_hdr->info3 = cpu_to_le16(if_idx & WMI_DATA_HDR_IF_IDX_MASK); - - ret = ath6kl_control_tx(wmi->parent_dev, skb, ep_id); - - return ret; -} - -static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx) -{ - struct sk_buff *skb; - struct wmi_sync_cmd *cmd; - struct wmi_data_sync_bufs data_sync_bufs[WMM_NUM_AC]; - enum htc_endpoint_id ep_id; - u8 index, num_pri_streams = 0; - int ret = 0; - u8 fat_pipe_exist; - - memset(data_sync_bufs, 0, sizeof(data_sync_bufs)); - - spin_lock_bh(&wmi->lock); - - fat_pipe_exist = wmi->fat_pipe_exist; - - for (index = 0; index < WMM_NUM_AC; index++) { - if (fat_pipe_exist & (1 << index)) { - num_pri_streams++; - data_sync_bufs[num_pri_streams - 1].traffic_class = - index; - } - } - - spin_unlock_bh(&wmi->lock); - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) { - ret = -ENOMEM; - goto free_skb; - } - - cmd = (struct wmi_sync_cmd *) skb->data; - - /* - * In the SYNC cmd sent on the control Ep, send a bitmap - * of the data eps on which the Data Sync will be sent - */ - cmd->data_sync_map = fat_pipe_exist; - - for (index = 0; index < num_pri_streams; index++) { - data_sync_bufs[index].skb = ath6kl_buf_alloc(0); - if (data_sync_bufs[index].skb == NULL) { - ret = -ENOMEM; - break; - } - } - - /* - * If buffer allocation for any of the dataSync fails, - * then do not send the Synchronize cmd on the control ep - */ - if (ret) - goto free_skb; - - /* - * Send sync cmd followed by sync data messages on all - * endpoints being used - */ - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SYNCHRONIZE_CMDID, - NO_SYNC_WMIFLAG); - - if (ret) - goto free_skb; - - /* cmd buffer sent, we no longer own it */ - skb = NULL; - - for (index = 0; index < num_pri_streams; index++) { - - if (WARN_ON(!data_sync_bufs[index].skb)) - break; - - ep_id = ath6kl_ac2_endpoint_id(wmi->parent_dev, - data_sync_bufs[index]. - traffic_class); - ret = - ath6kl_wmi_data_sync_send(wmi, data_sync_bufs[index].skb, - ep_id, if_idx); - - if (ret) - break; - - data_sync_bufs[index].skb = NULL; - } - -free_skb: - /* free up any resources left over (possibly due to an error) */ - if (skb) - dev_kfree_skb(skb); - - for (index = 0; index < num_pri_streams; index++) { - if (data_sync_bufs[index].skb != NULL) { - dev_kfree_skb((struct sk_buff *)data_sync_bufs[index]. - skb); - } - } - - return ret; -} - -int ath6kl_wmi_create_pstream_cmd(struct wmi *wmi, u8 if_idx, - struct wmi_create_pstream_cmd *params) -{ - struct sk_buff *skb; - struct wmi_create_pstream_cmd *cmd; - u8 fatpipe_exist_for_ac = 0; - s32 min_phy = 0; - s32 nominal_phy = 0; - int ret; - - if (!((params->user_pri < 8) && - (params->user_pri <= 0x7) && - (up_to_ac[params->user_pri & 0x7] == params->traffic_class) && - (params->traffic_direc == UPLINK_TRAFFIC || - params->traffic_direc == DNLINK_TRAFFIC || - params->traffic_direc == BIDIR_TRAFFIC) && - (params->traffic_type == TRAFFIC_TYPE_APERIODIC || - params->traffic_type == TRAFFIC_TYPE_PERIODIC) && - (params->voice_psc_cap == DISABLE_FOR_THIS_AC || - params->voice_psc_cap == ENABLE_FOR_THIS_AC || - params->voice_psc_cap == ENABLE_FOR_ALL_AC) && - (params->tsid == WMI_IMPLICIT_PSTREAM || - params->tsid <= WMI_MAX_THINSTREAM))) { - return -EINVAL; - } - - /* - * Check nominal PHY rate is >= minimalPHY, - * so that DUT can allow TSRS IE - */ - - /* Get the physical rate (units of bps) */ - min_phy = ((le32_to_cpu(params->min_phy_rate) / 1000) / 1000); - - /* Check minimal phy < nominal phy rate */ - if (params->nominal_phy >= min_phy) { - /* unit of 500 kbps */ - nominal_phy = (params->nominal_phy * 1000) / 500; - ath6kl_dbg(ATH6KL_DBG_WMI, - "TSRS IE enabled::MinPhy %x->NominalPhy ===> %x\n", - min_phy, nominal_phy); - - params->nominal_phy = nominal_phy; - } else { - params->nominal_phy = 0; - } - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - ath6kl_dbg(ATH6KL_DBG_WMI, - "sending create_pstream_cmd: ac=%d tsid:%d\n", - params->traffic_class, params->tsid); - - cmd = (struct wmi_create_pstream_cmd *) skb->data; - memcpy(cmd, params, sizeof(*cmd)); - - /* This is an implicitly created Fat pipe */ - if ((u32) params->tsid == (u32) WMI_IMPLICIT_PSTREAM) { - spin_lock_bh(&wmi->lock); - fatpipe_exist_for_ac = (wmi->fat_pipe_exist & - (1 << params->traffic_class)); - wmi->fat_pipe_exist |= (1 << params->traffic_class); - spin_unlock_bh(&wmi->lock); - } else { - /* explicitly created thin stream within a fat pipe */ - spin_lock_bh(&wmi->lock); - fatpipe_exist_for_ac = (wmi->fat_pipe_exist & - (1 << params->traffic_class)); - wmi->stream_exist_for_ac[params->traffic_class] |= - (1 << params->tsid); - /* - * If a thinstream becomes active, the fat pipe automatically - * becomes active - */ - wmi->fat_pipe_exist |= (1 << params->traffic_class); - spin_unlock_bh(&wmi->lock); - } - - /* - * Indicate activty change to driver layer only if this is the - * first TSID to get created in this AC explicitly or an implicit - * fat pipe is getting created. - */ - if (!fatpipe_exist_for_ac) - ath6kl_indicate_tx_activity(wmi->parent_dev, - params->traffic_class, true); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_CREATE_PSTREAM_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class, - u8 tsid) -{ - struct sk_buff *skb; - struct wmi_delete_pstream_cmd *cmd; - u16 active_tsids = 0; - int ret; - - if (traffic_class > 3) { - ath6kl_err("invalid traffic class: %d\n", traffic_class); - return -EINVAL; - } - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_delete_pstream_cmd *) skb->data; - cmd->traffic_class = traffic_class; - cmd->tsid = tsid; - - spin_lock_bh(&wmi->lock); - active_tsids = wmi->stream_exist_for_ac[traffic_class]; - spin_unlock_bh(&wmi->lock); - - if (!(active_tsids & (1 << tsid))) { - dev_kfree_skb(skb); - ath6kl_dbg(ATH6KL_DBG_WMI, - "TSID %d doesn't exist for traffic class: %d\n", - tsid, traffic_class); - return -ENODATA; - } - - ath6kl_dbg(ATH6KL_DBG_WMI, - "sending delete_pstream_cmd: traffic class: %d tsid=%d\n", - traffic_class, tsid); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_DELETE_PSTREAM_CMDID, - SYNC_BEFORE_WMIFLAG); - - spin_lock_bh(&wmi->lock); - wmi->stream_exist_for_ac[traffic_class] &= ~(1 << tsid); - active_tsids = wmi->stream_exist_for_ac[traffic_class]; - spin_unlock_bh(&wmi->lock); - - /* - * Indicate stream inactivity to driver layer only if all tsids - * within this AC are deleted. - */ - if (!active_tsids) { - ath6kl_indicate_tx_activity(wmi->parent_dev, - traffic_class, false); - wmi->fat_pipe_exist &= ~(1 << traffic_class); - } - - return ret; -} - -int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, u8 if_idx, - __be32 ips0, __be32 ips1) -{ - struct sk_buff *skb; - struct wmi_set_ip_cmd *cmd; - int ret; - - /* Multicast address are not valid */ - if (ipv4_is_multicast(ips0) || - ipv4_is_multicast(ips1)) - return -EINVAL; - - skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_set_ip_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_ip_cmd *) skb->data; - cmd->ips[0] = ips0; - cmd->ips[1] = ips1; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_IP_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -static void ath6kl_wmi_relinquish_implicit_pstream_credits(struct wmi *wmi) -{ - u16 active_tsids; - u8 stream_exist; - int i; - - /* - * Relinquish credits from all implicitly created pstreams - * since when we go to sleep. If user created explicit - * thinstreams exists with in a fatpipe leave them intact - * for the user to delete. - */ - spin_lock_bh(&wmi->lock); - stream_exist = wmi->fat_pipe_exist; - spin_unlock_bh(&wmi->lock); - - for (i = 0; i < WMM_NUM_AC; i++) { - if (stream_exist & (1 << i)) { - - /* - * FIXME: Is this lock & unlock inside - * for loop correct? may need rework. - */ - spin_lock_bh(&wmi->lock); - active_tsids = wmi->stream_exist_for_ac[i]; - spin_unlock_bh(&wmi->lock); - - /* - * If there are no user created thin streams - * delete the fatpipe - */ - if (!active_tsids) { - stream_exist &= ~(1 << i); - /* - * Indicate inactivity to driver layer for - * this fatpipe (pstream) - */ - ath6kl_indicate_tx_activity(wmi->parent_dev, - i, false); - } - } - } - - /* FIXME: Can we do this assignment without locking ? */ - spin_lock_bh(&wmi->lock); - wmi->fat_pipe_exist = stream_exist; - spin_unlock_bh(&wmi->lock); -} - -int ath6kl_wmi_set_host_sleep_mode_cmd(struct wmi *wmi, u8 if_idx, - enum ath6kl_host_mode host_mode) -{ - struct sk_buff *skb; - struct wmi_set_host_sleep_mode_cmd *cmd; - int ret; - - if ((host_mode != ATH6KL_HOST_MODE_ASLEEP) && - (host_mode != ATH6KL_HOST_MODE_AWAKE)) { - ath6kl_err("invalid host sleep mode: %d\n", host_mode); - return -EINVAL; - } - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_host_sleep_mode_cmd *) skb->data; - - if (host_mode == ATH6KL_HOST_MODE_ASLEEP) { - ath6kl_wmi_relinquish_implicit_pstream_credits(wmi); - cmd->asleep = cpu_to_le32(1); - } else - cmd->awake = cpu_to_le32(1); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, - WMI_SET_HOST_SLEEP_MODE_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -/* This command has zero length payload */ -static int ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx(struct wmi *wmi, - struct ath6kl_vif *vif) -{ - struct ath6kl *ar = wmi->parent_dev; - - set_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags); - wake_up(&ar->event_wq); - - return 0; -} - -int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx, - enum ath6kl_wow_mode wow_mode, - u32 filter, u16 host_req_delay) -{ - struct sk_buff *skb; - struct wmi_set_wow_mode_cmd *cmd; - int ret; - - if ((wow_mode != ATH6KL_WOW_MODE_ENABLE) && - wow_mode != ATH6KL_WOW_MODE_DISABLE) { - ath6kl_err("invalid wow mode: %d\n", wow_mode); - return -EINVAL; - } - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_wow_mode_cmd *) skb->data; - cmd->enable_wow = cpu_to_le32(wow_mode); - cmd->filter = cpu_to_le32(filter); - cmd->host_req_delay = cpu_to_le16(host_req_delay); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_WOW_MODE_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_add_wow_pattern_cmd(struct wmi *wmi, u8 if_idx, - u8 list_id, u8 filter_size, - u8 filter_offset, const u8 *filter, - const u8 *mask) -{ - struct sk_buff *skb; - struct wmi_add_wow_pattern_cmd *cmd; - u16 size; - u8 *filter_mask; - int ret; - - /* - * Allocate additional memory in the buffer to hold - * filter and mask value, which is twice of filter_size. - */ - size = sizeof(*cmd) + (2 * filter_size); - - skb = ath6kl_wmi_get_new_buf(size); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_add_wow_pattern_cmd *) skb->data; - cmd->filter_list_id = list_id; - cmd->filter_size = filter_size; - cmd->filter_offset = filter_offset; - - memcpy(cmd->filter, filter, filter_size); - - filter_mask = (u8 *) (cmd->filter + filter_size); - memcpy(filter_mask, mask, filter_size); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_ADD_WOW_PATTERN_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_del_wow_pattern_cmd(struct wmi *wmi, u8 if_idx, - u16 list_id, u16 filter_id) -{ - struct sk_buff *skb; - struct wmi_del_wow_pattern_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_del_wow_pattern_cmd *) skb->data; - cmd->filter_list_id = cpu_to_le16(list_id); - cmd->filter_id = cpu_to_le16(filter_id); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_DEL_WOW_PATTERN_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -static int ath6kl_wmi_cmd_send_xtnd(struct wmi *wmi, struct sk_buff *skb, - enum wmix_command_id cmd_id, - enum wmi_sync_flag sync_flag) -{ - struct wmix_cmd_hdr *cmd_hdr; - int ret; - - skb_push(skb, sizeof(struct wmix_cmd_hdr)); - - cmd_hdr = (struct wmix_cmd_hdr *) skb->data; - cmd_hdr->cmd_id = cpu_to_le32(cmd_id); - - ret = ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_EXTENSION_CMDID, sync_flag); - - return ret; -} - -int ath6kl_wmi_get_challenge_resp_cmd(struct wmi *wmi, u32 cookie, u32 source) -{ - struct sk_buff *skb; - struct wmix_hb_challenge_resp_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmix_hb_challenge_resp_cmd *) skb->data; - cmd->cookie = cpu_to_le32(cookie); - cmd->source = cpu_to_le32(source); - - ret = ath6kl_wmi_cmd_send_xtnd(wmi, skb, WMIX_HB_CHALLENGE_RESP_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_config_debug_module_cmd(struct wmi *wmi, u32 valid, u32 config) -{ - struct ath6kl_wmix_dbglog_cfg_module_cmd *cmd; - struct sk_buff *skb; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct ath6kl_wmix_dbglog_cfg_module_cmd *) skb->data; - cmd->valid = cpu_to_le32(valid); - cmd->config = cpu_to_le32(config); - - ret = ath6kl_wmi_cmd_send_xtnd(wmi, skb, WMIX_DBGLOG_CFG_MODULE_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_get_stats_cmd(struct wmi *wmi, u8 if_idx) -{ - return ath6kl_wmi_simple_cmd(wmi, if_idx, WMI_GET_STATISTICS_CMDID); -} - -int ath6kl_wmi_set_tx_pwr_cmd(struct wmi *wmi, u8 if_idx, u8 dbM) -{ - struct sk_buff *skb; - struct wmi_set_tx_pwr_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_set_tx_pwr_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_tx_pwr_cmd *) skb->data; - cmd->dbM = dbM; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_TX_PWR_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_get_tx_pwr_cmd(struct wmi *wmi, u8 if_idx) -{ - return ath6kl_wmi_simple_cmd(wmi, if_idx, WMI_GET_TX_PWR_CMDID); -} - -int ath6kl_wmi_get_roam_tbl_cmd(struct wmi *wmi) -{ - return ath6kl_wmi_simple_cmd(wmi, 0, WMI_GET_ROAM_TBL_CMDID); -} - -int ath6kl_wmi_set_lpreamble_cmd(struct wmi *wmi, u8 if_idx, u8 status, - u8 preamble_policy) -{ - struct sk_buff *skb; - struct wmi_set_lpreamble_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_set_lpreamble_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_lpreamble_cmd *) skb->data; - cmd->status = status; - cmd->preamble_policy = preamble_policy; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_LPREAMBLE_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_set_rts_cmd(struct wmi *wmi, u16 threshold) -{ - struct sk_buff *skb; - struct wmi_set_rts_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_set_rts_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_rts_cmd *) skb->data; - cmd->threshold = cpu_to_le16(threshold); - - ret = ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SET_RTS_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_set_wmm_txop(struct wmi *wmi, u8 if_idx, enum wmi_txop_cfg cfg) -{ - struct sk_buff *skb; - struct wmi_set_wmm_txop_cmd *cmd; - int ret; - - if (!((cfg == WMI_TXOP_DISABLED) || (cfg == WMI_TXOP_ENABLED))) - return -EINVAL; - - skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_set_wmm_txop_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_wmm_txop_cmd *) skb->data; - cmd->txop_enable = cfg; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_WMM_TXOP_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_set_keepalive_cmd(struct wmi *wmi, u8 if_idx, - u8 keep_alive_intvl) -{ - struct sk_buff *skb; - struct wmi_set_keepalive_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_keepalive_cmd *) skb->data; - cmd->keep_alive_intvl = keep_alive_intvl; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_KEEPALIVE_CMDID, - NO_SYNC_WMIFLAG); - - if (ret == 0) - ath6kl_debug_set_keepalive(wmi->parent_dev, keep_alive_intvl); - - return ret; -} - -int ath6kl_wmi_test_cmd(struct wmi *wmi, void *buf, size_t len) -{ - struct sk_buff *skb; - int ret; - - skb = ath6kl_wmi_get_new_buf(len); - if (!skb) - return -ENOMEM; - - memcpy(skb->data, buf, len); - - ret = ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_TEST_CMDID, NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, bool mc_all_on) -{ - struct sk_buff *skb; - struct wmi_mcast_filter_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_mcast_filter_cmd *) skb->data; - cmd->mcast_all_enable = mc_all_on; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_MCAST_FILTER_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - -int ath6kl_wmi_add_del_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, - u8 *filter, bool add_filter) -{ - struct sk_buff *skb; - struct wmi_mcast_filter_add_del_cmd *cmd; - int ret; - - if ((filter[0] != 0x33 || filter[1] != 0x33) && - (filter[0] != 0x01 || filter[1] != 0x00 || - filter[2] != 0x5e || filter[3] > 0x7f)) { - ath6kl_warn("invalid multicast filter address\n"); - return -EINVAL; - } - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_mcast_filter_add_del_cmd *) skb->data; - memcpy(cmd->mcast_mac, filter, ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE); - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, - add_filter ? WMI_SET_MCAST_FILTER_CMDID : - WMI_DEL_MCAST_FILTER_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_set_ht_cap_cmd(struct wmi *wmi, u8 if_idx, - struct wmi_set_ht_cap_cmd *params) -{ - struct sk_buff *skb; - struct wmi_set_ht_cap_cmd *cmd; - struct ath6kl *ar = wmi->parent_dev; - struct ieee80211_supported_band *sband; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_ht_cap_cmd *) skb->data; - ath6kl_dbg(ATH6KL_DBG_WMI, "bands %d, ht_supported = %d, " - "chan_width_40m_supported %d, short_gi_20mhz = %d, " - "short_gi_40mhz = %d, intolerance_40mhz = %d\n", - params->band, params->enable, - params->chan_width_40m_supported, params->short_gi_20mhz, - params->short_gi_40mhz, params->intolerance_40mhz); - memcpy(cmd, params, sizeof(*cmd)); - - sband = ar->wiphy->bands[params->band]; - sband->ht_cap.ht_supported = params->enable; - if (params->chan_width_40m_supported) - sband->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; - else - sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; - - if (params->short_gi_20mhz) - sband->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; - else - sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SGI_20; - - if (params->short_gi_40mhz) - sband->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; - else - sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SGI_40; - - if (params->intolerance_40mhz) - sband->ht_cap.cap |= IEEE80211_HT_CAP_40MHZ_INTOLERANT; - else - sband->ht_cap.cap &= ~IEEE80211_HT_CAP_40MHZ_INTOLERANT; - - if (params->max_ampdu_len_exp) - sband->ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU; - else - sband->ht_cap.cap &= ~IEEE80211_HT_CAP_MAX_AMSDU; - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_HT_CAP_CMDID, - NO_SYNC_WMIFLAG); - return ret; -} - - -s32 ath6kl_wmi_get_rate(s8 rate_index) -{ - u32 sgi; - - if (rate_index == RATE_AUTO) - return 0; - - /* SGI is stored as the MSG of the rate_index */ - if (rate_index & 0x80) { - rate_index &= 0x7f; - sgi = 1; - } else { - sgi = 0; - } - - if (rate_index > RATE_MCS_7_40) - rate_index = RATE_MCS_7_40; - - return wmi_rate_tbl[(u32) rate_index][sgi]; -} - -static int ath6kl_wmi_get_pmkid_list_event_rx(struct wmi *wmi, u8 *datap, - u32 len) -{ - struct wmi_pmkid_list_reply *reply; - u32 expected_len; - - if (len < sizeof(struct wmi_pmkid_list_reply)) - return -EINVAL; - - reply = (struct wmi_pmkid_list_reply *)datap; - expected_len = sizeof(reply->num_pmkid) + - le32_to_cpu(reply->num_pmkid) * WMI_PMKID_LEN; - - if (len < expected_len) - return -EINVAL; - - return 0; -} - -static int ath6kl_wmi_addba_req_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_addba_req_event *cmd = (struct wmi_addba_req_event *) datap; - - aggr_recv_addba_req_evt(vif, cmd->tid, - le16_to_cpu(cmd->st_seq_no), cmd->win_sz); - - return 0; -} - -static int ath6kl_wmi_delba_req_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_delba_event *cmd = (struct wmi_delba_event *) datap; - - aggr_recv_delba_req_evt(vif, cmd->tid); - - return 0; -} - -/* AP mode functions */ - -int ath6kl_wmi_ap_profile_commit(struct wmi *wmip, u8 if_idx, - struct wmi_connect_cmd *p) -{ - struct sk_buff *skb; - struct wmi_connect_cmd *cm; - int res; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cm)); - if (!skb) - return -ENOMEM; - - cm = (struct wmi_connect_cmd *) skb->data; - memcpy(cm, p, sizeof(*cm)); - - res = ath6kl_wmi_cmd_send(wmip, if_idx, skb, WMI_AP_CONFIG_COMMIT_CMDID, - NO_SYNC_WMIFLAG); - ath6kl_dbg(ATH6KL_DBG_WMI, "%s: nw_type=%u auth_mode=%u ch=%u " - "ctrl_flags=0x%x-> res=%d\n", - __func__, p->nw_type, p->auth_mode, le16_to_cpu(p->ch), - le32_to_cpu(p->ctrl_flags), res); - return res; -} - -int ath6kl_wmi_ap_set_mlme(struct wmi *wmip, u8 if_idx, u8 cmd, const u8 *mac, - u16 reason) -{ - struct sk_buff *skb; - struct wmi_ap_set_mlme_cmd *cm; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cm)); - if (!skb) - return -ENOMEM; - - cm = (struct wmi_ap_set_mlme_cmd *) skb->data; - memcpy(cm->mac, mac, ETH_ALEN); - cm->reason = cpu_to_le16(reason); - cm->cmd = cmd; - - ath6kl_dbg(ATH6KL_DBG_WMI, "ap_set_mlme: cmd=%d reason=%d\n", cm->cmd, - cm->reason); - - return ath6kl_wmi_cmd_send(wmip, if_idx, skb, WMI_AP_SET_MLME_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_ap_hidden_ssid(struct wmi *wmi, u8 if_idx, bool enable) -{ - struct sk_buff *skb; - struct wmi_ap_hidden_ssid_cmd *cmd; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_ap_hidden_ssid_cmd *) skb->data; - cmd->hidden_ssid = enable ? 1 : 0; - - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_AP_HIDDEN_SSID_CMDID, - NO_SYNC_WMIFLAG); -} - -/* This command will be used to enable/disable AP uAPSD feature */ -int ath6kl_wmi_ap_set_apsd(struct wmi *wmi, u8 if_idx, u8 enable) -{ - struct wmi_ap_set_apsd_cmd *cmd; - struct sk_buff *skb; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_ap_set_apsd_cmd *)skb->data; - cmd->enable = enable; - - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_AP_SET_APSD_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_set_apsd_bfrd_traf(struct wmi *wmi, u8 if_idx, - u16 aid, u16 bitmap, u32 flags) -{ - struct wmi_ap_apsd_buffered_traffic_cmd *cmd; - struct sk_buff *skb; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_ap_apsd_buffered_traffic_cmd *)skb->data; - cmd->aid = cpu_to_le16(aid); - cmd->bitmap = cpu_to_le16(bitmap); - cmd->flags = cpu_to_le32(flags); - - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, - WMI_AP_APSD_BUFFERED_TRAFFIC_CMDID, - NO_SYNC_WMIFLAG); -} - -static int ath6kl_wmi_pspoll_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - struct wmi_pspoll_event *ev; - - if (len < sizeof(struct wmi_pspoll_event)) - return -EINVAL; - - ev = (struct wmi_pspoll_event *) datap; - - ath6kl_pspoll_event(vif, le16_to_cpu(ev->aid)); - - return 0; -} - -static int ath6kl_wmi_dtimexpiry_event_rx(struct wmi *wmi, u8 *datap, int len, - struct ath6kl_vif *vif) -{ - ath6kl_dtimexpiry_event(vif); - - return 0; -} - -int ath6kl_wmi_set_pvb_cmd(struct wmi *wmi, u8 if_idx, u16 aid, - bool flag) -{ - struct sk_buff *skb; - struct wmi_ap_set_pvb_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_ap_set_pvb_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_ap_set_pvb_cmd *) skb->data; - cmd->aid = cpu_to_le16(aid); - cmd->rsvd = cpu_to_le16(0); - cmd->flag = cpu_to_le32(flag); - - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_AP_SET_PVB_CMDID, - NO_SYNC_WMIFLAG); - - return 0; -} - -int ath6kl_wmi_set_rx_frame_format_cmd(struct wmi *wmi, u8 if_idx, - u8 rx_meta_ver, - bool rx_dot11_hdr, bool defrag_on_host) -{ - struct sk_buff *skb; - struct wmi_rx_frame_format_cmd *cmd; - int ret; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_rx_frame_format_cmd *) skb->data; - cmd->dot11_hdr = rx_dot11_hdr ? 1 : 0; - cmd->defrag_on_host = defrag_on_host ? 1 : 0; - cmd->meta_ver = rx_meta_ver; - - /* Delete the local aggr state, on host */ - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_RX_FRAME_FORMAT_CMDID, - NO_SYNC_WMIFLAG); - - return ret; -} - -int ath6kl_wmi_set_appie_cmd(struct wmi *wmi, u8 if_idx, u8 mgmt_frm_type, - const u8 *ie, u8 ie_len) -{ - struct sk_buff *skb; - struct wmi_set_appie_cmd *p; - - skb = ath6kl_wmi_get_new_buf(sizeof(*p) + ie_len); - if (!skb) - return -ENOMEM; - - ath6kl_dbg(ATH6KL_DBG_WMI, "set_appie_cmd: mgmt_frm_type=%u " - "ie_len=%u\n", mgmt_frm_type, ie_len); - p = (struct wmi_set_appie_cmd *) skb->data; - p->mgmt_frm_type = mgmt_frm_type; - p->ie_len = ie_len; - - if (ie != NULL && ie_len > 0) - memcpy(p->ie_info, ie, ie_len); - - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_APPIE_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_set_ie_cmd(struct wmi *wmi, u8 if_idx, u8 ie_id, u8 ie_field, - const u8 *ie_info, u8 ie_len) -{ - struct sk_buff *skb; - struct wmi_set_ie_cmd *p; - - skb = ath6kl_wmi_get_new_buf(sizeof(*p) + ie_len); - if (!skb) - return -ENOMEM; - - ath6kl_dbg(ATH6KL_DBG_WMI, "set_ie_cmd: ie_id=%u ie_ie_field=%u " - "ie_len=%u\n", ie_id, ie_field, ie_len); - p = (struct wmi_set_ie_cmd *) skb->data; - p->ie_id = ie_id; - p->ie_field = ie_field; - p->ie_len = ie_len; - if (ie_info != NULL && ie_len > 0) - memcpy(p->ie_info, ie_info, ie_len); - - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_IE_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_disable_11b_rates_cmd(struct wmi *wmi, bool disable) -{ - struct sk_buff *skb; - struct wmi_disable_11b_rates_cmd *cmd; - - skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); - if (!skb) - return -ENOMEM; - - ath6kl_dbg(ATH6KL_DBG_WMI, "disable_11b_rates_cmd: disable=%u\n", - disable); - cmd = (struct wmi_disable_11b_rates_cmd *) skb->data; - cmd->disable = disable ? 1 : 0; - - return ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_DISABLE_11B_RATES_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_remain_on_chnl_cmd(struct wmi *wmi, u8 if_idx, u32 freq, u32 dur) -{ - struct sk_buff *skb; - struct wmi_remain_on_chnl_cmd *p; - - skb = ath6kl_wmi_get_new_buf(sizeof(*p)); - if (!skb) - return -ENOMEM; - - ath6kl_dbg(ATH6KL_DBG_WMI, "remain_on_chnl_cmd: freq=%u dur=%u\n", - freq, dur); - p = (struct wmi_remain_on_chnl_cmd *) skb->data; - p->freq = cpu_to_le32(freq); - p->duration = cpu_to_le32(dur); - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_REMAIN_ON_CHNL_CMDID, - NO_SYNC_WMIFLAG); -} - -/* ath6kl_wmi_send_action_cmd is to be deprecated. Use - * ath6kl_wmi_send_mgmt_cmd instead. The new function supports P2P - * mgmt operations using station interface. - */ -static int ath6kl_wmi_send_action_cmd(struct wmi *wmi, u8 if_idx, u32 id, - u32 freq, u32 wait, const u8 *data, - u16 data_len) -{ - struct sk_buff *skb; - struct wmi_send_action_cmd *p; - u8 *buf; - int ret; - - if (wait) - return -EINVAL; /* Offload for wait not supported */ - - buf = kmalloc(data_len, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - skb = ath6kl_wmi_get_new_buf(sizeof(*p) + data_len); - if (!skb) { - kfree(buf); - return -ENOMEM; - } - - mutex_lock(&wmi->lock_mgmt); - if (wmi->last_mgmt_tx_frame) - kfree(wmi->last_mgmt_tx_frame); - - memcpy(buf, data, data_len); - wmi->last_mgmt_tx_frame = buf; - wmi->last_mgmt_tx_frame_len = data_len; - - ath6kl_dbg(ATH6KL_DBG_WMI, "send_action_cmd: id=%u freq=%u wait=%u " - "len=%u\n", id, freq, wait, data_len); - p = (struct wmi_send_action_cmd *) skb->data; - p->id = cpu_to_le32(id); - p->freq = cpu_to_le32(freq); - p->wait = cpu_to_le32(wait); - p->len = cpu_to_le16(data_len); - memcpy(p->data, data, data_len); - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SEND_ACTION_CMDID, - NO_SYNC_WMIFLAG); - mutex_unlock(&wmi->lock_mgmt); - return ret; -} - -static int __ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, - u32 freq, u32 wait, const u8 *data, - u16 data_len, u32 no_cck) -{ - struct sk_buff *skb; - struct wmi_send_mgmt_cmd *p; - u8 *buf; - int ret; - - if (wait) - return -EINVAL; /* Offload for wait not supported */ - - buf = kmalloc(data_len, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - skb = ath6kl_wmi_get_new_buf(sizeof(*p) + data_len); - if (!skb) { - kfree(buf); - return -ENOMEM; - } - - mutex_lock(&wmi->lock_mgmt); - if (wmi->last_mgmt_tx_frame) - kfree(wmi->last_mgmt_tx_frame); - - memcpy(buf, data, data_len); - wmi->last_mgmt_tx_frame = buf; - wmi->last_mgmt_tx_frame_len = data_len; - - ath6kl_dbg(ATH6KL_DBG_WMI, "send_action_cmd: id=%u freq=%u wait=%u " - "len=%u\n", id, freq, wait, data_len); - p = (struct wmi_send_mgmt_cmd *) skb->data; - p->id = cpu_to_le32(id); - p->freq = cpu_to_le32(freq); - p->wait = cpu_to_le32(wait); - p->no_cck = cpu_to_le32(no_cck); - p->len = cpu_to_le16(data_len); - memcpy(p->data, data, data_len); - ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SEND_MGMT_CMDID, - NO_SYNC_WMIFLAG); - mutex_unlock(&wmi->lock_mgmt); - - return ret; -} - -int ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq, - u32 wait, const u8 *data, u16 data_len, - u32 no_cck) -{ - int status; - struct ath6kl *ar = wmi->parent_dev; - - if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX, - ar->fw_capabilities)) { - /* - * If capable of doing P2P mgmt operations using - * station interface, send additional information like - * supported rates to advertise and xmit rates for - * probe requests - */ - status = __ath6kl_wmi_send_mgmt_cmd(ar->wmi, if_idx, id, freq, - wait, data, data_len, - no_cck); - } else { - status = ath6kl_wmi_send_action_cmd(ar->wmi, if_idx, id, freq, - wait, data, data_len); - } - - return status; -} - -int ath6kl_wmi_send_probe_response_cmd(struct wmi *wmi, u8 if_idx, u32 freq, - const u8 *dst, const u8 *data, - u16 data_len) -{ - struct sk_buff *skb; - struct wmi_p2p_probe_response_cmd *p; - size_t cmd_len = sizeof(*p) + data_len; - - if (data_len == 0) - cmd_len++; /* work around target minimum length requirement */ - - skb = ath6kl_wmi_get_new_buf(cmd_len); - if (!skb) - return -ENOMEM; - - ath6kl_dbg(ATH6KL_DBG_WMI, "send_probe_response_cmd: freq=%u dst=%s " - "len=%u\n", freq, sec_conv_mac(dst), data_len); - p = (struct wmi_p2p_probe_response_cmd *) skb->data; - p->freq = cpu_to_le32(freq); - memcpy(p->destination_addr, dst, ETH_ALEN); - p->len = cpu_to_le16(data_len); - memcpy(p->data, data, data_len); - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, - WMI_SEND_PROBE_RESPONSE_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_probe_report_req_cmd(struct wmi *wmi, u8 if_idx, bool enable) -{ - struct sk_buff *skb; - struct wmi_probe_req_report_cmd *p; - - skb = ath6kl_wmi_get_new_buf(sizeof(*p)); - if (!skb) - return -ENOMEM; - - ath6kl_dbg(ATH6KL_DBG_WMI, "probe_report_req_cmd: enable=%u\n", - enable); - p = (struct wmi_probe_req_report_cmd *) skb->data; - p->enable = enable ? 1 : 0; - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_PROBE_REQ_REPORT_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_info_req_cmd(struct wmi *wmi, u8 if_idx, u32 info_req_flags) -{ - struct sk_buff *skb; - struct wmi_get_p2p_info *p; - - skb = ath6kl_wmi_get_new_buf(sizeof(*p)); - if (!skb) - return -ENOMEM; - - ath6kl_dbg(ATH6KL_DBG_WMI, "info_req_cmd: flags=%x\n", - info_req_flags); - p = (struct wmi_get_p2p_info *) skb->data; - p->info_req_flags = cpu_to_le32(info_req_flags); - return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_GET_P2P_INFO_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_cancel_remain_on_chnl_cmd(struct wmi *wmi, u8 if_idx) -{ - ath6kl_dbg(ATH6KL_DBG_WMI, "cancel_remain_on_chnl_cmd\n"); - return ath6kl_wmi_simple_cmd(wmi, if_idx, - WMI_CANCEL_REMAIN_ON_CHNL_CMDID); -} - -static int ath6kl_wmi_control_rx_xtnd(struct wmi *wmi, struct sk_buff *skb) -{ - struct wmix_cmd_hdr *cmd; - u32 len; - u16 id; - u8 *datap; - int ret = 0; - - if (skb->len < sizeof(struct wmix_cmd_hdr)) { - ath6kl_err("bad packet 1\n"); - return -EINVAL; - } - - cmd = (struct wmix_cmd_hdr *) skb->data; - id = le32_to_cpu(cmd->cmd_id); - - skb_pull(skb, sizeof(struct wmix_cmd_hdr)); - - datap = skb->data; - len = skb->len; - - switch (id) { - case WMIX_HB_CHALLENGE_RESP_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "wmi event hb challenge resp\n"); - break; - case WMIX_DBGLOG_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "wmi event dbglog len %d\n", len); - ath6kl_debug_fwlog_event(wmi->parent_dev, datap, len); - break; - default: - ath6kl_warn("unknown cmd id 0x%x\n", id); - ret = -EINVAL; - break; - } - - return ret; -} - -static int ath6kl_wmi_roam_tbl_event_rx(struct wmi *wmi, u8 *datap, int len) -{ - return ath6kl_debug_roam_tbl_event(wmi->parent_dev, datap, len); -} - -/* Control Path */ -int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb) -{ - struct wmi_cmd_hdr *cmd; - struct ath6kl_vif *vif; - __le32 regcode; - u32 len; - u16 id; - u8 if_idx; - u8 *datap; - int ret = 0; - - if (WARN_ON(skb == NULL)) - return -EINVAL; - - if (skb->len < sizeof(struct wmi_cmd_hdr)) { - ath6kl_err("bad packet 1\n"); - dev_kfree_skb(skb); - return -EINVAL; - } - - cmd = (struct wmi_cmd_hdr *) skb->data; - id = le16_to_cpu(cmd->cmd_id); - if_idx = le16_to_cpu(cmd->info1) & WMI_CMD_HDR_IF_ID_MASK; - - skb_pull(skb, sizeof(struct wmi_cmd_hdr)); - - datap = skb->data; - len = skb->len; - - ath6kl_dbg(ATH6KL_DBG_WMI, "wmi rx id %d len %d\n", id, len); - ath6kl_dbg_dump(ATH6KL_DBG_WMI_DUMP, NULL, "wmi rx ", - datap, len); - - vif = ath6kl_get_vif_by_index(wmi->parent_dev, if_idx); - if (!vif) { - ath6kl_dbg(ATH6KL_DBG_WMI, - "Wmi event for unavailable vif, vif_index:%d\n", - if_idx); - dev_kfree_skb(skb); - return -EINVAL; - } - - switch (id) { - case WMI_GET_BITRATE_CMDID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_BITRATE_CMDID\n"); - ret = ath6kl_wmi_bitrate_reply_rx(wmi, datap, len); - break; - case WMI_GET_CHANNEL_LIST_CMDID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_CHANNEL_LIST_CMDID\n"); - ret = ath6kl_wmi_ch_list_reply_rx(wmi, datap, len); - break; - case WMI_GET_TX_PWR_CMDID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_TX_PWR_CMDID\n"); - ret = ath6kl_wmi_tx_pwr_reply_rx(wmi, datap, len); - break; - case WMI_READY_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_READY_EVENTID\n"); - ret = ath6kl_wmi_ready_event_rx(wmi, datap, len); - cfg80211_send_event_to_app(skb->dev, id, datap, len); - break; - case WMI_CONNECT_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CONNECT_EVENTID\n"); - ret = ath6kl_wmi_connect_event_rx(wmi, datap, len, vif); - cfg80211_send_genevent_to_app(skb->dev, id, datap, len); - break; - case WMI_DISCONNECT_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DISCONNECT_EVENTID\n"); - ret = ath6kl_wmi_disconnect_event_rx(wmi, datap, len, vif); - cfg80211_send_event_to_app(skb->dev, id, datap, len); - break; - case WMI_PEER_NODE_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PEER_NODE_EVENTID\n"); - ret = ath6kl_wmi_peer_node_event_rx(wmi, datap, len); - cfg80211_send_event_to_app(skb->dev, id, datap, len); - break; - case WMI_TKIP_MICERR_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TKIP_MICERR_EVENTID\n"); - ret = ath6kl_wmi_tkip_micerr_event_rx(wmi, datap, len, vif); - break; - case WMI_BSSINFO_EVENTID: - /* ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_BSSINFO_EVENTID\n"); */ - ret = ath6kl_wmi_bssinfo_event_rx(wmi, datap, len, vif); - break; - case WMI_REGDOMAIN_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REGDOMAIN_EVENTID\n"); - memcpy(®code, datap, 4); - ath6kl_info("%s: 0x%x WWR:%d\n", - le32_to_cpu(regcode) & BIT(31) ? - "Country Code" : "Reg Domain", - le32_to_cpu(regcode) & 0xfff, - !!(le32_to_cpu(regcode) & BIT(30))); - ath6kl_wmi_regdomain_event(wmi, datap, len); - break; - case WMI_PSTREAM_TIMEOUT_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PSTREAM_TIMEOUT_EVENTID\n"); - ret = ath6kl_wmi_pstream_timeout_event_rx(wmi, datap, len); - cfg80211_send_event_to_app(skb->dev, id, datap, len); - break; - case WMI_NEIGHBOR_REPORT_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_NEIGHBOR_REPORT_EVENTID\n"); - ret = ath6kl_wmi_neighbor_report_event_rx(wmi, datap, len, - vif); - break; - case WMI_SCAN_COMPLETE_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SCAN_COMPLETE_EVENTID\n"); - ret = ath6kl_wmi_scan_complete_rx(wmi, datap, len, vif); - cfg80211_send_event_to_app(skb->dev, id, datap, len); - break; - case WMI_CMDERROR_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CMDERROR_EVENTID\n"); - ret = ath6kl_wmi_error_event_rx(wmi, datap, len); - break; - case WMI_REPORT_STATISTICS_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_STATISTICS_EVENTID\n"); - ret = ath6kl_wmi_stats_event_rx(wmi, datap, len, vif); - break; - case WMI_RSSI_THRESHOLD_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RSSI_THRESHOLD_EVENTID\n"); - ret = ath6kl_wmi_rssi_threshold_event_rx(wmi, datap, len); - break; - case WMI_ERROR_REPORT_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ERROR_REPORT_EVENTID\n"); - ath6kl_wmi_error_report_event(wmi, datap, len); - cfg80211_send_event_to_app(skb->dev, id, datap, len); - break; - case WMI_OPT_RX_FRAME_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_OPT_RX_FRAME_EVENTID\n"); - /* this event has been deprecated */ - break; - case WMI_REPORT_ROAM_TBL_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_ROAM_TBL_EVENTID\n"); - ret = ath6kl_wmi_roam_tbl_event_rx(wmi, datap, len); - break; - case WMI_EXTENSION_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_EXTENSION_EVENTID\n"); - ret = ath6kl_wmi_control_rx_xtnd(wmi, skb); - break; - case WMI_CAC_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CAC_EVENTID\n"); - ret = ath6kl_wmi_cac_event_rx(wmi, datap, len, vif); - break; - case WMI_CHANNEL_CHANGE_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CHANNEL_CHANGE_EVENTID\n"); - break; - case WMI_REPORT_ROAM_DATA_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_ROAM_DATA_EVENTID\n"); - break; - case WMI_TEST_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TEST_EVENTID\n"); - ret = ath6kl_wmi_test_rx(wmi, datap, len); - break; - case WMI_GET_FIXRATES_CMDID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_FIXRATES_CMDID\n"); - ret = ath6kl_wmi_ratemask_reply_rx(wmi, datap, len); - break; - case WMI_TX_RETRY_ERR_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_RETRY_ERR_EVENTID\n"); - cfg80211_send_event_to_app(skb->dev, id, datap, len); - break; - case WMI_SNR_THRESHOLD_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SNR_THRESHOLD_EVENTID\n"); - ret = ath6kl_wmi_snr_threshold_event_rx(wmi, datap, len); - break; - case WMI_LQ_THRESHOLD_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_LQ_THRESHOLD_EVENTID\n"); - cfg80211_send_event_to_app(skb->dev, id, datap, len); - break; - case WMI_APLIST_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_APLIST_EVENTID\n"); - ret = ath6kl_wmi_aplist_event_rx(wmi, datap, len); - break; - case WMI_GET_KEEPALIVE_CMDID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_KEEPALIVE_CMDID\n"); - ret = ath6kl_wmi_keepalive_reply_rx(wmi, datap, len); - break; - case WMI_GET_WOW_LIST_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_WOW_LIST_EVENTID\n"); - break; - case WMI_GET_PMKID_LIST_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_PMKID_LIST_EVENTID\n"); - ret = ath6kl_wmi_get_pmkid_list_event_rx(wmi, datap, len); - break; - case WMI_PSPOLL_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PSPOLL_EVENTID\n"); - ret = ath6kl_wmi_pspoll_event_rx(wmi, datap, len, vif); - break; - case WMI_DTIMEXPIRY_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DTIMEXPIRY_EVENTID\n"); - ret = ath6kl_wmi_dtimexpiry_event_rx(wmi, datap, len, vif); - break; - case WMI_SET_PARAMS_REPLY_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_PARAMS_REPLY_EVENTID\n"); - break; - case WMI_ADDBA_REQ_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_REQ_EVENTID\n"); - ret = ath6kl_wmi_addba_req_event_rx(wmi, datap, len, vif); - break; - case WMI_ADDBA_RESP_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_RESP_EVENTID\n"); - break; - case WMI_DELBA_REQ_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DELBA_REQ_EVENTID\n"); - ret = ath6kl_wmi_delba_req_event_rx(wmi, datap, len, vif); - break; - case WMI_REPORT_BTCOEX_CONFIG_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, - "WMI_REPORT_BTCOEX_CONFIG_EVENTID\n"); - break; - case WMI_REPORT_BTCOEX_STATS_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, - "WMI_REPORT_BTCOEX_STATS_EVENTID\n"); - break; - case WMI_TX_COMPLETE_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_COMPLETE_EVENTID\n"); - ret = ath6kl_wmi_tx_complete_event_rx(datap, len); - break; - case WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, - "WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID"); - ret = ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx(wmi, vif); - break; - case WMI_REMAIN_ON_CHNL_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REMAIN_ON_CHNL_EVENTID\n"); - ret = ath6kl_wmi_remain_on_chnl_event_rx(wmi, datap, len, vif); - break; - case WMI_CANCEL_REMAIN_ON_CHNL_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, - "WMI_CANCEL_REMAIN_ON_CHNL_EVENTID\n"); - ret = ath6kl_wmi_cancel_remain_on_chnl_event_rx(wmi, datap, - len, vif); - break; - case WMI_TX_STATUS_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_STATUS_EVENTID\n"); - ret = ath6kl_wmi_tx_status_event_rx(wmi, datap, len, vif); - break; - case WMI_RX_PROBE_REQ_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RX_PROBE_REQ_EVENTID\n"); - ret = ath6kl_wmi_rx_probe_req_event_rx(wmi, datap, len, vif); - break; - case WMI_P2P_CAPABILITIES_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_P2P_CAPABILITIES_EVENTID\n"); - ret = ath6kl_wmi_p2p_capabilities_event_rx(datap, len); - break; - case WMI_RX_ACTION_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RX_ACTION_EVENTID\n"); - ret = ath6kl_wmi_rx_action_event_rx(wmi, datap, len, vif); - break; - case WMI_P2P_INFO_EVENTID: - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_P2P_INFO_EVENTID\n"); - ret = ath6kl_wmi_p2p_info_event_rx(datap, len); - break; - default: - ath6kl_dbg(ATH6KL_DBG_WMI, "unknown cmd id 0x%x\n", id); - ret = -EINVAL; - break; - } - - dev_kfree_skb(skb); - - return ret; -} - -void ath6kl_wmi_reset(struct wmi *wmi) -{ - spin_lock_bh(&wmi->lock); - - wmi->fat_pipe_exist = 0; - memset(wmi->stream_exist_for_ac, 0, sizeof(wmi->stream_exist_for_ac)); - - spin_unlock_bh(&wmi->lock); -} - -void *ath6kl_wmi_init(struct ath6kl *dev) -{ - struct wmi *wmi; - - wmi = kzalloc(sizeof(struct wmi), GFP_KERNEL); - if (!wmi) - return NULL; - - spin_lock_init(&wmi->lock); - mutex_init(&wmi->lock_mgmt); - - wmi->parent_dev = dev; - - wmi->pwr_mode = REC_POWER; - - ath6kl_wmi_reset(wmi); - - return wmi; -} - -void ath6kl_wmi_shutdown(struct wmi *wmi) -{ - if (!wmi) - return; - - kfree(wmi->last_mgmt_tx_frame); - kfree(wmi); -} diff --git a/drivers/net/wireless/ath/ath6kl/wmi.h b/drivers/net/wireless/ath/ath6kl/wmi.h deleted file mode 100755 index 1e6c48d..0000000 --- a/drivers/net/wireless/ath/ath6kl/wmi.h +++ /dev/null @@ -1,2602 +0,0 @@ -/* - * Copyright (c) 2010-2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file contains the definitions of the WMI protocol specified in the - * Wireless Module Interface (WMI). It includes definitions of all the - * commands and events. Commands are messages from the host to the WM. - * Events and Replies are messages from the WM to the host. - */ - -#ifndef WMI_H -#define WMI_H - -#include - -#include "htc.h" - -#define HTC_PROTOCOL_VERSION 0x0002 -#define WMI_PROTOCOL_VERSION 0x0002 -#define WMI_CONTROL_MSG_MAX_LEN 256 -#define is_ethertype(type_or_len) ((type_or_len) >= 0x0600) - -#define IP_ETHERTYPE 0x0800 - -#define WMI_IMPLICIT_PSTREAM 0xFF -#define WMI_MAX_THINSTREAM 15 - -#define SSID_IE_LEN_INDEX 13 - -/* Host side link management data structures */ -#define SIG_QUALITY_THRESH_LVLS 6 -#define SIG_QUALITY_UPPER_THRESH_LVLS SIG_QUALITY_THRESH_LVLS -#define SIG_QUALITY_LOWER_THRESH_LVLS SIG_QUALITY_THRESH_LVLS - -#define A_BAND_24GHZ 0 -#define A_BAND_5GHZ 1 -#define A_NUM_BANDS 2 - -/* in ms */ -#define WMI_IMPLICIT_PSTREAM_INACTIVITY_INT 5000 - -/* - * There are no signed versions of __le16 and __le32, so for a temporary - * solution come up with our own version. The idea is from fs/ntfs/types.h. - * - * Use a_ prefix so that it doesn't conflict if we get proper support to - * linux/types.h. - */ -typedef __s16 __bitwise a_sle16; -typedef __s32 __bitwise a_sle32; - -static inline a_sle32 a_cpu_to_sle32(s32 val) -{ - return (__force a_sle32) cpu_to_le32(val); -} - -static inline s32 a_sle32_to_cpu(a_sle32 val) -{ - return le32_to_cpu((__force __le32) val); -} - -static inline a_sle16 a_cpu_to_sle16(s16 val) -{ - return (__force a_sle16) cpu_to_le16(val); -} - -static inline s16 a_sle16_to_cpu(a_sle16 val) -{ - return le16_to_cpu((__force __le16) val); -} - -struct sq_threshold_params { - s16 upper_threshold[SIG_QUALITY_UPPER_THRESH_LVLS]; - s16 lower_threshold[SIG_QUALITY_LOWER_THRESH_LVLS]; - u32 upper_threshold_valid_count; - u32 lower_threshold_valid_count; - u32 polling_interval; - u8 weight; - u8 last_rssi; - u8 last_rssi_poll_event; -}; - -struct wmi_data_sync_bufs { - u8 traffic_class; - struct sk_buff *skb; -}; - -/* WMM stream classes */ -#define WMM_NUM_AC 4 -#define WMM_AC_BE 0 /* best effort */ -#define WMM_AC_BK 1 /* background */ -#define WMM_AC_VI 2 /* video */ -#define WMM_AC_VO 3 /* voice */ - -#define WMI_VOICE_USER_PRIORITY 0x7 - -struct wmi { - u16 stream_exist_for_ac[WMM_NUM_AC]; - u8 fat_pipe_exist; - struct ath6kl *parent_dev; - u8 pwr_mode; - spinlock_t lock; - struct mutex lock_mgmt; - enum htc_endpoint_id ep_id; - struct sq_threshold_params - sq_threshld[SIGNAL_QUALITY_METRICS_NUM_MAX]; - bool is_wmm_enabled; - u8 traffic_class; - bool is_probe_ssid; - - u8 *last_mgmt_tx_frame; - size_t last_mgmt_tx_frame_len; - u8 saved_pwr_mode; -}; - -struct host_app_area { - __le32 wmi_protocol_ver; -} __packed; - -enum wmi_msg_type { - DATA_MSGTYPE = 0x0, - CNTL_MSGTYPE, - SYNC_MSGTYPE, - OPT_MSGTYPE, -}; - -/* - * Macros for operating on WMI_DATA_HDR (info) field - */ - -#define WMI_DATA_HDR_MSG_TYPE_MASK 0x03 -#define WMI_DATA_HDR_MSG_TYPE_SHIFT 0 -#define WMI_DATA_HDR_UP_MASK 0x07 -#define WMI_DATA_HDR_UP_SHIFT 2 - -/* In AP mode, the same bit (b5) is used to indicate Power save state in - * the Rx dir and More data bit state in the tx direction. - */ -#define WMI_DATA_HDR_PS_MASK 0x1 -#define WMI_DATA_HDR_PS_SHIFT 5 - -#define WMI_DATA_HDR_MORE 0x20 - -enum wmi_data_hdr_data_type { - WMI_DATA_HDR_DATA_TYPE_802_3 = 0, - WMI_DATA_HDR_DATA_TYPE_802_11, - - /* used to be used for the PAL */ - WMI_DATA_HDR_DATA_TYPE_ACL, -}; - -/* Bitmap of data header flags */ -enum wmi_data_hdr_flags { - WMI_DATA_HDR_FLAGS_MORE = 0x1, - WMI_DATA_HDR_FLAGS_EOSP = 0x2, - WMI_DATA_HDR_FLAGS_UAPSD = 0x4, -}; - -#define WMI_DATA_HDR_DATA_TYPE_MASK 0x3 -#define WMI_DATA_HDR_DATA_TYPE_SHIFT 6 - -/* Macros for operating on WMI_DATA_HDR (info2) field */ -#define WMI_DATA_HDR_SEQNO_MASK 0xFFF -#define WMI_DATA_HDR_SEQNO_SHIFT 0 - -#define WMI_DATA_HDR_AMSDU_MASK 0x1 -#define WMI_DATA_HDR_AMSDU_SHIFT 12 - -#define WMI_DATA_HDR_META_MASK 0x7 -#define WMI_DATA_HDR_META_SHIFT 13 - -/* Macros for operating on WMI_DATA_HDR (info3) field */ -#define WMI_DATA_HDR_IF_IDX_MASK 0xF - -#define WMI_DATA_HDR_TRIG 0x10 -#define WMI_DATA_HDR_EOSP 0x10 - -struct wmi_data_hdr { - s8 rssi; - - /* - * usage of 'info' field(8-bit): - * - * b1:b0 - WMI_MSG_TYPE - * b4:b3:b2 - UP(tid) - * b5 - Used in AP mode. - * More-data in tx dir, PS in rx. - * b7:b6 - Dot3 header(0), - * Dot11 Header(1), - * ACL data(2) - */ - u8 info; - - /* - * usage of 'info2' field(16-bit): - * - * b11:b0 - seq_no - * b12 - A-MSDU? - * b15:b13 - META_DATA_VERSION 0 - 7 - */ - __le16 info2; - - /* - * usage of info3, 16-bit: - * b3:b0 - Interface index - * b4 - uAPSD trigger in rx & EOSP in tx - * b15:b5 - Reserved - */ - __le16 info3; -} __packed; - -static inline u8 wmi_data_hdr_get_up(struct wmi_data_hdr *dhdr) -{ - return (dhdr->info >> WMI_DATA_HDR_UP_SHIFT) & WMI_DATA_HDR_UP_MASK; -} - -static inline void wmi_data_hdr_set_up(struct wmi_data_hdr *dhdr, - u8 usr_pri) -{ - dhdr->info &= ~(WMI_DATA_HDR_UP_MASK << WMI_DATA_HDR_UP_SHIFT); - dhdr->info |= usr_pri << WMI_DATA_HDR_UP_SHIFT; -} - -static inline u8 wmi_data_hdr_get_dot11(struct wmi_data_hdr *dhdr) -{ - u8 data_type; - - data_type = (dhdr->info >> WMI_DATA_HDR_DATA_TYPE_SHIFT) & - WMI_DATA_HDR_DATA_TYPE_MASK; - return (data_type == WMI_DATA_HDR_DATA_TYPE_802_11); -} - -static inline u16 wmi_data_hdr_get_seqno(struct wmi_data_hdr *dhdr) -{ - return (le16_to_cpu(dhdr->info2) >> WMI_DATA_HDR_SEQNO_SHIFT) & - WMI_DATA_HDR_SEQNO_MASK; -} - -static inline u8 wmi_data_hdr_is_amsdu(struct wmi_data_hdr *dhdr) -{ - return (le16_to_cpu(dhdr->info2) >> WMI_DATA_HDR_AMSDU_SHIFT) & - WMI_DATA_HDR_AMSDU_MASK; -} - -static inline u8 wmi_data_hdr_get_meta(struct wmi_data_hdr *dhdr) -{ - return (le16_to_cpu(dhdr->info2) >> WMI_DATA_HDR_META_SHIFT) & - WMI_DATA_HDR_META_MASK; -} - -static inline u8 wmi_data_hdr_get_if_idx(struct wmi_data_hdr *dhdr) -{ - return le16_to_cpu(dhdr->info3) & WMI_DATA_HDR_IF_IDX_MASK; -} - -/* Tx meta version definitions */ -#define WMI_MAX_TX_META_SZ 12 -#define WMI_META_VERSION_1 0x01 -#define WMI_META_VERSION_2 0x02 - -/* Flag to signal to FW to calculate TCP checksum */ -#define WMI_META_V2_FLAG_CSUM_OFFLOAD 0x01 - -struct wmi_tx_meta_v1 { - /* packet ID to identify the tx request */ - u8 pkt_id; - - /* rate policy to be used for the tx of this frame */ - u8 rate_plcy_id; -} __packed; - -struct wmi_tx_meta_v2 { - /* - * Offset from start of the WMI header for csum calculation to - * begin. - */ - u8 csum_start; - - /* offset from start of WMI header where final csum goes */ - u8 csum_dest; - - /* no of bytes over which csum is calculated */ - u8 csum_flags; -} __packed; - -struct wmi_rx_meta_v1 { - u8 status; - - /* rate index mapped to rate at which this packet was received. */ - u8 rix; - - /* rssi of packet */ - u8 rssi; - - /* rf channel during packet reception */ - u8 channel; - - __le16 flags; -} __packed; - -struct wmi_rx_meta_v2 { - __le16 csum; - - /* bit 0 set -partial csum valid bit 1 set -test mode */ - u8 csum_flags; -} __packed; - -#define WMI_CMD_HDR_IF_ID_MASK 0xF - -/* Control Path */ -struct wmi_cmd_hdr { - __le16 cmd_id; - - /* info1 - 16 bits - * b03:b00 - id - * b15:b04 - unused */ - __le16 info1; - - /* for alignment */ - __le16 reserved; -} __packed; - -static inline u8 wmi_cmd_hdr_get_if_idx(struct wmi_cmd_hdr *chdr) -{ - return le16_to_cpu(chdr->info1) & WMI_CMD_HDR_IF_ID_MASK; -} - -/* List of WMI commands */ -enum wmi_cmd_id { - WMI_CONNECT_CMDID = 0x0001, - WMI_RECONNECT_CMDID, - WMI_DISCONNECT_CMDID, - WMI_SYNCHRONIZE_CMDID, - WMI_CREATE_PSTREAM_CMDID, - WMI_DELETE_PSTREAM_CMDID, - /* WMI_START_SCAN_CMDID is to be deprecated. Use - * WMI_BEGIN_SCAN_CMDID instead. The new cmd supports P2P mgmt - * operations using station interface. - */ - WMI_START_SCAN_CMDID, - WMI_SET_SCAN_PARAMS_CMDID, - WMI_SET_BSS_FILTER_CMDID, - WMI_SET_PROBED_SSID_CMDID, /* 10 */ - WMI_SET_LISTEN_INT_CMDID, - WMI_SET_BMISS_TIME_CMDID, - WMI_SET_DISC_TIMEOUT_CMDID, - WMI_GET_CHANNEL_LIST_CMDID, - WMI_SET_BEACON_INT_CMDID, - WMI_GET_STATISTICS_CMDID, - WMI_SET_CHANNEL_PARAMS_CMDID, - WMI_SET_POWER_MODE_CMDID, - WMI_SET_IBSS_PM_CAPS_CMDID, - WMI_SET_POWER_PARAMS_CMDID, /* 20 */ - WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID, - WMI_ADD_CIPHER_KEY_CMDID, - WMI_DELETE_CIPHER_KEY_CMDID, - WMI_ADD_KRK_CMDID, - WMI_DELETE_KRK_CMDID, - WMI_SET_PMKID_CMDID, - WMI_SET_TX_PWR_CMDID, - WMI_GET_TX_PWR_CMDID, - WMI_SET_ASSOC_INFO_CMDID, - WMI_ADD_BAD_AP_CMDID, /* 30 */ - WMI_DELETE_BAD_AP_CMDID, - WMI_SET_TKIP_COUNTERMEASURES_CMDID, - WMI_RSSI_THRESHOLD_PARAMS_CMDID, - WMI_TARGET_ERROR_REPORT_BITMASK_CMDID, - WMI_SET_ACCESS_PARAMS_CMDID, - WMI_SET_RETRY_LIMITS_CMDID, - WMI_SET_OPT_MODE_CMDID, - WMI_OPT_TX_FRAME_CMDID, - WMI_SET_VOICE_PKT_SIZE_CMDID, - WMI_SET_MAX_SP_LEN_CMDID, /* 40 */ - WMI_SET_ROAM_CTRL_CMDID, - WMI_GET_ROAM_TBL_CMDID, - WMI_GET_ROAM_DATA_CMDID, - WMI_ENABLE_RM_CMDID, - WMI_SET_MAX_OFFHOME_DURATION_CMDID, - WMI_EXTENSION_CMDID, /* Non-wireless extensions */ - WMI_SNR_THRESHOLD_PARAMS_CMDID, - WMI_LQ_THRESHOLD_PARAMS_CMDID, - WMI_SET_LPREAMBLE_CMDID, - WMI_SET_RTS_CMDID, /* 50 */ - WMI_CLR_RSSI_SNR_CMDID, - WMI_SET_FIXRATES_CMDID, - WMI_GET_FIXRATES_CMDID, - WMI_SET_AUTH_MODE_CMDID, - WMI_SET_REASSOC_MODE_CMDID, - WMI_SET_WMM_CMDID, - WMI_SET_WMM_TXOP_CMDID, - WMI_TEST_CMDID, - - /* COEX AR6002 only */ - WMI_SET_BT_STATUS_CMDID, - WMI_SET_BT_PARAMS_CMDID, /* 60 */ - - WMI_SET_KEEPALIVE_CMDID, - WMI_GET_KEEPALIVE_CMDID, - WMI_SET_APPIE_CMDID, - WMI_GET_APPIE_CMDID, - WMI_SET_WSC_STATUS_CMDID, - - /* Wake on Wireless */ - WMI_SET_HOST_SLEEP_MODE_CMDID, - WMI_SET_WOW_MODE_CMDID, - WMI_GET_WOW_LIST_CMDID, - WMI_ADD_WOW_PATTERN_CMDID, - WMI_DEL_WOW_PATTERN_CMDID, /* 70 */ - - WMI_SET_FRAMERATES_CMDID, - WMI_SET_AP_PS_CMDID, - WMI_SET_QOS_SUPP_CMDID, - WMI_SET_IE_CMDID, - - /* WMI_THIN_RESERVED_... mark the start and end - * values for WMI_THIN_RESERVED command IDs. These - * command IDs can be found in wmi_thin.h */ - WMI_THIN_RESERVED_START = 0x8000, - WMI_THIN_RESERVED_END = 0x8fff, - - /* Developer commands starts at 0xF000 */ - WMI_SET_BITRATE_CMDID = 0xF000, - WMI_GET_BITRATE_CMDID, - WMI_SET_WHALPARAM_CMDID, - WMI_SET_MAC_ADDRESS_CMDID, - WMI_SET_AKMP_PARAMS_CMDID, - WMI_SET_PMKID_LIST_CMDID, - WMI_GET_PMKID_LIST_CMDID, - WMI_ABORT_SCAN_CMDID, - WMI_SET_TARGET_EVENT_REPORT_CMDID, - - /* Unused */ - WMI_UNUSED1, - WMI_UNUSED2, - - /* AP mode commands */ - WMI_AP_HIDDEN_SSID_CMDID, - WMI_AP_SET_NUM_STA_CMDID, - WMI_AP_ACL_POLICY_CMDID, - WMI_AP_ACL_MAC_LIST_CMDID, - WMI_AP_CONFIG_COMMIT_CMDID, - WMI_AP_SET_MLME_CMDID, - WMI_AP_SET_PVB_CMDID, - WMI_AP_CONN_INACT_CMDID, - WMI_AP_PROT_SCAN_TIME_CMDID, - WMI_AP_SET_COUNTRY_CMDID, - WMI_AP_SET_DTIM_CMDID, - WMI_AP_MODE_STAT_CMDID, - - WMI_SET_IP_CMDID, - WMI_SET_PARAMS_CMDID, - WMI_SET_MCAST_FILTER_CMDID, - WMI_DEL_MCAST_FILTER_CMDID, - - WMI_ALLOW_AGGR_CMDID, - WMI_ADDBA_REQ_CMDID, - WMI_DELBA_REQ_CMDID, - WMI_SET_HT_CAP_CMDID, - WMI_SET_HT_OP_CMDID, - WMI_SET_TX_SELECT_RATES_CMDID, - WMI_SET_TX_SGI_PARAM_CMDID, - WMI_SET_RATE_POLICY_CMDID, - - WMI_HCI_CMD_CMDID, - WMI_RX_FRAME_FORMAT_CMDID, - WMI_SET_THIN_MODE_CMDID, - WMI_SET_BT_WLAN_CONN_PRECEDENCE_CMDID, - - WMI_AP_SET_11BG_RATESET_CMDID, - WMI_SET_PMK_CMDID, - WMI_MCAST_FILTER_CMDID, - - /* COEX CMDID AR6003 */ - WMI_SET_BTCOEX_FE_ANT_CMDID, - WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMDID, - WMI_SET_BTCOEX_SCO_CONFIG_CMDID, - WMI_SET_BTCOEX_A2DP_CONFIG_CMDID, - WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMDID, - WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMDID, - WMI_SET_BTCOEX_DEBUG_CMDID, - WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID, - WMI_GET_BTCOEX_STATS_CMDID, - WMI_GET_BTCOEX_CONFIG_CMDID, - - WMI_SET_DFS_ENABLE_CMDID, /* F034 */ - WMI_SET_DFS_MINRSSITHRESH_CMDID, - WMI_SET_DFS_MAXPULSEDUR_CMDID, - WMI_DFS_RADAR_DETECTED_CMDID, - - /* P2P commands */ - WMI_P2P_SET_CONFIG_CMDID, /* F038 */ - WMI_WPS_SET_CONFIG_CMDID, - WMI_SET_REQ_DEV_ATTR_CMDID, - WMI_P2P_FIND_CMDID, - WMI_P2P_STOP_FIND_CMDID, - WMI_P2P_GO_NEG_START_CMDID, - WMI_P2P_LISTEN_CMDID, - - WMI_CONFIG_TX_MAC_RULES_CMDID, /* F040 */ - WMI_SET_PROMISCUOUS_MODE_CMDID, - WMI_RX_FRAME_FILTER_CMDID, - WMI_SET_CHANNEL_CMDID, - - /* WAC commands */ - WMI_ENABLE_WAC_CMDID, - WMI_WAC_SCAN_REPLY_CMDID, - WMI_WAC_CTRL_REQ_CMDID, - WMI_SET_DIV_PARAMS_CMDID, - - WMI_GET_PMK_CMDID, - WMI_SET_PASSPHRASE_CMDID, - WMI_SEND_ASSOC_RES_CMDID, - WMI_SET_ASSOC_REQ_RELAY_CMDID, - - /* ACS command, consists of sub-commands */ - WMI_ACS_CTRL_CMDID, - WMI_SET_EXCESS_TX_RETRY_THRES_CMDID, - WMI_SET_TBD_TIME_CMDID, /*added for wmiconfig command for TBD */ - - /* Pktlog cmds */ - WMI_PKTLOG_ENABLE_CMDID, - WMI_PKTLOG_DISABLE_CMDID, - - /* More P2P Cmds */ - WMI_P2P_GO_NEG_REQ_RSP_CMDID, - WMI_P2P_GRP_INIT_CMDID, - WMI_P2P_GRP_FORMATION_DONE_CMDID, - WMI_P2P_INVITE_CMDID, - WMI_P2P_INVITE_REQ_RSP_CMDID, - WMI_P2P_PROV_DISC_REQ_CMDID, - WMI_P2P_SET_CMDID, - - WMI_GET_RFKILL_MODE_CMDID, - WMI_SET_RFKILL_MODE_CMDID, - WMI_AP_SET_APSD_CMDID, - WMI_AP_APSD_BUFFERED_TRAFFIC_CMDID, - - WMI_P2P_SDPD_TX_CMDID, /* F05C */ - WMI_P2P_STOP_SDPD_CMDID, - WMI_P2P_CANCEL_CMDID, - /* Ultra low power store / recall commands */ - WMI_STORERECALL_CONFIGURE_CMDID, - WMI_STORERECALL_RECALL_CMDID, - WMI_STORERECALL_HOST_READY_CMDID, - WMI_FORCE_TARGET_ASSERT_CMDID, - - WMI_SET_PROBED_SSID_EX_CMDID, - WMI_SET_NETWORK_LIST_OFFLOAD_CMDID, - WMI_SET_ARP_NS_OFFLOAD_CMDID, - WMI_ADD_WOW_EXT_PATTERN_CMDID, - WMI_GTK_OFFLOAD_OP_CMDID, - WMI_REMAIN_ON_CHNL_CMDID, - WMI_CANCEL_REMAIN_ON_CHNL_CMDID, - /* WMI_SEND_ACTION_CMDID is to be deprecated. Use - * WMI_SEND_MGMT_CMDID instead. The new cmd supports P2P mgmt - * operations using station interface. - */ - WMI_SEND_ACTION_CMDID, - WMI_PROBE_REQ_REPORT_CMDID, - WMI_DISABLE_11B_RATES_CMDID, - WMI_SEND_PROBE_RESPONSE_CMDID, - WMI_GET_P2P_INFO_CMDID, - WMI_AP_JOIN_BSS_CMDID, - - WMI_SMPS_ENABLE_CMDID, - WMI_SMPS_CONFIG_CMDID, - WMI_SET_RATECTRL_PARM_CMDID, - /* LPL specific commands*/ - WMI_LPL_FORCE_ENABLE_CMDID, - WMI_LPL_SET_POLICY_CMDID, - WMI_LPL_GET_POLICY_CMDID, - WMI_LPL_GET_HWSTATE_CMDID, - WMI_LPL_SET_PARAMS_CMDID, - WMI_LPL_GET_PARAMS_CMDID, - - WMI_SET_BUNDLE_PARAM_CMDID, - - /*GreenTx specific commands*/ - - WMI_GREENTX_PARAMS_CMDID, - - WMI_RTT_MEASREQ_CMDID, - WMI_RTT_CAPREQ_CMDID, - WMI_RTT_STATUSREQ_CMDID, - - /* WPS Commands */ - WMI_WPS_START_CMDID, - WMI_GET_WPS_STATUS_CMDID, - - /* More P2P commands */ - WMI_SET_NOA_CMDID, - WMI_GET_NOA_CMDID, - WMI_SET_OPPPS_CMDID, - WMI_GET_OPPPS_CMDID, - WMI_ADD_PORT_CMDID, - WMI_DEL_PORT_CMDID, - - /* 802.11w cmd */ - WMI_SET_RSN_CAP_CMDID, - WMI_GET_RSN_CAP_CMDID, - WMI_SET_IGTK_CMDID, - - WMI_RX_FILTER_COALESCE_FILTER_OP_CMDID, - WMI_RX_FILTER_SET_FRAME_TEST_LIST_CMDID, - - WMI_SEND_MGMT_CMDID, - WMI_BEGIN_SCAN_CMDID, - - WMI_SET_MCASTRATE_CMDID, -}; - -enum wmi_mgmt_frame_type { - WMI_FRAME_BEACON = 0, - WMI_FRAME_PROBE_REQ, - WMI_FRAME_PROBE_RESP, - WMI_FRAME_ASSOC_REQ, - WMI_FRAME_ASSOC_RESP, - WMI_NUM_MGMT_FRAME -}; - -enum wmi_ie_field_type { - WMI_RSN_IE_CAPB = 0x1, - WMI_IE_FULL = 0xFF /* indicats full IE */ -}; - -/* WMI_CONNECT_CMDID */ -enum network_type { - INFRA_NETWORK = 0x01, - ADHOC_NETWORK = 0x02, - ADHOC_CREATOR = 0x04, - AP_NETWORK = 0x10, -}; - -enum network_subtype { - SUBTYPE_NONE, - SUBTYPE_BT, - SUBTYPE_P2PDEV, - SUBTYPE_P2PCLIENT, - SUBTYPE_P2PGO, -}; - -enum dot11_auth_mode { - OPEN_AUTH = 0x01, - SHARED_AUTH = 0x02, - - /* different from IEEE_AUTH_MODE definitions */ - LEAP_AUTH = 0x04, -}; - -enum auth_mode { - NONE_AUTH = 0x01, - WPA_AUTH = 0x02, - WPA2_AUTH = 0x04, - WPA_PSK_AUTH = 0x08, - WPA2_PSK_AUTH = 0x10, - WPA_AUTH_CCKM = 0x20, - WPA2_AUTH_CCKM = 0x40, -}; - -#define WMI_MAX_KEY_INDEX 3 - -#define WMI_MAX_KEY_LEN 32 - -/* - * NB: these values are ordered carefully; there are lots of - * of implications in any reordering. In particular beware - * that 4 is not used to avoid conflicting with IEEE80211_F_PRIVACY. - */ -#define ATH6KL_CIPHER_WEP 0 -#define ATH6KL_CIPHER_TKIP 1 -#define ATH6KL_CIPHER_AES_OCB 2 -#define ATH6KL_CIPHER_AES_CCM 3 -#define ATH6KL_CIPHER_CKIP 5 -#define ATH6KL_CIPHER_CCKM_KRK 6 -#define ATH6KL_CIPHER_NONE 7 /* pseudo value */ - -/* - * 802.11 rate set. - */ -#define ATH6KL_RATE_MAXSIZE 15 /* max rates we'll handle */ - -#define ATH_OUI_TYPE 0x01 -#define WPA_OUI_TYPE 0x01 -#define WMM_PARAM_OUI_SUBTYPE 0x01 -#define WMM_OUI_TYPE 0x02 -#define WSC_OUT_TYPE 0x04 - -enum wmi_connect_ctrl_flags_bits { - CONNECT_ASSOC_POLICY_USER = 0x0001, - CONNECT_SEND_REASSOC = 0x0002, - CONNECT_IGNORE_WPAx_GROUP_CIPHER = 0x0004, - CONNECT_PROFILE_MATCH_DONE = 0x0008, - CONNECT_IGNORE_AAC_BEACON = 0x0010, - CONNECT_CSA_FOLLOW_BSS = 0x0020, - CONNECT_DO_WPA_OFFLOAD = 0x0040, - CONNECT_DO_NOT_DEAUTH = 0x0080, - CONNECT_WPS_FLAG = 0x0100, -}; - -struct wmi_connect_cmd { - u8 nw_type; - u8 dot11_auth_mode; - u8 auth_mode; - u8 prwise_crypto_type; - u8 prwise_crypto_len; - u8 grp_crypto_type; - u8 grp_crypto_len; - u8 ssid_len; - u8 ssid[IEEE80211_MAX_SSID_LEN]; - __le16 ch; - u8 bssid[ETH_ALEN]; - __le32 ctrl_flags; - u8 nw_subtype; -} __packed; - -/* WMI_RECONNECT_CMDID */ -struct wmi_reconnect_cmd { - /* channel hint */ - __le16 channel; - - /* mandatory if set */ - u8 bssid[ETH_ALEN]; -} __packed; - -/* WMI_ADD_CIPHER_KEY_CMDID */ -enum key_usage { - PAIRWISE_USAGE = 0x00, - GROUP_USAGE = 0x01, - - /* default Tx Key - static WEP only */ - TX_USAGE = 0x02, -}; - -/* - * Bit Flag - * Bit 0 - Initialise TSC - default is Initialize - */ -#define KEY_OP_INIT_TSC 0x01 -#define KEY_OP_INIT_RSC 0x02 - -/* default initialise the TSC & RSC */ -#define KEY_OP_INIT_VAL 0x03 -#define KEY_OP_VALID_MASK 0x03 - -struct wmi_add_cipher_key_cmd { - u8 key_index; - u8 key_type; - - /* enum key_usage */ - u8 key_usage; - - u8 key_len; - - /* key replay sequence counter */ - u8 key_rsc[8]; - - u8 key[WLAN_MAX_KEY_LEN]; - - /* additional key control info */ - u8 key_op_ctrl; - - u8 key_mac_addr[ETH_ALEN]; -} __packed; - -/* WMI_DELETE_CIPHER_KEY_CMDID */ -struct wmi_delete_cipher_key_cmd { - u8 key_index; -} __packed; - -#define WMI_KRK_LEN 16 - -/* WMI_ADD_KRK_CMDID */ -struct wmi_add_krk_cmd { - u8 krk[WMI_KRK_LEN]; -} __packed; - -/* WMI_SETPMKID_CMDID */ - -#define WMI_PMKID_LEN 16 - -enum pmkid_enable_flg { - PMKID_DISABLE = 0, - PMKID_ENABLE = 1, -}; - -struct wmi_setpmkid_cmd { - u8 bssid[ETH_ALEN]; - - /* enum pmkid_enable_flg */ - u8 enable; - - u8 pmkid[WMI_PMKID_LEN]; -} __packed; - -/* WMI_START_SCAN_CMD */ -enum wmi_scan_type { - WMI_LONG_SCAN = 0, - WMI_SHORT_SCAN = 1, -}; - -struct wmi_supp_rates { - u8 nrates; - u8 rates[ATH6KL_RATE_MAXSIZE]; -}; - -struct wmi_begin_scan_cmd { - __le32 force_fg_scan; - - /* for legacy cisco AP compatibility */ - __le32 is_legacy; - - /* max duration in the home channel(msec) */ - __le32 home_dwell_time; - - /* time interval between scans (msec) */ - __le32 force_scan_intvl; - - /* no CCK rates */ - __le32 no_cck; - - /* enum wmi_scan_type */ - u8 scan_type; - - /* Supported rates to advertise in the probe request frames */ - struct wmi_supp_rates supp_rates[IEEE80211_NUM_BANDS]; - - /* how many channels follow */ - u8 num_ch; - - /* channels in Mhz */ - __le16 ch_list[1]; -} __packed; - -/* wmi_start_scan_cmd is to be deprecated. Use - * wmi_begin_scan_cmd instead. The new structure supports P2P mgmt - * operations using station interface. - */ -struct wmi_start_scan_cmd { - __le32 force_fg_scan; - - /* for legacy cisco AP compatibility */ - __le32 is_legacy; - - /* max duration in the home channel(msec) */ - __le32 home_dwell_time; - - /* time interval between scans (msec) */ - __le32 force_scan_intvl; - - /* enum wmi_scan_type */ - u8 scan_type; - - /* how many channels follow */ - u8 num_ch; - - /* channels in Mhz */ - __le16 ch_list[1]; -} __packed; - -/* - * Warning: scan control flag value of 0xFF is used to disable - * all flags in WMI_SCAN_PARAMS_CMD. Do not add any more - * flags here - */ -enum wmi_scan_ctrl_flags_bits { - - /* set if can scan in the connect cmd */ - CONNECT_SCAN_CTRL_FLAGS = 0x01, - - /* set if scan for the SSID it is already connected to */ - SCAN_CONNECTED_CTRL_FLAGS = 0x02, - - /* set if enable active scan */ - ACTIVE_SCAN_CTRL_FLAGS = 0x04, - - /* set if enable roam scan when bmiss and lowrssi */ - ROAM_SCAN_CTRL_FLAGS = 0x08, - - /* set if follows customer BSSINFO reporting rule */ - REPORT_BSSINFO_CTRL_FLAGS = 0x10, - - /* if disabled, target doesn't scan after a disconnect event */ - ENABLE_AUTO_CTRL_FLAGS = 0x20, - - /* - * Scan complete event with canceled status will be generated when - * a scan is prempted before it gets completed. - */ - ENABLE_SCAN_ABORT_EVENT = 0x40 -}; - -struct wmi_scan_params_cmd { - /* sec */ - __le16 fg_start_period; - - /* sec */ - __le16 fg_end_period; - - /* sec */ - __le16 bg_period; - - /* msec */ - __le16 maxact_chdwell_time; - - /* msec */ - __le16 pas_chdwell_time; - - /* how many shorts scan for one long */ - u8 short_scan_ratio; - - u8 scan_ctrl_flags; - - /* msec */ - __le16 minact_chdwell_time; - - /* max active scans per ssid */ - __le16 maxact_scan_per_ssid; - - /* msecs */ - __le32 max_dfsch_act_time; -} __packed; - -/* WMI_SET_BSS_FILTER_CMDID */ -enum wmi_bss_filter { - /* no beacons forwarded */ - NONE_BSS_FILTER = 0x0, - - /* all beacons forwarded */ - ALL_BSS_FILTER, - - /* only beacons matching profile */ - PROFILE_FILTER, - - /* all but beacons matching profile */ - ALL_BUT_PROFILE_FILTER, - - /* only beacons matching current BSS */ - CURRENT_BSS_FILTER, - - /* all but beacons matching BSS */ - ALL_BUT_BSS_FILTER, - - /* beacons matching probed ssid */ - PROBED_SSID_FILTER, - - /* marker only */ - LAST_BSS_FILTER, -}; - -struct wmi_bss_filter_cmd { - /* see, enum wmi_bss_filter */ - u8 bss_filter; - - /* for alignment */ - u8 reserved1; - - /* for alignment */ - __le16 reserved2; - - __le32 ie_mask; -} __packed; - -/* WMI_SET_PROBED_SSID_CMDID */ -#define MAX_PROBED_SSIDS 16 - -enum wmi_ssid_flag { - /* disables entry */ - DISABLE_SSID_FLAG = 0, - - /* probes specified ssid */ - SPECIFIC_SSID_FLAG = 0x01, - - /* probes for any ssid */ - ANY_SSID_FLAG = 0x02, -}; - -struct wmi_probed_ssid_cmd { - /* 0 to MAX_PROBED_SSIDS - 1 */ - u8 entry_index; - - /* see, enum wmi_ssid_flg */ - u8 flag; - - u8 ssid_len; - u8 ssid[IEEE80211_MAX_SSID_LEN]; -} __packed; - -/* - * WMI_SET_LISTEN_INT_CMDID - * The Listen interval is between 15 and 3000 TUs - */ -struct wmi_listen_int_cmd { - __le16 listen_intvl; - __le16 num_beacons; -} __packed; - -/* WMI_SET_BMISS_TIME_CMDID */ -struct wmi_bmiss_time_cmd { - __le16 bmiss_time; - __le16 num_beacons; -}; - -/* WMI_SET_POWER_MODE_CMDID */ -enum wmi_power_mode { - REC_POWER = 0x01, - MAX_PERF_POWER, -}; - -struct wmi_power_mode_cmd { - /* see, enum wmi_power_mode */ - u8 pwr_mode; -} __packed; - -/* - * Policy to determnine whether power save failure event should be sent to - * host during scanning - */ -enum power_save_fail_event_policy { - SEND_POWER_SAVE_FAIL_EVENT_ALWAYS = 1, - IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN = 2, -}; - -struct wmi_power_params_cmd { - /* msec */ - __le16 idle_period; - - __le16 pspoll_number; - __le16 dtim_policy; - __le16 tx_wakeup_policy; - __le16 num_tx_to_wakeup; - __le16 ps_fail_event_policy; -} __packed; - -/* WMI_SET_DISC_TIMEOUT_CMDID */ -struct wmi_disc_timeout_cmd { - /* seconds */ - u8 discon_timeout; -} __packed; - -enum dir_type { - UPLINK_TRAFFIC = 0, - DNLINK_TRAFFIC = 1, - BIDIR_TRAFFIC = 2, -}; - -enum voiceps_cap_type { - DISABLE_FOR_THIS_AC = 0, - ENABLE_FOR_THIS_AC = 1, - ENABLE_FOR_ALL_AC = 2, -}; - -enum traffic_type { - TRAFFIC_TYPE_APERIODIC = 0, - TRAFFIC_TYPE_PERIODIC = 1, -}; - -/* WMI_SYNCHRONIZE_CMDID */ -struct wmi_sync_cmd { - u8 data_sync_map; -} __packed; - -/* WMI_CREATE_PSTREAM_CMDID */ -struct wmi_create_pstream_cmd { - /* msec */ - __le32 min_service_int; - - /* msec */ - __le32 max_service_int; - - /* msec */ - __le32 inactivity_int; - - /* msec */ - __le32 suspension_int; - - __le32 service_start_time; - - /* in bps */ - __le32 min_data_rate; - - /* in bps */ - __le32 mean_data_rate; - - /* in bps */ - __le32 peak_data_rate; - - __le32 max_burst_size; - __le32 delay_bound; - - /* in bps */ - __le32 min_phy_rate; - - __le32 sba; - __le32 medium_time; - - /* in octects */ - __le16 nominal_msdu; - - /* in octects */ - __le16 max_msdu; - - u8 traffic_class; - - /* see, enum dir_type */ - u8 traffic_direc; - - u8 rx_queue_num; - - /* see, enum traffic_type */ - u8 traffic_type; - - /* see, enum voiceps_cap_type */ - u8 voice_psc_cap; - u8 tsid; - - /* 802.1D user priority */ - u8 user_pri; - - /* nominal phy rate */ - u8 nominal_phy; -} __packed; - -/* WMI_DELETE_PSTREAM_CMDID */ -struct wmi_delete_pstream_cmd { - u8 tx_queue_num; - u8 rx_queue_num; - u8 traffic_direc; - u8 traffic_class; - u8 tsid; -} __packed; - -/* WMI_SET_CHANNEL_PARAMS_CMDID */ -enum wmi_phy_mode { - WMI_11A_MODE = 0x1, - WMI_11G_MODE = 0x2, - WMI_11AG_MODE = 0x3, - WMI_11B_MODE = 0x4, - WMI_11GONLY_MODE = 0x5, -}; - -#define WMI_MAX_CHANNELS 32 - -/* - * WMI_RSSI_THRESHOLD_PARAMS_CMDID - * Setting the polltime to 0 would disable polling. Threshold values are - * in the ascending order, and should agree to: - * (lowThreshold_lowerVal < lowThreshold_upperVal < highThreshold_lowerVal - * < highThreshold_upperVal) - */ - -struct wmi_rssi_threshold_params_cmd { - /* polling time as a factor of LI */ - __le32 poll_time; - - /* lowest of upper */ - a_sle16 thresh_above1_val; - - a_sle16 thresh_above2_val; - a_sle16 thresh_above3_val; - a_sle16 thresh_above4_val; - a_sle16 thresh_above5_val; - - /* highest of upper */ - a_sle16 thresh_above6_val; - - /* lowest of bellow */ - a_sle16 thresh_below1_val; - - a_sle16 thresh_below2_val; - a_sle16 thresh_below3_val; - a_sle16 thresh_below4_val; - a_sle16 thresh_below5_val; - - /* highest of bellow */ - a_sle16 thresh_below6_val; - - /* "alpha" */ - u8 weight; - - u8 reserved[3]; -} __packed; - -/* - * WMI_SNR_THRESHOLD_PARAMS_CMDID - * Setting the polltime to 0 would disable polling. - */ - -struct wmi_snr_threshold_params_cmd { - /* polling time as a factor of LI */ - __le32 poll_time; - - /* "alpha" */ - u8 weight; - - /* lowest of uppper */ - u8 thresh_above1_val; - - u8 thresh_above2_val; - u8 thresh_above3_val; - - /* highest of upper */ - u8 thresh_above4_val; - - /* lowest of bellow */ - u8 thresh_below1_val; - - u8 thresh_below2_val; - u8 thresh_below3_val; - - /* highest of bellow */ - u8 thresh_below4_val; - - u8 reserved[3]; -} __packed; - -enum wmi_preamble_policy { - WMI_IGNORE_BARKER_IN_ERP = 0, - WMI_DONOT_IGNORE_BARKER_IN_ERP -}; - -struct wmi_set_lpreamble_cmd { - u8 status; - u8 preamble_policy; -} __packed; - -struct wmi_set_rts_cmd { - __le16 threshold; -} __packed; - -/* WMI_SET_TX_PWR_CMDID */ -struct wmi_set_tx_pwr_cmd { - /* in dbM units */ - u8 dbM; -} __packed; - -struct wmi_tx_pwr_reply { - /* in dbM units */ - u8 dbM; -} __packed; - -struct wmi_report_sleep_state_event { - __le32 sleep_state; -}; - -enum wmi_report_sleep_status { - WMI_REPORT_SLEEP_STATUS_IS_DEEP_SLEEP = 0, - WMI_REPORT_SLEEP_STATUS_IS_AWAKE -}; -enum target_event_report_config { - /* default */ - DISCONN_EVT_IN_RECONN = 0, - - NO_DISCONN_EVT_IN_RECONN -}; - -struct wmi_mcast_filter_cmd { - u8 mcast_all_enable; -} __packed; - -#define ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE 6 -struct wmi_mcast_filter_add_del_cmd { - u8 mcast_mac[ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE]; -} __packed; - -/* Command Replies */ - -/* WMI_GET_CHANNEL_LIST_CMDID reply */ -struct wmi_channel_list_reply { - u8 reserved; - - /* number of channels in reply */ - u8 num_ch; - - /* channel in Mhz */ - __le16 ch_list[1]; -} __packed; - -/* List of Events (target to host) */ -enum wmi_event_id { - WMI_READY_EVENTID = 0x1001, - WMI_CONNECT_EVENTID, - WMI_DISCONNECT_EVENTID, - WMI_BSSINFO_EVENTID, - WMI_CMDERROR_EVENTID, - WMI_REGDOMAIN_EVENTID, - WMI_PSTREAM_TIMEOUT_EVENTID, - WMI_NEIGHBOR_REPORT_EVENTID, - WMI_TKIP_MICERR_EVENTID, - WMI_SCAN_COMPLETE_EVENTID, /* 0x100a */ - WMI_REPORT_STATISTICS_EVENTID, - WMI_RSSI_THRESHOLD_EVENTID, - WMI_ERROR_REPORT_EVENTID, - WMI_OPT_RX_FRAME_EVENTID, - WMI_REPORT_ROAM_TBL_EVENTID, - WMI_EXTENSION_EVENTID, - WMI_CAC_EVENTID, - WMI_SNR_THRESHOLD_EVENTID, - WMI_LQ_THRESHOLD_EVENTID, - WMI_TX_RETRY_ERR_EVENTID, /* 0x1014 */ - WMI_REPORT_ROAM_DATA_EVENTID, - WMI_TEST_EVENTID, - WMI_APLIST_EVENTID, - WMI_GET_WOW_LIST_EVENTID, - WMI_GET_PMKID_LIST_EVENTID, - WMI_CHANNEL_CHANGE_EVENTID, - WMI_PEER_NODE_EVENTID, - WMI_PSPOLL_EVENTID, - WMI_DTIMEXPIRY_EVENTID, - WMI_WLAN_VERSION_EVENTID, - WMI_SET_PARAMS_REPLY_EVENTID, - WMI_ADDBA_REQ_EVENTID, /*0x1020 */ - WMI_ADDBA_RESP_EVENTID, - WMI_DELBA_REQ_EVENTID, - WMI_TX_COMPLETE_EVENTID, - WMI_HCI_EVENT_EVENTID, - WMI_ACL_DATA_EVENTID, - WMI_REPORT_SLEEP_STATE_EVENTID, - WMI_REPORT_BTCOEX_STATS_EVENTID, - WMI_REPORT_BTCOEX_CONFIG_EVENTID, - WMI_GET_PMK_EVENTID, - - /* DFS Events */ - WMI_DFS_HOST_ATTACH_EVENTID, - WMI_DFS_HOST_INIT_EVENTID, - WMI_DFS_RESET_DELAYLINES_EVENTID, - WMI_DFS_RESET_RADARQ_EVENTID, - WMI_DFS_RESET_AR_EVENTID, - WMI_DFS_RESET_ARQ_EVENTID, - WMI_DFS_SET_DUR_MULTIPLIER_EVENTID, - WMI_DFS_SET_BANGRADAR_EVENTID, - WMI_DFS_SET_DEBUGLEVEL_EVENTID, - WMI_DFS_PHYERR_EVENTID, - - /* CCX Evants */ - WMI_CCX_RM_STATUS_EVENTID, - - /* P2P Events */ - WMI_P2P_GO_NEG_RESULT_EVENTID, - - WMI_WAC_SCAN_DONE_EVENTID, - WMI_WAC_REPORT_BSS_EVENTID, - WMI_WAC_START_WPS_EVENTID, - WMI_WAC_CTRL_REQ_REPLY_EVENTID, - - WMI_REPORT_WMM_PARAMS_EVENTID, - WMI_WAC_REJECT_WPS_EVENTID, - - /* More P2P Events */ - WMI_P2P_GO_NEG_REQ_EVENTID, - WMI_P2P_INVITE_REQ_EVENTID, - WMI_P2P_INVITE_RCVD_RESULT_EVENTID, - WMI_P2P_INVITE_SENT_RESULT_EVENTID, - WMI_P2P_PROV_DISC_RESP_EVENTID, - WMI_P2P_PROV_DISC_REQ_EVENTID, - - /* RFKILL Events */ - WMI_RFKILL_STATE_CHANGE_EVENTID, - WMI_RFKILL_GET_MODE_CMD_EVENTID, - - WMI_P2P_START_SDPD_EVENTID, - WMI_P2P_SDPD_RX_EVENTID, - - WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID = 0x1047, - - WMI_THIN_RESERVED_START_EVENTID = 0x8000, - /* Events in this range are reserved for thinmode */ - WMI_THIN_RESERVED_END_EVENTID = 0x8fff, - - WMI_SET_CHANNEL_EVENTID, - WMI_ASSOC_REQ_EVENTID, - - /* Generic ACS event */ - WMI_ACS_EVENTID, - WMI_STORERECALL_STORE_EVENTID, - WMI_WOW_EXT_WAKE_EVENTID, - WMI_GTK_OFFLOAD_STATUS_EVENTID, - WMI_NETWORK_LIST_OFFLOAD_EVENTID, - WMI_REMAIN_ON_CHNL_EVENTID, - WMI_CANCEL_REMAIN_ON_CHNL_EVENTID, - WMI_TX_STATUS_EVENTID, - WMI_RX_PROBE_REQ_EVENTID, - WMI_P2P_CAPABILITIES_EVENTID, - WMI_RX_ACTION_EVENTID, - WMI_P2P_INFO_EVENTID, -}; - -struct wmi_ready_event_2 { - __le32 sw_version; - __le32 abi_version; - u8 mac_addr[ETH_ALEN]; - u8 phy_cap; -} __packed; - -/* Connect Event */ -struct wmi_connect_event { - union { - struct { - __le16 ch; - u8 bssid[ETH_ALEN]; - __le16 listen_intvl; - __le16 beacon_intvl; - __le32 nw_type; - } sta; - struct { - u8 phymode; - u8 aid; - u8 mac_addr[ETH_ALEN]; - u8 auth; - u8 keymgmt; - __le16 cipher; - u8 apsd_info; - u8 unused[3]; - } ap_sta; - struct { - __le16 ch; - u8 bssid[ETH_ALEN]; - u8 unused[8]; - } ap_bss; - } u; - u8 beacon_ie_len; - u8 assoc_req_len; - u8 assoc_resp_len; - u8 assoc_info[1]; -} __packed; - -/* Disconnect Event */ -enum wmi_disconnect_reason { - NO_NETWORK_AVAIL = 0x01, - - /* bmiss */ - LOST_LINK = 0x02, - - DISCONNECT_CMD = 0x03, - BSS_DISCONNECTED = 0x04, - AUTH_FAILED = 0x05, - ASSOC_FAILED = 0x06, - NO_RESOURCES_AVAIL = 0x07, - CSERV_DISCONNECT = 0x08, - INVALID_PROFILE = 0x0a, - DOT11H_CHANNEL_SWITCH = 0x0b, - PROFILE_MISMATCH = 0x0c, - CONNECTION_EVICTED = 0x0d, - IBSS_MERGE = 0xe, -}; - -#define ATH6KL_COUNTRY_RD_SHIFT 16 - -struct ath6kl_wmi_regdomain { - __le32 reg_code; -}; - -struct wmi_disconnect_event { - /* reason code, see 802.11 spec. */ - __le16 proto_reason_status; - - /* set if known */ - u8 bssid[ETH_ALEN]; - - /* see WMI_DISCONNECT_REASON */ - u8 disconn_reason; - - u8 assoc_resp_len; - u8 assoc_info[1]; -} __packed; - -/* - * BSS Info Event. - * Mechanism used to inform host of the presence and characteristic of - * wireless networks present. Consists of bss info header followed by - * the beacon or probe-response frame body. The 802.11 header is no included. - */ -enum wmi_bi_ftype { - BEACON_FTYPE = 0x1, - PROBERESP_FTYPE, - ACTION_MGMT_FTYPE, - PROBEREQ_FTYPE, -}; - -#ifdef CONFIG_MACH_PX -#define DEF_LRSSI_SCAN_PERIOD ( 5 * 1000 ) -#else -#define DEF_LRSSI_SCAN_PERIOD 5 -#endif -#define DEF_LRSSI_ROAM_THRESHOLD 20 -#define DEF_LRSSI_ROAM_FLOOR 60 -#ifdef CONFIG_MACH_PX -#define DEF_SCAN_FOR_ROAM_INTVL 5 -#else -#define DEF_SCAN_FOR_ROAM_INTVL 2 -#endif - -enum wmi_roam_ctrl { - WMI_FORCE_ROAM = 1, - WMI_SET_ROAM_MODE, - WMI_SET_HOST_BIAS, - WMI_SET_LRSSI_SCAN_PARAMS, -}; - -enum wmi_roam_mode { - WMI_DEFAULT_ROAM_MODE = 1, /* RSSI based roam */ - WMI_HOST_BIAS_ROAM_MODE = 2, /* Host bias based roam */ - WMI_LOCK_BSS_MODE = 3, /* Lock to the current BSS */ -}; - -struct bss_bias { - u8 bssid[ETH_ALEN]; - s8 bias; -} __packed; - -struct bss_bias_info { - u8 num_bss; - struct bss_bias bss_bias[0]; -} __packed; - -struct low_rssi_scan_params { - __le16 lrssi_scan_period; - a_sle16 lrssi_scan_threshold; - a_sle16 lrssi_roam_threshold; - u8 roam_rssi_floor; - u8 reserved[1]; -} __packed; - -struct roam_ctrl_cmd { - union { - u8 bssid[ETH_ALEN]; /* WMI_FORCE_ROAM */ - u8 roam_mode; /* WMI_SET_ROAM_MODE */ - struct bss_bias_info bss; /* WMI_SET_HOST_BIAS */ - struct low_rssi_scan_params params; /* WMI_SET_LRSSI_SCAN_PARAMS - */ - } __packed info; - u8 roam_ctrl; -} __packed; - -/* BSS INFO HDR version 2.0 */ -struct wmi_bss_info_hdr2 { - __le16 ch; /* frequency in MHz */ - - /* see, enum wmi_bi_ftype */ - u8 frame_type; - - u8 snr; /* note: rssi = snr - 95 dBm */ - u8 bssid[ETH_ALEN]; - __le16 ie_mask; -} __packed; - -/* Command Error Event */ -enum wmi_error_code { - INVALID_PARAM = 0x01, - ILLEGAL_STATE = 0x02, - INTERNAL_ERROR = 0x03, -}; - -struct wmi_cmd_error_event { - __le16 cmd_id; - u8 err_code; -} __packed; - -struct wmi_pstream_timeout_event { - u8 tx_queue_num; - u8 rx_queue_num; - u8 traffic_direc; - u8 traffic_class; -} __packed; - -/* - * The WMI_NEIGHBOR_REPORT Event is generated by the target to inform - * the host of BSS's it has found that matches the current profile. - * It can be used by the host to cache PMKs and/to initiate pre-authentication - * if the BSS supports it. The first bssid is always the current associated - * BSS. - * The bssid and bssFlags information repeats according to the number - * or APs reported. - */ -enum wmi_bss_flags { - WMI_DEFAULT_BSS_FLAGS = 0x00, - WMI_PREAUTH_CAPABLE_BSS = 0x01, - WMI_PMKID_VALID_BSS = 0x02, -}; - -struct wmi_neighbor_info { - u8 bssid[ETH_ALEN]; - u8 bss_flags; /* enum wmi_bss_flags */ -} __packed; - -struct wmi_neighbor_report_event { - u8 num_neighbors; - struct wmi_neighbor_info neighbor[0]; -} __packed; - -/* TKIP MIC Error Event */ -struct wmi_tkip_micerr_event { - u8 key_id; - u8 is_mcast; -} __packed; - -enum wmi_scan_status { - WMI_SCAN_STATUS_SUCCESS = 0, -}; - -/* WMI_SCAN_COMPLETE_EVENTID */ -struct wmi_scan_complete_event { - a_sle32 status; -} __packed; - -#define MAX_OPT_DATA_LEN 1400 - -/* - * Special frame receive Event. - * Mechanism used to inform host of the receiption of the special frames. - * Consists of special frame info header followed by special frame body. - * The 802.11 header is not included. - */ -struct wmi_opt_rx_info_hdr { - __le16 ch; - u8 frame_type; - s8 snr; - u8 src_addr[ETH_ALEN]; - u8 bssid[ETH_ALEN]; -} __packed; - -/* Reporting statistic */ -struct tx_stats { - __le32 pkt; - __le32 byte; - __le32 ucast_pkt; - __le32 ucast_byte; - __le32 mcast_pkt; - __le32 mcast_byte; - __le32 bcast_pkt; - __le32 bcast_byte; - __le32 rts_success_cnt; - __le32 pkt_per_ac[4]; - __le32 err_per_ac[4]; - - __le32 err; - __le32 fail_cnt; - __le32 retry_cnt; - __le32 mult_retry_cnt; - __le32 rts_fail_cnt; - a_sle32 ucast_rate; -} __packed; - -struct rx_stats { - __le32 pkt; - __le32 byte; - __le32 ucast_pkt; - __le32 ucast_byte; - __le32 mcast_pkt; - __le32 mcast_byte; - __le32 bcast_pkt; - __le32 bcast_byte; - __le32 frgment_pkt; - - __le32 err; - __le32 crc_err; - __le32 key_cache_miss; - __le32 decrypt_err; - __le32 dupl_frame; - a_sle32 ucast_rate; -} __packed; - -struct tkip_ccmp_stats { - __le32 tkip_local_mic_fail; - __le32 tkip_cnter_measures_invoked; - __le32 tkip_replays; - __le32 tkip_fmt_err; - __le32 ccmp_fmt_err; - __le32 ccmp_replays; -} __packed; - -struct pm_stats { - __le32 pwr_save_failure_cnt; - __le16 stop_tx_failure_cnt; - __le16 atim_tx_failure_cnt; - __le16 atim_rx_failure_cnt; - __le16 bcn_rx_failure_cnt; -} __packed; - -struct cserv_stats { - __le32 cs_bmiss_cnt; - __le32 cs_low_rssi_cnt; - __le16 cs_connect_cnt; - __le16 cs_discon_cnt; - a_sle16 cs_ave_beacon_rssi; - __le16 cs_roam_count; - a_sle16 cs_rssi; - u8 cs_snr; - u8 cs_ave_beacon_snr; - u8 cs_last_roam_msec; -} __packed; - -struct wlan_net_stats { - struct tx_stats tx; - struct rx_stats rx; - struct tkip_ccmp_stats tkip_ccmp_stats; -} __packed; - -struct arp_stats { - __le32 arp_received; - __le32 arp_matched; - __le32 arp_replied; -} __packed; - -struct wlan_wow_stats { - __le32 wow_pkt_dropped; - __le16 wow_evt_discarded; - u8 wow_host_pkt_wakeups; - u8 wow_host_evt_wakeups; -} __packed; - -struct wmi_target_stats { - __le32 lq_val; - a_sle32 noise_floor_calib; - struct pm_stats pm_stats; - struct wlan_net_stats stats; - struct wlan_wow_stats wow_stats; - struct arp_stats arp_stats; - struct cserv_stats cserv_stats; -} __packed; - -/* - * WMI_RSSI_THRESHOLD_EVENTID. - * Indicate the RSSI events to host. Events are indicated when we breach a - * thresold value. - */ -enum wmi_rssi_threshold_val { - WMI_RSSI_THRESHOLD1_ABOVE = 0, - WMI_RSSI_THRESHOLD2_ABOVE, - WMI_RSSI_THRESHOLD3_ABOVE, - WMI_RSSI_THRESHOLD4_ABOVE, - WMI_RSSI_THRESHOLD5_ABOVE, - WMI_RSSI_THRESHOLD6_ABOVE, - WMI_RSSI_THRESHOLD1_BELOW, - WMI_RSSI_THRESHOLD2_BELOW, - WMI_RSSI_THRESHOLD3_BELOW, - WMI_RSSI_THRESHOLD4_BELOW, - WMI_RSSI_THRESHOLD5_BELOW, - WMI_RSSI_THRESHOLD6_BELOW -}; - -struct wmi_rssi_threshold_event { - a_sle16 rssi; - u8 range; -} __packed; - -enum wmi_snr_threshold_val { - WMI_SNR_THRESHOLD1_ABOVE = 1, - WMI_SNR_THRESHOLD1_BELOW, - WMI_SNR_THRESHOLD2_ABOVE, - WMI_SNR_THRESHOLD2_BELOW, - WMI_SNR_THRESHOLD3_ABOVE, - WMI_SNR_THRESHOLD3_BELOW, - WMI_SNR_THRESHOLD4_ABOVE, - WMI_SNR_THRESHOLD4_BELOW -}; - -struct wmi_snr_threshold_event { - /* see, enum wmi_snr_threshold_val */ - u8 range; - - u8 snr; -} __packed; - -/* WMI_REPORT_ROAM_TBL_EVENTID */ -#define MAX_ROAM_TBL_CAND 5 - -struct wmi_bss_roam_info { - a_sle32 roam_util; - u8 bssid[ETH_ALEN]; - s8 rssi; - s8 rssidt; - s8 last_rssi; - s8 util; - s8 bias; - - /* for alignment */ - u8 reserved; -} __packed; - -struct wmi_target_roam_tbl { - __le16 roam_mode; - __le16 num_entries; - struct wmi_bss_roam_info info[]; -} __packed; - -/* WMI_CAC_EVENTID */ -enum cac_indication { - CAC_INDICATION_ADMISSION = 0x00, - CAC_INDICATION_ADMISSION_RESP = 0x01, - CAC_INDICATION_DELETE = 0x02, - CAC_INDICATION_NO_RESP = 0x03, -}; - -#define WMM_TSPEC_IE_LEN 63 - -struct wmi_cac_event { - u8 ac; - u8 cac_indication; - u8 status_code; - u8 tspec_suggestion[WMM_TSPEC_IE_LEN]; -} __packed; - -/* WMI_APLIST_EVENTID */ - -enum aplist_ver { - APLIST_VER1 = 1, -}; - -struct wmi_ap_info_v1 { - u8 bssid[ETH_ALEN]; - __le16 channel; -} __packed; - -union wmi_ap_info { - struct wmi_ap_info_v1 ap_info_v1; -} __packed; - -struct wmi_aplist_event { - u8 ap_list_ver; - u8 num_ap; - union wmi_ap_info ap_list[1]; -} __packed; - -/* Developer Commands */ - -/* - * WMI_SET_BITRATE_CMDID - * - * Get bit rate cmd uses same definition as set bit rate cmd - */ -enum wmi_bit_rate { - RATE_AUTO = -1, - RATE_1Mb = 0, - RATE_2Mb = 1, - RATE_5_5Mb = 2, - RATE_11Mb = 3, - RATE_6Mb = 4, - RATE_9Mb = 5, - RATE_12Mb = 6, - RATE_18Mb = 7, - RATE_24Mb = 8, - RATE_36Mb = 9, - RATE_48Mb = 10, - RATE_54Mb = 11, - RATE_MCS_0_20 = 12, - RATE_MCS_1_20 = 13, - RATE_MCS_2_20 = 14, - RATE_MCS_3_20 = 15, - RATE_MCS_4_20 = 16, - RATE_MCS_5_20 = 17, - RATE_MCS_6_20 = 18, - RATE_MCS_7_20 = 19, - RATE_MCS_0_40 = 20, - RATE_MCS_1_40 = 21, - RATE_MCS_2_40 = 22, - RATE_MCS_3_40 = 23, - RATE_MCS_4_40 = 24, - RATE_MCS_5_40 = 25, - RATE_MCS_6_40 = 26, - RATE_MCS_7_40 = 27, -}; - -struct wmi_bit_rate_reply { - /* see, enum wmi_bit_rate */ - s8 rate_index; -} __packed; - -/* - * WMI_SET_FIXRATES_CMDID - * - * Get fix rates cmd uses same definition as set fix rates cmd - */ -struct wmi_fix_rates_reply { - /* see wmi_bit_rate */ - __le32 fix_rate_mask; -} __packed; - -enum roam_data_type { - /* get the roam time data */ - ROAM_DATA_TIME = 1, -}; - -struct wmi_target_roam_time { - __le32 disassoc_time; - __le32 no_txrx_time; - __le32 assoc_time; - __le32 allow_txrx_time; - u8 disassoc_bssid[ETH_ALEN]; - s8 disassoc_bss_rssi; - u8 assoc_bssid[ETH_ALEN]; - s8 assoc_bss_rssi; -} __packed; - -enum wmi_txop_cfg { - WMI_TXOP_DISABLED = 0, - WMI_TXOP_ENABLED -}; - -struct wmi_set_wmm_txop_cmd { - u8 txop_enable; -} __packed; - -struct wmi_set_keepalive_cmd { - u8 keep_alive_intvl; -} __packed; - -struct wmi_get_keepalive_cmd { - __le32 configured; - u8 keep_alive_intvl; -} __packed; - -struct wmi_set_mcastrate_cmd { - u16 bitrate; -} __packed; - -struct wmi_set_appie_cmd { - u8 mgmt_frm_type; /* enum wmi_mgmt_frame_type */ - u8 ie_len; - u8 ie_info[0]; -} __packed; - -struct wmi_set_ie_cmd { - u8 ie_id; - u8 ie_field; /* enum wmi_ie_field_type */ - u8 ie_len; - u8 reserved; - u8 ie_info[0]; -} __packed; - -/* Notify the WSC registration status to the target */ -#define WSC_REG_ACTIVE 1 -#define WSC_REG_INACTIVE 0 - -#define WOW_MAX_FILTERS_PER_LIST 4 -#define WOW_PATTERN_SIZE 64 -#define WOW_MASK_SIZE 64 - -#define MAC_MAX_FILTERS_PER_LIST 4 - -struct wow_filter { - u8 wow_valid_filter; - u8 wow_filter_id; - u8 wow_filter_size; - u8 wow_filter_offset; - u8 wow_filter_mask[WOW_MASK_SIZE]; - u8 wow_filter_pattern[WOW_PATTERN_SIZE]; -} __packed; - -#define MAX_IP_ADDRS 2 - -struct wmi_set_ip_cmd { - /* IP in network byte order */ - __be32 ips[MAX_IP_ADDRS]; -} __packed; - -enum ath6kl_wow_filters { - WOW_FILTER_SSID = BIT(1), - WOW_FILTER_OPTION_MAGIC_PACKET = BIT(2), - WOW_FILTER_OPTION_EAP_REQ = BIT(3), - WOW_FILTER_OPTION_PATTERNS = BIT(4), - WOW_FILTER_OPTION_OFFLOAD_ARP = BIT(5), - WOW_FILTER_OPTION_OFFLOAD_NS = BIT(6), - WOW_FILTER_OPTION_OFFLOAD_GTK = BIT(7), - WOW_FILTER_OPTION_8021X_4WAYHS = BIT(8), - WOW_FILTER_OPTION_NLO_DISCVRY = BIT(9), - WOW_FILTER_OPTION_NWK_DISASSOC = BIT(10), - WOW_FILTER_OPTION_GTK_ERROR = BIT(11), - WOW_FILTER_OPTION_TEST_MODE = BIT(15), -}; - -enum ath6kl_host_mode { - ATH6KL_HOST_MODE_AWAKE, - ATH6KL_HOST_MODE_ASLEEP, -}; - -struct wmi_set_host_sleep_mode_cmd { - __le32 awake; - __le32 asleep; -} __packed; - -enum ath6kl_wow_mode { - ATH6KL_WOW_MODE_DISABLE, - ATH6KL_WOW_MODE_ENABLE, -}; - -struct wmi_set_wow_mode_cmd { - __le32 enable_wow; - __le32 filter; - __le16 host_req_delay; -} __packed; - -struct wmi_add_wow_pattern_cmd { - u8 filter_list_id; - u8 filter_size; - u8 filter_offset; - u8 filter[0]; -} __packed; - -struct wmi_del_wow_pattern_cmd { - __le16 filter_list_id; - __le16 filter_id; -} __packed; - -/* WMI_SET_AKMP_PARAMS_CMD */ - -struct wmi_pmkid { - u8 pmkid[WMI_PMKID_LEN]; -} __packed; - -/* WMI_GET_PMKID_LIST_CMD Reply */ -struct wmi_pmkid_list_reply { - __le32 num_pmkid; - u8 bssid_list[ETH_ALEN][1]; - struct wmi_pmkid pmkid_list[1]; -} __packed; - -/* WMI_ADDBA_REQ_EVENTID */ -struct wmi_addba_req_event { - u8 tid; - u8 win_sz; - __le16 st_seq_no; - - /* f/w response for ADDBA Req; OK (0) or failure (!=0) */ - u8 status; -} __packed; - -/* WMI_ADDBA_RESP_EVENTID */ -struct wmi_addba_resp_event { - u8 tid; - - /* OK (0), failure (!=0) */ - u8 status; - - /* three values: not supported(0), 3839, 8k */ - __le16 amsdu_sz; -} __packed; - -/* WMI_DELBA_EVENTID - * f/w received a DELBA for peer and processed it. - * Host is notified of this - */ -struct wmi_delba_event { - u8 tid; - u8 is_peer_initiator; - __le16 reason_code; -} __packed; - -#define PEER_NODE_JOIN_EVENT 0x00 -#define PEER_NODE_LEAVE_EVENT 0x01 -#define PEER_FIRST_NODE_JOIN_EVENT 0x10 -#define PEER_LAST_NODE_LEAVE_EVENT 0x11 - -struct wmi_peer_node_event { - u8 event_code; - u8 peer_mac_addr[ETH_ALEN]; -} __packed; - -/* Transmit complete event data structure(s) */ - -/* version 1 of tx complete msg */ -struct tx_complete_msg_v1 { -#define TX_COMPLETE_STATUS_SUCCESS 0 -#define TX_COMPLETE_STATUS_RETRIES 1 -#define TX_COMPLETE_STATUS_NOLINK 2 -#define TX_COMPLETE_STATUS_TIMEOUT 3 -#define TX_COMPLETE_STATUS_OTHER 4 - - u8 status; - - /* packet ID to identify parent packet */ - u8 pkt_id; - - /* rate index on successful transmission */ - u8 rate_idx; - - /* number of ACK failures in tx attempt */ - u8 ack_failures; -} __packed; - -struct wmi_tx_complete_event { - /* no of tx comp msgs following this struct */ - u8 num_msg; - - /* length in bytes for each individual msg following this struct */ - u8 msg_len; - - /* version of tx complete msg data following this struct */ - u8 msg_type; - - /* individual messages follow this header */ - u8 reserved; -} __packed; - -/* - * ------- AP Mode definitions -------------- - */ - -/* - * !!! Warning !!! - * -Changing the following values needs compilation of both driver and firmware - */ -#define AP_MAX_NUM_STA 10 - -/* Spl. AID used to set DTIM flag in the beacons */ -#define MCAST_AID 0xFF - -#define DEF_AP_COUNTRY_CODE "US " - -/* Used with WMI_AP_SET_NUM_STA_CMDID */ - -/* - * Used with WMI_AP_SET_MLME_CMDID - */ - -/* MLME Commands */ -#define WMI_AP_MLME_ASSOC 1 /* associate station */ -#define WMI_AP_DISASSOC 2 /* disassociate station */ -#define WMI_AP_DEAUTH 3 /* deauthenticate station */ -#define WMI_AP_MLME_AUTHORIZE 4 /* authorize station */ -#define WMI_AP_MLME_UNAUTHORIZE 5 /* unauthorize station */ - -struct wmi_ap_set_mlme_cmd { - u8 mac[ETH_ALEN]; - __le16 reason; /* 802.11 reason code */ - u8 cmd; /* operation to perform (WMI_AP_*) */ -} __packed; - -struct wmi_ap_set_pvb_cmd { - __le32 flag; - __le16 rsvd; - __le16 aid; -} __packed; - -struct wmi_rx_frame_format_cmd { - /* version of meta data for rx packets <0 = default> (0-7 = valid) */ - u8 meta_ver; - - /* - * 1 == leave .11 header intact, - * 0 == replace .11 header with .3 - */ - u8 dot11_hdr; - - /* - * 1 == defragmentation is performed by host, - * 0 == performed by target - */ - u8 defrag_on_host; - - /* for alignment */ - u8 reserved[1]; -} __packed; - -struct wmi_ap_hidden_ssid_cmd { - u8 hidden_ssid; -} __packed; - -/* AP mode events */ -struct wmi_ap_set_apsd_cmd { - u8 enable; -} __packed; - -enum wmi_ap_apsd_buffered_traffic_flags { - WMI_AP_APSD_NO_DELIVERY_FRAMES = 0x1, -}; - -struct wmi_ap_apsd_buffered_traffic_cmd { - __le16 aid; - __le16 bitmap; - __le32 flags; -} __packed; - -/* WMI_PS_POLL_EVENT */ -struct wmi_pspoll_event { - __le16 aid; -} __packed; - -struct wmi_per_sta_stat { - __le32 tx_bytes; - __le32 tx_pkts; - __le32 tx_error; - __le32 tx_discard; - __le32 rx_bytes; - __le32 rx_pkts; - __le32 rx_error; - __le32 rx_discard; - __le32 aid; -} __packed; - -struct wmi_ap_mode_stat { - __le32 action; - struct wmi_per_sta_stat sta[AP_MAX_NUM_STA + 1]; -} __packed; - -/* End of AP mode definitions */ - -struct wmi_remain_on_chnl_cmd { - __le32 freq; - __le32 duration; -} __packed; - -/* wmi_send_action_cmd is to be deprecated. Use - * wmi_send_mgmt_cmd instead. The new structure supports P2P mgmt - * operations using station interface. - */ -struct wmi_send_action_cmd { - __le32 id; - __le32 freq; - __le32 wait; - __le16 len; - u8 data[0]; -} __packed; - -struct wmi_send_mgmt_cmd { - __le32 id; - __le32 freq; - __le32 wait; - __le32 no_cck; - __le16 len; - u8 data[0]; -} __packed; - -struct wmi_tx_status_event { - __le32 id; - u8 ack_status; -} __packed; - -struct wmi_probe_req_report_cmd { - u8 enable; -} __packed; - -struct wmi_disable_11b_rates_cmd { - u8 disable; -} __packed; - -struct wmi_set_appie_extended_cmd { - u8 role_id; - u8 mgmt_frm_type; - u8 ie_len; - u8 ie_info[0]; -} __packed; - -struct wmi_remain_on_chnl_event { - __le32 freq; - __le32 duration; -} __packed; - -struct wmi_cancel_remain_on_chnl_event { - __le32 freq; - __le32 duration; - u8 status; -} __packed; - -struct wmi_rx_action_event { - __le32 freq; - __le16 len; - u8 data[0]; -} __packed; - -struct wmi_p2p_capabilities_event { - __le16 len; - u8 data[0]; -} __packed; - -struct wmi_p2p_rx_probe_req_event { - __le32 freq; - __le16 len; - u8 data[0]; -} __packed; - -#define P2P_FLAG_CAPABILITIES_REQ (0x00000001) -#define P2P_FLAG_MACADDR_REQ (0x00000002) -#define P2P_FLAG_HMODEL_REQ (0x00000002) - -struct wmi_get_p2p_info { - __le32 info_req_flags; -} __packed; - -struct wmi_p2p_info_event { - __le32 info_req_flags; - __le16 len; - u8 data[0]; -} __packed; - -struct wmi_p2p_capabilities { - u8 go_power_save; -} __packed; - -struct wmi_p2p_macaddr { - u8 mac_addr[ETH_ALEN]; -} __packed; - -struct wmi_p2p_hmodel { - u8 p2p_model; -} __packed; - -struct wmi_p2p_probe_response_cmd { - __le32 freq; - u8 destination_addr[ETH_ALEN]; - __le16 len; - u8 data[0]; -} __packed; - -struct wmi_set_ht_cap_cmd { - u8 band; - u8 enable; - u8 chan_width_40m_supported; - u8 short_gi_20mhz; - u8 short_gi_40mhz; - u8 intolerance_40mhz; - u8 max_ampdu_len_exp; -} __packed; - - -/* Extended WMI (WMIX) - * - * Extended WMIX commands are encapsulated in a WMI message with - * cmd=WMI_EXTENSION_CMD. - * - * Extended WMI commands are those that are needed during wireless - * operation, but which are not really wireless commands. This allows, - * for instance, platform-specific commands. Extended WMI commands are - * embedded in a WMI command message with WMI_COMMAND_ID=WMI_EXTENSION_CMDID. - * Extended WMI events are similarly embedded in a WMI event message with - * WMI_EVENT_ID=WMI_EXTENSION_EVENTID. - */ -struct wmix_cmd_hdr { - __le32 cmd_id; -} __packed; - -enum wmix_command_id { - WMIX_DSETOPEN_REPLY_CMDID = 0x2001, - WMIX_DSETDATA_REPLY_CMDID, - WMIX_GPIO_OUTPUT_SET_CMDID, - WMIX_GPIO_INPUT_GET_CMDID, - WMIX_GPIO_REGISTER_SET_CMDID, - WMIX_GPIO_REGISTER_GET_CMDID, - WMIX_GPIO_INTR_ACK_CMDID, - WMIX_HB_CHALLENGE_RESP_CMDID, - WMIX_DBGLOG_CFG_MODULE_CMDID, - WMIX_PROF_CFG_CMDID, /* 0x200a */ - WMIX_PROF_ADDR_SET_CMDID, - WMIX_PROF_START_CMDID, - WMIX_PROF_STOP_CMDID, - WMIX_PROF_COUNT_GET_CMDID, -}; - -enum wmix_event_id { - WMIX_DSETOPENREQ_EVENTID = 0x3001, - WMIX_DSETCLOSE_EVENTID, - WMIX_DSETDATAREQ_EVENTID, - WMIX_GPIO_INTR_EVENTID, - WMIX_GPIO_DATA_EVENTID, - WMIX_GPIO_ACK_EVENTID, - WMIX_HB_CHALLENGE_RESP_EVENTID, - WMIX_DBGLOG_EVENTID, - WMIX_PROF_COUNT_EVENTID, -}; - -/* - * ------Error Detection support------- - */ - -/* - * WMIX_HB_CHALLENGE_RESP_CMDID - * Heartbeat Challenge Response command - */ -struct wmix_hb_challenge_resp_cmd { - __le32 cookie; - __le32 source; -} __packed; - -struct ath6kl_wmix_dbglog_cfg_module_cmd { - __le32 valid; - __le32 config; -} __packed; - -/* End of Extended WMI (WMIX) */ - -enum wmi_sync_flag { - NO_SYNC_WMIFLAG = 0, - - /* transmit all queued data before cmd */ - SYNC_BEFORE_WMIFLAG, - - /* any new data waits until cmd execs */ - SYNC_AFTER_WMIFLAG, - - SYNC_BOTH_WMIFLAG, - - /* end marker */ - END_WMIFLAG -}; - -enum htc_endpoint_id ath6kl_wmi_get_control_ep(struct wmi *wmi); -void ath6kl_wmi_set_control_ep(struct wmi *wmi, enum htc_endpoint_id ep_id); -int ath6kl_wmi_dix_2_dot3(struct wmi *wmi, struct sk_buff *skb); -int ath6kl_wmi_data_hdr_add(struct wmi *wmi, struct sk_buff *skb, - u8 msg_type, u32 flags, - enum wmi_data_hdr_data_type data_type, - u8 meta_ver, void *tx_meta_info, u8 if_idx); - -int ath6kl_wmi_dot11_hdr_remove(struct wmi *wmi, struct sk_buff *skb); -int ath6kl_wmi_dot3_2_dix(struct sk_buff *skb); -int ath6kl_wmi_implicit_create_pstream(struct wmi *wmi, u8 if_idx, - struct sk_buff *skb, u32 layer2_priority, - bool wmm_enabled, u8 *ac); - -int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb); - -int ath6kl_wmi_cmd_send(struct wmi *wmi, u8 if_idx, struct sk_buff *skb, - enum wmi_cmd_id cmd_id, enum wmi_sync_flag sync_flag); - -int ath6kl_wmi_connect_cmd(struct wmi *wmi, u8 if_idx, - enum network_type nw_type, - enum dot11_auth_mode dot11_auth_mode, - enum auth_mode auth_mode, - enum crypto_type pairwise_crypto, - u8 pairwise_crypto_len, - enum crypto_type group_crypto, - u8 group_crypto_len, int ssid_len, u8 *ssid, - u8 *bssid, u16 channel, u32 ctrl_flags, - u8 nw_subtype); - -int ath6kl_wmi_reconnect_cmd(struct wmi *wmi, u8 if_idx, u8 *bssid, - u16 channel); -int ath6kl_wmi_disconnect_cmd(struct wmi *wmi, u8 if_idx); -int ath6kl_wmi_startscan_cmd(struct wmi *wmi, u8 if_idx, - enum wmi_scan_type scan_type, - u32 force_fgscan, u32 is_legacy, - u32 home_dwell_time, u32 force_scan_interval, - s8 num_chan, u16 *ch_list); - -int ath6kl_wmi_beginscan_cmd(struct wmi *wmi, u8 if_idx, - enum wmi_scan_type scan_type, - u32 force_fgscan, u32 is_legacy, - u32 home_dwell_time, u32 force_scan_interval, - s8 num_chan, u16 *ch_list, u32 no_cck, - u32 *rates); - -int ath6kl_wmi_scanparams_cmd(struct wmi *wmi, u8 if_idx, u16 fg_start_sec, - u16 fg_end_sec, u16 bg_sec, - u16 minact_chdw_msec, u16 maxact_chdw_msec, - u16 pas_chdw_msec, u8 short_scan_ratio, - u8 scan_ctrl_flag, u32 max_dfsch_act_time, - u16 maxact_scan_per_ssid); -int ath6kl_wmi_bssfilter_cmd(struct wmi *wmi, u8 if_idx, u8 filter, - u32 ie_mask); -int ath6kl_wmi_probedssid_cmd(struct wmi *wmi, u8 if_idx, u8 index, u8 flag, - u8 ssid_len, u8 *ssid); -int ath6kl_wmi_listeninterval_cmd(struct wmi *wmi, u8 if_idx, - u16 listen_interval, - u16 listen_beacons); -int ath6kl_wmi_mcastrate_cmd(struct wmi *wmi, u8 if_idx, - u16 bitrate); -int ath6kl_wmi_bmisstime_cmd(struct wmi *wmi, u8 if_idx, - u16 bmiss_time, - u16 bmiss_beacons); -int ath6kl_wmi_powermode_cmd(struct wmi *wmi, u8 if_idx, u8 pwr_mode); -int ath6kl_wmi_pmparams_cmd(struct wmi *wmi, u8 if_idx, u16 idle_period, - u16 ps_poll_num, u16 dtim_policy, - u16 tx_wakup_policy, u16 num_tx_to_wakeup, - u16 ps_fail_event_policy); -int ath6kl_wmi_create_pstream_cmd(struct wmi *wmi, u8 if_idx, - struct wmi_create_pstream_cmd *pstream); -int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class, - u8 tsid); -int ath6kl_wmi_disctimeout_cmd(struct wmi *wmi, u8 if_idx, u8 timeout); - -int ath6kl_wmi_set_rts_cmd(struct wmi *wmi, u16 threshold); -int ath6kl_wmi_set_lpreamble_cmd(struct wmi *wmi, u8 if_idx, u8 status, - u8 preamble_policy); - -int ath6kl_wmi_get_challenge_resp_cmd(struct wmi *wmi, u32 cookie, u32 source); -int ath6kl_wmi_config_debug_module_cmd(struct wmi *wmi, u32 valid, u32 config); - -int ath6kl_wmi_get_stats_cmd(struct wmi *wmi, u8 if_idx); -int ath6kl_wmi_addkey_cmd(struct wmi *wmi, u8 if_idx, u8 key_index, - enum crypto_type key_type, - u8 key_usage, u8 key_len, - u8 *key_rsc, unsigned int key_rsc_len, - u8 *key_material, - u8 key_op_ctrl, u8 *mac_addr, - enum wmi_sync_flag sync_flag); -int ath6kl_wmi_add_krk_cmd(struct wmi *wmi, u8 if_idx, u8 *krk); -int ath6kl_wmi_deletekey_cmd(struct wmi *wmi, u8 if_idx, u8 key_index); -int ath6kl_wmi_setpmkid_cmd(struct wmi *wmi, u8 if_idx, const u8 *bssid, - const u8 *pmkid, bool set); -int ath6kl_wmi_set_tx_pwr_cmd(struct wmi *wmi, u8 if_idx, u8 dbM); -int ath6kl_wmi_get_tx_pwr_cmd(struct wmi *wmi, u8 if_idx); -int ath6kl_wmi_get_roam_tbl_cmd(struct wmi *wmi); - -int ath6kl_wmi_set_wmm_txop(struct wmi *wmi, u8 if_idx, enum wmi_txop_cfg cfg); -int ath6kl_wmi_set_keepalive_cmd(struct wmi *wmi, u8 if_idx, - u8 keep_alive_intvl); -int ath6kl_wmi_test_cmd(struct wmi *wmi, void *buf, size_t len); - -s32 ath6kl_wmi_get_rate(s8 rate_index); - -int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, u8 if_idx, - __be32 ips0, __be32 ips1); -int ath6kl_wmi_set_host_sleep_mode_cmd(struct wmi *wmi, u8 if_idx, - enum ath6kl_host_mode host_mode); -int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx, - enum ath6kl_wow_mode wow_mode, - u32 filter, u16 host_req_delay); -int ath6kl_wmi_add_wow_pattern_cmd(struct wmi *wmi, u8 if_idx, - u8 list_id, u8 filter_size, - u8 filter_offset, const u8 *filter, - const u8 *mask); -int ath6kl_wmi_del_wow_pattern_cmd(struct wmi *wmi, u8 if_idx, - u16 list_id, u16 filter_id); -int ath6kl_wmi_set_roam_lrssi_cmd(struct wmi *wmi, u8 lrssi); -int ath6kl_wmi_set_roam_lrssi_config_cmd(struct wmi *wmi, - struct low_rssi_scan_params *params); -int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid); -int ath6kl_wmi_set_roam_mode_cmd(struct wmi *wmi, enum wmi_roam_mode mode); -int ath6kl_wmi_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, bool mc_all_on); -int ath6kl_wmi_add_del_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, - u8 *filter, bool add_filter); -int ath6kl_wmi_set_ht_cap_cmd(struct wmi *wmi, u8 if_idx, - struct wmi_set_ht_cap_cmd *params); - -/* AP mode uAPSD */ -int ath6kl_wmi_ap_set_apsd(struct wmi *wmi, u8 if_idx, u8 enable); - -int ath6kl_wmi_set_apsd_bfrd_traf(struct wmi *wmi, - u8 if_idx, u16 aid, - u16 bitmap, u32 flags); - -int ath6kl_wmi_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, bool mc_all_on); -int ath6kl_wmi_add_del_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, - u8 *filter, bool add_filter); - -u8 ath6kl_wmi_get_traffic_class(u8 user_priority); - -u8 ath6kl_wmi_determine_user_priority(u8 *pkt, u32 layer2_pri); -/* AP mode */ -int ath6kl_wmi_ap_hidden_ssid(struct wmi *wmi, u8 if_idx, bool enable); -int ath6kl_wmi_ap_profile_commit(struct wmi *wmip, u8 if_idx, - struct wmi_connect_cmd *p); - -int ath6kl_wmi_ap_set_mlme(struct wmi *wmip, u8 if_idx, u8 cmd, - const u8 *mac, u16 reason); - -int ath6kl_wmi_set_pvb_cmd(struct wmi *wmi, u8 if_idx, u16 aid, bool flag); - -int ath6kl_wmi_set_rx_frame_format_cmd(struct wmi *wmi, u8 if_idx, - u8 rx_meta_version, - bool rx_dot11_hdr, bool defrag_on_host); - -int ath6kl_wmi_set_appie_cmd(struct wmi *wmi, u8 if_idx, u8 mgmt_frm_type, - const u8 *ie, u8 ie_len); - -int ath6kl_wmi_set_ie_cmd(struct wmi *wmi, u8 if_idx, u8 ie_id, u8 ie_field, - const u8 *ie_info, u8 ie_len); - -/* P2P */ -int ath6kl_wmi_disable_11b_rates_cmd(struct wmi *wmi, bool disable); - -int ath6kl_wmi_remain_on_chnl_cmd(struct wmi *wmi, u8 if_idx, u32 freq, - u32 dur); - -int ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq, - u32 wait, const u8 *data, u16 data_len, - u32 no_cck); - -int ath6kl_wmi_send_probe_response_cmd(struct wmi *wmi, u8 if_idx, u32 freq, - const u8 *dst, const u8 *data, - u16 data_len); - -int ath6kl_wmi_probe_report_req_cmd(struct wmi *wmi, u8 if_idx, bool enable); - -int ath6kl_wmi_info_req_cmd(struct wmi *wmi, u8 if_idx, u32 info_req_flags); - -int ath6kl_wmi_cancel_remain_on_chnl_cmd(struct wmi *wmi, u8 if_idx); - -int ath6kl_wmi_set_appie_cmd(struct wmi *wmi, u8 if_idx, u8 mgmt_frm_type, - const u8 *ie, u8 ie_len); - -void ath6kl_wmi_sscan_timer(unsigned long ptr); - -struct ath6kl_vif *ath6kl_get_vif_by_index(struct ath6kl *ar, u8 if_idx); -void *ath6kl_wmi_init(struct ath6kl *devt); -void ath6kl_wmi_shutdown(struct wmi *wmi); -void ath6kl_wmi_reset(struct wmi *wmi); - -#endif /* WMI_H */ diff --git a/drivers/net/wireless/ath/ath6kl/wmi_btcoex.c b/drivers/net/wireless/ath/ath6kl/wmi_btcoex.c deleted file mode 100644 index 280522b..0000000 --- a/drivers/net/wireless/ath/ath6kl/wmi_btcoex.c +++ /dev/null @@ -1,627 +0,0 @@ -/* - * Copyright (c) 2004-2011 Atheros Communications Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include "core.h" -#include "wmi_btcoex.h" -#include "debug.h" - -#define BT_COEX_OP_ACTIVE 0x01 -#define BT_COEX_OP_INACTIVE 0x02 - -#define BT_COEX_DEFAULT_LINK 0x00 - -static inline struct sk_buff *ath6kl_wmi_btcoex_get_new_buf(u32 size) -{ - struct sk_buff *skb; - - skb = ath6kl_buf_alloc(size); - if (!skb) - return NULL; - - skb_put(skb, size); - if (size) - memset(skb->data, 0, size); - - return skb; -} -int ath6kl_wmi_set_btcoex_bt_op_status(struct wmi *wmi, u8 op_id, bool flag) -{ - struct sk_buff *skb; - struct wmi_btcoex_bt_op_status_cmd *cmd; - int op_status; - - skb = ath6kl_wmi_btcoex_get_new_buf(sizeof - (struct wmi_btcoex_bt_op_status_cmd)); - if (!skb) - return -ENOMEM; - - if (flag) - op_status = BT_COEX_OP_ACTIVE; - else - op_status = BT_COEX_OP_INACTIVE; - - cmd = (struct wmi_btcoex_bt_op_status_cmd *) skb->data; - cmd->op_type = cpu_to_le32(op_id); - cmd->op_status = cpu_to_le32(op_status); - cmd->link_id = cpu_to_le32(BT_COEX_DEFAULT_LINK); - - ath6kl_dbg(ATH6KL_DBG_WMI, - "WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID\n"); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tBT Op status->op_type: %x\n", - cmd->op_type); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tBT Op status->op_status: %x\n", - cmd->op_status); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tBT Op status->link_id: %x\n", - cmd->link_id); - - return ath6kl_wmi_cmd_send(wmi, 0, skb, - WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID, - NO_SYNC_WMIFLAG); -} -static inline int btcoex_get_max_slot(int tx_pkt_len) -{ - int slot = 2; - - if (tx_pkt_len <= 90) - slot = 1; /* EV3 or 2-EV3 or 3-EV3 */ - else - slot = 3; /* EV4 or EV5 or 2-EV5 3-EV5 */ - - slot *= 2; - - return slot; -} - -#define SCO_SLOT_DEFAULT 2 -#define SCO_IDLE_SLOT_DEFAULT 4 -#define SCO_FLAGS_DEFAULT 0 -#define SCO_LINK_ID_DEFAULT 0 -#define SCO_CYCLES_FORCE_TRIGGER_DEFAULT 10 -#define SCO_DATA_RES_TIMEOUT_DEFAULT 20 -#define SCO_STOMP_DUTY_CYCLE_DEFAULT 2 -#define SCO_STOMP_DUTY_CYCLE_MAX_DEFAULT 6 -#define SCO_PS_POLL_LATENCY_FRACTION_DEFAULT 2 -#define SCO_STOMP_COUNT_IN_100MS_DEFAULT 3 -#define SCO_CONT_STOMP_MAX_DEFAULT 3 -#define SCO_MIN_RATE_MBPS_DEFAULT 36 -#define SCO_LOW_RATE_CNT_DEFAULT 5 -#define SCO_HI_PKT_RATIO_DEFAULT 5 -#define SCO_MAX_AGGR_SIZE_DEFAULT 1 -#define SCO_SCAN_INTERVAL_DEFAULT 100 -#define SCO_MAX_SCAN_STOMP_CNT_INTERVAL 2 - -static inline void set_default_sco(struct wmi_set_btcoex_sco_config_cmd *cmd) -{ - struct btcoex_sco_config *sco_config = &cmd->sco_config; - struct btcoex_pspoll_mode_sco_config *ppoll_config = - &cmd->sco_pspoll_config; - struct btcoex_optmode_sco_config *optmode_config = - &cmd->sco_optmode_config; - struct btcoex_wlan_sco_config *wlan_config = &cmd->sco_wlan_config; - - - sco_config->sco_slots = cpu_to_le32(SCO_SLOT_DEFAULT); - sco_config->sco_idle_slots = cpu_to_le32(SCO_IDLE_SLOT_DEFAULT); - sco_config->sco_flags = cpu_to_le32(SCO_FLAGS_DEFAULT); - sco_config->link_id = cpu_to_le32(SCO_LINK_ID_DEFAULT); - - ppoll_config->sco_cycle_force_trigger = - cpu_to_le32(SCO_CYCLES_FORCE_TRIGGER_DEFAULT); - ppoll_config->sco_data_res_to = - cpu_to_le32(SCO_DATA_RES_TIMEOUT_DEFAULT); - ppoll_config->sco_stomp_duty_cycle_val = - cpu_to_le32(SCO_STOMP_DUTY_CYCLE_DEFAULT); - ppoll_config->sco_stomp_duty_cycle_max_val = - cpu_to_le32(SCO_STOMP_DUTY_CYCLE_MAX_DEFAULT); - ppoll_config->sco_pspoll_latency_fraction = - cpu_to_le32(SCO_PS_POLL_LATENCY_FRACTION_DEFAULT); - - optmode_config->sco_stomp_cnt_in_100ms = - cpu_to_le32(SCO_STOMP_COUNT_IN_100MS_DEFAULT); - optmode_config->sco_cont_stomp_cnt_max = - cpu_to_le32(SCO_CONT_STOMP_MAX_DEFAULT); - optmode_config->sco_min_low_rate_mbps = - cpu_to_le32(SCO_MIN_RATE_MBPS_DEFAULT); - optmode_config->sco_low_rate_cnt = - cpu_to_le32(SCO_LOW_RATE_CNT_DEFAULT); - optmode_config->sco_hi_pkt_ratio = - cpu_to_le32(SCO_HI_PKT_RATIO_DEFAULT); - optmode_config->sco_max_aggr_size = - cpu_to_le32(SCO_MAX_AGGR_SIZE_DEFAULT); - - wlan_config->scan_interval = - cpu_to_le32(SCO_SCAN_INTERVAL_DEFAULT); - wlan_config->max_scan_stomp_cnt = - cpu_to_le32(SCO_MAX_SCAN_STOMP_CNT_INTERVAL); - -} -#define WMI_SCO_CONFIG_FLAG_IS_EDR_CAPABLE (1 << 1) - -#define IDLE_SLOT_THREASHOLD 10 -#define MAX_AGGR_SIZE_ABOVE_THREASHOLD 8 -#define POLL_LATENCY_BELOW_THRESHOLD 1 -#define POLL_LATENCY_ABOVE_THRESHOLD 2 -#define POLL_LATENCY_BELOW_THRESHOLD_EDR 2 -#define POLL_LATENCY_ABOVE_THRESHOLD_EDR 3 -#define STOMP_CYCLE_ABOVE_THREASHOLD 2 -#define STOMP_CYCLE_BELOW_THREASHOLD 5 -#define STOMP_CYCLE_ABOVE_THREASHOLD_EDR 2 -#define STOMP_CYCLE_BELOW_THREASHOLD_EDR 5 -#define MAX_STOMP_CNT_BELOW_THRESHOLD 4 -#define MAX_STOMP_CNT_ABOVE_THRESHOLD 2 -#define MAX_STOMP_CNT_BELOW_THRESHOLD_EDR 4 -#define MAX_STOMP_CNT_ABOVE_THRESHOLD_EDR 2 -int ath6kl_wmi_set_btcoex_sco_op(struct wmi *wmi, bool esco, u32 tx_interval, - u32 tx_pkt_len) -{ - - struct sk_buff *skb; - int max_slot; - - struct wmi_set_btcoex_sco_config_cmd *cmd; - struct btcoex_sco_config *sco_config; - struct btcoex_pspoll_mode_sco_config *ppoll_config; - struct btcoex_optmode_sco_config *optmode_config; - struct btcoex_wlan_sco_config *wlan_config; - - skb = ath6kl_wmi_btcoex_get_new_buf(sizeof - (struct wmi_set_btcoex_sco_config_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_btcoex_sco_config_cmd *)skb->data; - set_default_sco(cmd); - - set_default_sco(cmd); - sco_config = &cmd->sco_config; - ppoll_config = &cmd->sco_pspoll_config; - optmode_config = &cmd->sco_optmode_config; - wlan_config = &cmd->sco_wlan_config; - - if (esco) - max_slot = btcoex_get_max_slot(tx_pkt_len); - else - max_slot = SCO_SLOT_DEFAULT; - - sco_config->sco_slots = cpu_to_le32(max_slot); - - if (tx_interval >= max_slot) - sco_config->sco_idle_slots = - cpu_to_le32(tx_interval - max_slot); - - - if (sco_config->sco_idle_slots >= IDLE_SLOT_THREASHOLD) - optmode_config->sco_max_aggr_size = - cpu_to_le32(MAX_AGGR_SIZE_ABOVE_THREASHOLD); - - if (esco) { - sco_config->sco_flags |= WMI_SCO_CONFIG_FLAG_IS_EDR_CAPABLE; - - if (sco_config->sco_idle_slots >= IDLE_SLOT_THREASHOLD) { - ppoll_config->sco_pspoll_latency_fraction = - cpu_to_le32(POLL_LATENCY_ABOVE_THRESHOLD_EDR); - ppoll_config->sco_stomp_duty_cycle_val = - cpu_to_le32(STOMP_CYCLE_ABOVE_THREASHOLD_EDR); - wlan_config->max_scan_stomp_cnt = - cpu_to_le32(MAX_STOMP_CNT_ABOVE_THRESHOLD_EDR); - } else { - ppoll_config->sco_pspoll_latency_fraction = - cpu_to_le32(POLL_LATENCY_BELOW_THRESHOLD_EDR); - ppoll_config->sco_stomp_duty_cycle_val = - cpu_to_le32(STOMP_CYCLE_BELOW_THREASHOLD_EDR); - wlan_config->max_scan_stomp_cnt = - cpu_to_le32(MAX_STOMP_CNT_BELOW_THRESHOLD_EDR); - } - } else { - if (sco_config->sco_idle_slots >= IDLE_SLOT_THREASHOLD) { - ppoll_config->sco_pspoll_latency_fraction = - cpu_to_le32(POLL_LATENCY_ABOVE_THRESHOLD); - ppoll_config->sco_stomp_duty_cycle_val = - cpu_to_le32(STOMP_CYCLE_ABOVE_THREASHOLD); - wlan_config->max_scan_stomp_cnt = - cpu_to_le32(MAX_STOMP_CNT_ABOVE_THRESHOLD); - } else { - ppoll_config->sco_pspoll_latency_fraction = - cpu_to_le32(POLL_LATENCY_BELOW_THRESHOLD); - ppoll_config->sco_stomp_duty_cycle_val = - cpu_to_le32(STOMP_CYCLE_BELOW_THREASHOLD); - wlan_config->max_scan_stomp_cnt = - cpu_to_le32(MAX_STOMP_CNT_BELOW_THRESHOLD); - } - } - - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_BTCOEX_SCO_CONFIG_CMDID\n"); - ath6kl_dbg(ATH6KL_DBG_WMI, "wmi_set_btcoex_sco_config_cmd :\n"); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tsco_config->sco_slots:%x\n", - sco_config->sco_slots); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tsco_config->sco_idle_slots:%x\n", - sco_config->sco_idle_slots); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tsco_config->sco_flags:%x\n", - sco_config->sco_flags); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tsco_config->link_id:%x\n", - sco_config->link_id); - ath6kl_dbg(ATH6KL_DBG_WMI, "\n"); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tpspoll_sco_config->sco_cycle_force_trigger %x\n", - ppoll_config->sco_cycle_force_trigger); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tpspoll_sco_config->sco_data_res_to %x\n", - ppoll_config->sco_data_res_to); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tpspoll_config->sco_stomp_duty_cycle_val %x\n", - ppoll_config->sco_stomp_duty_cycle_val); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tpspoll_config->sco_stomp_duty_cycle_max_val %x\n", - ppoll_config->sco_stomp_duty_cycle_max_val); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tpspoll_config->sco_pspoll_latency_fraction %x\n", - ppoll_config->sco_pspoll_latency_fraction); - ath6kl_dbg(ATH6KL_DBG_WMI, "\n"); - ath6kl_dbg(ATH6KL_DBG_WMI, "\toptmode_config->sco_stomp_cnt_in_100ms %x\n", - optmode_config->sco_stomp_cnt_in_100ms); - ath6kl_dbg(ATH6KL_DBG_WMI, "\toptmode_config->sco_cont_stomp_cnt_max %x\n", - optmode_config->sco_cont_stomp_cnt_max); - ath6kl_dbg(ATH6KL_DBG_WMI, "\toptmode_config->sco_min_low_rate_mbps %x\n", - optmode_config->sco_min_low_rate_mbps); - ath6kl_dbg(ATH6KL_DBG_WMI, "\toptmode_config->sco_low_rate_cnt %x\n", - optmode_config->sco_low_rate_cnt); - ath6kl_dbg(ATH6KL_DBG_WMI, "\toptmode_config->sco_hi_pkt_ratio %x\n", - optmode_config->sco_hi_pkt_ratio); - ath6kl_dbg(ATH6KL_DBG_WMI, "\toptmode_config->sco_max_aggr_size %x\n", - optmode_config->sco_max_aggr_size); - ath6kl_dbg(ATH6KL_DBG_WMI, "\n"); - ath6kl_dbg(ATH6KL_DBG_WMI, "\twlan_config->scan_interval %x\n", - wlan_config->scan_interval); - ath6kl_dbg(ATH6KL_DBG_WMI, "\twlan_config->max_scan_stomp_cnt %x\n", - wlan_config->max_scan_stomp_cnt); - - return ath6kl_wmi_cmd_send(wmi, 0, skb, - WMI_SET_BTCOEX_SCO_CONFIG_CMDID, - NO_SYNC_WMIFLAG); -} -#define BTCOEX_A2DP_FLAG_DEFAULT 0 -#define BTCOEX_A2DP_LINK_ID_DEFAULT 0 -#define BTCOEX_A2DP_WLAN_MAX_DUR_DEFAULT 30 -#define BTCOEX_A2DP_MIN_BURST_CNT_DEFAULT 3 -#define BTCOEX_A2DP_DATA_RESP_TO_DEFAULT 20 -#define BTCOEX_A2DP_LOW_RATE_MBPS_DEFAULT 36 -#define BTCOEX_A2DP_LOW_RATE_CNT_DEFAULT 5 -#define BTCOEX_A2DP_HI_PKT_RATIO_DEFAULT 5 -#define BTCOEX_A2DP_MAX_AGGR_SIZE 1 -#define BTCOEX_A2DP_PKT_STOMP_CNT_DEFAULT 6 - -static inline void dump_a2dp_cmd(struct wmi_set_btcoex_a2dp_config_cmd *cmd) -{ - struct btcoex_a2dp_config *a2dp_config = &cmd->a2dp_config; - struct btcoex_pspoll_a2dp_config *pspoll_config = &cmd->pspoll_config; - struct btcoex_a2dp_optmode_config *optmode_config = - &cmd->optmode_config; - - ath6kl_dbg(ATH6KL_DBG_WMI, "a2dp_config->a2dp_flags:%x\n", - a2dp_config->a2dp_flags); - ath6kl_dbg(ATH6KL_DBG_WMI, "a2dp_config->link_id:%x\n", - a2dp_config->link_id); - ath6kl_dbg(ATH6KL_DBG_WMI, "pspoll_config->a2dp_wlan_max_dur:%x\n", - pspoll_config->a2dp_wlan_max_dur); - ath6kl_dbg(ATH6KL_DBG_WMI, "pspoll_config->a2dp_min_bus_cnt:%x\n", - pspoll_config->a2dp_min_bus_cnt); - - ath6kl_dbg(ATH6KL_DBG_WMI, "optmode_config->a2dp_min_low_rate_mbps:%x\n", - optmode_config->a2dp_min_low_rate_mbps); - ath6kl_dbg(ATH6KL_DBG_WMI, "optmode_config->a2dp_low_rate_cnt:%x\n", - optmode_config->a2dp_low_rate_cnt); - ath6kl_dbg(ATH6KL_DBG_WMI, "optmode_config->a2dp_hi_pkt_ratio:%x\n", - optmode_config->a2dp_hi_pkt_ratio); - ath6kl_dbg(ATH6KL_DBG_WMI, "optmode_config->a2dp_max_aggr_size:%x\n", - optmode_config->a2dp_max_aggr_size); - ath6kl_dbg(ATH6KL_DBG_WMI, "optmode_config->a2dp_pkt_stomp_cnt:%x\n", - optmode_config->a2dp_pkt_stomp_cnt); -} - -static inline void set_default_a2dp(struct wmi_set_btcoex_a2dp_config_cmd *cmd) -{ - struct btcoex_a2dp_config *a2dp_config = &cmd->a2dp_config; - struct btcoex_pspoll_a2dp_config *pspoll_config = &cmd->pspoll_config; - struct btcoex_a2dp_optmode_config *optmode_config = - &cmd->optmode_config; - - a2dp_config->a2dp_flags = cpu_to_le32(BTCOEX_A2DP_FLAG_DEFAULT); - a2dp_config->link_id = cpu_to_le32(BTCOEX_A2DP_LINK_ID_DEFAULT); - - pspoll_config->a2dp_wlan_max_dur = - cpu_to_le32(BTCOEX_A2DP_WLAN_MAX_DUR_DEFAULT); - pspoll_config->a2dp_min_bus_cnt = - cpu_to_le32(BTCOEX_A2DP_MIN_BURST_CNT_DEFAULT); - pspoll_config->a2dp_data_res_to = - cpu_to_le32(BTCOEX_A2DP_DATA_RESP_TO_DEFAULT); - - optmode_config->a2dp_min_low_rate_mbps = - cpu_to_le32(BTCOEX_A2DP_LOW_RATE_MBPS_DEFAULT); - optmode_config->a2dp_low_rate_cnt = - cpu_to_le32(BTCOEX_A2DP_LOW_RATE_CNT_DEFAULT); - optmode_config->a2dp_hi_pkt_ratio = - cpu_to_le32(BTCOEX_A2DP_HI_PKT_RATIO_DEFAULT); - optmode_config->a2dp_max_aggr_size = - cpu_to_le32(BTCOEX_A2DP_MAX_AGGR_SIZE); - optmode_config->a2dp_pkt_stomp_cnt = - cpu_to_le32(BTCOEX_A2DP_PKT_STOMP_CNT_DEFAULT); -} - -#define BTCOEX_A2DP_WLAN_MAX_DUR_QCOM_BT 25 -#define BTCOEX_A2DP_MIN_BURST_CNT_QCOM_BT 3 -#define BTCOEX_A2DP_PKT_STOMP_CNT_QCOM_BT 2 -#define A2DP_CONFIG_ALLOW_OPTIMIZATION (1 << 0) -static inline void set_qcom_a2dp(struct wmi_set_btcoex_a2dp_config_cmd *cmd) -{ - struct btcoex_a2dp_config *a2dp_config = &cmd->a2dp_config; - struct btcoex_pspoll_a2dp_config *pspoll_config = &cmd->pspoll_config; - struct btcoex_a2dp_optmode_config *optmode_config = - &cmd->optmode_config; - - a2dp_config->a2dp_flags |= cpu_to_le32(A2DP_CONFIG_ALLOW_OPTIMIZATION); - - pspoll_config->a2dp_wlan_max_dur = - cpu_to_le32(BTCOEX_A2DP_WLAN_MAX_DUR_QCOM_BT); - pspoll_config->a2dp_min_bus_cnt = - cpu_to_le32(BTCOEX_A2DP_MIN_BURST_CNT_QCOM_BT); - - optmode_config->a2dp_pkt_stomp_cnt = - cpu_to_le32(BTCOEX_A2DP_PKT_STOMP_CNT_QCOM_BT); -} - -#define BT_VER_1_0 0 -#define BT_VER_1_1 1 -#define BT_VER_1_2 2 -#define BT_VER_2_0 3 -#define BT_VER_2_1 4 -#define BT_VER_3_0 5 -#define BT_VER_4_0 6 - -#define BTCOEX_A2DP_WLAN_MAX_DUR_BDR 30 -#define BTCOEX_A2DP_DATA_RESP_TO_BDR 10 -#define BTCOEX_A2DP_MIN_BURST_CNT_BDR 4 - -#define BTCOEX_A2DP_LOW_RATE_MBPS_BDR 52 -#define BTCOEX_A2DP_MAX_AGGR_SIZE_BDR 1 - -#define BTCOEX_A2DP_DATA_RESP_TO_EDR 20 -#define BTCOEX_A2DP_WLAN_MAX_DUR_EDR 50 -#define BTCOEX_A2DP_LOW_RATE_MBPS_EDR 36 -#define BTCOEX_A2DP_MAX_AGGR_SIZE_EDR 16 -#define BTCOEX_A2DP_MIN_BURST_CNT_EDR 2 -static inline void update_lmp_ver(struct wmi_set_btcoex_a2dp_config_cmd *cmd, - u32 lmp_ver) -{ - struct btcoex_pspoll_a2dp_config *pspoll_config = &cmd->pspoll_config; - struct btcoex_a2dp_optmode_config *optmode_config = - &cmd->optmode_config; - - switch (lmp_ver) { - case BT_VER_1_0: - case BT_VER_1_1: - case BT_VER_1_2: /* BDR */ - pspoll_config->a2dp_wlan_max_dur = - cpu_to_le32(BTCOEX_A2DP_WLAN_MAX_DUR_BDR); - pspoll_config->a2dp_min_bus_cnt = - cpu_to_le32(BTCOEX_A2DP_MIN_BURST_CNT_BDR); - pspoll_config->a2dp_data_res_to = - cpu_to_le32(BTCOEX_A2DP_DATA_RESP_TO_BDR); - - optmode_config->a2dp_min_low_rate_mbps = - cpu_to_le32(BTCOEX_A2DP_LOW_RATE_MBPS_BDR); - optmode_config->a2dp_max_aggr_size = - cpu_to_le32(BTCOEX_A2DP_MAX_AGGR_SIZE_BDR); - break; - default: /* EDR */ - pspoll_config->a2dp_data_res_to = - cpu_to_le32(BTCOEX_A2DP_DATA_RESP_TO_EDR); - pspoll_config->a2dp_wlan_max_dur = - cpu_to_le32(BTCOEX_A2DP_WLAN_MAX_DUR_EDR); - pspoll_config->a2dp_min_bus_cnt = - cpu_to_le32(BTCOEX_A2DP_MIN_BURST_CNT_EDR); - - optmode_config->a2dp_min_low_rate_mbps = - cpu_to_le32(BTCOEX_A2DP_LOW_RATE_MBPS_EDR); - optmode_config->a2dp_max_aggr_size = - cpu_to_le32(BTCOEX_A2DP_MAX_AGGR_SIZE_EDR); - } -} - -#define BTCOEX_ACL_ROLE_UNKNOWN 0 -#define BTCOEX_ACL_ROLE_MASTER 1 -#define BTCOEX_ACL_ROLE_SLAVE 2 - -#define A2DP_CONFIG_IS_MASTER (1 << 2) -#define BTCOEX_A2DP_WLAN_MAX_DUR_SLAVE 30 -static inline void update_acl_role(struct wmi_set_btcoex_a2dp_config_cmd *cmd, - u32 role) -{ - struct btcoex_a2dp_config *a2dp_config = &cmd->a2dp_config; - struct btcoex_pspoll_a2dp_config *pspoll_config = &cmd->pspoll_config; - - if (role == BTCOEX_ACL_ROLE_UNKNOWN) - return; - - if (role == BTCOEX_ACL_ROLE_MASTER) { - a2dp_config->a2dp_flags |= cpu_to_le32(A2DP_CONFIG_IS_MASTER); - } else { - a2dp_config->a2dp_flags &= ~cpu_to_le32(A2DP_CONFIG_IS_MASTER); - pspoll_config->a2dp_wlan_max_dur = - cpu_to_le32(BTCOEX_A2DP_WLAN_MAX_DUR_SLAVE); - } -} - -#define BT_VENDOR_DEFAULT 0 -#define BT_VENDOR_QCOM 1 - -int ath6kl_wmi_set_btcoex_a2dp_op(struct wmi *wmi, u32 role, u32 ver, - u32 vendor) -{ - struct wmi_set_btcoex_a2dp_config_cmd *cmd; - struct sk_buff *skb; - - skb = ath6kl_wmi_btcoex_get_new_buf(sizeof - (struct wmi_set_btcoex_a2dp_config_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_btcoex_a2dp_config_cmd *)skb->data; - set_default_a2dp(cmd); - - update_acl_role(cmd, role); - update_lmp_ver(cmd, ver); - - if (vendor == BT_VENDOR_QCOM) - set_qcom_a2dp(cmd); - - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_BTCOEX_A2DP_CONFIG_CMDID\n"); - dump_a2dp_cmd(cmd); - - return ath6kl_wmi_cmd_send(wmi, 0, skb, - WMI_SET_BTCOEX_A2DP_CONFIG_CMDID, - NO_SYNC_WMIFLAG); -} - -int ath6kl_wmi_set_btcoex_set_colocated_bt(struct wmi *wmi, u8 dev_type) -{ - struct wmi_set_btcoex_colocated_bt_dev_cmd *cmd; - struct sk_buff *skb; - - skb = ath6kl_wmi_btcoex_get_new_buf(sizeof - (struct wmi_set_btcoex_colocated_bt_dev_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_btcoex_colocated_bt_dev_cmd *)skb->data; - cmd->colocated_bt_dev = dev_type; - - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMDID:\n"); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tCo-Located BT: %x\n", - cmd->colocated_bt_dev); - - return ath6kl_wmi_cmd_send(wmi, 0, skb, - WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMDID, - NO_SYNC_WMIFLAG); -} -int ath6kl_wmi_set_btcoex_set_fe_antenna(struct wmi *wmi, u8 antenna_type) -{ - struct wmi_set_btcoex_fe_antenna_cmd *cmd; - struct sk_buff *skb; - - skb = ath6kl_wmi_btcoex_get_new_buf(sizeof - (struct wmi_set_btcoex_fe_antenna_cmd)); - if (!skb) - return -ENOMEM; - - cmd = (struct wmi_set_btcoex_fe_antenna_cmd *)skb->data; - cmd->fe_antenna_type = antenna_type; - - ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_BTCOEX_FE_ANT_CMDID:\n"); - ath6kl_dbg(ATH6KL_DBG_WMI, "\tFe antenna Type: %x\n", - cmd->fe_antenna_type); - - return ath6kl_wmi_cmd_send(wmi, 0, skb, - WMI_SET_BTCOEX_FE_ANT_CMDID, - NO_SYNC_WMIFLAG); -} - -static int ath6kl_get_wmi_cmd(int nl_cmd) -{ - int wmi_cmd = 0; - switch (nl_cmd) { - case NL80211_WMI_SET_BT_STATUS: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT status\n"); - wmi_cmd = WMI_SET_BT_STATUS_CMDID; - break; - - case NL80211_WMI_SET_BT_PARAMS: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT params\n"); - wmi_cmd = WMI_SET_BT_PARAMS_CMDID; - break; - - case NL80211_WMI_SET_BT_FT_ANT: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT FT antenna\n"); - wmi_cmd = WMI_SET_BTCOEX_FE_ANT_CMDID; - break; - - case NL80211_WMI_SET_COLOCATED_BT_DEV: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT collocated dev\n"); - wmi_cmd = WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMDID; - break; - - case NL80211_WMI_SET_BT_INQUIRY_PAGE_CONFIG: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT inquiry page\n"); - wmi_cmd = WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMDID; - break; - - case NL80211_WMI_SET_BT_SCO_CONFIG: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT sco config\n"); - wmi_cmd = WMI_SET_BTCOEX_SCO_CONFIG_CMDID; - break; - - case NL80211_WMI_SET_BT_A2DP_CONFIG: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT a2dp config\n"); - wmi_cmd = WMI_SET_BTCOEX_A2DP_CONFIG_CMDID; - break; - - case NL80211_WMI_SET_BT_ACLCOEX_CONFIG: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT acl config\n"); - wmi_cmd = WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMDID; - break; - - case NL80211_WMI_SET_BT_DEBUG: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT bt debug\n"); - wmi_cmd = WMI_SET_BTCOEX_DEBUG_CMDID; - break; - - case NL80211_WMI_SET_BT_OPSTATUS: - ath6kl_dbg(ATH6KL_DBG_WMI, "Set BT op status\n"); - wmi_cmd = WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID; - break; - - case NL80211_WMI_GET_BT_CONFIG: - ath6kl_dbg(ATH6KL_DBG_WMI, "Get BT config\n"); - wmi_cmd = WMI_GET_BTCOEX_CONFIG_CMDID; - break; - - case NL80211_WMI_GET_BT_STATS: - ath6kl_dbg(ATH6KL_DBG_WMI, "Get BT status\n"); - wmi_cmd = WMI_GET_BTCOEX_STATS_CMDID; - break; - } - return wmi_cmd; -} - -int ath6kl_wmi_send_btcoex_cmd(struct wmi *wmi, - u8 *buf, int len) -{ - struct sk_buff *skb; - u32 nl_cmd; - int wmi_cmd; - - nl_cmd = *(u32 *)buf; - buf += sizeof(u32); - len -= sizeof(u32); - wmi_cmd = ath6kl_get_wmi_cmd(nl_cmd); - if (wmi_cmd == 0) - return -ENOMEM; - - skb = ath6kl_wmi_btcoex_get_new_buf(len); - if (!skb) - return -ENOMEM; - - memcpy(skb->data, buf, len); - - return ath6kl_wmi_cmd_send(wmi, 0, skb, - (enum wmi_cmd_id)wmi_cmd, - NO_SYNC_WMIFLAG); -} diff --git a/drivers/net/wireless/ath/ath6kl/wmi_btcoex.h b/drivers/net/wireless/ath/ath6kl/wmi_btcoex.h deleted file mode 100644 index 0f7acce..0000000 --- a/drivers/net/wireless/ath/ath6kl/wmi_btcoex.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2010-2011 Atheros Communications Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file contains the definitions of the WMI protocol specified in the - * Wireless Module Interface (WMI). It includes definitions of all the - * commands and events. Commands are messages from the host to the WM. - * Events and Replies are messages from the WM to the host. - */ - -#ifndef WMI_BTCOEX_H -#define WMI_BTCOEX_H - -#include - -/* - * WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID - * Setting the Bluetooth operation status. - */ -struct wmi_btcoex_bt_op_status_cmd { - __le32 op_type; - __le32 op_status; - __le32 link_id; -} __packed; - -/* - * WMI_SET_BTCOEX_SCO_CONFIG_CMDID - * Setting the Bluetooth operation status. - */ -struct btcoex_sco_config { - __le32 sco_slots; - __le32 sco_idle_slots; - __le32 sco_flags; - __le32 link_id; -} __packed; - -struct btcoex_pspoll_mode_sco_config { - __le32 sco_cycle_force_trigger; - __le32 sco_data_res_to; - __le32 sco_stomp_duty_cycle_val; - __le32 sco_stomp_duty_cycle_max_val; - __le32 sco_pspoll_latency_fraction; -} __packed; - -struct btcoex_optmode_sco_config { - __le32 sco_stomp_cnt_in_100ms; - __le32 sco_cont_stomp_cnt_max; - __le32 sco_min_low_rate_mbps; - __le32 sco_low_rate_cnt; - __le32 sco_hi_pkt_ratio; - __le32 sco_max_aggr_size; -} __packed; - -struct btcoex_wlan_sco_config { - __le32 scan_interval; - __le32 max_scan_stomp_cnt; -} __packed; - -struct wmi_set_btcoex_sco_config_cmd { - struct btcoex_sco_config sco_config; - struct btcoex_pspoll_mode_sco_config sco_pspoll_config; - struct btcoex_optmode_sco_config sco_optmode_config; - struct btcoex_wlan_sco_config sco_wlan_config; -} __packed; -/* - * WMI_SET_BTCOEX_A2DP_CONFIG_CMDID - * Setting the Bluetooth A2DP configuration operation. - */ -struct btcoex_a2dp_config { - __le32 a2dp_flags; - __le32 link_id; -} __packed; - -struct btcoex_pspoll_a2dp_config { - __le32 a2dp_wlan_max_dur; - __le32 a2dp_min_bus_cnt; - __le32 a2dp_data_res_to; - -} __packed; - -struct btcoex_a2dp_optmode_config { - __le32 a2dp_min_low_rate_mbps; - __le32 a2dp_low_rate_cnt; - __le32 a2dp_hi_pkt_ratio; - __le32 a2dp_max_aggr_size; - __le32 a2dp_pkt_stomp_cnt; -} __packed; - -struct wmi_set_btcoex_a2dp_config_cmd { - struct btcoex_a2dp_config a2dp_config; - struct btcoex_pspoll_a2dp_config pspoll_config; - struct btcoex_a2dp_optmode_config optmode_config; -} __packed; - -struct wmi_set_btcoex_colocated_bt_dev_cmd { - u8 colocated_bt_dev; -} __packed; - -struct wmi_set_btcoex_fe_antenna_cmd { - u8 fe_antenna_type; -} __packed; - -/* BT Coex */ -int ath6kl_wmi_set_btcoex_bt_op_status(struct wmi *wmi, u8 op_id, bool flag); -int ath6kl_wmi_set_btcoex_sco_op(struct wmi *wmi, bool esco, u32 tx_interval, - u32 tx_pkt_len); -int ath6kl_wmi_set_btcoex_a2dp_op(struct wmi *wmi, u32 role, u32 ver, u32 ven); -int ath6kl_wmi_set_btcoex_set_colocated_bt(struct wmi *wmi, u8 dev_type); -int ath6kl_wmi_set_btcoex_set_fe_antenna(struct wmi *wmi, u8 antenna_type); -int ath6kl_wmi_send_btcoex_cmd(struct wmi *wmi, - u8 *buf, int len); -#endif /* WMI_BTCOEX_H */ diff --git a/drivers/net/wireless/ath/ath6kl/wmiconfig.c b/drivers/net/wireless/ath/ath6kl/wmiconfig.c deleted file mode 100644 index bb60ed2..0000000 --- a/drivers/net/wireless/ath/ath6kl/wmiconfig.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2010-2011 Atheros Communications Inc. - * Copyright (c) 2011 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "testmode.h" -#include "debug.h" -#include "wmi.h" - -#include - -enum ath6kl_tm_attr { - __ATH6KL_TM_ATTR_INVALID = 0, - ATH6KL_TM_ATTR_CMD = 1, - ATH6KL_TM_ATTR_DATA = 2, - - /* keep last */ - __ATH6KL_TM_ATTR_AFTER_LAST, - ATH6KL_TM_ATTR_MAX = __ATH6KL_TM_ATTR_AFTER_LAST - 1, -}; - -enum ath6kl_tm_cmd { - ATH6KL_TM_CMD_TCMD = 0, - ATH6KL_TM_CMD_RX_REPORT = 1, /* not used anymore */ - ATH6KL_TM_CMD_WMI_CMD = 0xF000, -}; - -struct sk_buff *ath6kl_wmi_get_buf(u32 size) -{ - struct sk_buff *skb; - - skb = ath6kl_buf_alloc(size); - if (!skb) - return NULL; - - skb_put(skb, size); - if (size) - memset(skb->data, 0, size); - - return skb; -} -void ath6kl_tm_rx_wmi_event(struct ath6kl *ar, void *buf, size_t buf_len) -{ - struct sk_buff *skb; - - - if (!buf || buf_len == 0) - return; - - skb = cfg80211_testmode_alloc_event_skb(ar->wiphy, buf_len, GFP_KERNEL); - if (!skb) { - ath6kl_warn("failed to allocate testmode rx skb!\n"); - return; - } - NLA_PUT_U32(skb, ATH6KL_TM_ATTR_CMD, ATH6KL_TM_CMD_WMI_CMD); - NLA_PUT(skb, ATH6KL_TM_ATTR_DATA, buf_len, buf); - cfg80211_testmode_event(skb, GFP_KERNEL); - return; - -nla_put_failure: - kfree_skb(skb); - ath6kl_warn("nla_put failed on testmode rx skb!\n"); -} - - -void ath6kl_wmicfg_send_stats(struct ath6kl_vif *vif, - struct target_stats *stats) -{ - u32 *buff = kzalloc(sizeof(*stats) + 4, GFP_KERNEL); - - buff[0] = WMI_REPORT_STATISTICS_EVENTID; - memcpy(buff+1, stats, sizeof(struct target_stats)); - ath6kl_tm_rx_wmi_event(vif->ar->wmi->parent_dev, buff, - sizeof(struct target_stats)+4); - kfree(buff); -} diff --git a/drivers/net/wireless/ath/ath6kl/wmiconfig.h b/drivers/net/wireless/ath/ath6kl/wmiconfig.h deleted file mode 100644 index bcc29ae..0000000 --- a/drivers/net/wireless/ath/ath6kl/wmiconfig.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2011 Atheros Communications Inc. - * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef WMICONFIG_H -#define WMICONFIG_H - -struct sk_buff *ath6kl_wmi_get_buf(u32 size); -void ath6kl_tm_rx_wmi_event(struct ath6kl *ar, void *buf, size_t buf_len); -void ath6kl_wmicfg_send_stats(struct ath6kl_vif *vif, - struct target_stats *stats); -#endif diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 217cfd7..1c70e7a 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -263,7 +263,6 @@ comment "Frame buffer hardware drivers" source "drivers/video/samsung/Kconfig" source "drivers/video/samsung_extdisp/Kconfig" -source "drivers/video/samsung_duallcd/Kconfig" config FB_CIRRUS tristate "Cirrus Logic support" diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 1261866..7aa3b21 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -121,15 +121,6 @@ obj-$(CONFIG_FB_MIPI_DSIM) += s5p_mipi_dsi.o s5p_mipi_dsi_lowlevel.o obj-$(CONFIG_FB_S3C) += s3c-fb.o obj-$(CONFIG_S5P_DP) += s5p-dp-core.o s5p-dp-reg.o obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o -ifeq ($(CONFIG_S5P_DSIM_SWITCHABLE_DUAL_LCD),y) -obj-$(CONFIG_FB_S5P) += samsung_duallcd/ -ifeq ($(CONFIG_NAPLES_COMMON),y) -obj-$(CONFIG_S5P_MIPI_DSI2) += samsung_duallcd/dsim2_tmp/ -else -obj-$(CONFIG_S5P_MIPI_DSI2) += samsung_duallcd/dsim2/ -endif -obj-$(CONFIG_FIMD_EXT_SUPPORT) += samsung_duallcd/extension/ -else obj-$(CONFIG_FB_S5P) += samsung/ ifeq ($(CONFIG_NAPLES_COMMON),y) obj-$(CONFIG_S5P_MIPI_DSI2) += samsung/dsim2_tmp/ @@ -137,7 +128,6 @@ else obj-$(CONFIG_S5P_MIPI_DSI2) += samsung/dsim2/ endif obj-$(CONFIG_FIMD_EXT_SUPPORT) += samsung/extension/ -endif obj-$(CONFIG_FB_S5P_EXTDSP) += samsung_extdisp/ obj-$(CONFIG_FB_FSL_DIU) += fsl-diu-fb.o obj-$(CONFIG_FB_COBALT) += cobalt_lcdfb.o diff --git a/drivers/video/samsung_duallcd/Kconfig b/drivers/video/samsung_duallcd/Kconfig deleted file mode 100644 index 549e981..0000000 --- a/drivers/video/samsung_duallcd/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -# -# S3C Video configuration -# - -config S5P_DSIM_SWITCHABLE_DUAL_LCD - bool "Samsung MIPI DSIM Switchable DUAL LCD support" - default n - ---help--- - This enables support for Samsung MIPI DSIM Switchable DUAL LCD. - This driver uses one DSIM port. DSIM port is able to switch to - select LCD Panel. Using LCD_SEL gpio, LCD can be switched. - Only one side of lcd panel could be enabled. diff --git a/drivers/video/samsung_duallcd/Makefile b/drivers/video/samsung_duallcd/Makefile deleted file mode 100644 index 04157b4..0000000 --- a/drivers/video/samsung_duallcd/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# -# Makefile for the s3c framebuffer driver -# -ifeq ($(CONFIG_FB_S5P),y) -obj-y += s3cfb.o -s3cfb-y := s3cfb_main.o s3cfb_ops.o lcdfreq.o -obj-$(CONFIG_ARCH_S5PV210) += s3cfb_fimd6x.o -obj-$(CONFIG_ARCH_EXYNOS4) += s3cfb_fimd6x.o - -obj-$(CONFIG_FB_S5P_S6C1372) += s3cfb_s6c1372.o -obj-$(CONFIG_FB_S5P_S6F1202A) += s3cfb_s6c1372.o -obj-$(CONFIG_FB_S5P_LTE480WV) += s3cfb_lte480wv.o -obj-$(CONFIG_FB_S5P_HT101HD1) += s3cfb_ht101hd1.o -obj-$(CONFIG_FB_S5P_WA101S) += s3cfb_wa101s.o -obj-$(CONFIG_FB_S5P_AMS369FG06) += s3cfb_ams369fg06.o -obj-$(CONFIG_FB_S5P_LD9040) += ld9040.o smart_dimming_ld9042.o -obj-$(CONFIG_FB_S5P_NT35560) += nt35560.o -obj-$(CONFIG_FB_S5P_MDNIE) += s3cfb_mdnie.o s3cfb_ielcd.o mdnie.o mdnie_tunning.o -obj-$(CONFIG_FB_S5P_LMS501KF03) += s3cfb_lms501kf03.o -obj-$(CONFIG_FB_S5P_DUMMY_MIPI_LCD) += s3cfb_dummymipilcd.o -obj-$(CONFIG_FB_S5P_S6E8AA0) += s3cfb_s6e8aa0.o smart_dimming.o -obj-$(CONFIG_FB_S5P_EA8061) += s3cfb_ea8061.o -obj-$(CONFIG_FB_S5P_S6E8AB0) += s3cfb_s6e8ab0.o smart_dimming_s6e8ab0.o -obj-$(CONFIG_FB_S5P_S6E39A0) += s3cfb_s6e39a0.o smart_dimming.o -# obj-$(CONFIG_FB_S5P_S6E63M0) += s3cfb_s6e63m0.o smart_dimming_s6e63m0.o -obj-$(CONFIG_FB_S5P_S6E63M0) += s3cfb_s6e63m0.o smart_mtp_s6e63m0.o -obj-$(CONFIG_FB_S5P_S6D6AA1) += s6d6aa1.o -obj-$(CONFIG_FB_S5P_MIPI_DSIM) += s5p_dsim_lowlevel.o -obj-$(CONFIG_FB_S5P_MIPI_DSIM) += s5p-dsim.o -obj-$(CONFIG_TARGET_LOCALE_KOR) += boot_progressbar.o -endif - -ifeq ($(CONFIG_FB_S5P_DEBUG),y) -EXTRA_CFLAGS += -DDEBUG -endif - -# version 2 rules -ifeq ($(CONFIG_FB_S5P_V2),y) -obj-y += s3cfb2.o -obj-$(CONFIG_PLAT_S3C64XX) += s3cfb2_fimd4x.o -obj-$(CONFIG_PLAT_S5P64XX) += s3cfb2_fimd5x.o -obj-$(CONFIG_CPU_S5P6450) += s3cfb2_fimd5x.o -obj-$(CONFIG_CPU_S5PC100) += s3cfb2_fimd5x.o -obj-$(CONFIG_CPU_S5PC110) += s3cfb2_fimd6x.o -obj-$(CONFIG_FB_S5P_V2_LTE480WV) += s3cfb2_lte480wv.o -obj-$(CONFIG_FB_S5P_V2_TL2796) += s3cfb2_tl2796.o -endif - -ifeq ($(CONFIG_FB_S5P_V2_DEBUG),y) -EXTRA_CFLAGS += -DDEBUG -endif diff --git a/drivers/video/samsung_duallcd/aid_s6e8aa0.h b/drivers/video/samsung_duallcd/aid_s6e8aa0.h deleted file mode 100644 index cf8058a..0000000 --- a/drivers/video/samsung_duallcd/aid_s6e8aa0.h +++ /dev/null @@ -1,239 +0,0 @@ -#ifndef __AID_S6E8AA0_H__ -#define __AID_S6E8AA0_H__ - -#include "smart_dimming.h" - -#define aid_300nit_260nit_F8_1st 0x19 -#define aid_300nit_260nit_F8_18th 0x04 -#define aid_250nit_190nit_F8_1st 0x19 -#define aid_250nit_190nit_F8_18th 0x04 -#define aid_188nit_182nit_F8_1st 0x59 -#define aid_188nit_F8_18th 0x0D -#define aid_186nit_F8_18th 0x1A -#define aid_184nit_F8_18th 0x27 -#define aid_182nit_F8_18th 0x34 -#define aid_180nit_110nit_F8_18th 0x42 -#define aid_180nit_110nit_F8_1st 0x59 -#define aid_100nit_20nit_F8_1st 0x59 -#define aid_100nit_F8_18th 0x12 -#define aid_90nit_F8_18th 0x22 -#define aid_80nit_F8_18th 0x32 -#define aid_70nit_F8_18th 0x41 -#define aid_60nit_F8_18th 0x50 -#define aid_50nit_F8_18th 0x5E -#define aid_40nit_F8_18th 0x6C -#define aid_30nit_F8_18th 0x7A -#define aid_20nit_F8_18th 0x88 -#define AOR40_BASE_188 201 -#define AOR40_BASE_186 214 -#define AOR40_BASE_184 234 -#define AOR40_BASE_182 250 -#define AOR40_BASE_180 273 -#define AOR40_BASE_170 258 -#define AOR40_BASE_160 244 -#define AOR40_BASE_150 229 -#define AOR40_BASE_140 215 -#define AOR40_BASE_130 200 -#define AOR40_BASE_120 186 -#define AOR40_BASE_110 171 -#define base_20to100 110 - -const struct rgb_offset_info aid_rgb_fix_table[] = { - {GAMMA_180CD, IV_15, CI_RED, 1}, {GAMMA_180CD, IV_15, CI_GREEN, -1}, {GAMMA_180CD, IV_15, CI_BLUE, 5}, - {GAMMA_170CD, IV_15, CI_RED, 1}, {GAMMA_170CD, IV_15, CI_GREEN, -1}, {GAMMA_170CD, IV_15, CI_BLUE, 5}, - {GAMMA_160CD, IV_15, CI_RED, 1}, {GAMMA_160CD, IV_15, CI_GREEN, -1}, {GAMMA_160CD, IV_15, CI_BLUE, 5}, - {GAMMA_150CD, IV_15, CI_RED, 1}, {GAMMA_150CD, IV_15, CI_GREEN, -1}, {GAMMA_150CD, IV_15, CI_BLUE, 5}, - {GAMMA_140CD, IV_15, CI_RED, 1}, {GAMMA_140CD, IV_15, CI_GREEN, -1}, {GAMMA_140CD, IV_15, CI_BLUE, 5}, - {GAMMA_130CD, IV_15, CI_RED, 1}, {GAMMA_130CD, IV_15, CI_GREEN, -1}, {GAMMA_130CD, IV_15, CI_BLUE, 5}, - {GAMMA_120CD, IV_15, CI_RED, 1}, {GAMMA_120CD, IV_15, CI_GREEN, -1}, {GAMMA_120CD, IV_15, CI_BLUE, 5}, - {GAMMA_110CD, IV_15, CI_RED, 1}, {GAMMA_110CD, IV_15, CI_GREEN, -1}, {GAMMA_110CD, IV_15, CI_BLUE, 5}, - {GAMMA_100CD, IV_15, CI_RED, -2}, {GAMMA_100CD, IV_15, CI_GREEN, -3}, - {GAMMA_90CD, IV_15, CI_RED, -6}, {GAMMA_90CD, IV_15, CI_GREEN, -7}, - {GAMMA_80CD, IV_15, CI_RED, -10}, {GAMMA_80CD, IV_15, CI_GREEN, -12}, - {GAMMA_70CD, IV_15, CI_RED, -17}, {GAMMA_70CD, IV_15, CI_GREEN, -20}, - {GAMMA_60CD, IV_15, CI_RED, -27}, {GAMMA_60CD, IV_15, CI_GREEN, -32}, - {GAMMA_50CD, IV_15, CI_RED, -44}, {GAMMA_50CD, IV_15, CI_GREEN, -53}, - {GAMMA_40CD, IV_15, CI_RED, -44}, {GAMMA_40CD, IV_15, CI_GREEN, -53}, {GAMMA_40CD, IV_15, CI_BLUE, 14}, - {GAMMA_30CD, IV_15, CI_RED, -44}, {GAMMA_30CD, IV_15, CI_GREEN, -53}, {GAMMA_30CD, IV_15, CI_BLUE, 32}, - {GAMMA_20CD, IV_15, CI_RED, -33}, {GAMMA_20CD, IV_15, CI_GREEN, -53}, {GAMMA_20CD, IV_15, CI_BLUE, 62}, - {GAMMA_20CD, IV_35, CI_RED, -15}, {GAMMA_20CD, IV_35, CI_GREEN, -12}, -}; - -static unsigned char aid_command_20[] = { - aid_20nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_30[] = { - aid_30nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_40[] = { - aid_40nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_50[] = { - aid_50nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_60[] = { - aid_60nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_70[] = { - aid_70nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_80[] = { - aid_80nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_90[] = { - aid_90nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_100[] = { - aid_100nit_F8_18th, - aid_100nit_20nit_F8_1st, -}; - -static unsigned char aid_command_110[] = { - aid_180nit_110nit_F8_18th, - aid_180nit_110nit_F8_1st, -}; - -static unsigned char aid_command_120[] = { - aid_180nit_110nit_F8_18th, - aid_180nit_110nit_F8_1st, -}; - -static unsigned char aid_command_130[] = { - aid_180nit_110nit_F8_18th, - aid_180nit_110nit_F8_1st, -}; - -static unsigned char aid_command_140[] = { - aid_180nit_110nit_F8_18th, - aid_180nit_110nit_F8_1st, -}; - -static unsigned char aid_command_150[] = { - aid_180nit_110nit_F8_18th, - aid_180nit_110nit_F8_1st, -}; - -static unsigned char aid_command_160[] = { - aid_180nit_110nit_F8_18th, - aid_180nit_110nit_F8_1st, -}; - -static unsigned char aid_command_170[] = { - aid_180nit_110nit_F8_18th, - aid_180nit_110nit_F8_1st, -}; - -static unsigned char aid_command_180[] = { - aid_180nit_110nit_F8_18th, - aid_180nit_110nit_F8_1st, -}; - -static unsigned char aid_command_182[] = { - aid_182nit_F8_18th, - aid_188nit_182nit_F8_1st, -}; - -static unsigned char aid_command_184[] = { - aid_184nit_F8_18th, - aid_188nit_182nit_F8_1st, -}; - -static unsigned char aid_command_186[] = { - aid_186nit_F8_18th, - aid_188nit_182nit_F8_1st, -}; - -static unsigned char aid_command_188[] = { - aid_188nit_F8_18th, - aid_188nit_182nit_F8_1st, -}; - -static unsigned char aid_command_190[] = { - aid_250nit_190nit_F8_18th, - aid_250nit_190nit_F8_1st, -}; - -static unsigned char aid_command_200[] = { - aid_250nit_190nit_F8_18th, - aid_250nit_190nit_F8_1st, -}; - -static unsigned char aid_command_210[] = { - aid_250nit_190nit_F8_18th, - aid_250nit_190nit_F8_1st, -}; - -static unsigned char aid_command_220[] = { - aid_250nit_190nit_F8_18th, - aid_250nit_190nit_F8_1st, -}; - -static unsigned char aid_command_230[] = { - aid_250nit_190nit_F8_18th, - aid_250nit_190nit_F8_1st, -}; - -static unsigned char aid_command_240[] = { - aid_250nit_190nit_F8_18th, - aid_250nit_190nit_F8_1st, -}; - -static unsigned char aid_command_250[] = { - aid_250nit_190nit_F8_18th, - aid_250nit_190nit_F8_1st, -}; - -static unsigned char aid_command_300[] = { - aid_300nit_260nit_F8_18th, - aid_300nit_260nit_F8_1st, -}; - -static unsigned char *aid_command_table[GAMMA_MAX] = { - aid_command_20, - aid_command_30, - aid_command_40, - aid_command_50, - aid_command_60, - aid_command_70, - aid_command_80, - aid_command_90, - aid_command_100, - aid_command_110, - aid_command_120, - aid_command_130, - aid_command_140, - aid_command_150, - aid_command_160, - aid_command_170, - aid_command_180, - aid_command_182, - aid_command_184, - aid_command_186, - aid_command_188, - aid_command_190, - aid_command_200, - aid_command_210, - aid_command_220, - aid_command_230, - aid_command_240, - aid_command_250, - aid_command_300 -}; - -#endif diff --git a/drivers/video/samsung_duallcd/boot_progressbar.c b/drivers/video/samsung_duallcd/boot_progressbar.c deleted file mode 100644 index f4cc6da..0000000 --- a/drivers/video/samsung_duallcd/boot_progressbar.c +++ /dev/null @@ -1,266 +0,0 @@ -/* linux/drivers/video/samsung/boot_progressbar.c - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - * http://www.samsung.com - * - * Core file for Samsung Display Controller (FIMD) driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "s3cfb.h" - -#ifdef CONFIG_HAS_WAKELOCK -#include -#include -#include -#endif - -#define TRUE 1 -#define FALSE 0 -#define DISPLAY_BOOT_PROGRESS /* progress bar while kernel-loading */ -#define LOGO_MEM_SIZE (800*480*4) -#define LPDDR1_BASE_ADDR 0x50000000 -/* LPDDR1_BASE_ADDR = Bootloader */ -#define LOGO_MEM_BASE (LPDDR1_BASE_ADDR + 0x0EC00000) - - -static int progress_flag = FALSE; -static int progress_pos; -static struct timer_list progress_timer; - -#define PROGRESS_BAR_WIDTH 4 -#define PROGRESS_BAR_HEIGHT 8 -#define PROGRESS_BAR_LEFT_POS 54 -#define PROGRESS_BAR_RIGHT_POS (425-PROGRESS_BAR_WIDTH) -#define PROGRESS_BAR_START_Y 576 - -static unsigned char anycall_progress_bar_left[] = { -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00 -}; - -static unsigned char anycall_progress_bar_right[] = { -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00 -}; - -static unsigned char anycall_progress_bar_center[] = { -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0xf3, 0xc5, 0x00, 0x00, 0xf3, 0xc5, 0x00, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00 -}; - -static unsigned char anycall_progress_bar[] = { -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00, -0x33, 0x33, 0x33, 0x00, 0x33, 0x33, 0x33, 0x00 -}; - -static void progress_timer_handler(unsigned long data); -static int show_progress = 1; -module_param_named(progress, show_progress, bool, 0); - -static void s3cfb_update_framebuffer( \ - struct fb_info *fb, int x, int y, void *buffer, \ - int src_width, int src_height) -{ - struct s3cfb_global *fbdev = - platform_get_drvdata(to_platform_device(fb->device)); - struct fb_fix_screeninfo *fix = &fb->fix; - struct fb_var_screeninfo *var = &fb->var; - int row; - int bytes_per_pixel = (var->bits_per_pixel / 8); - - unsigned char *pSrc = buffer; - unsigned char *pDst = fb->screen_base; - - if (x+src_width > var->xres || y+src_height > var->yres) { - dev_err(fbdev->dev, "invalid destination coordinate or" \ - " source size (%d, %d) (%d %d)\n", \ - x, y, src_width, src_height); - return; - } - - pDst += y * fix->line_length + x * bytes_per_pixel; - - for (row = 0; row < src_height ; row++) { - memcpy(pDst, pSrc, src_width * bytes_per_pixel); - pSrc += src_width * bytes_per_pixel; - pDst += fix->line_length; - } -} - - -/* -if Updated-pixel is overwrited by other color, progressbar-Update Stop. -return value : TRUE(update), FALSE(STOP) -*/ -static int s3cfb_check_progress(struct fb_info *fb, const int progress_pos) -{ - unsigned char *pDst = fb->screen_base; - struct fb_fix_screeninfo *fix = &fb->fix; - struct fb_var_screeninfo *var = &fb->var; - int bytes_per_pixel = (var->bits_per_pixel / 8); - int x = PROGRESS_BAR_LEFT_POS; - int y = PROGRESS_BAR_START_Y; - - if (progress_pos + PROGRESS_BAR_WIDTH >= PROGRESS_BAR_RIGHT_POS) - return FALSE; - - pDst += y * fix->line_length + x * bytes_per_pixel; - if (*pDst == anycall_progress_bar_left[0]) - return TRUE; - else - return FALSE; -} - - -void s3cfb_start_progress(struct fb_info *fb) -{ - int x_pos; - - if (!show_progress) - return; - - init_timer(&progress_timer); - - progress_timer.expires = (get_jiffies_64() + (HZ/20)); - progress_timer.data = (long)fb; - progress_timer.function = progress_timer_handler; - progress_pos = PROGRESS_BAR_LEFT_POS; - - /* draw progress background. */ - for (x_pos = PROGRESS_BAR_LEFT_POS; x_pos <= PROGRESS_BAR_RIGHT_POS; \ - x_pos += PROGRESS_BAR_WIDTH){ - s3cfb_update_framebuffer(fb, - x_pos, - PROGRESS_BAR_START_Y, - (void *)anycall_progress_bar, - PROGRESS_BAR_WIDTH, - PROGRESS_BAR_HEIGHT); - } - s3cfb_update_framebuffer(fb, - PROGRESS_BAR_LEFT_POS, - PROGRESS_BAR_START_Y, - (void *)anycall_progress_bar_left, - PROGRESS_BAR_WIDTH, - PROGRESS_BAR_HEIGHT); - - progress_pos += PROGRESS_BAR_WIDTH; - - s3cfb_update_framebuffer(fb, - progress_pos, - PROGRESS_BAR_START_Y, - (void *)anycall_progress_bar_right, - PROGRESS_BAR_WIDTH, - PROGRESS_BAR_HEIGHT); - - add_timer(&progress_timer); - progress_flag = TRUE; - -} - -static void s3cfb_stop_progress(void) -{ - if (progress_flag == FALSE) - return; - del_timer(&progress_timer); - progress_flag = 0; -} - -static void progress_timer_handler(unsigned long data) -{ - int i; - - if (s3cfb_check_progress((struct fb_info *)data, progress_pos)) { - for (i = 0; i < PROGRESS_BAR_WIDTH; i++) { - s3cfb_update_framebuffer((struct fb_info *)data, - progress_pos++, - PROGRESS_BAR_START_Y, - (void *)anycall_progress_bar_center, - 1, - PROGRESS_BAR_HEIGHT); - } - - s3cfb_update_framebuffer((struct fb_info *)data, - progress_pos, - PROGRESS_BAR_START_Y, - (void *)anycall_progress_bar_right, - PROGRESS_BAR_WIDTH, - PROGRESS_BAR_HEIGHT); - - progress_timer.expires = (get_jiffies_64() + (HZ/20)); - progress_timer.function = progress_timer_handler; - add_timer(&progress_timer); - } else - s3cfb_stop_progress(); - -} diff --git a/drivers/video/samsung_duallcd/boot_progressbar.h b/drivers/video/samsung_duallcd/boot_progressbar.h deleted file mode 100644 index fa3424c..0000000 --- a/drivers/video/samsung_duallcd/boot_progressbar.h +++ /dev/null @@ -1,13 +0,0 @@ -/* linux/drivers/video/samsung/boot_progressbar.h - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - * http://www.samsung.com - * - * Draw progress-bar while kernel loading - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -extern void s3cfb_start_progress(struct fb_info *fb); diff --git a/drivers/video/samsung_duallcd/dsim2/Makefile b/drivers/video/samsung_duallcd/dsim2/Makefile deleted file mode 100644 index 984452d..0000000 --- a/drivers/video/samsung_duallcd/dsim2/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# -# Makefile for MIPI-DSI driver. -# -obj-$(CONFIG_S5P_MIPI_DSI2) += s5p_mipi_dsi.o s5p_mipi_dsi_common.o\ - s5p_mipi_dsi_lowlevel.o diff --git a/drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi.c b/drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi.c deleted file mode 100644 index 29faa03..0000000 --- a/drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi.c +++ /dev/null @@ -1,803 +0,0 @@ -/* linux/drivers/video/s5p_mipi_dsi.c - * - * Samsung SoC MIPI-DSIM driver. - * - * Copyright (c) 2011 Samsung Electronics Co., Ltd - * - * InKi Dae, - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "s5p_mipi_dsi_common.h" -#include "s5p_mipi_dsi_lowlevel.h" - -#define master_to_driver(a) (a->dsim_lcd_drv) -#define master_to_device(a) (a->dsim_lcd_dev) -#define dev_to_dsim(a) platform_get_drvdata(to_platform_device(a)) - -struct mipi_dsim_ddi { - int bus_id; - struct list_head list; - struct mipi_dsim_lcd_device *dsim_lcd_dev; - struct mipi_dsim_lcd_driver *dsim_lcd_drv; -}; - -static LIST_HEAD(dsim_ddi_list); - -static DEFINE_MUTEX(mipi_dsim_lock); - -static struct s5p_platform_mipi_dsim *to_dsim_plat(struct platform_device *pdev) -{ - return (struct s5p_platform_mipi_dsim *)pdev->dev.platform_data; -} - -static int s5p_mipi_regulator_enable(struct mipi_dsim_device *dsim) -{ - int ret = 0; - - mutex_lock(&dsim->lock); - if (dsim->reg_vdd10) { - ret = regulator_enable(dsim->reg_vdd10); - if (ret < 0) { - dev_err(dsim->dev, "failed to enable regulator.\n"); - goto err_vdd10; - } - } - if (dsim->reg_vdd18) { - ret = regulator_enable(dsim->reg_vdd18); - if (ret < 0) { - dev_err(dsim->dev, "failed to enable regulator.\n"); - goto err_vdd18; - } - } - - mutex_unlock(&dsim->lock); - return ret; - -err_vdd18: - ret = regulator_disable(dsim->reg_vdd10); - if (ret < 0) - dev_err(dsim->dev, "failed to disable regulator.\n"); -err_vdd10: - mutex_unlock(&dsim->lock); - return ret; -} - -static int s5p_mipi_regulator_disable(struct mipi_dsim_device *dsim) -{ - int ret = 0; - - mutex_lock(&dsim->lock); - if (dsim->reg_vdd18) { - ret = regulator_disable(dsim->reg_vdd18); - if (ret < 0) { - dev_err(dsim->dev, "failed to disable regulator.\n"); - goto err_vdd18; - } - } - - if (dsim->reg_vdd10) { - ret = regulator_disable(dsim->reg_vdd10); - if (ret < 0) { - dev_err(dsim->dev, "failed to disable regulator.\n"); - goto err_vdd10; - } - } - - mutex_unlock(&dsim->lock); - return ret; - -err_vdd10: - ret = regulator_enable(dsim->reg_vdd18); - if (ret < 0) - dev_err(dsim->dev, "failed to enable regulator.\n"); -err_vdd18: - mutex_unlock(&dsim->lock); - return ret; -} - -/* update all register settings to MIPI DSI controller. */ -static void s5p_mipi_update_cfg(struct mipi_dsim_device *dsim) -{ - /* - * data from Display controller(FIMD) is not transferred in video mode - * but in case of command mode, all settings is not updated to - * registers. - */ - s5p_mipi_dsi_stand_by(dsim, 0); - - s5p_mipi_dsi_init_dsim(dsim); - s5p_mipi_dsi_init_link(dsim); - - s5p_mipi_dsi_set_hs_enable(dsim); - - /* set display timing. */ - s5p_mipi_dsi_set_display_mode(dsim, dsim->dsim_config); - - s5p_mipi_dsi_init_interrupt(dsim); - - /* - * data from Display controller(FIMD) is transferred in video mode - * but in case of command mode, all settigs is updated to registers. - */ - s5p_mipi_dsi_stand_by(dsim, 1); -} - -static int s5p_mipi_dsi_early_blank_mode(struct mipi_dsim_device *dsim, - int power) -{ - switch (power) { - case FB_BLANK_POWERDOWN: - if (!dsim->suspended) - pm_runtime_put_sync(dsim->dev); - - atomic_set(&dsim->early_blank_used_t, 1); - break; - default: - break; - } - - return 0; -} - -static int s5p_mipi_dsi_blank_mode(struct mipi_dsim_device *dsim, int power) -{ - switch (power) { - case FB_BLANK_UNBLANK: - if (dsim->suspended) - pm_runtime_get_sync(dsim->dev); - - atomic_set(&dsim->early_blank_used_t, 0); - break; - case FB_BLANK_NORMAL: - /* TODO. */ - break; - case FB_BLANK_POWERDOWN: - /* - * if this function is called after early fb blank event, - * ignor it. - */ - if (atomic_read(&dsim->early_blank_used_t)) { - atomic_set(&dsim->early_blank_used_t, 0); - break; - } - - if (!dsim->suspended) - pm_runtime_put_sync(dsim->dev); - default: - break; - } - - return 0; -} - -int s5p_mipi_dsi_register_lcd_device(struct mipi_dsim_lcd_device *lcd_dev) -{ - struct mipi_dsim_ddi *dsim_ddi; - - if (!lcd_dev) { - printk(KERN_ERR "mipi_dsim_lcd_device is NULL.\n"); - return -EFAULT; - } - - if (!lcd_dev->name) { - printk(KERN_ERR "dsim_lcd_device name is NULL.\n"); - return -EFAULT; - } - - dsim_ddi = kzalloc(sizeof(struct mipi_dsim_ddi), GFP_KERNEL); - if (!dsim_ddi) { - printk(KERN_ERR "failed to allocate dsim_ddi object.\n"); - return -EFAULT; - } - - dsim_ddi->dsim_lcd_dev = lcd_dev; - - mutex_lock(&mipi_dsim_lock); - list_add_tail(&dsim_ddi->list, &dsim_ddi_list); - mutex_unlock(&mipi_dsim_lock); - - return 0; -} - -struct mipi_dsim_ddi - *s5p_mipi_dsi_find_lcd_device(struct mipi_dsim_lcd_driver *lcd_drv) -{ - struct mipi_dsim_ddi *dsim_ddi; - struct mipi_dsim_lcd_device *lcd_dev; - - mutex_lock(&mipi_dsim_lock); - - list_for_each_entry(dsim_ddi, &dsim_ddi_list, list) { - if (!dsim_ddi) - goto out; - - lcd_dev = dsim_ddi->dsim_lcd_dev; - if (!lcd_dev) - continue; - - if (lcd_drv->id >= 0) { - if ((strcmp(lcd_drv->name, lcd_dev->name)) == 0 && - lcd_drv->id == lcd_dev->id) { - /** - * bus_id would be used to identify - * connected bus. - */ - dsim_ddi->bus_id = lcd_dev->bus_id; - mutex_unlock(&mipi_dsim_lock); - - return dsim_ddi; - } - } else { - if ((strcmp(lcd_drv->name, lcd_dev->name)) == 0) { - /** - * bus_id would be used to identify - * connected bus. - */ - dsim_ddi->bus_id = lcd_dev->bus_id; - mutex_unlock(&mipi_dsim_lock); - - return dsim_ddi; - } - } - } - -out: - mutex_unlock(&mipi_dsim_lock); - - return NULL; -} - -int s5p_mipi_dsi_register_lcd_driver(struct mipi_dsim_lcd_driver *lcd_drv) -{ - struct mipi_dsim_ddi *dsim_ddi; - - if (!lcd_drv) { - printk(KERN_ERR "mipi_dsim_lcd_driver is NULL.\n"); - return -EFAULT; - } - - if (!lcd_drv->name) { - printk(KERN_ERR "dsim_lcd_driver name is NULL.\n"); - return -EFAULT; - } - - dsim_ddi = s5p_mipi_dsi_find_lcd_device(lcd_drv); - if (!dsim_ddi) { - printk(KERN_ERR "mipi_dsim_ddi object not found.\n"); - return -EFAULT; - } - - dsim_ddi->dsim_lcd_drv = lcd_drv; - - printk(KERN_INFO "registered panel driver(%s) to mipi-dsi driver.\n", - lcd_drv->name); - - return 0; - -} - -struct mipi_dsim_ddi - *s5p_mipi_dsi_bind_lcd_ddi(struct mipi_dsim_device *dsim, - const char *name) -{ - struct mipi_dsim_ddi *dsim_ddi; - struct mipi_dsim_lcd_driver *lcd_drv; - struct mipi_dsim_lcd_device *lcd_dev; - int ret; - - mutex_lock(&dsim->lock); - - list_for_each_entry(dsim_ddi, &dsim_ddi_list, list) { - lcd_drv = dsim_ddi->dsim_lcd_drv; - lcd_dev = dsim_ddi->dsim_lcd_dev; - if (!lcd_drv || !lcd_dev || - (dsim->id != dsim_ddi->bus_id)) - continue; - - dev_dbg(dsim->dev, "lcd_drv->id = %d, lcd_dev->id = %d\n", - lcd_drv->id, lcd_dev->id); - dev_dbg(dsim->dev, "lcd_dev->bus_id = %d, dsim->id = %d\n", - lcd_dev->bus_id, dsim->id); - - if ((strcmp(lcd_drv->name, name) == 0)) { - lcd_dev->master = dsim; - - lcd_dev->dev.parent = dsim->dev; - dev_set_name(&lcd_dev->dev, "%s", lcd_drv->name); - - ret = device_register(&lcd_dev->dev); - if (ret < 0) { - dev_err(dsim->dev, - "can't register %s, status %d\n", - dev_name(&lcd_dev->dev), ret); - mutex_unlock(&dsim->lock); - - return NULL; - } - - dsim->dsim_lcd_dev = lcd_dev; - dsim->dsim_lcd_drv = lcd_drv; - - mutex_unlock(&dsim->lock); - - return dsim_ddi; - } - } - - mutex_unlock(&dsim->lock); - - return NULL; -} - -static void s5p_mipi_dsi_set_pms(struct mipi_dsim_device *dsim, unsigned int p, - unsigned int m, unsigned int s, unsigned int freq_band) -{ - s5p_mipi_dsi_set_pll_pms(dsim, p, m, s); - s5p_mipi_dsi_pll_freq_band(dsim, freq_band); - s5p_mipi_dsi_pll_stable_time(dsim, - dsim->dsim_config->pll_stable_time); - dsim->dsim_config->p = p; - dsim->dsim_config->m = m; - dsim->dsim_config->s = s; -} - -/* define MIPI-DSI Master operations. */ -static struct mipi_dsim_master_ops master_ops = { - .cmd_read = s5p_mipi_dsi_rd_data, - .cmd_write = s5p_mipi_dsi_wr_data, - .get_dsim_frame_done = s5p_mipi_dsi_get_frame_done_status, - .clear_dsim_frame_done = s5p_mipi_dsi_clear_frame_done, - .set_early_blank_mode = s5p_mipi_dsi_early_blank_mode, - .set_blank_mode = s5p_mipi_dsi_blank_mode, - .set_pms = s5p_mipi_dsi_set_pms, -}; - -static int s5p_mipi_dsi_notifier(unsigned int val, void *data) -{ - struct mipi_dsim_device *dsim = (struct mipi_dsim_device *)data; - int ret; - - ret = s5p_mipi_regulator_enable(dsim); - if (ret < 0) - return ret; - - ret = clk_enable(dsim->clock); - if (ret < 0) { - dev_err(dsim->dev, "failed to enable clock.\n"); - /* it doesn't need error check. */ - s5p_mipi_regulator_disable(dsim); - return ret; - } - - /* it doesn't need error check. */ - s5p_mipi_dsi_fifo_clear(dsim, val); - - clk_disable(dsim->clock); - return s5p_mipi_regulator_disable(dsim); -} - -static int register_notif_to_fimd(struct mipi_dsim_device *dsim) -{ - return fimd_register_client(s5p_mipi_dsi_notifier, - (void *)dsim); -} - -static int s5p_mipi_dsi_power_on(struct mipi_dsim_device *dsim, bool enable) -{ - struct mipi_dsim_lcd_driver *client_drv = master_to_driver(dsim); - struct mipi_dsim_lcd_device *client_dev = master_to_device(dsim); - struct platform_device *pdev = to_platform_device(dsim->dev); - - if (enable != false && enable != true) - return -EINVAL; - - if (enable) { - int ret; - - if (!dsim->suspended) - return 0; - - /* lcd panel power on. */ - if (client_drv && client_drv->power_on) - client_drv->power_on(client_dev, 1); - - ret = s5p_mipi_regulator_enable(dsim); - if (ret < 0) { - client_drv->power_on(client_dev, 0); - return ret; - } - - ret = clk_enable(dsim->clock); - if (ret < 0) { - dev_err(dsim->dev, "failed to enable clock.\n"); - /* it doesn't need error check. */ - s5p_mipi_regulator_disable(dsim); - client_drv->power_on(client_dev, 0); - return ret; - } - - /* enable MIPI-DSI PHY. */ - if (dsim->pd->phy_enable) - dsim->pd->phy_enable(pdev, true); - - s5p_mipi_update_cfg(dsim); - - /* set lcd panel sequence commands. */ - if (client_drv && client_drv->set_sequence) - client_drv->set_sequence(client_dev); - - dsim->suspended = false; - } else { - if (dsim->suspended) - return 0; - - if (client_drv && client_drv->suspend) - client_drv->suspend(client_dev); - - if (client_drv && client_drv->power_on) - client_drv->power_on(client_dev, 0); - - clk_disable(dsim->clock); - - dsim->suspended = true; - - return s5p_mipi_regulator_disable(dsim); - } - - return 0; -} - -static int s5p_mipi_dsi_probe(struct platform_device *pdev) -{ - struct resource *res; - struct mipi_dsim_device *dsim; - struct mipi_dsim_config *dsim_config; - struct s5p_platform_mipi_dsim *dsim_pd; - struct mipi_dsim_lcd_driver *client_drv; - struct mipi_dsim_ddi *dsim_ddi; - int ret = -EINVAL; - - dsim = kzalloc(sizeof(struct mipi_dsim_device), GFP_KERNEL); - if (!dsim) { - dev_err(&pdev->dev, "failed to allocate dsim object.\n"); - return -EFAULT; - } - - dsim->pd = to_dsim_plat(pdev); - dsim->dev = &pdev->dev; - dsim->id = pdev->id; - - /* get s5p_platform_mipi_dsim. */ - dsim_pd = (struct s5p_platform_mipi_dsim *)dsim->pd; - if (dsim_pd == NULL) { - dev_err(&pdev->dev, "failed to get platform data for dsim.\n"); - ret = -EFAULT; - goto err_free; - } - /* get mipi_dsim_config. */ - dsim_config = dsim_pd->dsim_config; - if (dsim_config == NULL) { - dev_err(&pdev->dev, "failed to get dsim config data.\n"); - ret = -EFAULT; - goto err_free; - } - - dsim->dsim_config = dsim_config; - dsim->master_ops = &master_ops; - - mutex_init(&dsim->lock); - - dsim->reg_vdd10 = regulator_get(&pdev->dev, "VDD10"); - if (IS_ERR(dsim->reg_vdd10)) { - ret = PTR_ERR(dsim->reg_vdd10); - dev_err(&pdev->dev, "failed to get %s regulator (%d)\n", - "VDD10", ret); - dsim->reg_vdd10 = NULL; - } - - dsim->reg_vdd18 = regulator_get(&pdev->dev, "VDD18"); - if (IS_ERR(dsim->reg_vdd18)) { - ret = PTR_ERR(dsim->reg_vdd18); - dev_err(&pdev->dev, "failed to get %s regulator (%d)\n", - "VDD18", ret); - dsim->reg_vdd18 = NULL; - } - dsim->clock = clk_get(&pdev->dev, "dsim0"); - if (IS_ERR(dsim->clock)) { - dev_err(&pdev->dev, "failed to get dsim clock source\n"); - goto err_regulator; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "failed to get io memory region\n"); - goto err_put_clk; - } - - dsim->res = request_mem_region(res->start, resource_size(res), - dev_name(&pdev->dev)); - if (!dsim->res) { - dev_err(&pdev->dev, "failed to request io memory region\n"); - ret = -ENOMEM; - goto err_release_res; - } - - dsim->reg_base = ioremap(res->start, resource_size(res)); - if (!dsim->reg_base) { - dev_err(&pdev->dev, "failed to remap io region\n"); - ret = -EFAULT; - goto err_release_mem; - } - - dsim->irq = platform_get_irq(pdev, 0); - if (dsim->irq < 0) { - dev_err(&pdev->dev, "failed to request dsim irq resource\n"); - ret = -EINVAL; - goto err_unmap; - } - - ret = request_irq(dsim->irq, s5p_mipi_dsi_interrupt_handler, - IRQF_SHARED, pdev->name, dsim); - if (ret != 0) { - dev_err(&pdev->dev, "failed to request dsim irq\n"); - ret = -EINVAL; - goto err_unmap; - } - - /* bind lcd ddi matched with panel name. */ - dsim_ddi = s5p_mipi_dsi_bind_lcd_ddi(dsim, dsim_pd->lcd_panel_name); - if (!dsim_ddi) { - dev_err(&pdev->dev, "mipi_dsim_ddi object not found.\n"); - goto err_free_irq; - } - - /* register a callback called by fimd. */ - ret = register_notif_to_fimd(dsim); - if (ret < 0) { - dev_err(&pdev->dev, "failed to register fimd notifier.\n"); - fimd_unregister_client(s5p_mipi_dsi_notifier); - - goto err_free_irq; - } - - init_completion(&dsim_wr_comp); - init_completion(&dsim_rd_comp); - mutex_init(&dsim->lock); - - client_drv = dsim_ddi->dsim_lcd_drv; - - /* initialize mipi-dsi client(lcd panel). */ - if (client_drv && client_drv->probe) - client_drv->probe(dsim_ddi->dsim_lcd_dev); - - platform_set_drvdata(pdev, dsim); - - /* in case that mipi got enabled at bootloader. */ - if (dsim_pd->enabled) { - ret = s5p_mipi_regulator_enable(dsim); - if (ret < 0) - goto err_regulator_enable; - - ret = pm_runtime_set_active(&pdev->dev); - if (ret < 0) { - dev_err(&pdev->dev, "failed to active pm runtime.\n"); - goto err_pm_runtime_active; - } - - s5p_mipi_dsi_init_interrupt(dsim); - - if (client_drv && client_drv->check_mtp) - client_drv->check_mtp(dsim_ddi->dsim_lcd_dev); - - /* set lcd panel sequence commands. */ - if (client_drv && client_drv->set_sequence) - client_drv->set_sequence(dsim_ddi->dsim_lcd_dev); - } else { - /* TODO: - * add check_mtp callback function - * if mipi dsim is off on bootloader, it causes kernel panic */ - pm_runtime_set_suspended(&pdev->dev); - dsim->suspended = true; - } - - pm_runtime_enable(&pdev->dev); - ret = pm_runtime_get_sync(&pdev->dev); - if (ret < 0) { - dev_err(&pdev->dev, "failed to get pm runtime.\n"); - pm_runtime_disable(&pdev->dev); - goto err_regulator_enable; - } - - dev_info(&pdev->dev, "mipi-dsi driver(%s mode) has been probed.\n", - (dsim_config->e_interface == DSIM_COMMAND) ? - "CPU" : "RGB"); - - return 0; - -err_pm_runtime_active: - /* it doesn't need error check. */ - s5p_mipi_regulator_disable(dsim); - -err_regulator_enable: - if (client_drv && client_drv->remove) - client_drv->remove(dsim_ddi->dsim_lcd_dev); - -err_free_irq: - free_irq(dsim->irq, dsim); - -err_unmap: - iounmap((void __iomem *) dsim->reg_base); - -err_release_mem: - release_mem_region(dsim->res->start, resource_size(dsim->res)); - -err_release_res: - release_resource(dsim->res); - -err_put_clk: - clk_disable(dsim->clock); - clk_put(dsim->clock); - -err_regulator: - regulator_put(dsim->reg_vdd18); - regulator_put(dsim->reg_vdd10); - -err_free: - kfree(dsim); - return ret; -} - -static int __devexit s5p_mipi_dsi_remove(struct platform_device *pdev) -{ - struct mipi_dsim_device *dsim = platform_get_drvdata(pdev); - struct mipi_dsim_ddi *dsim_ddi; - struct mipi_dsim_lcd_driver *dsim_lcd_drv; - - iounmap(dsim->reg_base); - - s5p_mipi_regulator_disable(dsim); - regulator_put(dsim->reg_vdd18); - regulator_put(dsim->reg_vdd10); - - clk_disable(dsim->clock); - clk_put(dsim->clock); - - release_resource(dsim->res); - release_mem_region(dsim->res->start, resource_size(dsim->res)); - - list_for_each_entry(dsim_ddi, &dsim_ddi_list, list) { - if (dsim_ddi) { - if (dsim->id != dsim_ddi->bus_id) - continue; - - dsim_lcd_drv = dsim_ddi->dsim_lcd_drv; - - if (dsim_lcd_drv->remove) - dsim_lcd_drv->remove(dsim_ddi->dsim_lcd_dev); - - list_del(&dsim_ddi->list); - kfree(dsim_ddi); - } - } - - kfree(dsim); - - return 0; -} - -#ifdef CONFIG_PM -static int s5p_mipi_dsi_suspend(struct device *dev) -{ - struct mipi_dsim_device *dsim = dev_to_dsim(dev); - - if (pm_runtime_suspended(dev)) - return 0; - - /* - * do not use pm_runtime_suspend(). if pm_runtime_suspend() is - * called here, an error would be returned by that interface - * because the usage_count of pm runtime is more than 1. - */ - return s5p_mipi_dsi_power_on(dsim, false); -} - -static int s5p_mipi_dsi_resume(struct device *dev) -{ - struct mipi_dsim_device *dsim = dev_to_dsim(dev); - - /* - * if entering to sleep when lcd panel is on, the usage_count - * of pm runtime would still be 1 so in this case, mipi dsi driver - * should be on directly not drawing on pm runtime interface. - */ - if (!pm_runtime_suspended(dev)) - return s5p_mipi_dsi_power_on(dsim, true); - - return 0; -} - -static int s5p_mipi_dsi_runtime_suspend(struct device *dev) -{ - struct mipi_dsim_device *dsim = dev_to_dsim(dev); - - return s5p_mipi_dsi_power_on(dsim, false); -} - -static int s5p_mipi_dsi_runtime_resume(struct device *dev) -{ - struct mipi_dsim_device *dsim = dev_to_dsim(dev); - - return s5p_mipi_dsi_power_on(dsim, true); -} - -static const struct dev_pm_ops s5p_mipi_dsi_pm_ops = { - .suspend = s5p_mipi_dsi_suspend, - .resume = s5p_mipi_dsi_resume, -#ifdef CONFIG_HIBERNATION - .freeze = s5p_mipi_dsi_suspend, - .thaw = s5p_mipi_dsi_resume, - .restore = s5p_mipi_dsi_resume, -#endif - .runtime_suspend = s5p_mipi_dsi_runtime_suspend, - .runtime_resume = s5p_mipi_dsi_runtime_resume, -}; -#endif - -static struct platform_driver s5p_mipi_dsi_driver = { - .probe = s5p_mipi_dsi_probe, - .remove = __devexit_p(s5p_mipi_dsi_remove), - .driver = { - .name = "s5p-mipi-dsim", - .owner = THIS_MODULE, -#ifdef CONFIG_PM - .pm = &s5p_mipi_dsi_pm_ops, -#endif - }, -}; - -static int s5p_mipi_dsi_register(void) -{ - platform_driver_register(&s5p_mipi_dsi_driver); - - return 0; -} - -static void s5p_mipi_dsi_unregister(void) -{ - platform_driver_unregister(&s5p_mipi_dsi_driver); -} - -late_initcall(s5p_mipi_dsi_register); -module_exit(s5p_mipi_dsi_unregister); - -MODULE_AUTHOR("InKi Dae "); -MODULE_DESCRIPTION("Samusung SoC MIPI-DSI driver"); -MODULE_LICENSE("GPL"); diff --git a/drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi_common.c b/drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi_common.c deleted file mode 100644 index 9b4714c..0000000 --- a/drivers/video/samsung_duallcd/dsim2/s5p_mipi_dsi_common.c +++ /dev/null @@ -1,884 +0,0 @@ -/* linux/drivers/video/s5p_mipi_dsi_common.c - * - * Samsung SoC MIPI-DSI common driver. - * - * Copyright (c) 2011 Samsung Electronics Co., Ltd - * - * InKi Dae, - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include