diff options
author | Lukasz Majewski <l.majewski@majess.pl> | 2017-01-29 16:54:09 -0500 |
---|---|---|
committer | Thierry Reding <thierry.reding@gmail.com> | 2017-01-30 03:12:46 -0500 |
commit | 970247a486751c79903c7d853198d0106805c641 (patch) | |
tree | 69f78bffe9faee6c1af6b46688d0b399ddb9a8ba | |
parent | b3c088fe0297d7580bef5d5830fa5fc69ae8443c (diff) |
pwm: imx: Move PWMv2 software reset code to a separate function
The software reset code has been extracted from imx_pwm_config_v2 function
and moved to new one - imx_pwm_sw_reset().
This change reduces the overall size of imx_pwm_config_v2() and prepares
it for atomic PWM operation.
Suggested-by: Stefan Agner <stefan@agner.ch>
Suggested-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Lukasz Majewski <l.majewski@majess.pl>
Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
-rw-r--r-- | drivers/pwm/pwm-imx.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c index 5c712104066a..c944f15f574c 100644 --- a/drivers/pwm/pwm-imx.c +++ b/drivers/pwm/pwm-imx.c | |||
@@ -119,6 +119,25 @@ static void imx_pwm_disable_v1(struct pwm_chip *chip, struct pwm_device *pwm) | |||
119 | clk_disable_unprepare(imx->clk_per); | 119 | clk_disable_unprepare(imx->clk_per); |
120 | } | 120 | } |
121 | 121 | ||
122 | static void imx_pwm_sw_reset(struct pwm_chip *chip) | ||
123 | { | ||
124 | struct imx_chip *imx = to_imx_chip(chip); | ||
125 | struct device *dev = chip->dev; | ||
126 | int wait_count = 0; | ||
127 | u32 cr; | ||
128 | |||
129 | writel(MX3_PWMCR_SWR, imx->mmio_base + MX3_PWMCR); | ||
130 | do { | ||
131 | usleep_range(200, 1000); | ||
132 | cr = readl(imx->mmio_base + MX3_PWMCR); | ||
133 | } while ((cr & MX3_PWMCR_SWR) && | ||
134 | (wait_count++ < MX3_PWM_SWR_LOOP)); | ||
135 | |||
136 | if (cr & MX3_PWMCR_SWR) | ||
137 | dev_warn(dev, "software reset timeout\n"); | ||
138 | } | ||
139 | |||
140 | |||
122 | static int imx_pwm_config_v2(struct pwm_chip *chip, | 141 | static int imx_pwm_config_v2(struct pwm_chip *chip, |
123 | struct pwm_device *pwm, int duty_ns, int period_ns) | 142 | struct pwm_device *pwm, int duty_ns, int period_ns) |
124 | { | 143 | { |
@@ -128,7 +147,7 @@ static int imx_pwm_config_v2(struct pwm_chip *chip, | |||
128 | unsigned long period_cycles, duty_cycles, prescale; | 147 | unsigned long period_cycles, duty_cycles, prescale; |
129 | unsigned int period_ms; | 148 | unsigned int period_ms; |
130 | bool enable = pwm_is_enabled(pwm); | 149 | bool enable = pwm_is_enabled(pwm); |
131 | int wait_count = 0, fifoav; | 150 | int fifoav; |
132 | u32 cr, sr; | 151 | u32 cr, sr; |
133 | 152 | ||
134 | /* | 153 | /* |
@@ -151,15 +170,7 @@ static int imx_pwm_config_v2(struct pwm_chip *chip, | |||
151 | dev_warn(dev, "there is no free FIFO slot\n"); | 170 | dev_warn(dev, "there is no free FIFO slot\n"); |
152 | } | 171 | } |
153 | } else { | 172 | } else { |
154 | writel(MX3_PWMCR_SWR, imx->mmio_base + MX3_PWMCR); | 173 | imx_pwm_sw_reset(chip); |
155 | do { | ||
156 | usleep_range(200, 1000); | ||
157 | cr = readl(imx->mmio_base + MX3_PWMCR); | ||
158 | } while ((cr & MX3_PWMCR_SWR) && | ||
159 | (wait_count++ < MX3_PWM_SWR_LOOP)); | ||
160 | |||
161 | if (cr & MX3_PWMCR_SWR) | ||
162 | dev_warn(dev, "software reset timeout\n"); | ||
163 | } | 174 | } |
164 | 175 | ||
165 | c = clk_get_rate(imx->clk_per); | 176 | c = clk_get_rate(imx->clk_per); |