コード例 #1
0
int bbd_sensor_uninit(void)
{
        struct bbd_sensor_device* p = bbd_sensor_ptr();
        int freed = 0;
        if (p) {
                freed = bbd_base_uninit(&p->base);
                bbd_free(p);
                gpbbd_dev->bbd_ptr[BBD_MINOR_SENSOR] = 0;
        }
        return freed;
}
コード例 #2
0
static void __exit bbd_device_exit(void)
{
	struct bbd_device *pbbd_dev = gpbbd_dev;
	struct device *dev = &bbd_platform_dev.dev;
	int index = 0;
	int freedActive = 0;
	int freedIdle   = 0;

	if (pbbd_dev == NULL)
		return;


	for (index = 0; index < BBD_DEVICE_INDEX; index++) {
		cdev_del(&pbbd_dev->dev[index]);
		unregister_chrdev_region(MKDEV(bbd_dev_major, index), 1);
	}

        BbdEngine_dtor(&pbbd_dev->bbd_engine);

        bbd_ssi_spi_close();
        bbd_tty_close();
        // freedActive += bbd_ssi_spi_debug_uninit(); not needed
        freedActive += bbd_patch_uninit();
        freedActive += bbd_reliable_uninit();
        freedActive += bbd_packet_uninit();
        freedActive += bbd_control_uninit();
        freedActive += bbd_sensor_uninit();

        freedIdle    = bbd_qitem_cache_uninit();
        pbbd_dev->qfree = 0;
	bbd_free(pbbd_dev);
	gpbbd_dev = 0;

        printk("%s Buffer stats: %d active %d idle  %d lost\n", __func__,
                        freedActive, freedIdle, bbd_alloc_count());

        bbd_sysfs_uninit(&dev->kobj);
	platform_device_unregister(&bbd_platform_dev);
}
コード例 #3
0
void bbd_sensor_init_vars(struct bbd_device *dev, int* result)
{
        struct bbd_sensor_device *p = 0;

        if (*result)
                return;

	p = bbd_alloc(sizeof(struct bbd_sensor_device));
        if (!p) {
		*result = -ENOMEM;
		return;
        }

        bbd_base_init_vars(dev, &p->base, result);
        if (*result) {
                bbd_free(p);
                return;
        }
        p->priv_data = 0;
        p->callbacks = 0;
        dev->bbd_ptr[BBD_MINOR_SENSOR] = p;
        p->base.name = "sensor";
}
コード例 #4
0
static int __init bbd_device_init(void)
{
	int ret   = -ENOMEM;
	int index =  0;
	dev_t devno[BBD_DEVICE_INDEX] = {0,};
	struct device *dev = NULL;
	struct class *bbd_class;	

	const char *dev_name[BBD_DEVICE_INDEX] = {
		"bbd_sensor",
		"bbd_control",
		"bbd_packet",
		"bbd_reliable",
		"bbd_patch",
		"bbd_ssi_spi_debug" };

	gpbbd_dev = bbd_alloc(sizeof(struct bbd_device));
	if (gpbbd_dev == NULL)
		return ret;

	ret = bbd_init_vars(gpbbd_dev);
	if (ret < 0)
		return ret;

	bbd_class = class_create(THIS_MODULE, "bbd");
	if (IS_ERR(bbd_class)) {
		printk(KERN_ERR "BBD:%s() failed to create class (ret=%d)\n",
					__func__, ret);
		return ret;
	}

	for (index = 0; index < BBD_DEVICE_INDEX; index++) {
		printk(KERN_INFO "BBD:%s(%d,%d)##### 204024 /dev/%s\n",
                            __func__, BBD_DEVICE_MAJOR,index, dev_name[index]);

		devno[index] = MKDEV(BBD_DEVICE_MAJOR, index);
                if (dev_name[index])
                    ret = register_chrdev_region(devno[index], 1, dev_name[index]);
                else
                    ret = -EFAULT;
		if (ret < 0) {
			printk(KERN_ERR "BBD:%s() failed to register char dev(%d) (ret=%d)\n",
						__func__, index, ret);
			return ret;
		}

		dev = device_create(bbd_class, NULL, MKDEV(BBD_DEVICE_MAJOR, index), NULL, 
					"%s", dev_name[index]);
		if (IS_ERR_OR_NULL(dev)) {
			printk(KERN_ERR "BBD:%s() failed to create device %s (ret=%d)\n",
						__func__, dev_name[index], ret);
			return ret;
		}

		cdev_init(&gpbbd_dev->dev[index], &bbd_fops[index]);

		gpbbd_dev->dev[index].owner = THIS_MODULE;
		gpbbd_dev->dev[index].ops   = &bbd_fops[index];
		ret = cdev_add(&gpbbd_dev->dev[index], devno[index], 1);
		if (ret) {
			printk(KERN_ERR "failed to add bbd_device device(ret=%d).\n",
						ret);
			return ret;
		}
	}

	ret = platform_device_register(&bbd_platform_dev);
	if (ret) {
		printk(KERN_ERR "%s(): failed to register platfrom device(bbd_device)\n",
		__func__);
		goto err;
	}
	dev = &bbd_platform_dev.dev;
	dev_set_drvdata(dev, (void *)gpbbd_dev);

	ret = bbd_sysfs_init(&dev->kobj);
	if (ret < 0) {
		goto err;
	}

        bbd_ssi_spi_open();

	return 0;

err:
	for (index = 0; index < BBD_DEVICE_INDEX; index++) {
		cdev_del(&gpbbd_dev->dev[index]);
		unregister_chrdev_region(MKDEV(bbd_dev_major, index), 1);
	}
        if (gpbbd_dev) {
            bbd_free(gpbbd_dev);
            gpbbd_dev = 0;
        }
	return ret;
}