aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMichael Ellerman <mpe@ellerman.id.au>2017-05-09 08:54:35 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2017-05-09 08:54:35 -0400
commit0b382fb3d905e2754302cf9097ffca13afb8b73f (patch)
treeb70fdbe056761d4186cd0c9fe7707b9910617bcc /drivers
parent6102c005a71b4a7a6433d43b887662fb0780746d (diff)
parent61baf15555129f69720334f232b153890895ef71 (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.c8
-rw-r--r--drivers/soc/fsl/qbman/qman.c5
-rw-r--r--drivers/soc/fsl/qe/qe.c25
-rw-r--r--drivers/soc/fsl/qe/qe_tdm.c2
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
1363static void qm_mr_process_task(struct work_struct *work) 1365static 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
1423static u32 __poll_portal_slow(struct qman_portal *p, u32 is) 1426static 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
67static phys_addr_t qebase = -1; 67static phys_addr_t qebase = -1;
68 68
69phys_addr_t get_qe_base(void) 69static 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
93EXPORT_SYMBOL(get_qe_base);
94
95void qe_reset(void) 93void 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 */
164static unsigned int brg_clk = 0; 162static unsigned int brg_clk = 0;
165 163
164#define CLK_GRAN (1000)
165#define CLK_GRAN_LIMIT (5)
166
166unsigned int qe_get_brg_clk(void) 167unsigned 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}
190EXPORT_SYMBOL(qe_get_brg_clk); 201EXPORT_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}
180EXPORT_SYMBOL(ucc_of_parse_tdm);
180 181
181void ucc_tdm_init(struct ucc_tdm *utdm, struct ucc_tdm_info *ut_info) 182void 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}
278EXPORT_SYMBOL(ucc_tdm_init);