static int blinkm_test_run(struct i2c_client *client) { int ret; struct blinkm_data *data = i2c_get_clientdata(client); data->next_red = 0x01; data->next_green = 0x05; data->next_blue = 0x10; ret = blinkm_transfer_hw(client, BLM_GO_RGB); if (ret < 0) return ret; msleep(2000); data->next_red = 0x25; data->next_green = 0x10; data->next_blue = 0x31; ret = blinkm_transfer_hw(client, BLM_FADE_RGB); if (ret < 0) return ret; msleep(2000); data->next_hue = 0x50; data->next_saturation = 0x10; data->next_brightness = 0x20; ret = blinkm_transfer_hw(client, BLM_FADE_HSB); if (ret < 0) return ret; msleep(2000); return 0; }
static ssize_t show_color_common(struct device *dev, char *buf, int color) { struct i2c_client *client; struct blinkm_data *data; int ret; client = to_i2c_client(dev); data = i2c_get_clientdata(client); ret = blinkm_transfer_hw(client, BLM_GET_CUR_RGB); if (ret < 0) return ret; switch (color) { case RED: return scnprintf(buf, PAGE_SIZE, "%02X\n", data->red); break; case GREEN: return scnprintf(buf, PAGE_SIZE, "%02X\n", data->green); break; case BLUE: return scnprintf(buf, PAGE_SIZE, "%02X\n", data->blue); break; default: return -EINVAL; } return -EINVAL; }
static int __devexit blinkm_remove(struct i2c_client *client) { struct blinkm_data *data = i2c_get_clientdata(client); int ret = 0; int i; /* make sure no workqueue entries are pending */ for (i = 0; i < 3; i++) { flush_scheduled_work(); led_classdev_unregister(&data->blinkm_leds[i].led_cdev); } /* reset rgb */ data->next_red = 0x00; data->next_green = 0x00; data->next_blue = 0x00; ret = blinkm_transfer_hw(client, BLM_FADE_RGB); if (ret < 0) dev_err(&client->dev, "Failure in blinkm_remove ignored. Continuing.\n"); /* reset hsb */ data->next_hue = 0x00; data->next_saturation = 0x00; data->next_brightness = 0x00; ret = blinkm_transfer_hw(client, BLM_FADE_HSB); if (ret < 0) dev_err(&client->dev, "Failure in blinkm_remove ignored. Continuing.\n"); /* red fade to off */ data->next_red = 0xff; ret = blinkm_transfer_hw(client, BLM_GO_RGB); if (ret < 0) dev_err(&client->dev, "Failure in blinkm_remove ignored. Continuing.\n"); /* off */ data->next_red = 0x00; ret = blinkm_transfer_hw(client, BLM_FADE_RGB); if (ret < 0) dev_err(&client->dev, "Failure in blinkm_remove ignored. Continuing.\n"); sysfs_remove_group(&client->dev.kobj, &blinkm_group); return 0; }
static void led_work(struct work_struct *work) { int ret; struct blinkm_led *led; struct blinkm_data *data ; struct blinkm_work *blm_work = work_to_blmwork(work); led = blm_work->blinkm_led; data = i2c_get_clientdata(led->i2c_client); ret = blinkm_transfer_hw(led->i2c_client, BLM_GO_RGB); atomic_dec(&led->active); dev_dbg(&led->i2c_client->dev, "# DONE # next_red = %d, next_green = %d," " next_blue = %d, active = %d\n", data->next_red, data->next_green, data->next_blue, atomic_read(&led->active)); kfree(blm_work); }
static int store_color_common(struct device *dev, const char *buf, int color) { struct i2c_client *client; struct blinkm_data *data; int ret; u8 value; client = to_i2c_client(dev); data = i2c_get_clientdata(client); ret = kstrtou8(buf, 10, &value); if (ret < 0) { dev_err(dev, "BlinkM: value too large!\n"); return ret; } switch (color) { case RED: data->next_red = value; break; case GREEN: data->next_green = value; break; case BLUE: data->next_blue = value; break; default: return -EINVAL; } dev_dbg(dev, "next_red = %d, next_green = %d, next_blue = %d\n", data->next_red, data->next_green, data->next_blue); /* if mode ... */ ret = blinkm_transfer_hw(client, BLM_GO_RGB); if (ret < 0) { dev_err(dev, "BlinkM: can't set RGB\n"); return ret; } return 0; }
static int blinkm_led_common_set(struct led_classdev *led_cdev, enum led_brightness value, int color) { /* led_brightness is 0, 127 or 255 - we just use it here as-is */ struct blinkm_led *led = cdev_to_blmled(led_cdev); struct blinkm_data *data = i2c_get_clientdata(led->i2c_client); switch (color) { case RED: /* bail out if there's no change */ if (data->next_red == (u8) value) return 0; data->next_red = (u8) value; break; case GREEN: /* bail out if there's no change */ if (data->next_green == (u8) value) return 0; data->next_green = (u8) value; break; case BLUE: /* bail out if there's no change */ if (data->next_blue == (u8) value) return 0; data->next_blue = (u8) value; break; default: dev_err(&led->i2c_client->dev, "BlinkM: unknown color.\n"); return -EINVAL; } blinkm_transfer_hw(led->i2c_client, BLM_GO_RGB); dev_dbg(&led->i2c_client->dev, "# DONE # next_red = %d, next_green = %d," " next_blue = %d\n", data->next_red, data->next_green, data->next_blue); return 0; }
static void blinkm_init_hw(struct i2c_client *client) { int ret; ret = blinkm_transfer_hw(client, BLM_STOP_SCRIPT); ret = blinkm_transfer_hw(client, BLM_GO_RGB); }