static int broadcast_tdmb_fc8080_probe(struct spi_device *spi) { int rc; if(spi == NULL) { printk("broadcast_fc8080_probe spi is NULL, so spi can not be set\n"); return -1; } fc8080_ctrl_info.TdmbPowerOnState = FALSE; fc8080_ctrl_info.spi_ptr = spi; fc8080_ctrl_info.spi_ptr->mode = SPI_MODE_0; fc8080_ctrl_info.spi_ptr->bits_per_word = 8; fc8080_ctrl_info.spi_ptr->max_speed_hz = (15000*1000); fc8080_ctrl_info.pdev = to_platform_device(&spi->dev); #ifdef FEATURE_DMB_USE_BUS_SCALE fc8080_ctrl_info.bus_scale_pdata = msm_bus_cl_get_pdata(fc8080_ctrl_info.pdev); fc8080_ctrl_info.bus_scale_client_id = msm_bus_scale_register_client(fc8080_ctrl_info.bus_scale_pdata); #endif // Once I have a spi_device structure I can do a transfer anytime rc = spi_setup(spi); printk("broadcast_tdmb_fc8080_probe spi_setup=%d\n", rc); bbm_com_hostif_select(NULL, 1); #ifdef FEATURE_DMB_USE_XO fc8080_ctrl_info.clk = clk_get(&fc8080_ctrl_info.spi_ptr->dev, "xo"); if (IS_ERR(fc8080_ctrl_info.clk)) { rc = PTR_ERR(fc8080_ctrl_info.clk); dev_err(&fc8080_ctrl_info.spi_ptr->dev, "could not get clock\n"); return rc; } /* We enable/disable the clock only to assure it works */ rc = clk_prepare_enable(fc8080_ctrl_info.clk); if (rc) { dev_err(&fc8080_ctrl_info.spi_ptr->dev, "could not enable clock\n"); return rc; } clk_disable_unprepare(fc8080_ctrl_info.clk); #endif #ifdef FEATURE_DMB_USE_WORKQUEUE INIT_WORK(&fc8080_ctrl_info.spi_work, broacast_tdmb_spi_work); fc8080_ctrl_info.spi_wq = create_singlethread_workqueue("tdmb_spi_wq"); if(fc8080_ctrl_info.spi_wq == NULL){ printk("Failed to setup tdmb spi workqueue \n"); return -ENOMEM; } #endif tdmb_configure_gpios(); #ifdef FEATURE_DMB_USE_WORKQUEUE rc = request_irq(spi->irq, broadcast_tdmb_spi_isr, IRQF_DISABLED | IRQF_TRIGGER_FALLING, spi->dev.driver->name, &fc8080_ctrl_info); #else rc = request_threaded_irq(spi->irq, NULL, broadcast_tdmb_spi_event_handler, IRQF_ONESHOT | IRQF_DISABLED | IRQF_TRIGGER_FALLING, spi->dev.driver->name, &fc8080_ctrl_info); #endif printk("broadcast_tdmb_fc8080_probe request_irq=%d\n", rc); tdmb_fc8080_interrupt_lock(); mutex_init(&fc8080_ctrl_info.mutex); wake_lock_init(&fc8080_ctrl_info.wake_lock, WAKE_LOCK_SUSPEND, dev_name(&spi->dev)); spin_lock_init(&fc8080_ctrl_info.spin_lock); #ifdef FEATURE_DMB_USE_PM_QOS pm_qos_add_request(&fc8080_ctrl_info.pm_req_list, PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE); #endif printk("broadcast_fc8080_probe End\n"); return rc; }
unsigned char dmb_drv_init(void) { #ifdef FEATURE_INTERFACE_TEST_MODE int i; 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; }