aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Griffin <peter.griffin@linaro.org>2016-03-24 07:23:52 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-05-09 11:57:54 -0400
commitc23ac90f78aa9190643c82c1975a0cfe480d7c60 (patch)
treed298c08da6db6b0ec8c09bb6c9fc17c52b74ce32
parentee105cac24693c8f3ea92e1700d5d16c4b035eb5 (diff)
[media] c8sectpfe: Rework firmware loading mechanism
c8sectpfe driver relied on CONFIG_FW_LOADER_USER_HELPER_FALLBACK option for loading its xp70 firmware. A previous commit removed this Kconfig option, as it is apparently harmful, but did not update the driver code which relied on it. This patch reworks the firmware loading into the start_feed callback. At this point we can be sure the rootfs is present, thereby removing the depedency on CONFIG_FW_LOADER_USER_HELPER_FALLBACK. Fixes: 79f5b6ae960d ('[media] c8sectpfe: Remove select on CONFIG_FW_LOADER_USER_HELPER_FALLBACK') Signed-off-by: Peter Griffin <peter.griffin@linaro.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r--drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c65
1 files changed, 22 insertions, 43 deletions
diff --git a/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c b/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
index acd076780827..7dddf77a62cf 100644
--- a/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
+++ b/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
@@ -49,7 +49,7 @@ MODULE_FIRMWARE(FIRMWARE_MEMDMA);
49#define PID_TABLE_SIZE 1024 49#define PID_TABLE_SIZE 1024
50#define POLL_MSECS 50 50#define POLL_MSECS 50
51 51
52static int load_c8sectpfe_fw_step1(struct c8sectpfei *fei); 52static int load_c8sectpfe_fw(struct c8sectpfei *fei);
53 53
54#define TS_PKT_SIZE 188 54#define TS_PKT_SIZE 188
55#define HEADER_SIZE (4) 55#define HEADER_SIZE (4)
@@ -141,6 +141,7 @@ static int c8sectpfe_start_feed(struct dvb_demux_feed *dvbdmxfeed)
141 struct channel_info *channel; 141 struct channel_info *channel;
142 u32 tmp; 142 u32 tmp;
143 unsigned long *bitmap; 143 unsigned long *bitmap;
144 int ret;
144 145
145 switch (dvbdmxfeed->type) { 146 switch (dvbdmxfeed->type) {
146 case DMX_TYPE_TS: 147 case DMX_TYPE_TS:
@@ -169,8 +170,9 @@ static int c8sectpfe_start_feed(struct dvb_demux_feed *dvbdmxfeed)
169 } 170 }
170 171
171 if (!atomic_read(&fei->fw_loaded)) { 172 if (!atomic_read(&fei->fw_loaded)) {
172 dev_err(fei->dev, "%s: c8sectpfe fw not loaded\n", __func__); 173 ret = load_c8sectpfe_fw(fei);
173 return -EINVAL; 174 if (ret)
175 return ret;
174 } 176 }
175 177
176 mutex_lock(&fei->lock); 178 mutex_lock(&fei->lock);
@@ -265,8 +267,9 @@ static int c8sectpfe_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
265 unsigned long *bitmap; 267 unsigned long *bitmap;
266 268
267 if (!atomic_read(&fei->fw_loaded)) { 269 if (!atomic_read(&fei->fw_loaded)) {
268 dev_err(fei->dev, "%s: c8sectpfe fw not loaded\n", __func__); 270 ret = load_c8sectpfe_fw(fei);
269 return -EINVAL; 271 if (ret)
272 return ret;
270 } 273 }
271 274
272 mutex_lock(&fei->lock); 275 mutex_lock(&fei->lock);
@@ -880,13 +883,6 @@ static int c8sectpfe_probe(struct platform_device *pdev)
880 goto err_clk_disable; 883 goto err_clk_disable;
881 } 884 }
882 885
883 /* ensure all other init has been done before requesting firmware */
884 ret = load_c8sectpfe_fw_step1(fei);
885 if (ret) {
886 dev_err(dev, "Couldn't load slim core firmware\n");
887 goto err_clk_disable;
888 }
889
890 c8sectpfe_debugfs_init(fei); 886 c8sectpfe_debugfs_init(fei);
891 887
892 return 0; 888 return 0;
@@ -1091,15 +1087,14 @@ static void load_dmem_segment(struct c8sectpfei *fei, Elf32_Phdr *phdr,
1091 phdr->p_memsz - phdr->p_filesz); 1087 phdr->p_memsz - phdr->p_filesz);
1092} 1088}
1093 1089
1094static int load_slim_core_fw(const struct firmware *fw, void *context) 1090static int load_slim_core_fw(const struct firmware *fw, struct c8sectpfei *fei)
1095{ 1091{
1096 struct c8sectpfei *fei = context;
1097 Elf32_Ehdr *ehdr; 1092 Elf32_Ehdr *ehdr;
1098 Elf32_Phdr *phdr; 1093 Elf32_Phdr *phdr;
1099 u8 __iomem *dst; 1094 u8 __iomem *dst;
1100 int err = 0, i; 1095 int err = 0, i;
1101 1096
1102 if (!fw || !context) 1097 if (!fw || !fei)
1103 return -EINVAL; 1098 return -EINVAL;
1104 1099
1105 ehdr = (Elf32_Ehdr *)fw->data; 1100 ehdr = (Elf32_Ehdr *)fw->data;
@@ -1151,29 +1146,35 @@ static int load_slim_core_fw(const struct firmware *fw, void *context)
1151 return err; 1146 return err;
1152} 1147}
1153 1148
1154static void load_c8sectpfe_fw_cb(const struct firmware *fw, void *context) 1149static int load_c8sectpfe_fw(struct c8sectpfei *fei)
1155{ 1150{
1156 struct c8sectpfei *fei = context; 1151 const struct firmware *fw;
1157 int err; 1152 int err;
1158 1153
1154 dev_info(fei->dev, "Loading firmware: %s\n", FIRMWARE_MEMDMA);
1155
1156 err = request_firmware(&fw, FIRMWARE_MEMDMA, fei->dev);
1157 if (err)
1158 return err;
1159
1159 err = c8sectpfe_elf_sanity_check(fei, fw); 1160 err = c8sectpfe_elf_sanity_check(fei, fw);
1160 if (err) { 1161 if (err) {
1161 dev_err(fei->dev, "c8sectpfe_elf_sanity_check failed err=(%d)\n" 1162 dev_err(fei->dev, "c8sectpfe_elf_sanity_check failed err=(%d)\n"
1162 , err); 1163 , err);
1163 goto err; 1164 return err;
1164 } 1165 }
1165 1166
1166 err = load_slim_core_fw(fw, context); 1167 err = load_slim_core_fw(fw, fei);
1167 if (err) { 1168 if (err) {
1168 dev_err(fei->dev, "load_slim_core_fw failed err=(%d)\n", err); 1169 dev_err(fei->dev, "load_slim_core_fw failed err=(%d)\n", err);
1169 goto err; 1170 return err;
1170 } 1171 }
1171 1172
1172 /* now the firmware is loaded configure the input blocks */ 1173 /* now the firmware is loaded configure the input blocks */
1173 err = configure_channels(fei); 1174 err = configure_channels(fei);
1174 if (err) { 1175 if (err) {
1175 dev_err(fei->dev, "configure_channels failed err=(%d)\n", err); 1176 dev_err(fei->dev, "configure_channels failed err=(%d)\n", err);
1176 goto err; 1177 return err;
1177 } 1178 }
1178 1179
1179 /* 1180 /*
@@ -1186,28 +1187,6 @@ static void load_c8sectpfe_fw_cb(const struct firmware *fw, void *context)
1186 writel(0x1, fei->io + DMA_CPU_RUN); 1187 writel(0x1, fei->io + DMA_CPU_RUN);
1187 1188
1188 atomic_set(&fei->fw_loaded, 1); 1189 atomic_set(&fei->fw_loaded, 1);
1189err:
1190 complete_all(&fei->fw_ack);
1191}
1192
1193static int load_c8sectpfe_fw_step1(struct c8sectpfei *fei)
1194{
1195 int err;
1196
1197 dev_info(fei->dev, "Loading firmware: %s\n", FIRMWARE_MEMDMA);
1198
1199 init_completion(&fei->fw_ack);
1200 atomic_set(&fei->fw_loaded, 0);
1201
1202 err = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
1203 FIRMWARE_MEMDMA, fei->dev, GFP_KERNEL, fei,
1204 load_c8sectpfe_fw_cb);
1205
1206 if (err) {
1207 dev_err(fei->dev, "request_firmware_nowait err: %d.\n", err);
1208 complete_all(&fei->fw_ack);
1209 return err;
1210 }
1211 1190
1212 return 0; 1191 return 0;
1213} 1192}