sunxi-rsb.c (4a0dbc12e61823ece7172df953c3333c8f5f9222) | sunxi-rsb.c (3c15e00e7b58bc2b37e53d2612f0a0163281be77) |
---|---|
1/* 2 * RSB (Reduced Serial Bus) driver. 3 * 4 * Author: Chen-Yu Tsai <wens@csie.org> 5 * 6 * This file is licensed under the terms of the GNU General Public License 7 * version 2. This program is licensed "as is" without any warranty of any 8 * kind, whether express or implied. --- 31 unchanged lines hidden (view full) --- 40#include <linux/interrupt.h> 41#include <linux/io.h> 42#include <linux/iopoll.h> 43#include <linux/module.h> 44#include <linux/of.h> 45#include <linux/of_irq.h> 46#include <linux/of_platform.h> 47#include <linux/platform_device.h> | 1/* 2 * RSB (Reduced Serial Bus) driver. 3 * 4 * Author: Chen-Yu Tsai <wens@csie.org> 5 * 6 * This file is licensed under the terms of the GNU General Public License 7 * version 2. This program is licensed "as is" without any warranty of any 8 * kind, whether express or implied. --- 31 unchanged lines hidden (view full) --- 40#include <linux/interrupt.h> 41#include <linux/io.h> 42#include <linux/iopoll.h> 43#include <linux/module.h> 44#include <linux/of.h> 45#include <linux/of_irq.h> 46#include <linux/of_platform.h> 47#include <linux/platform_device.h> |
48#include <linux/pm.h> 49#include <linux/pm_runtime.h> | |
50#include <linux/regmap.h> 51#include <linux/reset.h> 52#include <linux/slab.h> 53#include <linux/sunxi-rsb.h> 54#include <linux/types.h> 55 56/* RSB registers */ 57#define RSB_CTRL 0x0 /* Global control */ --- 65 unchanged lines hidden (view full) --- 123struct sunxi_rsb { 124 struct device *dev; 125 void __iomem *regs; 126 struct clk *clk; 127 struct reset_control *rstc; 128 struct completion complete; 129 struct mutex lock; 130 unsigned int status; | 48#include <linux/regmap.h> 49#include <linux/reset.h> 50#include <linux/slab.h> 51#include <linux/sunxi-rsb.h> 52#include <linux/types.h> 53 54/* RSB registers */ 55#define RSB_CTRL 0x0 /* Global control */ --- 65 unchanged lines hidden (view full) --- 121struct sunxi_rsb { 122 struct device *dev; 123 void __iomem *regs; 124 struct clk *clk; 125 struct reset_control *rstc; 126 struct completion complete; 127 struct mutex lock; 128 unsigned int status; |
131 u32 clk_freq; | |
132}; 133 134/* bus / slave device related functions */ 135static struct bus_type sunxi_rsb_bus; 136 137static int sunxi_rsb_device_match(struct device *dev, struct device_driver *drv) 138{ 139 return of_driver_match_device(dev, drv); --- 28 unchanged lines hidden (view full) --- 168 169 return drv->probe(rdev); 170} 171 172static int sunxi_rsb_device_remove(struct device *dev) 173{ 174 const struct sunxi_rsb_driver *drv = to_sunxi_rsb_driver(dev->driver); 175 | 129}; 130 131/* bus / slave device related functions */ 132static struct bus_type sunxi_rsb_bus; 133 134static int sunxi_rsb_device_match(struct device *dev, struct device_driver *drv) 135{ 136 return of_driver_match_device(dev, drv); --- 28 unchanged lines hidden (view full) --- 165 166 return drv->probe(rdev); 167} 168 169static int sunxi_rsb_device_remove(struct device *dev) 170{ 171 const struct sunxi_rsb_driver *drv = to_sunxi_rsb_driver(dev->driver); 172 |
176 return drv->remove(to_sunxi_rsb_device(dev)); | 173 drv->remove(to_sunxi_rsb_device(dev)); 174 175 return 0; |
177} 178 179static struct bus_type sunxi_rsb_bus = { 180 .name = RSB_CTRL_NAME, 181 .match = sunxi_rsb_device_match, 182 .probe = sunxi_rsb_device_probe, 183 .remove = sunxi_rsb_device_remove, 184 .uevent = of_device_uevent_modalias, --- 148 unchanged lines hidden (view full) --- 333 case 4: 334 cmd = RSB_CMD_RD32; 335 break; 336 default: 337 dev_err(rsb->dev, "Invalid access width: %zd\n", len); 338 return -EINVAL; 339 } 340 | 176} 177 178static struct bus_type sunxi_rsb_bus = { 179 .name = RSB_CTRL_NAME, 180 .match = sunxi_rsb_device_match, 181 .probe = sunxi_rsb_device_probe, 182 .remove = sunxi_rsb_device_remove, 183 .uevent = of_device_uevent_modalias, --- 148 unchanged lines hidden (view full) --- 332 case 4: 333 cmd = RSB_CMD_RD32; 334 break; 335 default: 336 dev_err(rsb->dev, "Invalid access width: %zd\n", len); 337 return -EINVAL; 338 } 339 |
341 ret = pm_runtime_resume_and_get(rsb->dev); 342 if (ret) 343 return ret; 344 | |
345 mutex_lock(&rsb->lock); 346 347 writel(addr, rsb->regs + RSB_ADDR); 348 writel(RSB_DAR_RTA(rtaddr), rsb->regs + RSB_DAR); 349 writel(cmd, rsb->regs + RSB_CMD); 350 351 ret = _sunxi_rsb_run_xfer(rsb); 352 if (ret) 353 goto unlock; 354 355 *buf = readl(rsb->regs + RSB_DATA) & GENMASK(len * 8 - 1, 0); 356 357unlock: 358 mutex_unlock(&rsb->lock); 359 | 340 mutex_lock(&rsb->lock); 341 342 writel(addr, rsb->regs + RSB_ADDR); 343 writel(RSB_DAR_RTA(rtaddr), rsb->regs + RSB_DAR); 344 writel(cmd, rsb->regs + RSB_CMD); 345 346 ret = _sunxi_rsb_run_xfer(rsb); 347 if (ret) 348 goto unlock; 349 350 *buf = readl(rsb->regs + RSB_DATA) & GENMASK(len * 8 - 1, 0); 351 352unlock: 353 mutex_unlock(&rsb->lock); 354 |
360 pm_runtime_mark_last_busy(rsb->dev); 361 pm_runtime_put_autosuspend(rsb->dev); 362 | |
363 return ret; 364} 365 366static int sunxi_rsb_write(struct sunxi_rsb *rsb, u8 rtaddr, u8 addr, 367 const u32 *buf, size_t len) 368{ 369 u32 cmd; 370 int ret; --- 11 unchanged lines hidden (view full) --- 382 case 4: 383 cmd = RSB_CMD_WR32; 384 break; 385 default: 386 dev_err(rsb->dev, "Invalid access width: %zd\n", len); 387 return -EINVAL; 388 } 389 | 355 return ret; 356} 357 358static int sunxi_rsb_write(struct sunxi_rsb *rsb, u8 rtaddr, u8 addr, 359 const u32 *buf, size_t len) 360{ 361 u32 cmd; 362 int ret; --- 11 unchanged lines hidden (view full) --- 374 case 4: 375 cmd = RSB_CMD_WR32; 376 break; 377 default: 378 dev_err(rsb->dev, "Invalid access width: %zd\n", len); 379 return -EINVAL; 380 } 381 |
390 ret = pm_runtime_resume_and_get(rsb->dev); 391 if (ret) 392 return ret; 393 | |
394 mutex_lock(&rsb->lock); 395 396 writel(addr, rsb->regs + RSB_ADDR); 397 writel(RSB_DAR_RTA(rtaddr), rsb->regs + RSB_DAR); 398 writel(*buf, rsb->regs + RSB_DATA); 399 writel(cmd, rsb->regs + RSB_CMD); 400 ret = _sunxi_rsb_run_xfer(rsb); 401 402 mutex_unlock(&rsb->lock); 403 | 382 mutex_lock(&rsb->lock); 383 384 writel(addr, rsb->regs + RSB_ADDR); 385 writel(RSB_DAR_RTA(rtaddr), rsb->regs + RSB_DAR); 386 writel(*buf, rsb->regs + RSB_DATA); 387 writel(cmd, rsb->regs + RSB_CMD); 388 ret = _sunxi_rsb_run_xfer(rsb); 389 390 mutex_unlock(&rsb->lock); 391 |
404 pm_runtime_mark_last_busy(rsb->dev); 405 pm_runtime_put_autosuspend(rsb->dev); 406 | |
407 return ret; 408} 409 410/* RSB regmap functions */ 411struct sunxi_rsb_ctx { 412 struct sunxi_rsb_device *rdev; 413 int size; 414}; --- 211 unchanged lines hidden (view full) --- 626 if (IS_ERR(rdev)) 627 dev_err(dev, "failed to add child device %pOF: %ld\n", 628 child, PTR_ERR(rdev)); 629 } 630 631 return 0; 632} 633 | 392 return ret; 393} 394 395/* RSB regmap functions */ 396struct sunxi_rsb_ctx { 397 struct sunxi_rsb_device *rdev; 398 int size; 399}; --- 211 unchanged lines hidden (view full) --- 611 if (IS_ERR(rdev)) 612 dev_err(dev, "failed to add child device %pOF: %ld\n", 613 child, PTR_ERR(rdev)); 614 } 615 616 return 0; 617} 618 |
634static int sunxi_rsb_hw_init(struct sunxi_rsb *rsb) 635{ 636 struct device *dev = rsb->dev; 637 unsigned long p_clk_freq; 638 u32 clk_delay, reg; 639 int clk_div, ret; | 619static const struct of_device_id sunxi_rsb_of_match_table[] = { 620 { .compatible = "allwinner,sun8i-a23-rsb" }, 621 {} 622}; 623MODULE_DEVICE_TABLE(of, sunxi_rsb_of_match_table); |
640 | 624 |
641 ret = clk_prepare_enable(rsb->clk); 642 if (ret) { 643 dev_err(dev, "failed to enable clk: %d\n", ret); 644 return ret; 645 } 646 647 ret = reset_control_deassert(rsb->rstc); 648 if (ret) { 649 dev_err(dev, "failed to deassert reset line: %d\n", ret); 650 goto err_clk_disable; 651 } 652 653 /* reset the controller */ 654 writel(RSB_CTRL_SOFT_RST, rsb->regs + RSB_CTRL); 655 readl_poll_timeout(rsb->regs + RSB_CTRL, reg, 656 !(reg & RSB_CTRL_SOFT_RST), 1000, 100000); 657 658 /* 659 * Clock frequency and delay calculation code is from 660 * Allwinner U-boot sources. 661 * 662 * From A83 user manual: 663 * bus clock frequency = parent clock frequency / (2 * (divider + 1)) 664 */ 665 p_clk_freq = clk_get_rate(rsb->clk); 666 clk_div = p_clk_freq / rsb->clk_freq / 2; 667 if (!clk_div) 668 clk_div = 1; 669 else if (clk_div > RSB_CCR_MAX_CLK_DIV + 1) 670 clk_div = RSB_CCR_MAX_CLK_DIV + 1; 671 672 clk_delay = clk_div >> 1; 673 if (!clk_delay) 674 clk_delay = 1; 675 676 dev_info(dev, "RSB running at %lu Hz\n", p_clk_freq / clk_div / 2); 677 writel(RSB_CCR_SDA_OUT_DELAY(clk_delay) | RSB_CCR_CLK_DIV(clk_div - 1), 678 rsb->regs + RSB_CCR); 679 680 return 0; 681 682err_clk_disable: 683 clk_disable_unprepare(rsb->clk); 684 685 return ret; 686} 687 688static void sunxi_rsb_hw_exit(struct sunxi_rsb *rsb) 689{ 690 /* Keep the clock and PM reference counts consistent. */ 691 if (pm_runtime_status_suspended(rsb->dev)) 692 pm_runtime_resume(rsb->dev); 693 reset_control_assert(rsb->rstc); 694 clk_disable_unprepare(rsb->clk); 695} 696 697static int __maybe_unused sunxi_rsb_runtime_suspend(struct device *dev) 698{ 699 struct sunxi_rsb *rsb = dev_get_drvdata(dev); 700 701 clk_disable_unprepare(rsb->clk); 702 703 return 0; 704} 705 706static int __maybe_unused sunxi_rsb_runtime_resume(struct device *dev) 707{ 708 struct sunxi_rsb *rsb = dev_get_drvdata(dev); 709 710 return clk_prepare_enable(rsb->clk); 711} 712 713static int __maybe_unused sunxi_rsb_suspend(struct device *dev) 714{ 715 struct sunxi_rsb *rsb = dev_get_drvdata(dev); 716 717 sunxi_rsb_hw_exit(rsb); 718 719 return 0; 720} 721 722static int __maybe_unused sunxi_rsb_resume(struct device *dev) 723{ 724 struct sunxi_rsb *rsb = dev_get_drvdata(dev); 725 726 return sunxi_rsb_hw_init(rsb); 727} 728 | |
729static int sunxi_rsb_probe(struct platform_device *pdev) 730{ 731 struct device *dev = &pdev->dev; 732 struct device_node *np = dev->of_node; 733 struct resource *r; 734 struct sunxi_rsb *rsb; | 625static int sunxi_rsb_probe(struct platform_device *pdev) 626{ 627 struct device *dev = &pdev->dev; 628 struct device_node *np = dev->of_node; 629 struct resource *r; 630 struct sunxi_rsb *rsb; |
735 u32 clk_freq = 3000000; 736 int irq, ret; | 631 unsigned long p_clk_freq; 632 u32 clk_delay, clk_freq = 3000000; 633 int clk_div, irq, ret; 634 u32 reg; |
737 738 of_property_read_u32(np, "clock-frequency", &clk_freq); 739 if (clk_freq > RSB_MAX_FREQ) { 740 dev_err(dev, 741 "clock-frequency (%u Hz) is too high (max = 20MHz)\n", 742 clk_freq); 743 return -EINVAL; 744 } 745 746 rsb = devm_kzalloc(dev, sizeof(*rsb), GFP_KERNEL); 747 if (!rsb) 748 return -ENOMEM; 749 750 rsb->dev = dev; | 635 636 of_property_read_u32(np, "clock-frequency", &clk_freq); 637 if (clk_freq > RSB_MAX_FREQ) { 638 dev_err(dev, 639 "clock-frequency (%u Hz) is too high (max = 20MHz)\n", 640 clk_freq); 641 return -EINVAL; 642 } 643 644 rsb = devm_kzalloc(dev, sizeof(*rsb), GFP_KERNEL); 645 if (!rsb) 646 return -ENOMEM; 647 648 rsb->dev = dev; |
751 rsb->clk_freq = clk_freq; | |
752 platform_set_drvdata(pdev, rsb); 753 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 754 rsb->regs = devm_ioremap_resource(dev, r); 755 if (IS_ERR(rsb->regs)) 756 return PTR_ERR(rsb->regs); 757 758 irq = platform_get_irq(pdev, 0); 759 if (irq < 0) 760 return irq; 761 762 rsb->clk = devm_clk_get(dev, NULL); 763 if (IS_ERR(rsb->clk)) { 764 ret = PTR_ERR(rsb->clk); 765 dev_err(dev, "failed to retrieve clk: %d\n", ret); 766 return ret; 767 } 768 | 649 platform_set_drvdata(pdev, rsb); 650 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 651 rsb->regs = devm_ioremap_resource(dev, r); 652 if (IS_ERR(rsb->regs)) 653 return PTR_ERR(rsb->regs); 654 655 irq = platform_get_irq(pdev, 0); 656 if (irq < 0) 657 return irq; 658 659 rsb->clk = devm_clk_get(dev, NULL); 660 if (IS_ERR(rsb->clk)) { 661 ret = PTR_ERR(rsb->clk); 662 dev_err(dev, "failed to retrieve clk: %d\n", ret); 663 return ret; 664 } 665 |
666 ret = clk_prepare_enable(rsb->clk); 667 if (ret) { 668 dev_err(dev, "failed to enable clk: %d\n", ret); 669 return ret; 670 } 671 672 p_clk_freq = clk_get_rate(rsb->clk); 673 |
|
769 rsb->rstc = devm_reset_control_get(dev, NULL); 770 if (IS_ERR(rsb->rstc)) { 771 ret = PTR_ERR(rsb->rstc); 772 dev_err(dev, "failed to retrieve reset controller: %d\n", ret); | 674 rsb->rstc = devm_reset_control_get(dev, NULL); 675 if (IS_ERR(rsb->rstc)) { 676 ret = PTR_ERR(rsb->rstc); 677 dev_err(dev, "failed to retrieve reset controller: %d\n", ret); |
773 return ret; | 678 goto err_clk_disable; |
774 } 775 | 679 } 680 |
681 ret = reset_control_deassert(rsb->rstc); 682 if (ret) { 683 dev_err(dev, "failed to deassert reset line: %d\n", ret); 684 goto err_clk_disable; 685 } 686 |
|
776 init_completion(&rsb->complete); 777 mutex_init(&rsb->lock); 778 | 687 init_completion(&rsb->complete); 688 mutex_init(&rsb->lock); 689 |
690 /* reset the controller */ 691 writel(RSB_CTRL_SOFT_RST, rsb->regs + RSB_CTRL); 692 readl_poll_timeout(rsb->regs + RSB_CTRL, reg, 693 !(reg & RSB_CTRL_SOFT_RST), 1000, 100000); 694 695 /* 696 * Clock frequency and delay calculation code is from 697 * Allwinner U-boot sources. 698 * 699 * From A83 user manual: 700 * bus clock frequency = parent clock frequency / (2 * (divider + 1)) 701 */ 702 clk_div = p_clk_freq / clk_freq / 2; 703 if (!clk_div) 704 clk_div = 1; 705 else if (clk_div > RSB_CCR_MAX_CLK_DIV + 1) 706 clk_div = RSB_CCR_MAX_CLK_DIV + 1; 707 708 clk_delay = clk_div >> 1; 709 if (!clk_delay) 710 clk_delay = 1; 711 712 dev_info(dev, "RSB running at %lu Hz\n", p_clk_freq / clk_div / 2); 713 writel(RSB_CCR_SDA_OUT_DELAY(clk_delay) | RSB_CCR_CLK_DIV(clk_div - 1), 714 rsb->regs + RSB_CCR); 715 |
|
779 ret = devm_request_irq(dev, irq, sunxi_rsb_irq, 0, RSB_CTRL_NAME, rsb); 780 if (ret) { 781 dev_err(dev, "can't register interrupt handler irq %d: %d\n", 782 irq, ret); | 716 ret = devm_request_irq(dev, irq, sunxi_rsb_irq, 0, RSB_CTRL_NAME, rsb); 717 if (ret) { 718 dev_err(dev, "can't register interrupt handler irq %d: %d\n", 719 irq, ret); |
783 return ret; | 720 goto err_reset_assert; |
784 } 785 | 721 } 722 |
786 ret = sunxi_rsb_hw_init(rsb); 787 if (ret) 788 return ret; 789 | |
790 /* initialize all devices on the bus into RSB mode */ 791 ret = sunxi_rsb_init_device_mode(rsb); 792 if (ret) 793 dev_warn(dev, "Initialize device mode failed: %d\n", ret); 794 | 723 /* initialize all devices on the bus into RSB mode */ 724 ret = sunxi_rsb_init_device_mode(rsb); 725 if (ret) 726 dev_warn(dev, "Initialize device mode failed: %d\n", ret); 727 |
795 pm_suspend_ignore_children(dev, true); 796 pm_runtime_set_active(dev); 797 pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC); 798 pm_runtime_use_autosuspend(dev); 799 pm_runtime_enable(dev); 800 | |
801 of_rsb_register_devices(rsb); 802 803 return 0; | 728 of_rsb_register_devices(rsb); 729 730 return 0; |
731 732err_reset_assert: 733 reset_control_assert(rsb->rstc); 734 735err_clk_disable: 736 clk_disable_unprepare(rsb->clk); 737 738 return ret; |
|
804} 805 806static int sunxi_rsb_remove(struct platform_device *pdev) 807{ 808 struct sunxi_rsb *rsb = platform_get_drvdata(pdev); 809 810 device_for_each_child(rsb->dev, NULL, sunxi_rsb_remove_devices); | 739} 740 741static int sunxi_rsb_remove(struct platform_device *pdev) 742{ 743 struct sunxi_rsb *rsb = platform_get_drvdata(pdev); 744 745 device_for_each_child(rsb->dev, NULL, sunxi_rsb_remove_devices); |
811 pm_runtime_disable(&pdev->dev); 812 sunxi_rsb_hw_exit(rsb); | 746 reset_control_assert(rsb->rstc); 747 clk_disable_unprepare(rsb->clk); |
813 814 return 0; 815} 816 | 748 749 return 0; 750} 751 |
817static void sunxi_rsb_shutdown(struct platform_device *pdev) 818{ 819 struct sunxi_rsb *rsb = platform_get_drvdata(pdev); 820 821 pm_runtime_disable(&pdev->dev); 822 sunxi_rsb_hw_exit(rsb); 823} 824 825static const struct dev_pm_ops sunxi_rsb_dev_pm_ops = { 826 SET_RUNTIME_PM_OPS(sunxi_rsb_runtime_suspend, 827 sunxi_rsb_runtime_resume, NULL) 828 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sunxi_rsb_suspend, sunxi_rsb_resume) 829}; 830 831static const struct of_device_id sunxi_rsb_of_match_table[] = { 832 { .compatible = "allwinner,sun8i-a23-rsb" }, 833 {} 834}; 835MODULE_DEVICE_TABLE(of, sunxi_rsb_of_match_table); 836 | |
837static struct platform_driver sunxi_rsb_driver = { 838 .probe = sunxi_rsb_probe, 839 .remove = sunxi_rsb_remove, | 752static struct platform_driver sunxi_rsb_driver = { 753 .probe = sunxi_rsb_probe, 754 .remove = sunxi_rsb_remove, |
840 .shutdown = sunxi_rsb_shutdown, | |
841 .driver = { 842 .name = RSB_CTRL_NAME, 843 .of_match_table = sunxi_rsb_of_match_table, | 755 .driver = { 756 .name = RSB_CTRL_NAME, 757 .of_match_table = sunxi_rsb_of_match_table, |
844 .pm = &sunxi_rsb_dev_pm_ops, | |
845 }, 846}; 847 848static int __init sunxi_rsb_init(void) 849{ 850 int ret; 851 852 ret = bus_register(&sunxi_rsb_bus); --- 19 unchanged lines hidden --- | 758 }, 759}; 760 761static int __init sunxi_rsb_init(void) 762{ 763 int ret; 764 765 ret = bus_register(&sunxi_rsb_bus); --- 19 unchanged lines hidden --- |