コード例 #1
0
static int SN3193_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	int ret=0;
	int i;
    	struct SN3193_sled * sn3193_sled_dev;

	//client->dev.platform_data = &rgb_pdata;

	SN3193_power();
	msleep(100);
	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
		pr_err("%s : need I2C_FUNC_I2C\n", __func__);
		return  -ENODEV;
		}
       SN3193_sled_dev_sate->gi2c_dev=client;
	sn3193_sled_dev = kzalloc(sizeof(struct SN3193_sled), GFP_KERNEL);
	if (sn3193_sled_dev == NULL) {
		dev_err(&client->dev,
				"failed to allocate memory for module data\n");
		ret = -ENOMEM;
		goto err_exit;
	}
	pr_info("%s:sn3193 probe\n",__func__);
	sn3193_sled_dev->i2c_dev   = client;
	sn3193_sled_dev->SN3193_miscdev.minor = MISC_DYNAMIC_MINOR;
	sn3193_sled_dev->SN3193_miscdev.name = "SN3193";
	sn3193_sled_dev->SN3193_miscdev.fops = &SN3193_fops;

	ret = misc_register(&sn3193_sled_dev->SN3193_miscdev);
	if (ret) {
		pr_err("%s : misc_register failed\n", __FILE__);
		goto err_misc_register;
	}

	for(i = 0; i < 3; i ++ )
	{
		if (led_classdev_register(&client->dev, &SN3193_lcds[i]))
		{
			printk(KERN_ERR "led_classdev_register failed of SN3193_lcds!\n");
			goto err_classdev_register;
		}
	}
	
	ret = sysfs_create_group(&client->dev.kobj, &blink_attr_group);
	if (ret) {
		pr_err( "%s : sysfs_create_group failed!\n", __func__);
		goto err_group_register;
	}

	i2c_set_clientdata(client, sn3193_sled_dev);

	//SN3193_config_feature_sled(0);		//dvt not breath

	//close, light as need
	SN3193_SetBrightness(RED_SLED,0);
	SN3193_SetBrightness(GREEN_SLED,0);
	SN3193_SetBrightness(BLUE_SLED,0);
	SN3193_upData_sled();
	SN3193_TurnOffOut_sled();
	SN3193_enable_sled(0);


	/**************************test*********************/
	//enable sled
	/*SN3193_enable_sled(1);
       SN3193_config_feature_sled(0x00);
	SN3193_workmod_sled(1);
	SN3193_setCurrent_sled(0x01);*/
        //SN3193_enable_diff_color_sled(BLUE_SLED);
        //mod_timer(&SN3193_sled_dev_sate->gsled_last_timer,jiffies+5*HZ);
       /**************************test******************/
	return 0;
err_group_register:
	for(i = 0; i < 3; i ++ )
		led_classdev_unregister(&SN3193_lcds[i]);
err_classdev_register:
	misc_deregister(&sn3193_sled_dev->SN3193_miscdev);
err_misc_register:
	kfree(sn3193_sled_dev);
