Commit 5758e03c authored by Diogo Ivo's avatar Diogo Ivo Committed by David S. Miller

net: ti: icss-iep: Remove spinlock-based synchronization

As all sources of concurrency in hardware register access occur in
non-interrupt context eliminate spinlock-based synchronization and
rely on the mutex-based synchronization that is already present.
Signed-off-by: default avatarDiogo Ivo <diogo.ivo@siemens.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5e1e4389
...@@ -110,7 +110,6 @@ struct icss_iep { ...@@ -110,7 +110,6 @@ struct icss_iep {
struct ptp_clock_info ptp_info; struct ptp_clock_info ptp_info;
struct ptp_clock *ptp_clock; struct ptp_clock *ptp_clock;
struct mutex ptp_clk_mutex; /* PHC access serializer */ struct mutex ptp_clk_mutex; /* PHC access serializer */
spinlock_t irq_lock; /* CMP IRQ vs icss_iep_ptp_enable access */
u32 def_inc; u32 def_inc;
s16 slow_cmp_inc; s16 slow_cmp_inc;
u32 slow_cmp_count; u32 slow_cmp_count;
...@@ -192,14 +191,11 @@ static void icss_iep_update_to_next_boundary(struct icss_iep *iep, u64 start_ns) ...@@ -192,14 +191,11 @@ static void icss_iep_update_to_next_boundary(struct icss_iep *iep, u64 start_ns)
*/ */
static void icss_iep_settime(struct icss_iep *iep, u64 ns) static void icss_iep_settime(struct icss_iep *iep, u64 ns)
{ {
unsigned long flags;
if (iep->ops && iep->ops->settime) { if (iep->ops && iep->ops->settime) {
iep->ops->settime(iep->clockops_data, ns); iep->ops->settime(iep->clockops_data, ns);
return; return;
} }
spin_lock_irqsave(&iep->irq_lock, flags);
if (iep->pps_enabled || iep->perout_enabled) if (iep->pps_enabled || iep->perout_enabled)
writel(0, iep->base + iep->plat_data->reg_offs[ICSS_IEP_SYNC_CTRL_REG]); writel(0, iep->base + iep->plat_data->reg_offs[ICSS_IEP_SYNC_CTRL_REG]);
...@@ -210,7 +206,6 @@ static void icss_iep_settime(struct icss_iep *iep, u64 ns) ...@@ -210,7 +206,6 @@ static void icss_iep_settime(struct icss_iep *iep, u64 ns)
writel(IEP_SYNC_CTRL_SYNC_N_EN(0) | IEP_SYNC_CTRL_SYNC_EN, writel(IEP_SYNC_CTRL_SYNC_N_EN(0) | IEP_SYNC_CTRL_SYNC_EN,
iep->base + iep->plat_data->reg_offs[ICSS_IEP_SYNC_CTRL_REG]); iep->base + iep->plat_data->reg_offs[ICSS_IEP_SYNC_CTRL_REG]);
} }
spin_unlock_irqrestore(&iep->irq_lock, flags);
} }
/** /**
...@@ -546,7 +541,6 @@ static int icss_iep_perout_enable_hw(struct icss_iep *iep, ...@@ -546,7 +541,6 @@ static int icss_iep_perout_enable_hw(struct icss_iep *iep,
static int icss_iep_perout_enable(struct icss_iep *iep, static int icss_iep_perout_enable(struct icss_iep *iep,
struct ptp_perout_request *req, int on) struct ptp_perout_request *req, int on)
{ {
unsigned long flags;
int ret = 0; int ret = 0;
mutex_lock(&iep->ptp_clk_mutex); mutex_lock(&iep->ptp_clk_mutex);
...@@ -559,11 +553,9 @@ static int icss_iep_perout_enable(struct icss_iep *iep, ...@@ -559,11 +553,9 @@ static int icss_iep_perout_enable(struct icss_iep *iep,
if (iep->perout_enabled == !!on) if (iep->perout_enabled == !!on)
goto exit; goto exit;
spin_lock_irqsave(&iep->irq_lock, flags);
ret = icss_iep_perout_enable_hw(iep, req, on); ret = icss_iep_perout_enable_hw(iep, req, on);
if (!ret) if (!ret)
iep->perout_enabled = !!on; iep->perout_enabled = !!on;
spin_unlock_irqrestore(&iep->irq_lock, flags);
exit: exit:
mutex_unlock(&iep->ptp_clk_mutex); mutex_unlock(&iep->ptp_clk_mutex);
...@@ -575,7 +567,6 @@ static int icss_iep_pps_enable(struct icss_iep *iep, int on) ...@@ -575,7 +567,6 @@ static int icss_iep_pps_enable(struct icss_iep *iep, int on)
{ {
struct ptp_clock_request rq; struct ptp_clock_request rq;
struct timespec64 ts; struct timespec64 ts;
unsigned long flags;
int ret = 0; int ret = 0;
u64 ns; u64 ns;
...@@ -589,8 +580,6 @@ static int icss_iep_pps_enable(struct icss_iep *iep, int on) ...@@ -589,8 +580,6 @@ static int icss_iep_pps_enable(struct icss_iep *iep, int on)
if (iep->pps_enabled == !!on) if (iep->pps_enabled == !!on)
goto exit; goto exit;
spin_lock_irqsave(&iep->irq_lock, flags);
rq.perout.index = 0; rq.perout.index = 0;
if (on) { if (on) {
ns = icss_iep_gettime(iep, NULL); ns = icss_iep_gettime(iep, NULL);
...@@ -607,8 +596,6 @@ static int icss_iep_pps_enable(struct icss_iep *iep, int on) ...@@ -607,8 +596,6 @@ static int icss_iep_pps_enable(struct icss_iep *iep, int on)
if (!ret) if (!ret)
iep->pps_enabled = !!on; iep->pps_enabled = !!on;
spin_unlock_irqrestore(&iep->irq_lock, flags);
exit: exit:
mutex_unlock(&iep->ptp_clk_mutex); mutex_unlock(&iep->ptp_clk_mutex);
...@@ -853,7 +840,6 @@ static int icss_iep_probe(struct platform_device *pdev) ...@@ -853,7 +840,6 @@ static int icss_iep_probe(struct platform_device *pdev)
iep->ptp_info = icss_iep_ptp_info; iep->ptp_info = icss_iep_ptp_info;
mutex_init(&iep->ptp_clk_mutex); mutex_init(&iep->ptp_clk_mutex);
spin_lock_init(&iep->irq_lock);
dev_set_drvdata(dev, iep); dev_set_drvdata(dev, iep);
icss_iep_disable(iep); icss_iep_disable(iep);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment