void smsspi_unregister(void) { struct _spi_device_st *spi_device = spi_dev; PDEBUG("entering\n"); /* stop interrupts */ smsspiphy_deinit(spi_device->phy_dev); smscore_unregister_device(spi_device->coredev); dma_free_coherent(NULL, TX_BUFFER_SIZE, spi_device->txbuf, spi_device->txbuf_phy_addr); platform_device_unregister(&smsspi_device); PDEBUG("exiting\n"); }
int smsspi_register(void) { struct smsdevice_params_t params; int ret = 0; struct _spi_device_st *spi_device; struct _spi_dev_cb_st common_cb; PDEBUG("entering \n"); printk(KERN_WARNING"enter smsspi_register\n"); spi_device = kmalloc(sizeof(struct _spi_device_st), GFP_KERNEL); if(!spi_device) { printk("spi_device is null smsspi_register\n") ; return 0; } spi_dev = spi_device; INIT_LIST_HEAD(&spi_device->txqueue); spi_device->txbuf = dma_alloc_coherent(NULL, MAX(TX_BUFFER_SIZE, PAGE_SIZE), &spi_device->txbuf_phy_addr, GFP_KERNEL | GFP_DMA); if (!spi_device->txbuf) { printk(KERN_INFO "%s dma_alloc_coherent(...) failed\n", __func__); ret = -ENOMEM; goto txbuf_error; } printk(KERN_INFO "smsmdtv: spi_device->txbuf = 0x%x spi_device->txbuf_phy_addr= 0x%x\n", (unsigned int)spi_device->txbuf, spi_device->txbuf_phy_addr); spi_device->phy_dev = smsspiphy_init(NULL, smsspi_int_handler, spi_device); if (spi_device->phy_dev == 0) { printk(KERN_INFO "%s smsspiphy_init(...) failed\n", __func__); goto phy_error; } common_cb.allocate_rx_buf = allocate_rx_buf; common_cb.free_rx_buf = free_rx_buf; common_cb.msg_found_cb = msg_found; common_cb.transfer_data_cb = smsspibus_xfer; ret = smsspicommon_init(&spi_device->dev, spi_device, spi_device->phy_dev, &common_cb); if (ret) { printk(KERN_INFO "%s smsspiphy_init(...) failed\n", __func__); goto common_error; } /* register in smscore */ memset(¶ms, 0, sizeof(params)); params.context = spi_device; params.device = &smsspi_device.dev; params.buffer_size = RX_BUFFER_SIZE; params.num_buffers = NUM_RX_BUFFERS; params.flags = SMS_DEVICE_NOT_READY; params.sendrequest_handler = smsspi_write; strcpy(params.devpath, "spi"); params.device_type = default_type; if (0) { /* device family */ /* params.setmode_handler = smsspi_setmode; */ } else { params.flags = SMS_DEVICE_FAMILY2 | SMS_DEVICE_NOT_READY | SMS_ROM_NO_RESPONSE; params.preload_handler = smsspi_preload; params.postload_handler = smsspi_postload; } ret = smscore_register_device(¶ms, &spi_device->coredev); if (ret < 0) { printk(KERN_INFO "%s smscore_register_device(...) failed\n", __func__); goto reg_device_error; } ret = smscore_start_device(spi_device->coredev); if (ret < 0) { printk(KERN_INFO "%s smscore_start_device(...) failed\n", __func__); goto start_device_error; } spi_resume_fail = 0 ; spi_suspended = 0 ; #if 0 //ZTE:added by wangtao for cmmbtest 20110712 { smsspibus_ssp_resume(spi_dev->phy_dev) ; // smsspi_preload(spi_dev); printk(KERN_INFO "%s [test] smsspi_preload test end\n",__func__); } #endif printk(KERN_WARNING"helike exit smsspi_register\n"); PDEBUG("exiting\n"); return 0; start_device_error: smscore_unregister_device(spi_device->coredev); reg_device_error: common_error: smsspiphy_deinit(spi_device->phy_dev); phy_error: dma_free_coherent(NULL, TX_BUFFER_SIZE, spi_device->txbuf, spi_device->txbuf_phy_addr); txbuf_error: PDEBUG("exiting error %d\n", ret); return ret; }
int smsspi_register(void) { struct smsdevice_params_t params; int ret; struct _spi_device_st *spi_device; struct _spi_dev_cb_st common_cb; PDEBUG("entering \n"); spi_device = kmalloc(sizeof(struct _spi_device_st), GFP_KERNEL); spi_dev = spi_device; INIT_LIST_HEAD(&spi_device->txqueue); ret = platform_device_register(&smsspi_device); if (ret < 0) { PERROR("platform_device_register failed\n"); return ret; } #if defined(MOT_FEAT_OMAP_DMA_USE) spi_device->txbuf = dma_alloc_coherent(NULL, TX_BUFFER_SIZE, &spi_device->txbuf_phy_addr, GFP_KERNEL | GFP_DMA); if (!spi_device->txbuf) { printk(KERN_INFO "%s dma_alloc_coherent(...) failed\n", __func__); ret = -ENOMEM; goto txbuf_error; } #endif spi_device->phy_dev = smsspiphy_init(NULL, smsspi_int_handler, spi_device); if (spi_device->phy_dev == 0) { printk(KERN_INFO "%s smsspiphy_init(...) failed\n", __func__); goto phy_error; } common_cb.allocate_rx_buf = allocate_rx_buf; common_cb.free_rx_buf = free_rx_buf; common_cb.msg_found_cb = msg_found; common_cb.transfer_data_cb = smsspibus_xfer; ret = smsspicommon_init(&spi_device->dev, spi_device, spi_device->phy_dev, &common_cb); if (ret) { printk(KERN_INFO "%s smsspiphy_init(...) failed\n", __func__); goto common_error; } /* register in smscore */ memset(¶ms, 0, sizeof(params)); params.context = spi_device; params.device = &smsspi_device.dev; params.buffer_size = RX_BUFFER_SIZE; params.num_buffers = NUM_RX_BUFFERS; params.flags = SMS_DEVICE_NOT_READY; params.sendrequest_handler = smsspi_write; strcpy(params.devpath, "spi"); params.device_type = default_type; if (0) { /* device family */ /* params.setmode_handler = smsspi_setmode; */ } else { params.flags = SMS_DEVICE_FAMILY2 | SMS_DEVICE_NOT_READY; params.preload_handler = smsspi_preload; params.postload_handler = smsspi_postload; } ret = smscore_register_device(¶ms, &spi_device->coredev); if (ret < 0) { printk(KERN_INFO "%s smscore_register_device(...) failed\n", __func__); goto reg_device_error; } ret = smscore_start_device(spi_device->coredev); if (ret < 0) { printk(KERN_INFO "%s smscore_start_device(...) failed\n", __func__); goto start_device_error; } PDEBUG("exiting\n"); return 0; start_device_error: smscore_unregister_device(spi_device->coredev); reg_device_error: common_error: smsspiphy_deinit(spi_device->phy_dev); phy_error: dma_free_coherent(NULL, TX_BUFFER_SIZE, spi_device->txbuf, spi_device->txbuf_phy_addr); txbuf_error: platform_device_unregister(&smsspi_device); PDEBUG("exiting error %d\n", ret); return ret; }