err_exit:
	return ret;
}
コード例 #2
0
static int SN3193_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    int ret = 0;
    int i, rc;
    enum of_gpio_flags gpio_flags;
    struct SN3193_sled * sn3193_sled_dev;

    SN3193_sled_dev_sate->ena_gpio = of_get_named_gpio_flags(client->dev.of_node, "sn3193,sdb-gpio", 0, &gpio_flags);
    pr_debug("%s ena_gpio:%d\n", __func__, SN3193_sled_dev_sate->ena_gpio);

    if (gpio_is_valid(SN3193_sled_dev_sate->ena_gpio)) {
        rc = gpio_request(SN3193_sled_dev_sate->ena_gpio, "sn3193");
        if (rc) {
            pr_err("%s gpio_request for %d failed rc=%d\n", __func__, SN3193_sled_dev_sate->ena_gpio, rc);
            return rc;
        }

        rc = gpio_direction_output(SN3193_sled_dev_sate->ena_gpio, 0);
        if (rc) {
            pr_err("%s set enable gpio direction fail\n",__func__);
            gpio_free(SN3193_sled_dev_sate->ena_gpio);
            return rc;
        }
    } else { 
        pr_err("%s SN3193 ena_gpio invalid\n",__func__);
        return -1;
    }

    //client->dev.platform_data = &rgb_pdata;

    /* i2c pull up Regulator configuration */
    SN3193_sled_dev_sate->vcc_i2c = regulator_get(&client->dev, "vcc_i2c_sn3193");
    if (IS_ERR(SN3193_sled_dev_sate->vcc_i2c)) {
       pr_err("%s: Failed to get i2c regulator\n", __func__);
        rc = PTR_ERR(SN3193_sled_dev_sate->vcc_i2c);
        return -1;//retval;
    }
    
    if (regulator_count_voltages(SN3193_sled_dev_sate->vcc_i2c) > 0) {
        rc = regulator_set_voltage(SN3193_sled_dev_sate->vcc_i2c, 1800000, 1800000);
        if (rc) {
            pr_err("regulator set i2c voltage failed! rc = %d\n", rc);
            return rc;
        }
    }
    
    rc = regulator_enable(SN3193_sled_dev_sate->vcc_i2c);
    if (rc) {
        pr_err("Regulator vcc_i2c enable failed! rc = %d\n", rc);
        return rc;
    }

    SN3193_power();
    msleep(100);
    if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
        pr_err("%s : need I2C_FUNC_I2C\n", __func__);
        return  -ENODEV;
    }

    SN3193_sled_dev_sate->gi2c_dev=client;
    sn3193_sled_dev = kzalloc(sizeof(struct SN3193_sled), GFP_KERNEL);
    if (sn3193_sled_dev == NULL) {
        dev_err(&client->dev, "failed to allocate memory for module data\n");
        ret = -ENOMEM;
        goto err_exit;
    }

    pr_info("%s:sn3193 probe\n",__func__);
    sn3193_sled_dev->i2c_dev   = client;
    sn3193_sled_dev->SN3193_miscdev.minor = MISC_DYNAMIC_MINOR;
    sn3193_sled_dev->SN3193_miscdev.name = "SN3193";
    sn3193_sled_dev->SN3193_miscdev.fops = &SN3193_fops;

    ret = misc_register(&sn3193_sled_dev->SN3193_miscdev);
    if (ret) {
        pr_err("%s : misc_register failed\n", __FILE__);
        goto err_misc_register;
    }

    for(i = 0; i < 3; i ++ ) {
        if (led_classdev_register(&client->dev, &SN3193_lcds[i])) {
            printk(KERN_ERR "led_classdev_register failed of SN3193_lcds!\n");
            goto err_classdev_register;
        }
    }

    ret = sysfs_create_group(&client->dev.kobj, &blink_attr_group);
    if (ret) {
        pr_err( "%s : sysfs_create_group failed!\n", __func__);
        goto err_group_register;
    }

    i2c_set_clientdata(client, sn3193_sled_dev);

    //SN3193_config_feature_sled(0);		//dvt not breath

    //close, light as need
    SN3193_SetBrightness(RED_SLED, 0);
    SN3193_SetBrightness(GREEN_SLED, 0);
    SN3193_SetBrightness(BLUE_SLED, 0);
    SN3193_upData_sled();
    SN3193_TurnOffOut_sled();
    SN3193_enable_sled(0);

    /**************************test*********************/
    //enable sled
    /*SN3193_enable_sled(1);
    SN3193_config_feature_sled(0x00);
    SN3193_workmod_sled(1);
    SN3193_setCurrent_sled(0x01);*/
    //SN3193_enable_diff_color_sled(BLUE_SLED);
    //mod_timer(&SN3193_sled_dev_sate->gsled_last_timer, jiffies+5*HZ);
    /**************************test******************/

    return 0;
err_group_register:
    for(i = 0; i < 3; i ++ )
        led_classdev_unregister(&SN3193_lcds[i]);
err_classdev_register:
    misc_deregister(&sn3193_sled_dev->SN3193_miscdev);
err_misc_register:
    kfree(sn3193_sled_dev);
err_exit:
    return ret;
}