Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: sunxi-ss - Add optional reset control support

On sun6i and later platforms, the reset control is split out of the
clock gates. Add support for an optional reset control.

Signed-off-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Chen-Yu Tsai and committed by
Herbert Xu
7ab64628 ca6bc691

+24
+22
drivers/crypto/sunxi-ss/sun4i-ss-core.c
··· 22 22 #include <linux/scatterlist.h> 23 23 #include <linux/interrupt.h> 24 24 #include <linux/delay.h> 25 + #include <linux/reset.h> 25 26 26 27 #include "sun4i-ss.h" 27 28 ··· 254 253 } 255 254 dev_dbg(&pdev->dev, "clock ahb_ss acquired\n"); 256 255 256 + ss->reset = devm_reset_control_get_optional(&pdev->dev, "ahb"); 257 + if (IS_ERR(ss->reset)) { 258 + if (PTR_ERR(ss->reset) == -EPROBE_DEFER) 259 + return PTR_ERR(ss->reset); 260 + dev_info(&pdev->dev, "no reset control found\n"); 261 + ss->reset = NULL; 262 + } 263 + 257 264 /* Enable both clocks */ 258 265 err = clk_prepare_enable(ss->busclk); 259 266 if (err != 0) { ··· 282 273 if (err != 0) { 283 274 dev_err(&pdev->dev, "Cannot set clock rate to ssclk\n"); 284 275 goto error_clk; 276 + } 277 + 278 + /* Deassert reset if we have a reset control */ 279 + if (ss->reset) { 280 + err = reset_control_deassert(ss->reset); 281 + if (err) { 282 + dev_err(&pdev->dev, "Cannot deassert reset control\n"); 283 + goto error_clk; 284 + } 285 285 } 286 286 287 287 /* ··· 370 352 break; 371 353 } 372 354 } 355 + if (ss->reset) 356 + reset_control_assert(ss->reset); 373 357 error_clk: 374 358 clk_disable_unprepare(ss->ssclk); 375 359 error_ssclk: ··· 396 376 } 397 377 398 378 writel(0, ss->base + SS_CTL); 379 + if (ss->reset) 380 + reset_control_assert(ss->reset); 399 381 clk_disable_unprepare(ss->busclk); 400 382 clk_disable_unprepare(ss->ssclk); 401 383 return 0;
+2
drivers/crypto/sunxi-ss/sun4i-ss.h
··· 18 18 #include <linux/module.h> 19 19 #include <linux/of.h> 20 20 #include <linux/platform_device.h> 21 + #include <linux/reset.h> 21 22 #include <crypto/scatterwalk.h> 22 23 #include <linux/scatterlist.h> 23 24 #include <linux/interrupt.h> ··· 130 129 int irq; 131 130 struct clk *busclk; 132 131 struct clk *ssclk; 132 + struct reset_control *reset; 133 133 struct device *dev; 134 134 struct resource *res; 135 135 spinlock_t slock; /* control the use of the device */