summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaewon Kim <jaewon02.kim@samsung.com>2014-10-10 17:34:07 +0900
committerChanho Park <chanho61.park@samsung.com>2014-10-13 17:37:31 -0700
commitc10ae55874fde16a60ac8ce8848b1595cf281f75 (patch)
treedf0d6e8b401517ca8c4b960a2ceee05a907e7aed
parent7651a01f8337ee05f1f03d54e678069dc8695685 (diff)
downloadlinux-3.10-c10ae55874fde16a60ac8ce8848b1595cf281f75.tar.gz
linux-3.10-c10ae55874fde16a60ac8ce8848b1595cf281f75.tar.bz2
linux-3.10-c10ae55874fde16a60ac8ce8848b1595cf281f75.zip
misc: ice4_irda: Move firmware download function to workqueue
This patch moves firmware download function to workqueue to reduce booting time. Change-Id: Idfa934b67494988a7de1f95f461dac41546cb2e5 Signed-off-by: Jaewon Kim <jaewon02.kim@samsung.com>
-rw-r--r--drivers/misc/ice4_irda.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/misc/ice4_irda.c b/drivers/misc/ice4_irda.c
index 37056585bf3..4e75bf67550 100644
--- a/drivers/misc/ice4_irda.c
+++ b/drivers/misc/ice4_irda.c
@@ -47,6 +47,7 @@ struct ice4_fpga_data {
struct regulator *ir_regulator;
struct mutex mutex;
struct clk *mclk;
+ struct work_struct work_download;
struct {
unsigned char addr;
unsigned char data[MAX_SIZE];
@@ -561,6 +562,20 @@ static void ice4_irda_firmware_download(struct device *dev,
dev_info(dev, "firmware download done!\n");
}
+static void work_function_firmware_download(struct work_struct *work)
+{
+ struct ice4_fpga_data *data = container_of((struct work_struct *)work,
+ struct ice4_fpga_data, work_download);
+
+ ice4_irda_firmware_download(&data->client->dev, fpga_irda_fw,
+ ARRAY_SIZE(fpga_irda_fw));
+
+ if (ice4_irda_check_cdone(data))
+ dev_err(&data->client->dev, "FPGA FW is loaded!\n");
+ else
+ dev_err(&data->client->dev, "FPGA FW is NOT loaded!\n");
+}
+
static int ice4_irda_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -571,11 +586,12 @@ static int ice4_irda_probe(struct i2c_client *client,
dev_info(&client->dev, "probe start!\n");
if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
- dev_err(&client->dev, "Failed to i2c functionality check err\n");
+ dev_err(&client->dev,
+ "Failed to i2c functionality check err\n");
return -EIO;
}
- data = kzalloc(sizeof(struct ice4_fpga_data), GFP_KERNEL);
+ data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
if (NULL == data) {
dev_err(&client->dev, "Failed to data allocate\n");
return -ENOMEM;
@@ -599,15 +615,8 @@ static int ice4_irda_probe(struct i2c_client *client,
goto err_parse;
}
- ice4_irda_firmware_download(&client->dev, fpga_irda_fw,
- ARRAY_SIZE(fpga_irda_fw));
-
- if (ice4_irda_check_cdone(data))
- dev_err(&client->dev, "FPGA FW is loaded!\n");
- else {
- dev_err(&client->dev, "FPGA FW is NOT loaded!\n");
- goto err_parse;
- }
+ INIT_WORK(&data->work_download, work_function_firmware_download);
+ schedule_work(&data->work_download);
data->sec_class = class_create(THIS_MODULE, "sec");
if (IS_ERR(data->sec_class)) {