@@ -49,6 +49,9 @@
#define TCON_INVERT(chan) (1 << (4 * (chan) + 2))
#define TCON_AUTORELOAD(chan) (1 << (4 * (chan) + 3))
+DEFINE_SPINLOCK(samsung_pwm_lock);
+EXPORT_SYMBOL(samsung_pwm_lock);
+
struct samsung_timer_source {
unsigned int event_id;
unsigned int source_id;
@@ -72,14 +75,14 @@ static void samsung_timer_set_prescale(struct samsung_pwm *pwm,
if (channel >= 2)
shift = TCFG0_PRESCALER1_SHIFT;
- spin_lock_irqsave(&pwm->slock, flags);
+ spin_lock_irqsave(&samsung_pwm_lock, flags);
reg = readl(pwm->base + REG_TCFG0);
reg &= ~(TCFG0_PRESCALER_MASK << shift);
reg |= (prescale - 1) << shift;
writel(reg, pwm->base + REG_TCFG0);
- spin_unlock_irqrestore(&pwm->slock, flags);
+ spin_unlock_irqrestore(&samsung_pwm_lock, flags);
}
static void samsung_timer_set_divisor(struct samsung_pwm *pwm,
@@ -92,14 +95,14 @@ static void samsung_timer_set_divisor(struct samsung_pwm *pwm,
bits = (fls(divisor) - 1) - pwm->variant.div_base;
- spin_lock_irqsave(&pwm->slock, flags);
+ spin_lock_irqsave(&samsung_pwm_lock, flags);
reg = readl(pwm->base + REG_TCFG1);
reg &= ~(TCFG1_MUX_MASK << shift);
reg |= bits << shift;
writel(reg, pwm->base + REG_TCFG1);
- spin_unlock_irqrestore(&pwm->slock, flags);
+ spin_unlock_irqrestore(&samsung_pwm_lock, flags);
}
static void samsung_time_stop(unsigned int channel)
@@ -110,13 +113,13 @@ static void samsung_time_stop(unsigned int channel)
if (channel > 0)
++channel;
- spin_lock_irqsave(&pwm->slock, flags);
+ spin_lock_irqsave(&samsung_pwm_lock, flags);
tcon = __raw_readl(pwm->base + REG_TCON);
tcon &= ~TCON_START(channel);
__raw_writel(tcon, pwm->base + REG_TCON);
- spin_unlock_irqrestore(&pwm->slock, flags);
+ spin_unlock_irqrestore(&samsung_pwm_lock, flags);
}
static void samsung_time_setup(unsigned int channel, unsigned long tcnt)
@@ -128,7 +131,7 @@ static void samsung_time_setup(unsigned int channel, unsigned long tcnt)
if (tcon_chan > 0)
++tcon_chan;
- spin_lock_irqsave(&pwm->slock, flags);
+ spin_lock_irqsave(&samsung_pwm_lock, flags);
tcon = __raw_readl(pwm->base + REG_TCON);
@@ -141,7 +144,7 @@ static void samsung_time_setup(unsigned int channel, unsigned long tcnt)
__raw_writel(tcnt, pwm->base + REG_TCMPB(channel));
__raw_writel(tcon, pwm->base + REG_TCON);
- spin_unlock_irqrestore(&pwm->slock, flags);
+ spin_unlock_irqrestore(&samsung_pwm_lock, flags);
}
static void samsung_time_start(unsigned int channel, bool periodic)
@@ -152,7 +155,7 @@ static void samsung_time_start(unsigned int channel, bool periodic)
if (channel > 0)
++channel;
- spin_lock_irqsave(&pwm->slock, flags);
+ spin_lock_irqsave(&samsung_pwm_lock, flags);
tcon = __raw_readl(pwm->base + REG_TCON);
@@ -166,7 +169,7 @@ static void samsung_time_start(unsigned int channel, bool periodic)
__raw_writel(tcon, pwm->base + REG_TCON);
- spin_unlock_irqrestore(&pwm->slock, flags);
+ spin_unlock_irqrestore(&samsung_pwm_lock, flags);
}
static int samsung_set_next_event(unsigned long cycles,
@@ -394,7 +397,6 @@ static void __init samsung_pwm_alloc(struct device_node *np,
return;
}
memcpy(&pwm->variant, variant, sizeof(pwm->variant));
- spin_lock_init(&pwm->slock);
for (i = 0; i < SAMSUNG_PWM_NUM; ++i)
pwm->irq[i] = irq_of_parse_and_map(np, i);
@@ -23,6 +23,8 @@
struct platform_device;
struct device_node;
+extern spinlock_t samsung_pwm_lock;
+
struct samsung_pwm_variant {
u8 bits;
u8 div_base;