Clock handling can be very simlified with using devm_clk_get_enabled() as was done by commit 8d2aaf4382b7 ("gpio: zynq: Simplify using devm_clk_get_enabled()").
Unified · Split
| @@ -248,41 +248,35 @@ static int xlnx_spdif_probe(struct platform_device *pdev) · 247 unmodified lines | |||
| 248 | if (!ctx) | 248 | if (!ctx) |
| 249 | return -ENOMEM; | 249 | return -ENOMEM; |
| 250 | 250 | ||
| 251 | ctx->axi_clk = devm_clk_get(dev, "s_axi_aclk"); | 251 | ctx->axi_clk = devm_clk_get_enabled(dev, "s_axi_aclk"); |
| 252 | if (IS_ERR(ctx->axi_clk)) { | 252 | if (IS_ERR(ctx->axi_clk)) { |
| 253 | ret = PTR_ERR(ctx->axi_clk); | 253 | ret = PTR_ERR(ctx->axi_clk); |
| 254 | dev_err(dev, "failed to get s_axi_aclk(%d)\n", ret); | 254 | dev_err(dev, "failed to get s_axi_aclk(%d)\n", ret); |
| 255 | return ret; | 255 | return ret; |
| 256 | } | 256 | } |
| 257 | ret = clk_prepare_enable(ctx->axi_clk); | ||
| 258 | if (ret) { | ||
| 259 | dev_err(dev, "failed to enable s_axi_aclk(%d)\n", ret); | ||
| 260 | return ret; | ||
| 261 | } | ||
| 262 | 257 | ||
| 263 | ctx->base = devm_platform_ioremap_resource(pdev, 0); | 258 | ctx->base = devm_platform_ioremap_resource(pdev, 0); |
| 264 | if (IS_ERR(ctx->base)) { | 259 | if (IS_ERR(ctx->base)) |
| 265 | ret = PTR_ERR(ctx->base); | 260 | return PTR_ERR(ctx->base); |
| 266 | goto clk_err; | 261 | |
| 267 | } | ||
| 268 | ret = of_property_read_u32(node, "xlnx,spdif-mode", &ctx->mode); | 262 | ret = of_property_read_u32(node, "xlnx,spdif-mode", &ctx->mode); |
| 269 | if (ret < 0) { | 263 | if (ret < 0) { |
| 270 | dev_err(dev, "cannot get SPDIF mode\n"); | 264 | dev_err(dev, "cannot get SPDIF mode\n"); |
| 271 | goto clk_err; | 265 | return ret; |
| 272 | } | 266 | } |
| 273 | if (ctx->mode) { | 267 | if (ctx->mode) { |
| 274 | dai_drv = &xlnx_spdif_tx_dai; | 268 | dai_drv = &xlnx_spdif_tx_dai; |
| 275 | } else { | 269 | } else { |
| 276 | ret = platform_get_irq(pdev, 0); | 270 | ret = platform_get_irq(pdev, 0); |
| 277 | if (ret < 0) | 271 | if (ret < 0) |
| 278 | goto clk_err; | 272 | return ret; |
| 273 | |||
| 279 | ret = devm_request_irq(dev, ret, | 274 | ret = devm_request_irq(dev, ret, |
| 280 | xlnx_spdifrx_irq_handler, | 275 | xlnx_spdifrx_irq_handler, |
| 281 | 0, "XLNX_SPDIF_RX", ctx); | 276 | 0, "XLNX_SPDIF_RX", ctx); |
| 282 | if (ret) { | 277 | if (ret) { |
| 283 | dev_err(dev, "spdif rx irq request failed\n"); | 278 | dev_err(dev, "spdif rx irq request failed\n"); |
| 284 | ret = -ENODEV; | 279 | return -ENODEV; |
| 285 | goto clk_err; | ||
| 286 | } | 280 | } |
| 287 | 281 | ||
| 288 | init_waitqueue_head(&ctx->chsts_q); | 282 | init_waitqueue_head(&ctx->chsts_q); |
| @@ -292,7 +286,7 @@ static int xlnx_spdif_probe(struct platform_device *pdev) · 3 unmodified lines | |||
| 292 | ret = of_property_read_u32(node, "xlnx,aud_clk_i", &ctx->aclk); | 286 | ret = of_property_read_u32(node, "xlnx,aud_clk_i", &ctx->aclk); |
| 293 | if (ret < 0) { | 287 | if (ret < 0) { |
| 294 | dev_err(dev, "cannot get aud_clk_i value\n"); | 288 | dev_err(dev, "cannot get aud_clk_i value\n"); |
| 295 | goto clk_err; | 289 | return ret; |
| 296 | } | 290 | } |
| 297 | 291 | ||
| 298 | dev_set_drvdata(dev, ctx); | 292 | dev_set_drvdata(dev, ctx); |
| @@ -301,22 +295,13 @@ static int xlnx_spdif_probe(struct platform_device *pdev) · 2 unmodified lines | |||
| 301 | dai_drv, 1); | 295 | dai_drv, 1); |
| 302 | if (ret) { | 296 | if (ret) { |
| 303 | dev_err(dev, "SPDIF component registration failed\n"); | 297 | dev_err(dev, "SPDIF component registration failed\n"); |
| 304 | goto clk_err; | 298 | return ret; |
| 305 | } | 299 | } |
| 306 | 300 | ||
| 307 | writel(XSPDIF_SOFT_RESET_VALUE, ctx->base + XSPDIF_SOFT_RESET_REG); | 301 | writel(XSPDIF_SOFT_RESET_VALUE, ctx->base + XSPDIF_SOFT_RESET_REG); |
| 308 | dev_info(dev, "%s DAI registered\n", dai_drv->name); | 302 | dev_info(dev, "%s DAI registered\n", dai_drv->name); |
| 309 | 303 | ||
| 310 | clk_err: | 304 | return 0; |
| 311 | clk_disable_unprepare(ctx->axi_clk); | ||
| 312 | return ret; | ||
| 313 | } | ||
| 314 | |||
| 315 | static void xlnx_spdif_remove(struct platform_device *pdev) | ||
| 316 | { | ||
| 317 | struct spdif_dev_data *ctx = dev_get_drvdata(&pdev->dev); | ||
| 318 | |||
| 319 | clk_disable_unprepare(ctx->axi_clk); | ||
| 320 | } | 305 | } |
| 321 | 306 | ||
| 322 | static struct platform_driver xlnx_spdif_driver = { | 307 | static struct platform_driver xlnx_spdif_driver = { |
| @@ -325,7 +310,6 @@ static struct platform_driver xlnx_spdif_driver = { · 2 unmodified lines | |||
| 325 | .of_match_table = xlnx_spdif_of_match, | 310 | .of_match_table = xlnx_spdif_of_match, |
| 326 | }, | 311 | }, |
| 327 | .probe = xlnx_spdif_probe, | 312 | .probe = xlnx_spdif_probe, |
| 328 | .remove = xlnx_spdif_remove, | ||
| 329 | }; | 313 | }; |
| 330 | module_platform_driver(xlnx_spdif_driver); | 314 | module_platform_driver(xlnx_spdif_driver); |
| 331 | 315 | ||