diff options
| author | Manuel Lauss <manuel.lauss@gmail.com> | 2014-07-23 10:36:53 -0400 |
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2014-07-30 08:10:19 -0400 |
| commit | 9178af9aa74edb4b161912ee1a6cbe0cc7ed7975 (patch) | |
| tree | 06340face6a9234ec2818ba64a97eecf9c17ca75 /drivers/net/irda | |
| parent | 415e0fec7a388dbe224057c1134737e23710aa9b (diff) | |
MIPS: Alchemy: irda: use clk framework
Test the existence of the irda_clk clock object, use it to en/dis-
able it when date is being transferred.
Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com>
Cc: Linux-MIPS <linux-mips@linux-mips.org>
Patchwork: https://patchwork.linux-mips.org/patch/7470/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'drivers/net/irda')
| -rw-r--r-- | drivers/net/irda/au1k_ir.c | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/drivers/net/irda/au1k_ir.c b/drivers/net/irda/au1k_ir.c index 5f91e3e01c04..aab2cf72d025 100644 --- a/drivers/net/irda/au1k_ir.c +++ b/drivers/net/irda/au1k_ir.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | * with this program; if not, see <http://www.gnu.org/licenses/>. | 18 | * with this program; if not, see <http://www.gnu.org/licenses/>. |
| 19 | */ | 19 | */ |
| 20 | 20 | ||
| 21 | #include <linux/clk.h> | ||
| 21 | #include <linux/module.h> | 22 | #include <linux/module.h> |
| 22 | #include <linux/netdevice.h> | 23 | #include <linux/netdevice.h> |
| 23 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
| @@ -175,6 +176,7 @@ struct au1k_private { | |||
| 175 | 176 | ||
| 176 | struct resource *ioarea; | 177 | struct resource *ioarea; |
| 177 | struct au1k_irda_platform_data *platdata; | 178 | struct au1k_irda_platform_data *platdata; |
| 179 | struct clk *irda_clk; | ||
| 178 | }; | 180 | }; |
| 179 | 181 | ||
| 180 | static int qos_mtt_bits = 0x07; /* 1 ms or more */ | 182 | static int qos_mtt_bits = 0x07; /* 1 ms or more */ |
| @@ -514,9 +516,39 @@ static irqreturn_t au1k_irda_interrupt(int dummy, void *dev_id) | |||
| 514 | static int au1k_init(struct net_device *dev) | 516 | static int au1k_init(struct net_device *dev) |
| 515 | { | 517 | { |
| 516 | struct au1k_private *aup = netdev_priv(dev); | 518 | struct au1k_private *aup = netdev_priv(dev); |
| 517 | u32 enable, ring_address; | 519 | u32 enable, ring_address, phyck; |
| 520 | struct clk *c; | ||
| 518 | int i; | 521 | int i; |
| 519 | 522 | ||
| 523 | c = clk_get(NULL, "irda_clk"); | ||
| 524 | if (IS_ERR(c)) | ||
| 525 | return PTR_ERR(c); | ||
| 526 | i = clk_prepare_enable(c); | ||
| 527 | if (i) { | ||
| 528 | clk_put(c); | ||
| 529 | return i; | ||
| 530 | } | ||
| 531 | |||
| 532 | switch (clk_get_rate(c)) { | ||
| 533 | case 40000000: | ||
| 534 | phyck = IR_PHYCLK_40MHZ; | ||
| 535 | break; | ||
| 536 | case 48000000: | ||
| 537 | phyck = IR_PHYCLK_48MHZ; | ||
| 538 | break; | ||
| 539 | case 56000000: | ||
| 540 | phyck = IR_PHYCLK_56MHZ; | ||
| 541 | break; | ||
| 542 | case 64000000: | ||
| 543 | phyck = IR_PHYCLK_64MHZ; | ||
| 544 | break; | ||
| 545 | default: | ||
| 546 | clk_disable_unprepare(c); | ||
| 547 | clk_put(c); | ||
| 548 | return -EINVAL; | ||
| 549 | } | ||
| 550 | aup->irda_clk = c; | ||
| 551 | |||
| 520 | enable = IR_HC | IR_CE | IR_C; | 552 | enable = IR_HC | IR_CE | IR_C; |
| 521 | #ifndef CONFIG_CPU_LITTLE_ENDIAN | 553 | #ifndef CONFIG_CPU_LITTLE_ENDIAN |
| 522 | enable |= IR_BE; | 554 | enable |= IR_BE; |
| @@ -545,7 +577,7 @@ static int au1k_init(struct net_device *dev) | |||
| 545 | irda_write(aup, IR_RING_SIZE, | 577 | irda_write(aup, IR_RING_SIZE, |
| 546 | (RING_SIZE_64 << 8) | (RING_SIZE_64 << 12)); | 578 | (RING_SIZE_64 << 8) | (RING_SIZE_64 << 12)); |
| 547 | 579 | ||
| 548 | irda_write(aup, IR_CONFIG_2, IR_PHYCLK_48MHZ | IR_ONE_PIN); | 580 | irda_write(aup, IR_CONFIG_2, phyck | IR_ONE_PIN); |
| 549 | irda_write(aup, IR_RING_ADDR_CMPR, 0); | 581 | irda_write(aup, IR_RING_ADDR_CMPR, 0); |
| 550 | 582 | ||
| 551 | au1k_irda_set_speed(dev, 9600); | 583 | au1k_irda_set_speed(dev, 9600); |
| @@ -619,6 +651,9 @@ static int au1k_irda_stop(struct net_device *dev) | |||
| 619 | free_irq(aup->irq_tx, dev); | 651 | free_irq(aup->irq_tx, dev); |
| 620 | free_irq(aup->irq_rx, dev); | 652 | free_irq(aup->irq_rx, dev); |
| 621 | 653 | ||
| 654 | clk_disable_unprepare(aup->irda_clk); | ||
| 655 | clk_put(aup->irda_clk); | ||
| 656 | |||
| 622 | return 0; | 657 | return 0; |
| 623 | } | 658 | } |
| 624 | 659 | ||
| @@ -853,6 +888,7 @@ static int au1k_irda_probe(struct platform_device *pdev) | |||
| 853 | struct au1k_private *aup; | 888 | struct au1k_private *aup; |
| 854 | struct net_device *dev; | 889 | struct net_device *dev; |
| 855 | struct resource *r; | 890 | struct resource *r; |
| 891 | struct clk *c; | ||
| 856 | int err; | 892 | int err; |
| 857 | 893 | ||
| 858 | dev = alloc_irdadev(sizeof(struct au1k_private)); | 894 | dev = alloc_irdadev(sizeof(struct au1k_private)); |
| @@ -886,6 +922,14 @@ static int au1k_irda_probe(struct platform_device *pdev) | |||
| 886 | if (!aup->ioarea) | 922 | if (!aup->ioarea) |
| 887 | goto out; | 923 | goto out; |
| 888 | 924 | ||
| 925 | /* bail out early if clock doesn't exist */ | ||
| 926 | c = clk_get(NULL, "irda_clk"); | ||
| 927 | if (IS_ERR(c)) { | ||
| 928 | err = PTR_ERR(c); | ||
| 929 | goto out; | ||
| 930 | } | ||
| 931 | clk_put(c); | ||
| 932 | |||
| 889 | aup->iobase = ioremap_nocache(r->start, resource_size(r)); | 933 | aup->iobase = ioremap_nocache(r->start, resource_size(r)); |
| 890 | if (!aup->iobase) | 934 | if (!aup->iobase) |
| 891 | goto out2; | 935 | goto out2; |
