diff options
author | Michael Ellerman <mpe@ellerman.id.au> | 2017-05-09 08:54:35 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2017-05-09 08:54:35 -0400 |
commit | 0b382fb3d905e2754302cf9097ffca13afb8b73f (patch) | |
tree | b70fdbe056761d4186cd0c9fe7707b9910617bcc /drivers | |
parent | 6102c005a71b4a7a6433d43b887662fb0780746d (diff) | |
parent | 61baf15555129f69720334f232b153890895ef71 (diff) |
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux into next
Freescale updates from Scott:
"Includes a fix for a powerpc/next mm regression on 64e, a fix for a
kernel hang on 64e when using a debugger inside a relocated kernel, a
qman fix, and misc qe improvements."
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/freescale/ucc_geth.c | 8 | ||||
-rw-r--r-- | drivers/soc/fsl/qbman/qman.c | 5 | ||||
-rw-r--r-- | drivers/soc/fsl/qe/qe.c | 25 | ||||
-rw-r--r-- | drivers/soc/fsl/qe/qe_tdm.c | 2 |
4 files changed, 30 insertions, 10 deletions
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c index 3f7ae9f64cd8..f77ba9fa257b 100644 --- a/drivers/net/ethernet/freescale/ucc_geth.c +++ b/drivers/net/ethernet/freescale/ucc_geth.c | |||
@@ -2594,11 +2594,10 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2594 | } else if (ugeth->ug_info->uf_info.bd_mem_part == | 2594 | } else if (ugeth->ug_info->uf_info.bd_mem_part == |
2595 | MEM_PART_MURAM) { | 2595 | MEM_PART_MURAM) { |
2596 | out_be32(&ugeth->p_send_q_mem_reg->sqqd[i].bd_ring_base, | 2596 | out_be32(&ugeth->p_send_q_mem_reg->sqqd[i].bd_ring_base, |
2597 | (u32) immrbar_virt_to_phys(ugeth-> | 2597 | (u32)qe_muram_dma(ugeth->p_tx_bd_ring[i])); |
2598 | p_tx_bd_ring[i])); | ||
2599 | out_be32(&ugeth->p_send_q_mem_reg->sqqd[i]. | 2598 | out_be32(&ugeth->p_send_q_mem_reg->sqqd[i]. |
2600 | last_bd_completed_address, | 2599 | last_bd_completed_address, |
2601 | (u32) immrbar_virt_to_phys(endOfRing)); | 2600 | (u32)qe_muram_dma(endOfRing)); |
2602 | } | 2601 | } |
2603 | } | 2602 | } |
2604 | 2603 | ||
@@ -2844,8 +2843,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2844 | } else if (ugeth->ug_info->uf_info.bd_mem_part == | 2843 | } else if (ugeth->ug_info->uf_info.bd_mem_part == |
2845 | MEM_PART_MURAM) { | 2844 | MEM_PART_MURAM) { |
2846 | out_be32(&ugeth->p_rx_bd_qs_tbl[i].externalbdbaseptr, | 2845 | out_be32(&ugeth->p_rx_bd_qs_tbl[i].externalbdbaseptr, |
2847 | (u32) immrbar_virt_to_phys(ugeth-> | 2846 | (u32)qe_muram_dma(ugeth->p_rx_bd_ring[i])); |
2848 | p_rx_bd_ring[i])); | ||
2849 | } | 2847 | } |
2850 | /* rest of fields handled by QE */ | 2848 | /* rest of fields handled by QE */ |
2851 | } | 2849 | } |
diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c index 6f509f68085e..2827a65aa25a 100644 --- a/drivers/soc/fsl/qbman/qman.c +++ b/drivers/soc/fsl/qbman/qman.c | |||
@@ -1344,6 +1344,7 @@ static void qm_congestion_task(struct work_struct *work) | |||
1344 | if (!qm_mc_result_timeout(&p->p, &mcr)) { | 1344 | if (!qm_mc_result_timeout(&p->p, &mcr)) { |
1345 | spin_unlock(&p->cgr_lock); | 1345 | spin_unlock(&p->cgr_lock); |
1346 | dev_crit(p->config->dev, "QUERYCONGESTION timeout\n"); | 1346 | dev_crit(p->config->dev, "QUERYCONGESTION timeout\n"); |
1347 | qman_p_irqsource_add(p, QM_PIRQ_CSCI); | ||
1347 | return; | 1348 | return; |
1348 | } | 1349 | } |
1349 | /* mask out the ones I'm not interested in */ | 1350 | /* mask out the ones I'm not interested in */ |
@@ -1358,6 +1359,7 @@ static void qm_congestion_task(struct work_struct *work) | |||
1358 | if (cgr->cb && qman_cgrs_get(&c, cgr->cgrid)) | 1359 | if (cgr->cb && qman_cgrs_get(&c, cgr->cgrid)) |
1359 | cgr->cb(p, cgr, qman_cgrs_get(&rr, cgr->cgrid)); | 1360 | cgr->cb(p, cgr, qman_cgrs_get(&rr, cgr->cgrid)); |
1360 | spin_unlock(&p->cgr_lock); | 1361 | spin_unlock(&p->cgr_lock); |
1362 | qman_p_irqsource_add(p, QM_PIRQ_CSCI); | ||
1361 | } | 1363 | } |
1362 | 1364 | ||
1363 | static void qm_mr_process_task(struct work_struct *work) | 1365 | static void qm_mr_process_task(struct work_struct *work) |
@@ -1417,12 +1419,14 @@ static void qm_mr_process_task(struct work_struct *work) | |||
1417 | } | 1419 | } |
1418 | 1420 | ||
1419 | qm_mr_cci_consume(&p->p, num); | 1421 | qm_mr_cci_consume(&p->p, num); |
1422 | qman_p_irqsource_add(p, QM_PIRQ_MRI); | ||
1420 | preempt_enable(); | 1423 | preempt_enable(); |
1421 | } | 1424 | } |
1422 | 1425 | ||
1423 | static u32 __poll_portal_slow(struct qman_portal *p, u32 is) | 1426 | static u32 __poll_portal_slow(struct qman_portal *p, u32 is) |
1424 | { | 1427 | { |
1425 | if (is & QM_PIRQ_CSCI) { | 1428 | if (is & QM_PIRQ_CSCI) { |
1429 | qman_p_irqsource_remove(p, QM_PIRQ_CSCI); | ||
1426 | queue_work_on(smp_processor_id(), qm_portal_wq, | 1430 | queue_work_on(smp_processor_id(), qm_portal_wq, |
1427 | &p->congestion_work); | 1431 | &p->congestion_work); |
1428 | } | 1432 | } |
@@ -1434,6 +1438,7 @@ static u32 __poll_portal_slow(struct qman_portal *p, u32 is) | |||
1434 | } | 1438 | } |
1435 | 1439 | ||
1436 | if (is & QM_PIRQ_MRI) { | 1440 | if (is & QM_PIRQ_MRI) { |
1441 | qman_p_irqsource_remove(p, QM_PIRQ_MRI); | ||
1437 | queue_work_on(smp_processor_id(), qm_portal_wq, | 1442 | queue_work_on(smp_processor_id(), qm_portal_wq, |
1438 | &p->mr_work); | 1443 | &p->mr_work); |
1439 | } | 1444 | } |
diff --git a/drivers/soc/fsl/qe/qe.c b/drivers/soc/fsl/qe/qe.c index ade168f5328e..2ef6fc6487c1 100644 --- a/drivers/soc/fsl/qe/qe.c +++ b/drivers/soc/fsl/qe/qe.c | |||
@@ -66,7 +66,7 @@ static unsigned int qe_num_of_snum; | |||
66 | 66 | ||
67 | static phys_addr_t qebase = -1; | 67 | static phys_addr_t qebase = -1; |
68 | 68 | ||
69 | phys_addr_t get_qe_base(void) | 69 | static phys_addr_t get_qe_base(void) |
70 | { | 70 | { |
71 | struct device_node *qe; | 71 | struct device_node *qe; |
72 | int ret; | 72 | int ret; |
@@ -90,8 +90,6 @@ phys_addr_t get_qe_base(void) | |||
90 | return qebase; | 90 | return qebase; |
91 | } | 91 | } |
92 | 92 | ||
93 | EXPORT_SYMBOL(get_qe_base); | ||
94 | |||
95 | void qe_reset(void) | 93 | void qe_reset(void) |
96 | { | 94 | { |
97 | if (qe_immr == NULL) | 95 | if (qe_immr == NULL) |
@@ -163,11 +161,15 @@ EXPORT_SYMBOL(qe_issue_cmd); | |||
163 | */ | 161 | */ |
164 | static unsigned int brg_clk = 0; | 162 | static unsigned int brg_clk = 0; |
165 | 163 | ||
164 | #define CLK_GRAN (1000) | ||
165 | #define CLK_GRAN_LIMIT (5) | ||
166 | |||
166 | unsigned int qe_get_brg_clk(void) | 167 | unsigned int qe_get_brg_clk(void) |
167 | { | 168 | { |
168 | struct device_node *qe; | 169 | struct device_node *qe; |
169 | int size; | 170 | int size; |
170 | const u32 *prop; | 171 | const u32 *prop; |
172 | unsigned int mod; | ||
171 | 173 | ||
172 | if (brg_clk) | 174 | if (brg_clk) |
173 | return brg_clk; | 175 | return brg_clk; |
@@ -185,10 +187,22 @@ unsigned int qe_get_brg_clk(void) | |||
185 | 187 | ||
186 | of_node_put(qe); | 188 | of_node_put(qe); |
187 | 189 | ||
190 | /* round this if near to a multiple of CLK_GRAN */ | ||
191 | mod = brg_clk % CLK_GRAN; | ||
192 | if (mod) { | ||
193 | if (mod < CLK_GRAN_LIMIT) | ||
194 | brg_clk -= mod; | ||
195 | else if (mod > (CLK_GRAN - CLK_GRAN_LIMIT)) | ||
196 | brg_clk += CLK_GRAN - mod; | ||
197 | } | ||
198 | |||
188 | return brg_clk; | 199 | return brg_clk; |
189 | } | 200 | } |
190 | EXPORT_SYMBOL(qe_get_brg_clk); | 201 | EXPORT_SYMBOL(qe_get_brg_clk); |
191 | 202 | ||
203 | #define PVR_VER_836x 0x8083 | ||
204 | #define PVR_VER_832x 0x8084 | ||
205 | |||
192 | /* Program the BRG to the given sampling rate and multiplier | 206 | /* Program the BRG to the given sampling rate and multiplier |
193 | * | 207 | * |
194 | * @brg: the BRG, QE_BRG1 - QE_BRG16 | 208 | * @brg: the BRG, QE_BRG1 - QE_BRG16 |
@@ -215,8 +229,9 @@ int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier) | |||
215 | /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says | 229 | /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says |
216 | that the BRG divisor must be even if you're not using divide-by-16 | 230 | that the BRG divisor must be even if you're not using divide-by-16 |
217 | mode. */ | 231 | mode. */ |
218 | if (!div16 && (divisor & 1) && (divisor > 3)) | 232 | if (pvr_version_is(PVR_VER_836x) || pvr_version_is(PVR_VER_832x)) |
219 | divisor++; | 233 | if (!div16 && (divisor & 1) && (divisor > 3)) |
234 | divisor++; | ||
220 | 235 | ||
221 | tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | | 236 | tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | |
222 | QE_BRGC_ENABLE | div16; | 237 | QE_BRGC_ENABLE | div16; |
diff --git a/drivers/soc/fsl/qe/qe_tdm.c b/drivers/soc/fsl/qe/qe_tdm.c index a1048b44e6b9..f744c214f680 100644 --- a/drivers/soc/fsl/qe/qe_tdm.c +++ b/drivers/soc/fsl/qe/qe_tdm.c | |||
@@ -177,6 +177,7 @@ err_miss_siram_property: | |||
177 | devm_iounmap(&pdev->dev, utdm->si_regs); | 177 | devm_iounmap(&pdev->dev, utdm->si_regs); |
178 | return ret; | 178 | return ret; |
179 | } | 179 | } |
180 | EXPORT_SYMBOL(ucc_of_parse_tdm); | ||
180 | 181 | ||
181 | void ucc_tdm_init(struct ucc_tdm *utdm, struct ucc_tdm_info *ut_info) | 182 | void ucc_tdm_init(struct ucc_tdm *utdm, struct ucc_tdm_info *ut_info) |
182 | { | 183 | { |
@@ -274,3 +275,4 @@ void ucc_tdm_init(struct ucc_tdm *utdm, struct ucc_tdm_info *ut_info) | |||
274 | break; | 275 | break; |
275 | } | 276 | } |
276 | } | 277 | } |
278 | EXPORT_SYMBOL(ucc_tdm_init); | ||