Commit ab4eb8b0 authored by Tarun Kanti DebBarma's avatar Tarun Kanti DebBarma Committed by Tony Lindgren

ARM: OMAP: dmtimer: add error handling to export APIs

Add error handling code to export APIs.
Signed-off-by: default avatarTarun Kanti DebBarma <tarun.kanti@ti.com>
Reviewed-by: default avatarSantosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent b481113a
...@@ -214,12 +214,16 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id) ...@@ -214,12 +214,16 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id)
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_request_specific); EXPORT_SYMBOL_GPL(omap_dm_timer_request_specific);
void omap_dm_timer_free(struct omap_dm_timer *timer) int omap_dm_timer_free(struct omap_dm_timer *timer)
{ {
if (unlikely(!timer))
return -EINVAL;
clk_put(timer->fclk); clk_put(timer->fclk);
WARN_ON(!timer->reserved); WARN_ON(!timer->reserved);
timer->reserved = 0; timer->reserved = 0;
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_free); EXPORT_SYMBOL_GPL(omap_dm_timer_free);
...@@ -237,7 +241,9 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_disable); ...@@ -237,7 +241,9 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_disable);
int omap_dm_timer_get_irq(struct omap_dm_timer *timer) int omap_dm_timer_get_irq(struct omap_dm_timer *timer)
{ {
return timer->irq; if (timer)
return timer->irq;
return -EINVAL;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_get_irq); EXPORT_SYMBOL_GPL(omap_dm_timer_get_irq);
...@@ -281,7 +287,9 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask); ...@@ -281,7 +287,9 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask);
struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer)
{ {
return timer->fclk; if (timer)
return timer->fclk;
return NULL;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_get_fclk); EXPORT_SYMBOL_GPL(omap_dm_timer_get_fclk);
...@@ -295,21 +303,25 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask); ...@@ -295,21 +303,25 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask);
#endif #endif
void omap_dm_timer_trigger(struct omap_dm_timer *timer) int omap_dm_timer_trigger(struct omap_dm_timer *timer)
{ {
if (unlikely(pm_runtime_suspended(&timer->pdev->dev))) { if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) {
pr_err("%s: timer%d not enabled.\n", __func__, timer->id); pr_err("%s: timer not available or enabled.\n", __func__);
return; return -EINVAL;
} }
omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0);
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_trigger); EXPORT_SYMBOL_GPL(omap_dm_timer_trigger);
void omap_dm_timer_start(struct omap_dm_timer *timer) int omap_dm_timer_start(struct omap_dm_timer *timer)
{ {
u32 l; u32 l;
if (unlikely(!timer))
return -EINVAL;
omap_dm_timer_enable(timer); omap_dm_timer_enable(timer);
if (timer->loses_context) { if (timer->loses_context) {
...@@ -327,25 +339,36 @@ void omap_dm_timer_start(struct omap_dm_timer *timer) ...@@ -327,25 +339,36 @@ void omap_dm_timer_start(struct omap_dm_timer *timer)
/* Save the context */ /* Save the context */
timer->context.tclr = l; timer->context.tclr = l;
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_start); EXPORT_SYMBOL_GPL(omap_dm_timer_start);
void omap_dm_timer_stop(struct omap_dm_timer *timer) int omap_dm_timer_stop(struct omap_dm_timer *timer)
{ {
unsigned long rate = 0; unsigned long rate = 0;
struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data; struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data;
if (unlikely(!timer))
return -EINVAL;
if (!pdata->needs_manual_reset) if (!pdata->needs_manual_reset)
rate = clk_get_rate(timer->fclk); rate = clk_get_rate(timer->fclk);
__omap_dm_timer_stop(timer, timer->posted, rate); __omap_dm_timer_stop(timer, timer->posted, rate);
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_stop); EXPORT_SYMBOL_GPL(omap_dm_timer_stop);
int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
{ {
int ret; int ret;
struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data; struct dmtimer_platform_data *pdata;
if (unlikely(!timer))
return -EINVAL;
pdata = timer->pdev->dev.platform_data;
if (source < 0 || source >= 3) if (source < 0 || source >= 3)
return -EINVAL; return -EINVAL;
...@@ -356,11 +379,14 @@ int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) ...@@ -356,11 +379,14 @@ int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); EXPORT_SYMBOL_GPL(omap_dm_timer_set_source);
void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload,
unsigned int load) unsigned int load)
{ {
u32 l; u32 l;
if (unlikely(!timer))
return -EINVAL;
omap_dm_timer_enable(timer); omap_dm_timer_enable(timer);
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
if (autoreload) if (autoreload)
...@@ -375,15 +401,19 @@ void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, ...@@ -375,15 +401,19 @@ void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload,
timer->context.tclr = l; timer->context.tclr = l;
timer->context.tldr = load; timer->context.tldr = load;
omap_dm_timer_disable(timer); omap_dm_timer_disable(timer);
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_set_load); EXPORT_SYMBOL_GPL(omap_dm_timer_set_load);
/* Optimized set_load which removes costly spin wait in timer_start */ /* Optimized set_load which removes costly spin wait in timer_start */
void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload,
unsigned int load) unsigned int load)
{ {
u32 l; u32 l;
if (unlikely(!timer))
return -EINVAL;
omap_dm_timer_enable(timer); omap_dm_timer_enable(timer);
if (timer->loses_context) { if (timer->loses_context) {
...@@ -408,14 +438,18 @@ void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, ...@@ -408,14 +438,18 @@ void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload,
timer->context.tclr = l; timer->context.tclr = l;
timer->context.tldr = load; timer->context.tldr = load;
timer->context.tcrr = load; timer->context.tcrr = load;
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start); EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start);
void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
unsigned int match) unsigned int match)
{ {
u32 l; u32 l;
if (unlikely(!timer))
return -EINVAL;
omap_dm_timer_enable(timer); omap_dm_timer_enable(timer);
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
if (enable) if (enable)
...@@ -429,14 +463,18 @@ void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, ...@@ -429,14 +463,18 @@ void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
timer->context.tclr = l; timer->context.tclr = l;
timer->context.tmar = match; timer->context.tmar = match;
omap_dm_timer_disable(timer); omap_dm_timer_disable(timer);
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_set_match); EXPORT_SYMBOL_GPL(omap_dm_timer_set_match);
void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
int toggle, int trigger) int toggle, int trigger)
{ {
u32 l; u32 l;
if (unlikely(!timer))
return -EINVAL;
omap_dm_timer_enable(timer); omap_dm_timer_enable(timer);
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM | l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |
...@@ -451,13 +489,17 @@ void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, ...@@ -451,13 +489,17 @@ void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
/* Save the context */ /* Save the context */
timer->context.tclr = l; timer->context.tclr = l;
omap_dm_timer_disable(timer); omap_dm_timer_disable(timer);
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_set_pwm); EXPORT_SYMBOL_GPL(omap_dm_timer_set_pwm);
void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler) int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler)
{ {
u32 l; u32 l;
if (unlikely(!timer))
return -EINVAL;
omap_dm_timer_enable(timer); omap_dm_timer_enable(timer);
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2)); l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2));
...@@ -470,12 +512,16 @@ void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler) ...@@ -470,12 +512,16 @@ void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler)
/* Save the context */ /* Save the context */
timer->context.tclr = l; timer->context.tclr = l;
omap_dm_timer_disable(timer); omap_dm_timer_disable(timer);
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_set_prescaler); EXPORT_SYMBOL_GPL(omap_dm_timer_set_prescaler);
void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,
unsigned int value) unsigned int value)
{ {
if (unlikely(!timer))
return -EINVAL;
omap_dm_timer_enable(timer); omap_dm_timer_enable(timer);
__omap_dm_timer_int_enable(timer, value); __omap_dm_timer_int_enable(timer, value);
...@@ -483,6 +529,7 @@ void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, ...@@ -483,6 +529,7 @@ void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,
timer->context.tier = value; timer->context.tier = value;
timer->context.twer = value; timer->context.twer = value;
omap_dm_timer_disable(timer); omap_dm_timer_disable(timer);
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable); EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable);
...@@ -490,8 +537,8 @@ unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) ...@@ -490,8 +537,8 @@ unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer)
{ {
unsigned int l; unsigned int l;
if (unlikely(pm_runtime_suspended(&timer->pdev->dev))) { if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) {
pr_err("%s: timer%d not enabled.\n", __func__, timer->id); pr_err("%s: timer not available or enabled.\n", __func__);
return 0; return 0;
} }
...@@ -501,18 +548,22 @@ unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) ...@@ -501,18 +548,22 @@ unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer)
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_read_status); EXPORT_SYMBOL_GPL(omap_dm_timer_read_status);
void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value)
{ {
if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev)))
return -EINVAL;
__omap_dm_timer_write_status(timer, value); __omap_dm_timer_write_status(timer, value);
/* Save the context */ /* Save the context */
timer->context.tisr = value; timer->context.tisr = value;
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_write_status); EXPORT_SYMBOL_GPL(omap_dm_timer_write_status);
unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer)
{ {
if (unlikely(pm_runtime_suspended(&timer->pdev->dev))) { if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) {
pr_err("%s: timer%d not enabled.\n", __func__, timer->id); pr_err("%s: timer not iavailable or enabled.\n", __func__);
return 0; return 0;
} }
...@@ -520,17 +571,18 @@ unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) ...@@ -520,17 +571,18 @@ unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer)
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter); EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter);
void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value)
{ {
if (unlikely(pm_runtime_suspended(&timer->pdev->dev))) { if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) {
pr_err("%s: timer%d not enabled.\n", __func__, timer->id); pr_err("%s: timer not available or enabled.\n", __func__);
return; return -EINVAL;
} }
omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value);
/* Save the context */ /* Save the context */
timer->context.tcrr = value; timer->context.tcrr = value;
return 0;
} }
EXPORT_SYMBOL_GPL(omap_dm_timer_write_counter); EXPORT_SYMBOL_GPL(omap_dm_timer_write_counter);
......
...@@ -109,7 +109,7 @@ struct dmtimer_platform_data { ...@@ -109,7 +109,7 @@ struct dmtimer_platform_data {
struct omap_dm_timer *omap_dm_timer_request(void); struct omap_dm_timer *omap_dm_timer_request(void);
struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id);
void omap_dm_timer_free(struct omap_dm_timer *timer); int omap_dm_timer_free(struct omap_dm_timer *timer);
void omap_dm_timer_enable(struct omap_dm_timer *timer); void omap_dm_timer_enable(struct omap_dm_timer *timer);
void omap_dm_timer_disable(struct omap_dm_timer *timer); void omap_dm_timer_disable(struct omap_dm_timer *timer);
...@@ -118,23 +118,23 @@ int omap_dm_timer_get_irq(struct omap_dm_timer *timer); ...@@ -118,23 +118,23 @@ int omap_dm_timer_get_irq(struct omap_dm_timer *timer);
u32 omap_dm_timer_modify_idlect_mask(u32 inputmask); u32 omap_dm_timer_modify_idlect_mask(u32 inputmask);
struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer); struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer);
void omap_dm_timer_trigger(struct omap_dm_timer *timer); int omap_dm_timer_trigger(struct omap_dm_timer *timer);
void omap_dm_timer_start(struct omap_dm_timer *timer); int omap_dm_timer_start(struct omap_dm_timer *timer);
void omap_dm_timer_stop(struct omap_dm_timer *timer); int omap_dm_timer_stop(struct omap_dm_timer *timer);
int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source); int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source);
void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value); int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value);
void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value); int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value);
void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match); int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match);
void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger); int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger);
void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler); int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler);
void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value);
unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer); unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer);
void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value); int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value);
unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer); unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer);
void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value); int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value);
int omap_dm_timers_active(void); int omap_dm_timers_active(void);
......
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