diff options
author | Jaehoon Chung <jh80.chung@samsung.com> | 2014-05-26 00:58:28 -0400 |
---|---|---|
committer | Chris Ball <chris@printf.net> | 2014-06-04 18:59:12 -0400 |
commit | 11bc9381b277a65ea4b3fe994e658f4a78512139 (patch) | |
tree | eed9298c4cc561d2aa2b0a911792045361de6fdd /drivers/mmc/host/sdhci-s3c.c | |
parent | 75fa9ea6e3c0223cf9f56ed15b0ea3e9ccc627f1 (diff) |
mmc: sdhci-s3c: use mmc_of_parse and remove the card_tasklet
Fix the compile error.
(Removed the card_tasklet at "mmc: sdhci: push card_tasklet into treaded irq handler")
drivers/mmc/host/sdhci-s3c.c: In function ‘sdhci_s3c_notify_change’:
drivers/mmc/host/sdhci-s3c.c:402:25: error: ‘struct sdhci_host’ has no member named ‘card_tasklet’
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Chris Ball <chris@printf.net>
Diffstat (limited to 'drivers/mmc/host/sdhci-s3c.c')
-rw-r--r-- | drivers/mmc/host/sdhci-s3c.c | 99 |
1 files changed, 4 insertions, 95 deletions
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index 781b8a943d38..fa5954a05449 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c | |||
@@ -374,82 +374,12 @@ static struct sdhci_ops sdhci_s3c_ops = { | |||
374 | .set_uhs_signaling = sdhci_set_uhs_signaling, | 374 | .set_uhs_signaling = sdhci_set_uhs_signaling, |
375 | }; | 375 | }; |
376 | 376 | ||
377 | static void sdhci_s3c_notify_change(struct platform_device *dev, int state) | ||
378 | { | ||
379 | struct sdhci_host *host = platform_get_drvdata(dev); | ||
380 | #ifdef CONFIG_PM_RUNTIME | ||
381 | struct sdhci_s3c *sc = sdhci_priv(host); | ||
382 | #endif | ||
383 | unsigned long flags; | ||
384 | |||
385 | if (host) { | ||
386 | spin_lock_irqsave(&host->lock, flags); | ||
387 | if (state) { | ||
388 | dev_dbg(&dev->dev, "card inserted.\n"); | ||
389 | #ifdef CONFIG_PM_RUNTIME | ||
390 | clk_prepare_enable(sc->clk_io); | ||
391 | #endif | ||
392 | host->flags &= ~SDHCI_DEVICE_DEAD; | ||
393 | host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION; | ||
394 | } else { | ||
395 | dev_dbg(&dev->dev, "card removed.\n"); | ||
396 | host->flags |= SDHCI_DEVICE_DEAD; | ||
397 | host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION; | ||
398 | #ifdef CONFIG_PM_RUNTIME | ||
399 | clk_disable_unprepare(sc->clk_io); | ||
400 | #endif | ||
401 | } | ||
402 | tasklet_schedule(&host->card_tasklet); | ||
403 | spin_unlock_irqrestore(&host->lock, flags); | ||
404 | } | ||
405 | } | ||
406 | |||
407 | static irqreturn_t sdhci_s3c_gpio_card_detect_thread(int irq, void *dev_id) | ||
408 | { | ||
409 | struct sdhci_s3c *sc = dev_id; | ||
410 | int status = gpio_get_value(sc->ext_cd_gpio); | ||
411 | if (sc->pdata->ext_cd_gpio_invert) | ||
412 | status = !status; | ||
413 | sdhci_s3c_notify_change(sc->pdev, status); | ||
414 | return IRQ_HANDLED; | ||
415 | } | ||
416 | |||
417 | static void sdhci_s3c_setup_card_detect_gpio(struct sdhci_s3c *sc) | ||
418 | { | ||
419 | struct s3c_sdhci_platdata *pdata = sc->pdata; | ||
420 | struct device *dev = &sc->pdev->dev; | ||
421 | |||
422 | if (devm_gpio_request(dev, pdata->ext_cd_gpio, "SDHCI EXT CD") == 0) { | ||
423 | sc->ext_cd_gpio = pdata->ext_cd_gpio; | ||
424 | sc->ext_cd_irq = gpio_to_irq(pdata->ext_cd_gpio); | ||
425 | if (sc->ext_cd_irq && | ||
426 | request_threaded_irq(sc->ext_cd_irq, NULL, | ||
427 | sdhci_s3c_gpio_card_detect_thread, | ||
428 | IRQF_TRIGGER_RISING | | ||
429 | IRQF_TRIGGER_FALLING | | ||
430 | IRQF_ONESHOT, | ||
431 | dev_name(dev), sc) == 0) { | ||
432 | int status = gpio_get_value(sc->ext_cd_gpio); | ||
433 | if (pdata->ext_cd_gpio_invert) | ||
434 | status = !status; | ||
435 | sdhci_s3c_notify_change(sc->pdev, status); | ||
436 | } else { | ||
437 | dev_warn(dev, "cannot request irq for card detect\n"); | ||
438 | sc->ext_cd_irq = 0; | ||
439 | } | ||
440 | } else { | ||
441 | dev_err(dev, "cannot request gpio for card detect\n"); | ||
442 | } | ||
443 | } | ||
444 | |||
445 | #ifdef CONFIG_OF | 377 | #ifdef CONFIG_OF |
446 | static int sdhci_s3c_parse_dt(struct device *dev, | 378 | static int sdhci_s3c_parse_dt(struct device *dev, |
447 | struct sdhci_host *host, struct s3c_sdhci_platdata *pdata) | 379 | struct sdhci_host *host, struct s3c_sdhci_platdata *pdata) |
448 | { | 380 | { |
449 | struct device_node *node = dev->of_node; | 381 | struct device_node *node = dev->of_node; |
450 | struct sdhci_s3c *ourhost = to_s3c(host); | ||
451 | u32 max_width; | 382 | u32 max_width; |
452 | int gpio; | ||
453 | 383 | ||
454 | /* if the bus-width property is not specified, assume width as 1 */ | 384 | /* if the bus-width property is not specified, assume width as 1 */ |
455 | if (of_property_read_u32(node, "bus-width", &max_width)) | 385 | if (of_property_read_u32(node, "bus-width", &max_width)) |
@@ -467,18 +397,8 @@ static int sdhci_s3c_parse_dt(struct device *dev, | |||
467 | return 0; | 397 | return 0; |
468 | } | 398 | } |
469 | 399 | ||
470 | gpio = of_get_named_gpio(node, "cd-gpios", 0); | 400 | if (of_get_named_gpio(node, "cd-gpios", 0)) |
471 | if (gpio_is_valid(gpio)) { | ||
472 | pdata->cd_type = S3C_SDHCI_CD_GPIO; | ||
473 | pdata->ext_cd_gpio = gpio; | ||
474 | ourhost->ext_cd_gpio = -1; | ||
475 | if (of_get_property(node, "cd-inverted", NULL)) | ||
476 | pdata->ext_cd_gpio_invert = 1; | ||
477 | return 0; | 401 | return 0; |
478 | } else if (gpio != -ENOENT) { | ||
479 | dev_err(dev, "invalid card detect gpio specified\n"); | ||
480 | return -EINVAL; | ||
481 | } | ||
482 | 402 | ||
483 | /* assuming internal card detect that will be configured by pinctrl */ | 403 | /* assuming internal card detect that will be configured by pinctrl */ |
484 | pdata->cd_type = S3C_SDHCI_CD_INTERNAL; | 404 | pdata->cd_type = S3C_SDHCI_CD_INTERNAL; |
@@ -681,6 +601,8 @@ static int sdhci_s3c_probe(struct platform_device *pdev) | |||
681 | pm_runtime_use_autosuspend(&pdev->dev); | 601 | pm_runtime_use_autosuspend(&pdev->dev); |
682 | pm_suspend_ignore_children(&pdev->dev, 1); | 602 | pm_suspend_ignore_children(&pdev->dev, 1); |
683 | 603 | ||
604 | mmc_of_parse(host->mmc); | ||
605 | |||
684 | ret = sdhci_add_host(host); | 606 | ret = sdhci_add_host(host); |
685 | if (ret) { | 607 | if (ret) { |
686 | dev_err(dev, "sdhci_add_host() failed\n"); | 608 | dev_err(dev, "sdhci_add_host() failed\n"); |
@@ -689,15 +611,6 @@ static int sdhci_s3c_probe(struct platform_device *pdev) | |||
689 | goto err_req_regs; | 611 | goto err_req_regs; |
690 | } | 612 | } |
691 | 613 | ||
692 | /* The following two methods of card detection might call | ||
693 | sdhci_s3c_notify_change() immediately, so they can be called | ||
694 | only after sdhci_add_host(). Setup errors are ignored. */ | ||
695 | if (pdata->cd_type == S3C_SDHCI_CD_EXTERNAL && pdata->ext_cd_init) | ||
696 | pdata->ext_cd_init(&sdhci_s3c_notify_change); | ||
697 | if (pdata->cd_type == S3C_SDHCI_CD_GPIO && | ||
698 | gpio_is_valid(pdata->ext_cd_gpio)) | ||
699 | sdhci_s3c_setup_card_detect_gpio(sc); | ||
700 | |||
701 | #ifdef CONFIG_PM_RUNTIME | 614 | #ifdef CONFIG_PM_RUNTIME |
702 | if (pdata->cd_type != S3C_SDHCI_CD_INTERNAL) | 615 | if (pdata->cd_type != S3C_SDHCI_CD_INTERNAL) |
703 | clk_disable_unprepare(sc->clk_io); | 616 | clk_disable_unprepare(sc->clk_io); |
@@ -718,16 +631,12 @@ static int sdhci_s3c_remove(struct platform_device *pdev) | |||
718 | { | 631 | { |
719 | struct sdhci_host *host = platform_get_drvdata(pdev); | 632 | struct sdhci_host *host = platform_get_drvdata(pdev); |
720 | struct sdhci_s3c *sc = sdhci_priv(host); | 633 | struct sdhci_s3c *sc = sdhci_priv(host); |
721 | struct s3c_sdhci_platdata *pdata = sc->pdata; | ||
722 | |||
723 | if (pdata->cd_type == S3C_SDHCI_CD_EXTERNAL && pdata->ext_cd_cleanup) | ||
724 | pdata->ext_cd_cleanup(&sdhci_s3c_notify_change); | ||
725 | 634 | ||
726 | if (sc->ext_cd_irq) | 635 | if (sc->ext_cd_irq) |
727 | free_irq(sc->ext_cd_irq, sc); | 636 | free_irq(sc->ext_cd_irq, sc); |
728 | 637 | ||
729 | #ifdef CONFIG_PM_RUNTIME | 638 | #ifdef CONFIG_PM_RUNTIME |
730 | if (pdata->cd_type != S3C_SDHCI_CD_INTERNAL) | 639 | if (sc->pdata->cd_type != S3C_SDHCI_CD_INTERNAL) |
731 | clk_prepare_enable(sc->clk_io); | 640 | clk_prepare_enable(sc->clk_io); |
732 | #endif | 641 | #endif |
733 | sdhci_remove_host(host, 1); | 642 | sdhci_remove_host(host, 1); |