diff options
Diffstat (limited to 'drivers/misc')
40 files changed, 506 insertions, 576 deletions
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index c002d8660e30..8dacd4c9ee87 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig | |||
| @@ -135,7 +135,7 @@ config PHANTOM | |||
| 135 | 135 | ||
| 136 | config INTEL_MID_PTI | 136 | config INTEL_MID_PTI |
| 137 | tristate "Parallel Trace Interface for MIPI P1149.7 cJTAG standard" | 137 | tristate "Parallel Trace Interface for MIPI P1149.7 cJTAG standard" |
| 138 | depends on PCI && TTY | 138 | depends on PCI && TTY && (X86_INTEL_MID || COMPILE_TEST) |
| 139 | default n | 139 | default n |
| 140 | help | 140 | help |
| 141 | The PTI (Parallel Trace Interface) driver directs | 141 | The PTI (Parallel Trace Interface) driver directs |
| @@ -480,6 +480,7 @@ config BMP085_SPI | |||
| 480 | 480 | ||
| 481 | config PCH_PHUB | 481 | config PCH_PHUB |
| 482 | tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) PHUB" | 482 | tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) PHUB" |
| 483 | select GENERIC_NET_UTILS | ||
| 483 | depends on PCI | 484 | depends on PCI |
| 484 | help | 485 | help |
| 485 | This driver is for PCH(Platform controller Hub) PHUB(Packet Hub) of | 486 | This driver is for PCH(Platform controller Hub) PHUB(Packet Hub) of |
diff --git a/drivers/misc/ad525x_dpot.c b/drivers/misc/ad525x_dpot.c index 8f99e8e3f0ac..0daadcf1ed7a 100644 --- a/drivers/misc/ad525x_dpot.c +++ b/drivers/misc/ad525x_dpot.c | |||
| @@ -470,7 +470,7 @@ static ssize_t sysfs_set_reg(struct device *dev, | |||
| 470 | !test_bit(DPOT_RDAC_MASK & reg, data->otp_en_mask)) | 470 | !test_bit(DPOT_RDAC_MASK & reg, data->otp_en_mask)) |
| 471 | return -EPERM; | 471 | return -EPERM; |
| 472 | 472 | ||
| 473 | err = strict_strtoul(buf, 10, &value); | 473 | err = kstrtoul(buf, 10, &value); |
| 474 | if (err) | 474 | if (err) |
| 475 | return err; | 475 | return err; |
| 476 | 476 | ||
diff --git a/drivers/misc/apds9802als.c b/drivers/misc/apds9802als.c index 5b5fd8416b3e..0c6e037153d2 100644 --- a/drivers/misc/apds9802als.c +++ b/drivers/misc/apds9802als.c | |||
| @@ -126,8 +126,9 @@ static ssize_t als_sensing_range_store(struct device *dev, | |||
| 126 | int ret_val; | 126 | int ret_val; |
| 127 | unsigned long val; | 127 | unsigned long val; |
| 128 | 128 | ||
| 129 | if (strict_strtoul(buf, 10, &val)) | 129 | ret_val = kstrtoul(buf, 10, &val); |
| 130 | return -EINVAL; | 130 | if (ret_val) |
| 131 | return ret_val; | ||
| 131 | 132 | ||
| 132 | if (val < 4096) | 133 | if (val < 4096) |
| 133 | val = 1; | 134 | val = 1; |
diff --git a/drivers/misc/apds990x.c b/drivers/misc/apds990x.c index 98f9bb26492a..868a30a1b417 100644 --- a/drivers/misc/apds990x.c +++ b/drivers/misc/apds990x.c | |||
| @@ -696,9 +696,11 @@ static ssize_t apds990x_lux_calib_store(struct device *dev, | |||
| 696 | { | 696 | { |
| 697 | struct apds990x_chip *chip = dev_get_drvdata(dev); | 697 | struct apds990x_chip *chip = dev_get_drvdata(dev); |
| 698 | unsigned long value; | 698 | unsigned long value; |
| 699 | int ret; | ||
| 699 | 700 | ||
| 700 | if (strict_strtoul(buf, 0, &value)) | 701 | ret = kstrtoul(buf, 0, &value); |
| 701 | return -EINVAL; | 702 | if (ret) |
| 703 | return ret; | ||
| 702 | 704 | ||
| 703 | chip->lux_calib = value; | 705 | chip->lux_calib = value; |
| 704 | 706 | ||
| @@ -759,8 +761,9 @@ static ssize_t apds990x_rate_store(struct device *dev, | |||
| 759 | unsigned long value; | 761 | unsigned long value; |
| 760 | int ret; | 762 | int ret; |
| 761 | 763 | ||
| 762 | if (strict_strtoul(buf, 0, &value)) | 764 | ret = kstrtoul(buf, 0, &value); |
| 763 | return -EINVAL; | 765 | if (ret) |
| 766 | return ret; | ||
| 764 | 767 | ||
| 765 | mutex_lock(&chip->mutex); | 768 | mutex_lock(&chip->mutex); |
| 766 | ret = apds990x_set_arate(chip, value); | 769 | ret = apds990x_set_arate(chip, value); |
| @@ -813,9 +816,11 @@ static ssize_t apds990x_prox_enable_store(struct device *dev, | |||
| 813 | { | 816 | { |
| 814 | struct apds990x_chip *chip = dev_get_drvdata(dev); | 817 | struct apds990x_chip *chip = dev_get_drvdata(dev); |
| 815 | unsigned long value; | 818 | unsigned long value; |
| 819 | int ret; | ||
| 816 | 820 | ||
| 817 | if (strict_strtoul(buf, 0, &value)) | 821 | ret = kstrtoul(buf, 0, &value); |
| 818 | return -EINVAL; | 822 | if (ret) |
| 823 | return ret; | ||
| 819 | 824 | ||
| 820 | mutex_lock(&chip->mutex); | 825 | mutex_lock(&chip->mutex); |
| 821 | 826 | ||
| @@ -892,11 +897,12 @@ static ssize_t apds990x_lux_thresh_below_show(struct device *dev, | |||
| 892 | static ssize_t apds990x_set_lux_thresh(struct apds990x_chip *chip, u32 *target, | 897 | static ssize_t apds990x_set_lux_thresh(struct apds990x_chip *chip, u32 *target, |
| 893 | const char *buf) | 898 | const char *buf) |
| 894 | { | 899 | { |
| 895 | int ret = 0; | ||
| 896 | unsigned long thresh; | 900 | unsigned long thresh; |
| 901 | int ret; | ||
| 897 | 902 | ||
| 898 | if (strict_strtoul(buf, 0, &thresh)) | 903 | ret = kstrtoul(buf, 0, &thresh); |
| 899 | return -EINVAL; | 904 | if (ret) |
| 905 | return ret; | ||
| 900 | 906 | ||
| 901 | if (thresh > APDS_RANGE) | 907 | if (thresh > APDS_RANGE) |
| 902 | return -EINVAL; | 908 | return -EINVAL; |
| @@ -957,9 +963,11 @@ static ssize_t apds990x_prox_threshold_store(struct device *dev, | |||
| 957 | { | 963 | { |
| 958 | struct apds990x_chip *chip = dev_get_drvdata(dev); | 964 | struct apds990x_chip *chip = dev_get_drvdata(dev); |
| 959 | unsigned long value; | 965 | unsigned long value; |
| 966 | int ret; | ||
| 960 | 967 | ||
| 961 | if (strict_strtoul(buf, 0, &value)) | 968 | ret = kstrtoul(buf, 0, &value); |
| 962 | return -EINVAL; | 969 | if (ret) |
| 970 | return ret; | ||
| 963 | 971 | ||
| 964 | if ((value > APDS_RANGE) || (value == 0) || | 972 | if ((value > APDS_RANGE) || (value == 0) || |
| 965 | (value < APDS_PROX_HYSTERESIS)) | 973 | (value < APDS_PROX_HYSTERESIS)) |
| @@ -990,9 +998,12 @@ static ssize_t apds990x_power_state_store(struct device *dev, | |||
| 990 | { | 998 | { |
| 991 | struct apds990x_chip *chip = dev_get_drvdata(dev); | 999 | struct apds990x_chip *chip = dev_get_drvdata(dev); |
| 992 | unsigned long value; | 1000 | unsigned long value; |
| 1001 | int ret; | ||
| 1002 | |||
| 1003 | ret = kstrtoul(buf, 0, &value); | ||
| 1004 | if (ret) | ||
| 1005 | return ret; | ||
| 993 | 1006 | ||
| 994 | if (strict_strtoul(buf, 0, &value)) | ||
| 995 | return -EINVAL; | ||
| 996 | if (value) { | 1007 | if (value) { |
| 997 | pm_runtime_get_sync(dev); | 1008 | pm_runtime_get_sync(dev); |
| 998 | mutex_lock(&chip->mutex); | 1009 | mutex_lock(&chip->mutex); |
diff --git a/drivers/misc/arm-charlcd.c b/drivers/misc/arm-charlcd.c index 48651ef0028c..1256a4bf1c04 100644 --- a/drivers/misc/arm-charlcd.c +++ b/drivers/misc/arm-charlcd.c | |||
| @@ -291,7 +291,7 @@ static int __init charlcd_probe(struct platform_device *pdev) | |||
| 291 | lcd->virtbase = ioremap(lcd->phybase, lcd->physize); | 291 | lcd->virtbase = ioremap(lcd->phybase, lcd->physize); |
| 292 | if (!lcd->virtbase) { | 292 | if (!lcd->virtbase) { |
| 293 | ret = -ENOMEM; | 293 | ret = -ENOMEM; |
| 294 | goto out_no_remap; | 294 | goto out_no_memregion; |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | lcd->irq = platform_get_irq(pdev, 0); | 297 | lcd->irq = platform_get_irq(pdev, 0); |
| @@ -320,8 +320,6 @@ static int __init charlcd_probe(struct platform_device *pdev) | |||
| 320 | 320 | ||
| 321 | out_no_irq: | 321 | out_no_irq: |
| 322 | iounmap(lcd->virtbase); | 322 | iounmap(lcd->virtbase); |
| 323 | out_no_remap: | ||
| 324 | platform_set_drvdata(pdev, NULL); | ||
| 325 | out_no_memregion: | 323 | out_no_memregion: |
| 326 | release_mem_region(lcd->phybase, SZ_4K); | 324 | release_mem_region(lcd->phybase, SZ_4K); |
| 327 | out_no_resource: | 325 | out_no_resource: |
| @@ -337,7 +335,6 @@ static int __exit charlcd_remove(struct platform_device *pdev) | |||
| 337 | free_irq(lcd->irq, lcd); | 335 | free_irq(lcd->irq, lcd); |
| 338 | iounmap(lcd->virtbase); | 336 | iounmap(lcd->virtbase); |
| 339 | release_mem_region(lcd->phybase, lcd->physize); | 337 | release_mem_region(lcd->phybase, lcd->physize); |
| 340 | platform_set_drvdata(pdev, NULL); | ||
| 341 | kfree(lcd); | 338 | kfree(lcd); |
| 342 | } | 339 | } |
| 343 | 340 | ||
diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c index 1abd5ad59925..f7b90661e321 100644 --- a/drivers/misc/atmel-ssc.c +++ b/drivers/misc/atmel-ssc.c | |||
| @@ -58,7 +58,7 @@ struct ssc_device *ssc_request(unsigned int ssc_num) | |||
| 58 | ssc->user++; | 58 | ssc->user++; |
| 59 | spin_unlock(&user_lock); | 59 | spin_unlock(&user_lock); |
| 60 | 60 | ||
| 61 | clk_enable(ssc->clk); | 61 | clk_prepare_enable(ssc->clk); |
| 62 | 62 | ||
| 63 | return ssc; | 63 | return ssc; |
| 64 | } | 64 | } |
| @@ -69,7 +69,7 @@ void ssc_free(struct ssc_device *ssc) | |||
| 69 | spin_lock(&user_lock); | 69 | spin_lock(&user_lock); |
| 70 | if (ssc->user) { | 70 | if (ssc->user) { |
| 71 | ssc->user--; | 71 | ssc->user--; |
| 72 | clk_disable(ssc->clk); | 72 | clk_disable_unprepare(ssc->clk); |
| 73 | } else { | 73 | } else { |
| 74 | dev_dbg(&ssc->pdev->dev, "device already free\n"); | 74 | dev_dbg(&ssc->pdev->dev, "device already free\n"); |
| 75 | } | 75 | } |
| @@ -167,10 +167,10 @@ static int ssc_probe(struct platform_device *pdev) | |||
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | /* disable all interrupts */ | 169 | /* disable all interrupts */ |
| 170 | clk_enable(ssc->clk); | 170 | clk_prepare_enable(ssc->clk); |
| 171 | ssc_writel(ssc->regs, IDR, -1); | 171 | ssc_writel(ssc->regs, IDR, -1); |
| 172 | ssc_readl(ssc->regs, SR); | 172 | ssc_readl(ssc->regs, SR); |
| 173 | clk_disable(ssc->clk); | 173 | clk_disable_unprepare(ssc->clk); |
| 174 | 174 | ||
| 175 | ssc->irq = platform_get_irq(pdev, 0); | 175 | ssc->irq = platform_get_irq(pdev, 0); |
| 176 | if (!ssc->irq) { | 176 | if (!ssc->irq) { |
diff --git a/drivers/misc/bh1770glc.c b/drivers/misc/bh1770glc.c index f4975f7d0d5b..99a04686e45f 100644 --- a/drivers/misc/bh1770glc.c +++ b/drivers/misc/bh1770glc.c | |||
| @@ -651,8 +651,9 @@ static ssize_t bh1770_power_state_store(struct device *dev, | |||
| 651 | unsigned long value; | 651 | unsigned long value; |
| 652 | ssize_t ret; | 652 | ssize_t ret; |
| 653 | 653 | ||
| 654 | if (strict_strtoul(buf, 0, &value)) | 654 | ret = kstrtoul(buf, 0, &value); |
| 655 | return -EINVAL; | 655 | if (ret) |
| 656 | return ret; | ||
| 656 | 657 | ||
| 657 | mutex_lock(&chip->mutex); | 658 | mutex_lock(&chip->mutex); |
| 658 | if (value) { | 659 | if (value) { |
| @@ -726,9 +727,11 @@ static ssize_t bh1770_prox_enable_store(struct device *dev, | |||
| 726 | { | 727 | { |
| 727 | struct bh1770_chip *chip = dev_get_drvdata(dev); | 728 | struct bh1770_chip *chip = dev_get_drvdata(dev); |
| 728 | unsigned long value; | 729 | unsigned long value; |
| 730 | int ret; | ||
| 729 | 731 | ||
| 730 | if (strict_strtoul(buf, 0, &value)) | 732 | ret = kstrtoul(buf, 0, &value); |
| 731 | return -EINVAL; | 733 | if (ret) |
| 734 | return ret; | ||
| 732 | 735 | ||
| 733 | mutex_lock(&chip->mutex); | 736 | mutex_lock(&chip->mutex); |
| 734 | /* Assume no proximity. Sensor will tell real state soon */ | 737 | /* Assume no proximity. Sensor will tell real state soon */ |
| @@ -824,9 +827,11 @@ static ssize_t bh1770_set_prox_rate_above(struct device *dev, | |||
| 824 | { | 827 | { |
| 825 | struct bh1770_chip *chip = dev_get_drvdata(dev); | 828 | struct bh1770_chip *chip = dev_get_drvdata(dev); |
| 826 | unsigned long value; | 829 | unsigned long value; |
| 830 | int ret; | ||
| 827 | 831 | ||
| 828 | if (strict_strtoul(buf, 0, &value)) | 832 | ret = kstrtoul(buf, 0, &value); |
| 829 | return -EINVAL; | 833 | if (ret) |
| 834 | return ret; | ||
| 830 | 835 | ||
| 831 | mutex_lock(&chip->mutex); | 836 | mutex_lock(&chip->mutex); |
| 832 | chip->prox_rate_threshold = bh1770_prox_rate_validate(value); | 837 | chip->prox_rate_threshold = bh1770_prox_rate_validate(value); |
| @@ -840,9 +845,11 @@ static ssize_t bh1770_set_prox_rate_below(struct device *dev, | |||
| 840 | { | 845 | { |
| 841 | struct bh1770_chip *chip = dev_get_drvdata(dev); | 846 | struct bh1770_chip *chip = dev_get_drvdata(dev); |
| 842 | unsigned long value; | 847 | unsigned long value; |
| 848 | int ret; | ||
| 843 | 849 | ||
| 844 | if (strict_strtoul(buf, 0, &value)) | 850 | ret = kstrtoul(buf, 0, &value); |
| 845 | return -EINVAL; | 851 | if (ret) |
| 852 | return ret; | ||
| 846 | 853 | ||
| 847 | mutex_lock(&chip->mutex); | 854 | mutex_lock(&chip->mutex); |
| 848 | chip->prox_rate = bh1770_prox_rate_validate(value); | 855 | chip->prox_rate = bh1770_prox_rate_validate(value); |
| @@ -865,8 +872,10 @@ static ssize_t bh1770_set_prox_thres(struct device *dev, | |||
| 865 | unsigned long value; | 872 | unsigned long value; |
| 866 | int ret; | 873 | int ret; |
| 867 | 874 | ||
| 868 | if (strict_strtoul(buf, 0, &value)) | 875 | ret = kstrtoul(buf, 0, &value); |
| 869 | return -EINVAL; | 876 | if (ret) |
| 877 | return ret; | ||
| 878 | |||
| 870 | if (value > BH1770_PROX_RANGE) | 879 | if (value > BH1770_PROX_RANGE) |
| 871 | return -EINVAL; | 880 | return -EINVAL; |
| 872 | 881 | ||
| @@ -893,9 +902,11 @@ static ssize_t bh1770_prox_persistence_store(struct device *dev, | |||
| 893 | { | 902 | { |
| 894 | struct bh1770_chip *chip = dev_get_drvdata(dev); | 903 | struct bh1770_chip *chip = dev_get_drvdata(dev); |
| 895 | unsigned long value; | 904 | unsigned long value; |
| 905 | int ret; | ||
| 896 | 906 | ||
| 897 | if (strict_strtoul(buf, 0, &value)) | 907 | ret = kstrtoul(buf, 0, &value); |
| 898 | return -EINVAL; | 908 | if (ret) |
| 909 | return ret; | ||
| 899 | 910 | ||
| 900 | if (value > BH1770_PROX_MAX_PERSISTENCE) | 911 | if (value > BH1770_PROX_MAX_PERSISTENCE) |
| 901 | return -EINVAL; | 912 | return -EINVAL; |
| @@ -918,9 +929,11 @@ static ssize_t bh1770_prox_abs_thres_store(struct device *dev, | |||
| 918 | { | 929 | { |
| 919 | struct bh1770_chip *chip = dev_get_drvdata(dev); | 930 | struct bh1770_chip *chip = dev_get_drvdata(dev); |
| 920 | unsigned long value; | 931 | unsigned long value; |
| 932 | int ret; | ||
| 921 | 933 | ||
| 922 | if (strict_strtoul(buf, 0, &value)) | 934 | ret = kstrtoul(buf, 0, &value); |
| 923 | return -EINVAL; | 935 | if (ret) |
| 936 | return ret; | ||
| 924 | 937 | ||
| 925 | if (value > BH1770_PROX_RANGE) | 938 | if (value > BH1770_PROX_RANGE) |
| 926 | return -EINVAL; | 939 | return -EINVAL; |
| @@ -963,9 +976,11 @@ static ssize_t bh1770_lux_calib_store(struct device *dev, | |||
| 963 | unsigned long value; | 976 | unsigned long value; |
| 964 | u32 old_calib; | 977 | u32 old_calib; |
| 965 | u32 new_corr; | 978 | u32 new_corr; |
| 979 | int ret; | ||
| 966 | 980 | ||
| 967 | if (strict_strtoul(buf, 0, &value)) | 981 | ret = kstrtoul(buf, 0, &value); |
| 968 | return -EINVAL; | 982 | if (ret) |
| 983 | return ret; | ||
| 969 | 984 | ||
| 970 | mutex_lock(&chip->mutex); | 985 | mutex_lock(&chip->mutex); |
| 971 | old_calib = chip->lux_calib; | 986 | old_calib = chip->lux_calib; |
| @@ -1012,8 +1027,9 @@ static ssize_t bh1770_set_lux_rate(struct device *dev, | |||
| 1012 | unsigned long rate_hz; | 1027 | unsigned long rate_hz; |
| 1013 | int ret, i; | 1028 | int ret, i; |
| 1014 | 1029 | ||
| 1015 | if (strict_strtoul(buf, 0, &rate_hz)) | 1030 | ret = kstrtoul(buf, 0, &rate_hz); |
| 1016 | return -EINVAL; | 1031 | if (ret) |
| 1032 | return ret; | ||
| 1017 | 1033 | ||
| 1018 | for (i = 0; i < ARRAY_SIZE(lux_rates_hz) - 1; i++) | 1034 | for (i = 0; i < ARRAY_SIZE(lux_rates_hz) - 1; i++) |
| 1019 | if (rate_hz >= lux_rates_hz[i]) | 1035 | if (rate_hz >= lux_rates_hz[i]) |
| @@ -1047,11 +1063,12 @@ static ssize_t bh1770_get_lux_thresh_below(struct device *dev, | |||
| 1047 | static ssize_t bh1770_set_lux_thresh(struct bh1770_chip *chip, u16 *target, | 1063 | static ssize_t bh1770_set_lux_thresh(struct bh1770_chip *chip, u16 *target, |
| 1048 | const char *buf) | 1064 | const char *buf) |
| 1049 | { | 1065 | { |
| 1050 | int ret = 0; | ||
| 1051 | unsigned long thresh; | 1066 | unsigned long thresh; |
| 1067 | int ret; | ||
| 1052 | 1068 | ||
| 1053 | if (strict_strtoul(buf, 0, &thresh)) | 1069 | ret = kstrtoul(buf, 0, &thresh); |
| 1054 | return -EINVAL; | 1070 | if (ret) |
| 1071 | return ret; | ||
| 1055 | 1072 | ||
| 1056 | if (thresh > BH1770_LUX_RANGE) | 1073 | if (thresh > BH1770_LUX_RANGE) |
| 1057 | return -EINVAL; | 1074 | return -EINVAL; |
diff --git a/drivers/misc/bh1780gli.c b/drivers/misc/bh1780gli.c index 818f3a0e62bf..057580e026c0 100644 --- a/drivers/misc/bh1780gli.c +++ b/drivers/misc/bh1780gli.c | |||
| @@ -107,7 +107,7 @@ static ssize_t bh1780_store_power_state(struct device *dev, | |||
| 107 | unsigned long val; | 107 | unsigned long val; |
| 108 | int error; | 108 | int error; |
| 109 | 109 | ||
| 110 | error = strict_strtoul(buf, 0, &val); | 110 | error = kstrtoul(buf, 0, &val); |
| 111 | if (error) | 111 | if (error) |
| 112 | return error; | 112 | return error; |
| 113 | 113 | ||
diff --git a/drivers/misc/carma/carma-fpga-program.c b/drivers/misc/carma/carma-fpga-program.c index 736c7714f565..c6bd7e84de24 100644 --- a/drivers/misc/carma/carma-fpga-program.c +++ b/drivers/misc/carma/carma-fpga-program.c | |||
| @@ -830,8 +830,9 @@ static ssize_t penable_store(struct device *dev, struct device_attribute *attr, | |||
| 830 | unsigned long val; | 830 | unsigned long val; |
| 831 | int ret; | 831 | int ret; |
| 832 | 832 | ||
| 833 | if (strict_strtoul(buf, 0, &val)) | 833 | ret = kstrtoul(buf, 0, &val); |
| 834 | return -EINVAL; | 834 | if (ret) |
| 835 | return ret; | ||
| 835 | 836 | ||
| 836 | if (val) { | 837 | if (val) { |
| 837 | ret = fpga_enable_power_supplies(priv); | 838 | ret = fpga_enable_power_supplies(priv); |
| @@ -859,8 +860,9 @@ static ssize_t program_store(struct device *dev, struct device_attribute *attr, | |||
| 859 | unsigned long val; | 860 | unsigned long val; |
| 860 | int ret; | 861 | int ret; |
| 861 | 862 | ||
| 862 | if (strict_strtoul(buf, 0, &val)) | 863 | ret = kstrtoul(buf, 0, &val); |
| 863 | return -EINVAL; | 864 | if (ret) |
| 865 | return ret; | ||
| 864 | 866 | ||
| 865 | /* We can't have an image writer and be programming simultaneously */ | 867 | /* We can't have an image writer and be programming simultaneously */ |
| 866 | if (mutex_lock_interruptible(&priv->lock)) | 868 | if (mutex_lock_interruptible(&priv->lock)) |
| @@ -919,7 +921,7 @@ static bool dma_filter(struct dma_chan *chan, void *data) | |||
| 919 | 921 | ||
| 920 | static int fpga_of_remove(struct platform_device *op) | 922 | static int fpga_of_remove(struct platform_device *op) |
| 921 | { | 923 | { |
| 922 | struct fpga_dev *priv = dev_get_drvdata(&op->dev); | 924 | struct fpga_dev *priv = platform_get_drvdata(op); |
| 923 | struct device *this_device = priv->miscdev.this_device; | 925 | struct device *this_device = priv->miscdev.this_device; |
| 924 | 926 | ||
| 925 | sysfs_remove_group(&this_device->kobj, &fpga_attr_group); | 927 | sysfs_remove_group(&this_device->kobj, &fpga_attr_group); |
| @@ -969,7 +971,7 @@ static int fpga_of_probe(struct platform_device *op) | |||
| 969 | 971 | ||
| 970 | kref_init(&priv->ref); | 972 | kref_init(&priv->ref); |
| 971 | 973 | ||
| 972 | dev_set_drvdata(&op->dev, priv); | 974 | platform_set_drvdata(op, priv); |
| 973 | priv->dev = &op->dev; | 975 | priv->dev = &op->dev; |
| 974 | mutex_init(&priv->lock); | 976 | mutex_init(&priv->lock); |
| 975 | init_completion(&priv->completion); | 977 | init_completion(&priv->completion); |
diff --git a/drivers/misc/carma/carma-fpga.c b/drivers/misc/carma/carma-fpga.c index 7508cafff103..7b56563f8b74 100644 --- a/drivers/misc/carma/carma-fpga.c +++ b/drivers/misc/carma/carma-fpga.c | |||
| @@ -1002,10 +1002,10 @@ static ssize_t data_en_set(struct device *dev, struct device_attribute *attr, | |||
| 1002 | unsigned long enable; | 1002 | unsigned long enable; |
| 1003 | int ret; | 1003 | int ret; |
| 1004 | 1004 | ||
| 1005 | ret = strict_strtoul(buf, 0, &enable); | 1005 | ret = kstrtoul(buf, 0, &enable); |
| 1006 | if (ret) { | 1006 | if (ret) { |
| 1007 | dev_err(priv->dev, "unable to parse enable input\n"); | 1007 | dev_err(priv->dev, "unable to parse enable input\n"); |
| 1008 | return -EINVAL; | 1008 | return ret; |
| 1009 | } | 1009 | } |
| 1010 | 1010 | ||
| 1011 | /* protect against concurrent enable/disable */ | 1011 | /* protect against concurrent enable/disable */ |
| @@ -1296,7 +1296,7 @@ static int data_of_probe(struct platform_device *op) | |||
| 1296 | goto out_return; | 1296 | goto out_return; |
| 1297 | } | 1297 | } |
| 1298 | 1298 | ||
| 1299 | dev_set_drvdata(&op->dev, priv); | 1299 | platform_set_drvdata(op, priv); |
| 1300 | priv->dev = &op->dev; | 1300 | priv->dev = &op->dev; |
| 1301 | kref_init(&priv->ref); | 1301 | kref_init(&priv->ref); |
| 1302 | mutex_init(&priv->mutex); | 1302 | mutex_init(&priv->mutex); |
| @@ -1400,7 +1400,7 @@ out_return: | |||
| 1400 | 1400 | ||
| 1401 | static int data_of_remove(struct platform_device *op) | 1401 | static int data_of_remove(struct platform_device *op) |
| 1402 | { | 1402 | { |
| 1403 | struct fpga_device *priv = dev_get_drvdata(&op->dev); | 1403 | struct fpga_device *priv = platform_get_drvdata(op); |
| 1404 | struct device *this_device = priv->miscdev.this_device; | 1404 | struct device *this_device = priv->miscdev.this_device; |
| 1405 | 1405 | ||
| 1406 | /* remove all sysfs files, now the device cannot be re-enabled */ | 1406 | /* remove all sysfs files, now the device cannot be re-enabled */ |
diff --git a/drivers/misc/dummy-irq.c b/drivers/misc/dummy-irq.c index c37eeedfe215..4d0db15df115 100644 --- a/drivers/misc/dummy-irq.c +++ b/drivers/misc/dummy-irq.c | |||
| @@ -26,7 +26,7 @@ static irqreturn_t dummy_interrupt(int irq, void *dev_id) | |||
| 26 | static int count = 0; | 26 | static int count = 0; |
| 27 | 27 | ||
| 28 | if (count == 0) { | 28 | if (count == 0) { |
| 29 | printk(KERN_INFO "dummy-irq: interrupt occured on IRQ %d\n", | 29 | printk(KERN_INFO "dummy-irq: interrupt occurred on IRQ %d\n", |
| 30 | irq); | 30 | irq); |
| 31 | count++; | 31 | count++; |
| 32 | } | 32 | } |
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 2baeec56edfe..5d4fd69d04ca 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c | |||
| @@ -492,10 +492,9 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 492 | if (client->dev.platform_data) { | 492 | if (client->dev.platform_data) { |
| 493 | chip = *(struct at24_platform_data *)client->dev.platform_data; | 493 | chip = *(struct at24_platform_data *)client->dev.platform_data; |
| 494 | } else { | 494 | } else { |
| 495 | if (!id->driver_data) { | 495 | if (!id->driver_data) |
| 496 | err = -ENODEV; | 496 | return -ENODEV; |
| 497 | goto err_out; | 497 | |
| 498 | } | ||
| 499 | magic = id->driver_data; | 498 | magic = id->driver_data; |
| 500 | chip.byte_len = BIT(magic & AT24_BITMASK(AT24_SIZE_BYTELEN)); | 499 | chip.byte_len = BIT(magic & AT24_BITMASK(AT24_SIZE_BYTELEN)); |
| 501 | magic >>= AT24_SIZE_BYTELEN; | 500 | magic >>= AT24_SIZE_BYTELEN; |
| @@ -519,8 +518,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 519 | "byte_len looks suspicious (no power of 2)!\n"); | 518 | "byte_len looks suspicious (no power of 2)!\n"); |
| 520 | if (!chip.page_size) { | 519 | if (!chip.page_size) { |
| 521 | dev_err(&client->dev, "page_size must not be 0!\n"); | 520 | dev_err(&client->dev, "page_size must not be 0!\n"); |
| 522 | err = -EINVAL; | 521 | return -EINVAL; |
| 523 | goto err_out; | ||
| 524 | } | 522 | } |
| 525 | if (!is_power_of_2(chip.page_size)) | 523 | if (!is_power_of_2(chip.page_size)) |
| 526 | dev_warn(&client->dev, | 524 | dev_warn(&client->dev, |
| @@ -528,10 +526,9 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 528 | 526 | ||
| 529 | /* Use I2C operations unless we're stuck with SMBus extensions. */ | 527 | /* Use I2C operations unless we're stuck with SMBus extensions. */ |
| 530 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | 528 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { |
| 531 | if (chip.flags & AT24_FLAG_ADDR16) { | 529 | if (chip.flags & AT24_FLAG_ADDR16) |
| 532 | err = -EPFNOSUPPORT; | 530 | return -EPFNOSUPPORT; |
| 533 | goto err_out; | 531 | |
| 534 | } | ||
| 535 | if (i2c_check_functionality(client->adapter, | 532 | if (i2c_check_functionality(client->adapter, |
| 536 | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { | 533 | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { |
| 537 | use_smbus = I2C_SMBUS_I2C_BLOCK_DATA; | 534 | use_smbus = I2C_SMBUS_I2C_BLOCK_DATA; |
| @@ -542,8 +539,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 542 | I2C_FUNC_SMBUS_READ_BYTE_DATA)) { | 539 | I2C_FUNC_SMBUS_READ_BYTE_DATA)) { |
| 543 | use_smbus = I2C_SMBUS_BYTE_DATA; | 540 | use_smbus = I2C_SMBUS_BYTE_DATA; |
| 544 | } else { | 541 | } else { |
| 545 | err = -EPFNOSUPPORT; | 542 | return -EPFNOSUPPORT; |
| 546 | goto err_out; | ||
| 547 | } | 543 | } |
| 548 | } | 544 | } |
| 549 | 545 | ||
| @@ -553,12 +549,10 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 553 | num_addresses = DIV_ROUND_UP(chip.byte_len, | 549 | num_addresses = DIV_ROUND_UP(chip.byte_len, |
| 554 | (chip.flags & AT24_FLAG_ADDR16) ? 65536 : 256); | 550 | (chip.flags & AT24_FLAG_ADDR16) ? 65536 : 256); |
| 555 | 551 | ||
| 556 | at24 = kzalloc(sizeof(struct at24_data) + | 552 | at24 = devm_kzalloc(&client->dev, sizeof(struct at24_data) + |
| 557 | num_addresses * sizeof(struct i2c_client *), GFP_KERNEL); | 553 | num_addresses * sizeof(struct i2c_client *), GFP_KERNEL); |
| 558 | if (!at24) { | 554 | if (!at24) |
| 559 | err = -ENOMEM; | 555 | return -ENOMEM; |
| 560 | goto err_out; | ||
| 561 | } | ||
| 562 | 556 | ||
| 563 | mutex_init(&at24->lock); | 557 | mutex_init(&at24->lock); |
| 564 | at24->use_smbus = use_smbus; | 558 | at24->use_smbus = use_smbus; |
| @@ -596,11 +590,10 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 596 | at24->write_max = write_max; | 590 | at24->write_max = write_max; |
| 597 | 591 | ||
| 598 | /* buffer (data + address at the beginning) */ | 592 | /* buffer (data + address at the beginning) */ |
| 599 | at24->writebuf = kmalloc(write_max + 2, GFP_KERNEL); | 593 | at24->writebuf = devm_kzalloc(&client->dev, |
| 600 | if (!at24->writebuf) { | 594 | write_max + 2, GFP_KERNEL); |
| 601 | err = -ENOMEM; | 595 | if (!at24->writebuf) |
| 602 | goto err_struct; | 596 | return -ENOMEM; |
| 603 | } | ||
| 604 | } else { | 597 | } else { |
| 605 | dev_warn(&client->dev, | 598 | dev_warn(&client->dev, |
| 606 | "cannot write due to controller restrictions."); | 599 | "cannot write due to controller restrictions."); |
| @@ -648,11 +641,6 @@ err_clients: | |||
| 648 | if (at24->client[i]) | 641 | if (at24->client[i]) |
| 649 | i2c_unregister_device(at24->client[i]); | 642 | i2c_unregister_device(at24->client[i]); |
| 650 | 643 | ||
| 651 | kfree(at24->writebuf); | ||
| 652 | err_struct: | ||
| 653 | kfree(at24); | ||
| 654 | err_out: | ||
| 655 | dev_dbg(&client->dev, "probe error %d\n", err); | ||
| 656 | return err; | 644 | return err; |
| 657 | } | 645 | } |
| 658 | 646 | ||
| @@ -667,8 +655,6 @@ static int at24_remove(struct i2c_client *client) | |||
| 667 | for (i = 1; i < at24->num_addresses; i++) | 655 | for (i = 1; i < at24->num_addresses; i++) |
| 668 | i2c_unregister_device(at24->client[i]); | 656 | i2c_unregister_device(at24->client[i]); |
| 669 | 657 | ||
| 670 | kfree(at24->writebuf); | ||
| 671 | kfree(at24); | ||
| 672 | return 0; | 658 | return 0; |
| 673 | } | 659 | } |
| 674 | 660 | ||
diff --git a/drivers/misc/eeprom/at25.c b/drivers/misc/eeprom/at25.c index ad8fd8e64937..840b3594a5ae 100644 --- a/drivers/misc/eeprom/at25.c +++ b/drivers/misc/eeprom/at25.c | |||
| @@ -371,11 +371,10 @@ static int at25_probe(struct spi_device *spi) | |||
| 371 | if (np) { | 371 | if (np) { |
| 372 | err = at25_np_to_chip(&spi->dev, np, &chip); | 372 | err = at25_np_to_chip(&spi->dev, np, &chip); |
| 373 | if (err) | 373 | if (err) |
| 374 | goto fail; | 374 | return err; |
| 375 | } else { | 375 | } else { |
| 376 | dev_err(&spi->dev, "Error: no chip description\n"); | 376 | dev_err(&spi->dev, "Error: no chip description\n"); |
| 377 | err = -ENODEV; | 377 | return -ENODEV; |
| 378 | goto fail; | ||
| 379 | } | 378 | } |
| 380 | } else | 379 | } else |
| 381 | chip = *(struct spi_eeprom *)spi->dev.platform_data; | 380 | chip = *(struct spi_eeprom *)spi->dev.platform_data; |
| @@ -389,8 +388,7 @@ static int at25_probe(struct spi_device *spi) | |||
| 389 | addrlen = 3; | 388 | addrlen = 3; |
| 390 | else { | 389 | else { |
| 391 | dev_dbg(&spi->dev, "unsupported address type\n"); | 390 | dev_dbg(&spi->dev, "unsupported address type\n"); |
| 392 | err = -EINVAL; | 391 | return -EINVAL; |
| 393 | goto fail; | ||
| 394 | } | 392 | } |
| 395 | 393 | ||
| 396 | /* Ping the chip ... the status register is pretty portable, | 394 | /* Ping the chip ... the status register is pretty portable, |
| @@ -400,14 +398,12 @@ static int at25_probe(struct spi_device *spi) | |||
| 400 | sr = spi_w8r8(spi, AT25_RDSR); | 398 | sr = spi_w8r8(spi, AT25_RDSR); |
| 401 | if (sr < 0 || sr & AT25_SR_nRDY) { | 399 | if (sr < 0 || sr & AT25_SR_nRDY) { |
| 402 | dev_dbg(&spi->dev, "rdsr --> %d (%02x)\n", sr, sr); | 400 | dev_dbg(&spi->dev, "rdsr --> %d (%02x)\n", sr, sr); |
| 403 | err = -ENXIO; | 401 | return -ENXIO; |
| 404 | goto fail; | ||
| 405 | } | 402 | } |
| 406 | 403 | ||
| 407 | if (!(at25 = kzalloc(sizeof *at25, GFP_KERNEL))) { | 404 | at25 = devm_kzalloc(&spi->dev, sizeof(struct at25_data), GFP_KERNEL); |
| 408 | err = -ENOMEM; | 405 | if (!at25) |
| 409 | goto fail; | 406 | return -ENOMEM; |
| 410 | } | ||
| 411 | 407 | ||
| 412 | mutex_init(&at25->lock); | 408 | mutex_init(&at25->lock); |
| 413 | at25->chip = chip; | 409 | at25->chip = chip; |
| @@ -439,7 +435,7 @@ static int at25_probe(struct spi_device *spi) | |||
| 439 | 435 | ||
| 440 | err = sysfs_create_bin_file(&spi->dev.kobj, &at25->bin); | 436 | err = sysfs_create_bin_file(&spi->dev.kobj, &at25->bin); |
| 441 | if (err) | 437 | if (err) |
| 442 | goto fail; | 438 | return err; |
| 443 | 439 | ||
| 444 | if (chip.setup) | 440 | if (chip.setup) |
| 445 | chip.setup(&at25->mem, chip.context); | 441 | chip.setup(&at25->mem, chip.context); |
| @@ -453,10 +449,6 @@ static int at25_probe(struct spi_device *spi) | |||
| 453 | (chip.flags & EE_READONLY) ? " (readonly)" : "", | 449 | (chip.flags & EE_READONLY) ? " (readonly)" : "", |
| 454 | at25->chip.page_size); | 450 | at25->chip.page_size); |
| 455 | return 0; | 451 | return 0; |
| 456 | fail: | ||
| 457 | dev_dbg(&spi->dev, "probe err %d\n", err); | ||
| 458 | kfree(at25); | ||
| 459 | return err; | ||
| 460 | } | 452 | } |
| 461 | 453 | ||
| 462 | static int at25_remove(struct spi_device *spi) | 454 | static int at25_remove(struct spi_device *spi) |
| @@ -465,7 +457,6 @@ static int at25_remove(struct spi_device *spi) | |||
| 465 | 457 | ||
| 466 | at25 = spi_get_drvdata(spi); | 458 | at25 = spi_get_drvdata(spi); |
| 467 | sysfs_remove_bin_file(&spi->dev.kobj, &at25->bin); | 459 | sysfs_remove_bin_file(&spi->dev.kobj, &at25->bin); |
| 468 | kfree(at25); | ||
| 469 | return 0; | 460 | return 0; |
| 470 | } | 461 | } |
| 471 | 462 | ||
diff --git a/drivers/misc/ep93xx_pwm.c b/drivers/misc/ep93xx_pwm.c index 96787ec15cad..cdb67a9c1959 100644 --- a/drivers/misc/ep93xx_pwm.c +++ b/drivers/misc/ep93xx_pwm.c | |||
| @@ -39,63 +39,6 @@ struct ep93xx_pwm { | |||
| 39 | u32 duty_percent; | 39 | u32 duty_percent; |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | static inline void ep93xx_pwm_writel(struct ep93xx_pwm *pwm, | ||
| 43 | unsigned int val, unsigned int off) | ||
| 44 | { | ||
| 45 | __raw_writel(val, pwm->mmio_base + off); | ||
| 46 | } | ||
| 47 | |||
| 48 | static inline unsigned int ep93xx_pwm_readl(struct ep93xx_pwm *pwm, | ||
| 49 | unsigned int off) | ||
| 50 | { | ||
| 51 | return __raw_readl(pwm->mmio_base + off); | ||
| 52 | } | ||
| 53 | |||
| 54 | static inline void ep93xx_pwm_write_tc(struct ep93xx_pwm *pwm, u16 value) | ||
| 55 | { | ||
| 56 | ep93xx_pwm_writel(pwm, value, EP93XX_PWMx_TERM_COUNT); | ||
| 57 | } | ||
| 58 | |||
| 59 | static inline u16 ep93xx_pwm_read_tc(struct ep93xx_pwm *pwm) | ||
| 60 | { | ||
| 61 | return ep93xx_pwm_readl(pwm, EP93XX_PWMx_TERM_COUNT); | ||
| 62 | } | ||
| 63 | |||
| 64 | static inline void ep93xx_pwm_write_dc(struct ep93xx_pwm *pwm, u16 value) | ||
| 65 | { | ||
| 66 | ep93xx_pwm_writel(pwm, value, EP93XX_PWMx_DUTY_CYCLE); | ||
| 67 | } | ||
| 68 | |||
| 69 | static inline void ep93xx_pwm_enable(struct ep93xx_pwm *pwm) | ||
| 70 | { | ||
| 71 | ep93xx_pwm_writel(pwm, 0x1, EP93XX_PWMx_ENABLE); | ||
| 72 | } | ||
| 73 | |||
| 74 | static inline void ep93xx_pwm_disable(struct ep93xx_pwm *pwm) | ||
| 75 | { | ||
| 76 | ep93xx_pwm_writel(pwm, 0x0, EP93XX_PWMx_ENABLE); | ||
| 77 | } | ||
| 78 | |||
| 79 | static inline int ep93xx_pwm_is_enabled(struct ep93xx_pwm *pwm) | ||
| 80 | { | ||
| 81 | return ep93xx_pwm_readl(pwm, EP93XX_PWMx_ENABLE) & 0x1; | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline void ep93xx_pwm_invert(struct ep93xx_pwm *pwm) | ||
| 85 | { | ||
| 86 | ep93xx_pwm_writel(pwm, 0x1, EP93XX_PWMx_INVERT); | ||
| 87 | } | ||
| 88 | |||
| 89 | static inline void ep93xx_pwm_normal(struct ep93xx_pwm *pwm) | ||
| 90 | { | ||
| 91 | ep93xx_pwm_writel(pwm, 0x0, EP93XX_PWMx_INVERT); | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline int ep93xx_pwm_is_inverted(struct ep93xx_pwm *pwm) | ||
| 95 | { | ||
| 96 | return ep93xx_pwm_readl(pwm, EP93XX_PWMx_INVERT) & 0x1; | ||
| 97 | } | ||
| 98 | |||
| 99 | /* | 42 | /* |
| 100 | * /sys/devices/platform/ep93xx-pwm.N | 43 | * /sys/devices/platform/ep93xx-pwm.N |
| 101 | * /min_freq read-only minimum pwm output frequency | 44 | * /min_freq read-only minimum pwm output frequency |
| @@ -131,9 +74,9 @@ static ssize_t ep93xx_pwm_get_freq(struct device *dev, | |||
| 131 | struct platform_device *pdev = to_platform_device(dev); | 74 | struct platform_device *pdev = to_platform_device(dev); |
| 132 | struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); | 75 | struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); |
| 133 | 76 | ||
| 134 | if (ep93xx_pwm_is_enabled(pwm)) { | 77 | if (readl(pwm->mmio_base + EP93XX_PWMx_ENABLE) & 0x1) { |
| 135 | unsigned long rate = clk_get_rate(pwm->clk); | 78 | unsigned long rate = clk_get_rate(pwm->clk); |
| 136 | u16 term = ep93xx_pwm_read_tc(pwm); | 79 | u16 term = readl(pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); |
| 137 | 80 | ||
| 138 | return sprintf(buf, "%ld\n", rate / (term + 1)); | 81 | return sprintf(buf, "%ld\n", rate / (term + 1)); |
| 139 | } else { | 82 | } else { |
| @@ -149,12 +92,12 @@ static ssize_t ep93xx_pwm_set_freq(struct device *dev, | |||
| 149 | long val; | 92 | long val; |
| 150 | int err; | 93 | int err; |
| 151 | 94 | ||
| 152 | err = strict_strtol(buf, 10, &val); | 95 | err = kstrtol(buf, 10, &val); |
| 153 | if (err) | 96 | if (err) |
| 154 | return -EINVAL; | 97 | return -EINVAL; |
| 155 | 98 | ||
| 156 | if (val == 0) { | 99 | if (val == 0) { |
| 157 | ep93xx_pwm_disable(pwm); | 100 | writel(0x0, pwm->mmio_base + EP93XX_PWMx_ENABLE); |
| 158 | } else if (val <= (clk_get_rate(pwm->clk) / 2)) { | 101 | } else if (val <= (clk_get_rate(pwm->clk) / 2)) { |
| 159 | u32 term, duty; | 102 | u32 term, duty; |
| 160 | 103 | ||
| @@ -164,20 +107,20 @@ static ssize_t ep93xx_pwm_set_freq(struct device *dev, | |||
| 164 | if (val < 1) | 107 | if (val < 1) |
| 165 | val = 1; | 108 | val = 1; |
| 166 | 109 | ||
| 167 | term = ep93xx_pwm_read_tc(pwm); | 110 | term = readl(pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); |
| 168 | duty = ((val + 1) * pwm->duty_percent / 100) - 1; | 111 | duty = ((val + 1) * pwm->duty_percent / 100) - 1; |
| 169 | 112 | ||
| 170 | /* If pwm is running, order is important */ | 113 | /* If pwm is running, order is important */ |
| 171 | if (val > term) { | 114 | if (val > term) { |
| 172 | ep93xx_pwm_write_tc(pwm, val); | 115 | writel(val, pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); |
| 173 | ep93xx_pwm_write_dc(pwm, duty); | 116 | writel(duty, pwm->mmio_base + EP93XX_PWMx_DUTY_CYCLE); |
| 174 | } else { | 117 | } else { |
| 175 | ep93xx_pwm_write_dc(pwm, duty); | 118 | writel(duty, pwm->mmio_base + EP93XX_PWMx_DUTY_CYCLE); |
| 176 | ep93xx_pwm_write_tc(pwm, val); | 119 | writel(val, pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); |
| 177 | } | 120 | } |
| 178 | 121 | ||
| 179 | if (!ep93xx_pwm_is_enabled(pwm)) | 122 | if (!readl(pwm->mmio_base + EP93XX_PWMx_ENABLE) & 0x1) |
| 180 | ep93xx_pwm_enable(pwm); | 123 | writel(0x1, pwm->mmio_base + EP93XX_PWMx_ENABLE); |
| 181 | } else { | 124 | } else { |
| 182 | return -EINVAL; | 125 | return -EINVAL; |
| 183 | } | 126 | } |
| @@ -202,13 +145,15 @@ static ssize_t ep93xx_pwm_set_duty_percent(struct device *dev, | |||
| 202 | long val; | 145 | long val; |
| 203 | int err; | 146 | int err; |
| 204 | 147 | ||
| 205 | err = strict_strtol(buf, 10, &val); | 148 | err = kstrtol(buf, 10, &val); |
| 206 | if (err) | 149 | if (err) |
| 207 | return -EINVAL; | 150 | return -EINVAL; |
| 208 | 151 | ||
| 209 | if (val > 0 && val < 100) { | 152 | if (val > 0 && val < 100) { |
| 210 | u32 term = ep93xx_pwm_read_tc(pwm); | 153 | u32 term = readl(pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); |
| 211 | ep93xx_pwm_write_dc(pwm, ((term + 1) * val / 100) - 1); | 154 | u32 duty = ((term + 1) * val / 100) - 1; |
| 155 | |||
| 156 | writel(duty, pwm->mmio_base + EP93XX_PWMx_DUTY_CYCLE); | ||
| 212 | pwm->duty_percent = val; | 157 | pwm->duty_percent = val; |
| 213 | return count; | 158 | return count; |
| 214 | } | 159 | } |
| @@ -221,8 +166,9 @@ static ssize_t ep93xx_pwm_get_invert(struct device *dev, | |||
| 221 | { | 166 | { |
| 222 | struct platform_device *pdev = to_platform_device(dev); | 167 | struct platform_device *pdev = to_platform_device(dev); |
| 223 | struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); | 168 | struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); |
| 169 | int inverted = readl(pwm->mmio_base + EP93XX_PWMx_INVERT) & 0x1; | ||
| 224 | 170 | ||
| 225 | return sprintf(buf, "%d\n", ep93xx_pwm_is_inverted(pwm)); | 171 | return sprintf(buf, "%d\n", inverted); |
| 226 | } | 172 | } |
| 227 | 173 | ||
| 228 | static ssize_t ep93xx_pwm_set_invert(struct device *dev, | 174 | static ssize_t ep93xx_pwm_set_invert(struct device *dev, |
| @@ -233,14 +179,14 @@ static ssize_t ep93xx_pwm_set_invert(struct device *dev, | |||
| 233 | long val; | 179 | long val; |
| 234 | int err; | 180 | int err; |
| 235 | 181 | ||
| 236 | err = strict_strtol(buf, 10, &val); | 182 | err = kstrtol(buf, 10, &val); |
| 237 | if (err) | 183 | if (err) |
| 238 | return -EINVAL; | 184 | return -EINVAL; |
| 239 | 185 | ||
| 240 | if (val == 0) | 186 | if (val == 0) |
| 241 | ep93xx_pwm_normal(pwm); | 187 | writel(0x0, pwm->mmio_base + EP93XX_PWMx_INVERT); |
| 242 | else if (val == 1) | 188 | else if (val == 1) |
| 243 | ep93xx_pwm_invert(pwm); | 189 | writel(0x1, pwm->mmio_base + EP93XX_PWMx_INVERT); |
| 244 | else | 190 | else |
| 245 | return -EINVAL; | 191 | return -EINVAL; |
| 246 | 192 | ||
| @@ -269,89 +215,55 @@ static const struct attribute_group ep93xx_pwm_sysfs_files = { | |||
| 269 | .attrs = ep93xx_pwm_attrs, | 215 | .attrs = ep93xx_pwm_attrs, |
| 270 | }; | 216 | }; |
| 271 | 217 | ||
| 272 | static int __init ep93xx_pwm_probe(struct platform_device *pdev) | 218 | static int ep93xx_pwm_probe(struct platform_device *pdev) |
| 273 | { | 219 | { |
| 274 | struct ep93xx_pwm *pwm; | 220 | struct ep93xx_pwm *pwm; |
| 275 | struct resource *res; | 221 | struct resource *res; |
| 276 | int err; | 222 | int ret; |
| 277 | 223 | ||
| 278 | err = ep93xx_pwm_acquire_gpio(pdev); | 224 | pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL); |
| 279 | if (err) | 225 | if (!pwm) |
| 280 | return err; | 226 | return -ENOMEM; |
| 281 | 227 | ||
| 282 | pwm = kzalloc(sizeof(struct ep93xx_pwm), GFP_KERNEL); | 228 | pwm->clk = devm_clk_get(&pdev->dev, "pwm_clk"); |
| 283 | if (!pwm) { | 229 | if (IS_ERR(pwm->clk)) |
| 284 | err = -ENOMEM; | 230 | return PTR_ERR(pwm->clk); |
| 285 | goto fail_no_mem; | ||
| 286 | } | ||
| 287 | 231 | ||
| 288 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 232 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 289 | if (res == NULL) { | 233 | pwm->mmio_base = devm_ioremap_resource(&pdev->dev, res); |
| 290 | err = -ENXIO; | 234 | if (IS_ERR(pwm->mmio_base)) |
| 291 | goto fail_no_mem_resource; | 235 | return PTR_ERR(pwm->mmio_base); |
| 292 | } | 236 | |
| 293 | 237 | ret = ep93xx_pwm_acquire_gpio(pdev); | |
| 294 | res = request_mem_region(res->start, resource_size(res), pdev->name); | 238 | if (ret) |
| 295 | if (res == NULL) { | 239 | return ret; |
| 296 | err = -EBUSY; | 240 | |
| 297 | goto fail_no_mem_resource; | 241 | ret = sysfs_create_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); |
| 298 | } | 242 | if (ret) { |
| 299 | 243 | ep93xx_pwm_release_gpio(pdev); | |
| 300 | pwm->mmio_base = ioremap(res->start, resource_size(res)); | 244 | return ret; |
| 301 | if (pwm->mmio_base == NULL) { | ||
| 302 | err = -ENXIO; | ||
| 303 | goto fail_no_ioremap; | ||
| 304 | } | ||
| 305 | |||
| 306 | err = sysfs_create_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); | ||
| 307 | if (err) | ||
| 308 | goto fail_no_sysfs; | ||
| 309 | |||
| 310 | pwm->clk = clk_get(&pdev->dev, "pwm_clk"); | ||
| 311 | if (IS_ERR(pwm->clk)) { | ||
| 312 | err = PTR_ERR(pwm->clk); | ||
| 313 | goto fail_no_clk; | ||
| 314 | } | 245 | } |
| 315 | 246 | ||
| 316 | pwm->duty_percent = 50; | 247 | pwm->duty_percent = 50; |
| 317 | 248 | ||
| 318 | platform_set_drvdata(pdev, pwm); | ||
| 319 | |||
| 320 | /* disable pwm at startup. Avoids zero value. */ | 249 | /* disable pwm at startup. Avoids zero value. */ |
| 321 | ep93xx_pwm_disable(pwm); | 250 | writel(0x0, pwm->mmio_base + EP93XX_PWMx_ENABLE); |
| 322 | ep93xx_pwm_write_tc(pwm, EP93XX_PWM_MAX_COUNT); | 251 | writel(EP93XX_PWM_MAX_COUNT, pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); |
| 323 | ep93xx_pwm_write_dc(pwm, EP93XX_PWM_MAX_COUNT / 2); | 252 | writel(EP93XX_PWM_MAX_COUNT/2, pwm->mmio_base + EP93XX_PWMx_DUTY_CYCLE); |
| 324 | 253 | ||
| 325 | clk_enable(pwm->clk); | 254 | clk_enable(pwm->clk); |
| 326 | 255 | ||
| 256 | platform_set_drvdata(pdev, pwm); | ||
| 327 | return 0; | 257 | return 0; |
| 328 | |||
| 329 | fail_no_clk: | ||
| 330 | sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); | ||
| 331 | fail_no_sysfs: | ||
| 332 | iounmap(pwm->mmio_base); | ||
| 333 | fail_no_ioremap: | ||
| 334 | release_mem_region(res->start, resource_size(res)); | ||
| 335 | fail_no_mem_resource: | ||
| 336 | kfree(pwm); | ||
| 337 | fail_no_mem: | ||
| 338 | ep93xx_pwm_release_gpio(pdev); | ||
| 339 | return err; | ||
| 340 | } | 258 | } |
| 341 | 259 | ||
| 342 | static int __exit ep93xx_pwm_remove(struct platform_device *pdev) | 260 | static int ep93xx_pwm_remove(struct platform_device *pdev) |
| 343 | { | 261 | { |
| 344 | struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); | 262 | struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); |
| 345 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 346 | 263 | ||
| 347 | ep93xx_pwm_disable(pwm); | 264 | writel(0x0, pwm->mmio_base + EP93XX_PWMx_ENABLE); |
| 348 | clk_disable(pwm->clk); | 265 | clk_disable(pwm->clk); |
| 349 | clk_put(pwm->clk); | ||
| 350 | platform_set_drvdata(pdev, NULL); | ||
| 351 | sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); | 266 | sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); |
| 352 | iounmap(pwm->mmio_base); | ||
| 353 | release_mem_region(res->start, resource_size(res)); | ||
| 354 | kfree(pwm); | ||
| 355 | ep93xx_pwm_release_gpio(pdev); | 267 | ep93xx_pwm_release_gpio(pdev); |
| 356 | 268 | ||
| 357 | return 0; | 269 | return 0; |
| @@ -362,10 +274,10 @@ static struct platform_driver ep93xx_pwm_driver = { | |||
| 362 | .name = "ep93xx-pwm", | 274 | .name = "ep93xx-pwm", |
| 363 | .owner = THIS_MODULE, | 275 | .owner = THIS_MODULE, |
| 364 | }, | 276 | }, |
| 365 | .remove = __exit_p(ep93xx_pwm_remove), | 277 | .probe = ep93xx_pwm_probe, |
| 278 | .remove = ep93xx_pwm_remove, | ||
| 366 | }; | 279 | }; |
| 367 | 280 | module_platform_driver(ep93xx_pwm_driver); | |
| 368 | module_platform_driver_probe(ep93xx_pwm_driver, ep93xx_pwm_probe); | ||
| 369 | 281 | ||
| 370 | MODULE_AUTHOR("Matthieu Crapet <mcrapet@gmail.com>, " | 282 | MODULE_AUTHOR("Matthieu Crapet <mcrapet@gmail.com>, " |
| 371 | "H Hartley Sweeten <hsweeten@visionengravers.com>"); | 283 | "H Hartley Sweeten <hsweeten@visionengravers.com>"); |
diff --git a/drivers/misc/hmc6352.c b/drivers/misc/hmc6352.c index 423cd40f1c0f..170bd3daf336 100644 --- a/drivers/misc/hmc6352.c +++ b/drivers/misc/hmc6352.c | |||
| @@ -46,8 +46,9 @@ static int compass_store(struct device *dev, const char *buf, size_t count, | |||
| 46 | int ret; | 46 | int ret; |
| 47 | unsigned long val; | 47 | unsigned long val; |
| 48 | 48 | ||
| 49 | if (strict_strtoul(buf, 10, &val)) | 49 | ret = kstrtoul(buf, 10, &val); |
| 50 | return -EINVAL; | 50 | if (ret) |
| 51 | return ret; | ||
| 51 | if (val >= strlen(map)) | 52 | if (val >= strlen(map)) |
| 52 | return -EINVAL; | 53 | return -EINVAL; |
| 53 | mutex_lock(&compass_mutex); | 54 | mutex_lock(&compass_mutex); |
diff --git a/drivers/misc/isl29003.c b/drivers/misc/isl29003.c index c5145b3fcce8..e3183f26216b 100644 --- a/drivers/misc/isl29003.c +++ b/drivers/misc/isl29003.c | |||
| @@ -208,7 +208,11 @@ static ssize_t isl29003_store_range(struct device *dev, | |||
| 208 | unsigned long val; | 208 | unsigned long val; |
| 209 | int ret; | 209 | int ret; |
| 210 | 210 | ||
| 211 | if ((strict_strtoul(buf, 10, &val) < 0) || (val > 3)) | 211 | ret = kstrtoul(buf, 10, &val); |
| 212 | if (ret) | ||
| 213 | return ret; | ||
| 214 | |||
| 215 | if (val > 3) | ||
| 212 | return -EINVAL; | 216 | return -EINVAL; |
| 213 | 217 | ||
| 214 | ret = isl29003_set_range(client, val); | 218 | ret = isl29003_set_range(client, val); |
| @@ -239,7 +243,11 @@ static ssize_t isl29003_store_resolution(struct device *dev, | |||
| 239 | unsigned long val; | 243 | unsigned long val; |
| 240 | int ret; | 244 | int ret; |
| 241 | 245 | ||
| 242 | if ((strict_strtoul(buf, 10, &val) < 0) || (val > 3)) | 246 | ret = kstrtoul(buf, 10, &val); |
| 247 | if (ret) | ||
| 248 | return ret; | ||
| 249 | |||
| 250 | if (val > 3) | ||
| 243 | return -EINVAL; | 251 | return -EINVAL; |
| 244 | 252 | ||
| 245 | ret = isl29003_set_resolution(client, val); | 253 | ret = isl29003_set_resolution(client, val); |
| @@ -267,7 +275,11 @@ static ssize_t isl29003_store_mode(struct device *dev, | |||
| 267 | unsigned long val; | 275 | unsigned long val; |
| 268 | int ret; | 276 | int ret; |
| 269 | 277 | ||
| 270 | if ((strict_strtoul(buf, 10, &val) < 0) || (val > 2)) | 278 | ret = kstrtoul(buf, 10, &val); |
| 279 | if (ret) | ||
| 280 | return ret; | ||
| 281 | |||
| 282 | if (val > 2) | ||
| 271 | return -EINVAL; | 283 | return -EINVAL; |
| 272 | 284 | ||
| 273 | ret = isl29003_set_mode(client, val); | 285 | ret = isl29003_set_mode(client, val); |
| @@ -298,7 +310,11 @@ static ssize_t isl29003_store_power_state(struct device *dev, | |||
| 298 | unsigned long val; | 310 | unsigned long val; |
| 299 | int ret; | 311 | int ret; |
| 300 | 312 | ||
| 301 | if ((strict_strtoul(buf, 10, &val) < 0) || (val > 1)) | 313 | ret = kstrtoul(buf, 10, &val); |
| 314 | if (ret) | ||
| 315 | return ret; | ||
| 316 | |||
| 317 | if (val > 1) | ||
| 302 | return -EINVAL; | 318 | return -EINVAL; |
| 303 | 319 | ||
| 304 | ret = isl29003_set_power_state(client, val); | 320 | ret = isl29003_set_power_state(client, val); |
diff --git a/drivers/misc/isl29020.c b/drivers/misc/isl29020.c index 0aa08c746463..b7f84dacf822 100644 --- a/drivers/misc/isl29020.c +++ b/drivers/misc/isl29020.c | |||
| @@ -90,8 +90,10 @@ static ssize_t als_sensing_range_store(struct device *dev, | |||
| 90 | int ret_val; | 90 | int ret_val; |
| 91 | unsigned long val; | 91 | unsigned long val; |
| 92 | 92 | ||
| 93 | if (strict_strtoul(buf, 10, &val)) | 93 | ret_val = kstrtoul(buf, 10, &val); |
| 94 | return -EINVAL; | 94 | if (ret_val) |
| 95 | return ret_val; | ||
| 96 | |||
| 95 | if (val < 1 || val > 64000) | 97 | if (val < 1 || val > 64000) |
| 96 | return -EINVAL; | 98 | return -EINVAL; |
| 97 | 99 | ||
diff --git a/drivers/misc/lattice-ecp3-config.c b/drivers/misc/lattice-ecp3-config.c index bb26f086bd8b..61fbe6acabef 100644 --- a/drivers/misc/lattice-ecp3-config.c +++ b/drivers/misc/lattice-ecp3-config.c | |||
| @@ -170,7 +170,7 @@ static void firmware_load(const struct firmware *fw, void *context) | |||
| 170 | 170 | ||
| 171 | /* Check result */ | 171 | /* Check result */ |
| 172 | if (status & FPGA_STATUS_DONE) | 172 | if (status & FPGA_STATUS_DONE) |
| 173 | dev_info(&spi->dev, "FPGA succesfully configured!\n"); | 173 | dev_info(&spi->dev, "FPGA successfully configured!\n"); |
| 174 | else | 174 | else |
| 175 | dev_info(&spi->dev, "FPGA not configured (DONE not set)\n"); | 175 | dev_info(&spi->dev, "FPGA not configured (DONE not set)\n"); |
| 176 | 176 | ||
diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c index 4cd4a3d2a76a..036effe9a795 100644 --- a/drivers/misc/lis3lv02d/lis3lv02d.c +++ b/drivers/misc/lis3lv02d/lis3lv02d.c | |||
| @@ -831,9 +831,11 @@ static ssize_t lis3lv02d_rate_set(struct device *dev, | |||
| 831 | { | 831 | { |
| 832 | struct lis3lv02d *lis3 = dev_get_drvdata(dev); | 832 | struct lis3lv02d *lis3 = dev_get_drvdata(dev); |
| 833 | unsigned long rate; | 833 | unsigned long rate; |
| 834 | int ret; | ||
| 834 | 835 | ||
| 835 | if (strict_strtoul(buf, 0, &rate)) | 836 | ret = kstrtoul(buf, 0, &rate); |
| 836 | return -EINVAL; | 837 | if (ret) |
| 838 | return ret; | ||
| 837 | 839 | ||
| 838 | lis3lv02d_sysfs_poweron(lis3); | 840 | lis3lv02d_sysfs_poweron(lis3); |
| 839 | if (lis3lv02d_set_odr(lis3, rate)) | 841 | if (lis3lv02d_set_odr(lis3, rate)) |
diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c index b3e50984d2c8..749452f8e2f6 100644 --- a/drivers/misc/mei/amthif.c +++ b/drivers/misc/mei/amthif.c | |||
| @@ -443,11 +443,11 @@ unsigned int mei_amthif_poll(struct mei_device *dev, | |||
| 443 | * | 443 | * |
| 444 | * returns 0, OK; otherwise, error. | 444 | * returns 0, OK; otherwise, error. |
| 445 | */ | 445 | */ |
| 446 | int mei_amthif_irq_write_complete(struct mei_device *dev, s32 *slots, | 446 | int mei_amthif_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, |
| 447 | struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list) | 447 | s32 *slots, struct mei_cl_cb *cmpl_list) |
| 448 | { | 448 | { |
| 449 | struct mei_device *dev = cl->dev; | ||
| 449 | struct mei_msg_hdr mei_hdr; | 450 | struct mei_msg_hdr mei_hdr; |
| 450 | struct mei_cl *cl = cb->cl; | ||
| 451 | size_t len = dev->iamthif_msg_buf_size - dev->iamthif_msg_buf_index; | 451 | size_t len = dev->iamthif_msg_buf_size - dev->iamthif_msg_buf_index; |
| 452 | u32 msg_slots = mei_data2slots(len); | 452 | u32 msg_slots = mei_data2slots(len); |
| 453 | 453 | ||
diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c index e310ca6ed1a3..21d3f5aa8353 100644 --- a/drivers/misc/mei/client.c +++ b/drivers/misc/mei/client.c | |||
| @@ -485,7 +485,6 @@ int mei_cl_connect(struct mei_cl *cl, struct file *file) | |||
| 485 | { | 485 | { |
| 486 | struct mei_device *dev; | 486 | struct mei_device *dev; |
| 487 | struct mei_cl_cb *cb; | 487 | struct mei_cl_cb *cb; |
| 488 | long timeout = mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT); | ||
| 489 | int rets; | 488 | int rets; |
| 490 | 489 | ||
| 491 | if (WARN_ON(!cl || !cl->dev)) | 490 | if (WARN_ON(!cl || !cl->dev)) |
| @@ -518,7 +517,7 @@ int mei_cl_connect(struct mei_cl *cl, struct file *file) | |||
| 518 | rets = wait_event_timeout(dev->wait_recvd_msg, | 517 | rets = wait_event_timeout(dev->wait_recvd_msg, |
| 519 | (cl->state == MEI_FILE_CONNECTED || | 518 | (cl->state == MEI_FILE_CONNECTED || |
| 520 | cl->state == MEI_FILE_DISCONNECTED), | 519 | cl->state == MEI_FILE_DISCONNECTED), |
| 521 | timeout * HZ); | 520 | mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT)); |
| 522 | mutex_lock(&dev->device_lock); | 521 | mutex_lock(&dev->device_lock); |
| 523 | 522 | ||
| 524 | if (cl->state != MEI_FILE_CONNECTED) { | 523 | if (cl->state != MEI_FILE_CONNECTED) { |
| @@ -682,6 +681,68 @@ err: | |||
| 682 | } | 681 | } |
| 683 | 682 | ||
| 684 | /** | 683 | /** |
| 684 | * mei_cl_irq_write_complete - write a message to device | ||
| 685 | * from the interrupt thread context | ||
| 686 | * | ||
| 687 | * @cl: client | ||
| 688 | * @cb: callback block. | ||
| 689 | * @slots: free slots. | ||
| 690 | * @cmpl_list: complete list. | ||
| 691 | * | ||
| 692 | * returns 0, OK; otherwise error. | ||
| 693 | */ | ||
| 694 | int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, | ||
| 695 | s32 *slots, struct mei_cl_cb *cmpl_list) | ||
| 696 | { | ||
| 697 | struct mei_device *dev = cl->dev; | ||
| 698 | struct mei_msg_hdr mei_hdr; | ||
| 699 | size_t len = cb->request_buffer.size - cb->buf_idx; | ||
| 700 | u32 msg_slots = mei_data2slots(len); | ||
| 701 | |||
| 702 | mei_hdr.host_addr = cl->host_client_id; | ||
| 703 | mei_hdr.me_addr = cl->me_client_id; | ||
| 704 | mei_hdr.reserved = 0; | ||
| 705 | |||
| 706 | if (*slots >= msg_slots) { | ||
| 707 | mei_hdr.length = len; | ||
| 708 | mei_hdr.msg_complete = 1; | ||
| 709 | /* Split the message only if we can write the whole host buffer */ | ||
| 710 | } else if (*slots == dev->hbuf_depth) { | ||
| 711 | msg_slots = *slots; | ||
| 712 | len = (*slots * sizeof(u32)) - sizeof(struct mei_msg_hdr); | ||
| 713 | mei_hdr.length = len; | ||
| 714 | mei_hdr.msg_complete = 0; | ||
| 715 | } else { | ||
| 716 | /* wait for next time the host buffer is empty */ | ||
| 717 | return 0; | ||
| 718 | } | ||
| 719 | |||
| 720 | dev_dbg(&dev->pdev->dev, "buf: size = %d idx = %lu\n", | ||
| 721 | cb->request_buffer.size, cb->buf_idx); | ||
| 722 | dev_dbg(&dev->pdev->dev, MEI_HDR_FMT, MEI_HDR_PRM(&mei_hdr)); | ||
| 723 | |||
| 724 | *slots -= msg_slots; | ||
| 725 | if (mei_write_message(dev, &mei_hdr, | ||
| 726 | cb->request_buffer.data + cb->buf_idx)) { | ||
| 727 | cl->status = -ENODEV; | ||
| 728 | list_move_tail(&cb->list, &cmpl_list->list); | ||
| 729 | return -ENODEV; | ||
| 730 | } | ||
| 731 | |||
| 732 | cl->status = 0; | ||
| 733 | cl->writing_state = MEI_WRITING; | ||
| 734 | cb->buf_idx += mei_hdr.length; | ||
| 735 | |||
| 736 | if (mei_hdr.msg_complete) { | ||
| 737 | if (mei_cl_flow_ctrl_reduce(cl)) | ||
| 738 | return -ENODEV; | ||
| 739 | list_move_tail(&cb->list, &dev->write_waiting_list.list); | ||
| 740 | } | ||
| 741 | |||
| 742 | return 0; | ||
| 743 | } | ||
| 744 | |||
| 745 | /** | ||
| 685 | * mei_cl_write - submit a write cb to mei device | 746 | * mei_cl_write - submit a write cb to mei device |
| 686 | assumes device_lock is locked | 747 | assumes device_lock is locked |
| 687 | * | 748 | * |
| @@ -723,7 +784,6 @@ int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking) | |||
| 723 | cb->buf_idx = 0; | 784 | cb->buf_idx = 0; |
| 724 | /* unseting complete will enqueue the cb for write */ | 785 | /* unseting complete will enqueue the cb for write */ |
| 725 | mei_hdr.msg_complete = 0; | 786 | mei_hdr.msg_complete = 0; |
| 726 | cl->writing_state = MEI_WRITING; | ||
| 727 | rets = buf->size; | 787 | rets = buf->size; |
| 728 | goto out; | 788 | goto out; |
| 729 | } | 789 | } |
| @@ -785,6 +845,32 @@ err: | |||
| 785 | } | 845 | } |
| 786 | 846 | ||
| 787 | 847 | ||
| 848 | /** | ||
| 849 | * mei_cl_complete - processes completed operation for a client | ||
| 850 | * | ||
| 851 | * @cl: private data of the file object. | ||
| 852 | * @cb: callback block. | ||
| 853 | */ | ||
| 854 | void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb) | ||
| 855 | { | ||
| 856 | if (cb->fop_type == MEI_FOP_WRITE) { | ||
| 857 | mei_io_cb_free(cb); | ||
| 858 | cb = NULL; | ||
| 859 | cl->writing_state = MEI_WRITE_COMPLETE; | ||
| 860 | if (waitqueue_active(&cl->tx_wait)) | ||
| 861 | wake_up_interruptible(&cl->tx_wait); | ||
| 862 | |||
| 863 | } else if (cb->fop_type == MEI_FOP_READ && | ||
| 864 | MEI_READING == cl->reading_state) { | ||
| 865 | cl->reading_state = MEI_READ_COMPLETE; | ||
| 866 | if (waitqueue_active(&cl->rx_wait)) | ||
| 867 | wake_up_interruptible(&cl->rx_wait); | ||
| 868 | else | ||
| 869 | mei_cl_bus_rx_event(cl); | ||
| 870 | |||
| 871 | } | ||
| 872 | } | ||
| 873 | |||
| 788 | 874 | ||
| 789 | /** | 875 | /** |
| 790 | * mei_cl_all_disconnect - disconnect forcefully all connected clients | 876 | * mei_cl_all_disconnect - disconnect forcefully all connected clients |
diff --git a/drivers/misc/mei/client.h b/drivers/misc/mei/client.h index cfdb144526aa..26b157d8bad5 100644 --- a/drivers/misc/mei/client.h +++ b/drivers/misc/mei/client.h | |||
| @@ -89,6 +89,10 @@ int mei_cl_disconnect(struct mei_cl *cl); | |||
| 89 | int mei_cl_connect(struct mei_cl *cl, struct file *file); | 89 | int mei_cl_connect(struct mei_cl *cl, struct file *file); |
| 90 | int mei_cl_read_start(struct mei_cl *cl, size_t length); | 90 | int mei_cl_read_start(struct mei_cl *cl, size_t length); |
| 91 | int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking); | 91 | int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking); |
| 92 | int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, | ||
| 93 | s32 *slots, struct mei_cl_cb *cmpl_list); | ||
| 94 | |||
| 95 | void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb); | ||
| 92 | 96 | ||
| 93 | void mei_host_client_init(struct work_struct *work); | 97 | void mei_host_client_init(struct work_struct *work); |
| 94 | 98 | ||
diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c index 6916045166eb..f9296abcf02a 100644 --- a/drivers/misc/mei/hbm.c +++ b/drivers/misc/mei/hbm.c | |||
| @@ -139,7 +139,7 @@ int mei_hbm_start_wait(struct mei_device *dev) | |||
| 139 | 139 | ||
| 140 | if (ret <= 0 && (dev->hbm_state <= MEI_HBM_START)) { | 140 | if (ret <= 0 && (dev->hbm_state <= MEI_HBM_START)) { |
| 141 | dev->hbm_state = MEI_HBM_IDLE; | 141 | dev->hbm_state = MEI_HBM_IDLE; |
| 142 | dev_err(&dev->pdev->dev, "wating for mei start failed\n"); | 142 | dev_err(&dev->pdev->dev, "waiting for mei start failed\n"); |
| 143 | return -ETIMEDOUT; | 143 | return -ETIMEDOUT; |
| 144 | } | 144 | } |
| 145 | return 0; | 145 | return 0; |
| @@ -536,6 +536,20 @@ static void mei_hbm_fw_disconnect_req(struct mei_device *dev, | |||
| 536 | 536 | ||
| 537 | 537 | ||
| 538 | /** | 538 | /** |
| 539 | * mei_hbm_version_is_supported - checks whether the driver can | ||
| 540 | * support the hbm version of the device | ||
| 541 | * | ||
| 542 | * @dev: the device structure | ||
| 543 | * returns true if driver can support hbm version of the device | ||
| 544 | */ | ||
| 545 | bool mei_hbm_version_is_supported(struct mei_device *dev) | ||
| 546 | { | ||
| 547 | return (dev->version.major_version < HBM_MAJOR_VERSION) || | ||
| 548 | (dev->version.major_version == HBM_MAJOR_VERSION && | ||
| 549 | dev->version.minor_version <= HBM_MINOR_VERSION); | ||
| 550 | } | ||
| 551 | |||
| 552 | /** | ||
| 539 | * mei_hbm_dispatch - bottom half read routine after ISR to | 553 | * mei_hbm_dispatch - bottom half read routine after ISR to |
| 540 | * handle the read bus message cmd processing. | 554 | * handle the read bus message cmd processing. |
| 541 | * | 555 | * |
| @@ -562,9 +576,24 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) | |||
| 562 | switch (mei_msg->hbm_cmd) { | 576 | switch (mei_msg->hbm_cmd) { |
| 563 | case HOST_START_RES_CMD: | 577 | case HOST_START_RES_CMD: |
| 564 | version_res = (struct hbm_host_version_response *)mei_msg; | 578 | version_res = (struct hbm_host_version_response *)mei_msg; |
| 565 | if (!version_res->host_version_supported) { | 579 | |
| 566 | dev->version = version_res->me_max_version; | 580 | dev_dbg(&dev->pdev->dev, "HBM VERSION: DRIVER=%02d:%02d DEVICE=%02d:%02d\n", |
| 567 | dev_dbg(&dev->pdev->dev, "version mismatch.\n"); | 581 | HBM_MAJOR_VERSION, HBM_MINOR_VERSION, |
| 582 | version_res->me_max_version.major_version, | ||
| 583 | version_res->me_max_version.minor_version); | ||
| 584 | |||
| 585 | if (version_res->host_version_supported) { | ||
| 586 | dev->version.major_version = HBM_MAJOR_VERSION; | ||
| 587 | dev->version.minor_version = HBM_MINOR_VERSION; | ||
| 588 | } else { | ||
| 589 | dev->version.major_version = | ||
| 590 | version_res->me_max_version.major_version; | ||
| 591 | dev->version.minor_version = | ||
| 592 | version_res->me_max_version.minor_version; | ||
| 593 | } | ||
| 594 | |||
| 595 | if (!mei_hbm_version_is_supported(dev)) { | ||
| 596 | dev_warn(&dev->pdev->dev, "hbm version mismatch: stopping the driver.\n"); | ||
| 568 | 597 | ||
| 569 | dev->hbm_state = MEI_HBM_STOP; | 598 | dev->hbm_state = MEI_HBM_STOP; |
| 570 | mei_hbm_stop_req_prepare(dev, &dev->wr_msg.hdr, | 599 | mei_hbm_stop_req_prepare(dev, &dev->wr_msg.hdr, |
| @@ -575,8 +604,6 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) | |||
| 575 | return; | 604 | return; |
| 576 | } | 605 | } |
| 577 | 606 | ||
| 578 | dev->version.major_version = HBM_MAJOR_VERSION; | ||
| 579 | dev->version.minor_version = HBM_MINOR_VERSION; | ||
| 580 | if (dev->dev_state == MEI_DEV_INIT_CLIENTS && | 607 | if (dev->dev_state == MEI_DEV_INIT_CLIENTS && |
| 581 | dev->hbm_state == MEI_HBM_START) { | 608 | dev->hbm_state == MEI_HBM_START) { |
| 582 | dev->init_clients_timer = 0; | 609 | dev->init_clients_timer = 0; |
diff --git a/drivers/misc/mei/hbm.h b/drivers/misc/mei/hbm.h index e80dc24ef3e2..4ae2e56e404f 100644 --- a/drivers/misc/mei/hbm.h +++ b/drivers/misc/mei/hbm.h | |||
| @@ -54,7 +54,7 @@ int mei_hbm_start_wait(struct mei_device *dev); | |||
| 54 | int mei_hbm_cl_flow_control_req(struct mei_device *dev, struct mei_cl *cl); | 54 | int mei_hbm_cl_flow_control_req(struct mei_device *dev, struct mei_cl *cl); |
| 55 | int mei_hbm_cl_disconnect_req(struct mei_device *dev, struct mei_cl *cl); | 55 | int mei_hbm_cl_disconnect_req(struct mei_device *dev, struct mei_cl *cl); |
| 56 | int mei_hbm_cl_connect_req(struct mei_device *dev, struct mei_cl *cl); | 56 | int mei_hbm_cl_connect_req(struct mei_device *dev, struct mei_cl *cl); |
| 57 | 57 | bool mei_hbm_version_is_supported(struct mei_device *dev); | |
| 58 | 58 | ||
| 59 | #endif /* _MEI_HBM_H_ */ | 59 | #endif /* _MEI_HBM_H_ */ |
| 60 | 60 | ||
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index 822170f00348..e4f8dec4dc3c 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
| @@ -171,7 +171,7 @@ static void mei_me_hw_reset_release(struct mei_device *dev) | |||
| 171 | * @dev: the device structure | 171 | * @dev: the device structure |
| 172 | * @intr_enable: if interrupt should be enabled after reset. | 172 | * @intr_enable: if interrupt should be enabled after reset. |
| 173 | */ | 173 | */ |
| 174 | static void mei_me_hw_reset(struct mei_device *dev, bool intr_enable) | 174 | static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable) |
| 175 | { | 175 | { |
| 176 | struct mei_me_hw *hw = to_me_hw(dev); | 176 | struct mei_me_hw *hw = to_me_hw(dev); |
| 177 | u32 hcsr = mei_hcsr_read(hw); | 177 | u32 hcsr = mei_hcsr_read(hw); |
| @@ -191,6 +191,7 @@ static void mei_me_hw_reset(struct mei_device *dev, bool intr_enable) | |||
| 191 | mei_me_hw_reset_release(dev); | 191 | mei_me_hw_reset_release(dev); |
| 192 | 192 | ||
| 193 | dev_dbg(&dev->pdev->dev, "current HCSR = 0x%08x.\n", mei_hcsr_read(hw)); | 193 | dev_dbg(&dev->pdev->dev, "current HCSR = 0x%08x.\n", mei_hcsr_read(hw)); |
| 194 | return 0; | ||
| 194 | } | 195 | } |
| 195 | 196 | ||
| 196 | /** | 197 | /** |
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index f580d30bb784..ed1d75203af6 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
| @@ -38,7 +38,7 @@ const char *mei_dev_state_str(int state) | |||
| 38 | MEI_DEV_STATE(POWER_DOWN); | 38 | MEI_DEV_STATE(POWER_DOWN); |
| 39 | MEI_DEV_STATE(POWER_UP); | 39 | MEI_DEV_STATE(POWER_UP); |
| 40 | default: | 40 | default: |
| 41 | return "unkown"; | 41 | return "unknown"; |
| 42 | } | 42 | } |
| 43 | #undef MEI_DEV_STATE | 43 | #undef MEI_DEV_STATE |
| 44 | } | 44 | } |
| @@ -106,8 +106,7 @@ int mei_start(struct mei_device *dev) | |||
| 106 | goto err; | 106 | goto err; |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | if (dev->version.major_version != HBM_MAJOR_VERSION || | 109 | if (!mei_hbm_version_is_supported(dev)) { |
| 110 | dev->version.minor_version != HBM_MINOR_VERSION) { | ||
| 111 | dev_dbg(&dev->pdev->dev, "MEI start failed.\n"); | 110 | dev_dbg(&dev->pdev->dev, "MEI start failed.\n"); |
| 112 | goto err; | 111 | goto err; |
| 113 | } | 112 | } |
| @@ -133,13 +132,19 @@ EXPORT_SYMBOL_GPL(mei_start); | |||
| 133 | void mei_reset(struct mei_device *dev, int interrupts_enabled) | 132 | void mei_reset(struct mei_device *dev, int interrupts_enabled) |
| 134 | { | 133 | { |
| 135 | bool unexpected; | 134 | bool unexpected; |
| 135 | int ret; | ||
| 136 | 136 | ||
| 137 | unexpected = (dev->dev_state != MEI_DEV_INITIALIZING && | 137 | unexpected = (dev->dev_state != MEI_DEV_INITIALIZING && |
| 138 | dev->dev_state != MEI_DEV_DISABLED && | 138 | dev->dev_state != MEI_DEV_DISABLED && |
| 139 | dev->dev_state != MEI_DEV_POWER_DOWN && | 139 | dev->dev_state != MEI_DEV_POWER_DOWN && |
| 140 | dev->dev_state != MEI_DEV_POWER_UP); | 140 | dev->dev_state != MEI_DEV_POWER_UP); |
| 141 | 141 | ||
| 142 | mei_hw_reset(dev, interrupts_enabled); | 142 | ret = mei_hw_reset(dev, interrupts_enabled); |
| 143 | if (ret) { | ||
| 144 | dev_err(&dev->pdev->dev, "hw reset failed disabling the device\n"); | ||
| 145 | interrupts_enabled = false; | ||
| 146 | dev->dev_state = MEI_DEV_DISABLED; | ||
| 147 | } | ||
| 143 | 148 | ||
| 144 | dev->hbm_state = MEI_HBM_IDLE; | 149 | dev->hbm_state = MEI_HBM_IDLE; |
| 145 | 150 | ||
| @@ -176,7 +181,12 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) | |||
| 176 | return; | 181 | return; |
| 177 | } | 182 | } |
| 178 | 183 | ||
| 179 | mei_hw_start(dev); | 184 | ret = mei_hw_start(dev); |
| 185 | if (ret) { | ||
| 186 | dev_err(&dev->pdev->dev, "hw_start failed disabling the device\n"); | ||
| 187 | dev->dev_state = MEI_DEV_DISABLED; | ||
| 188 | return; | ||
| 189 | } | ||
| 180 | 190 | ||
| 181 | dev_dbg(&dev->pdev->dev, "link is established start sending messages.\n"); | 191 | dev_dbg(&dev->pdev->dev, "link is established start sending messages.\n"); |
| 182 | /* link is established * start sending messages. */ | 192 | /* link is established * start sending messages. */ |
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index 2ad736989410..4b59cb742dee 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c | |||
| @@ -31,32 +31,6 @@ | |||
| 31 | 31 | ||
| 32 | 32 | ||
| 33 | /** | 33 | /** |
| 34 | * mei_cl_complete_handler - processes completed operation for a client | ||
| 35 | * | ||
| 36 | * @cl: private data of the file object. | ||
| 37 | * @cb: callback block. | ||
| 38 | */ | ||
| 39 | static void mei_cl_complete_handler(struct mei_cl *cl, struct mei_cl_cb *cb) | ||
| 40 | { | ||
| 41 | if (cb->fop_type == MEI_FOP_WRITE) { | ||
| 42 | mei_io_cb_free(cb); | ||
| 43 | cb = NULL; | ||
| 44 | cl->writing_state = MEI_WRITE_COMPLETE; | ||
| 45 | if (waitqueue_active(&cl->tx_wait)) | ||
| 46 | wake_up_interruptible(&cl->tx_wait); | ||
| 47 | |||
| 48 | } else if (cb->fop_type == MEI_FOP_READ && | ||
| 49 | MEI_READING == cl->reading_state) { | ||
| 50 | cl->reading_state = MEI_READ_COMPLETE; | ||
| 51 | if (waitqueue_active(&cl->rx_wait)) | ||
| 52 | wake_up_interruptible(&cl->rx_wait); | ||
| 53 | else | ||
| 54 | mei_cl_bus_rx_event(cl); | ||
| 55 | |||
| 56 | } | ||
| 57 | } | ||
| 58 | |||
| 59 | /** | ||
| 60 | * mei_irq_compl_handler - dispatch complete handelers | 34 | * mei_irq_compl_handler - dispatch complete handelers |
| 61 | * for the completed callbacks | 35 | * for the completed callbacks |
| 62 | * | 36 | * |
| @@ -78,7 +52,7 @@ void mei_irq_compl_handler(struct mei_device *dev, struct mei_cl_cb *compl_list) | |||
| 78 | if (cl == &dev->iamthif_cl) | 52 | if (cl == &dev->iamthif_cl) |
| 79 | mei_amthif_complete(dev, cb); | 53 | mei_amthif_complete(dev, cb); |
| 80 | else | 54 | else |
| 81 | mei_cl_complete_handler(cl, cb); | 55 | mei_cl_complete(cl, cb); |
| 82 | } | 56 | } |
| 83 | } | 57 | } |
| 84 | EXPORT_SYMBOL_GPL(mei_irq_compl_handler); | 58 | EXPORT_SYMBOL_GPL(mei_irq_compl_handler); |
| @@ -189,21 +163,21 @@ static int mei_cl_irq_read_msg(struct mei_device *dev, | |||
| 189 | } | 163 | } |
| 190 | 164 | ||
| 191 | /** | 165 | /** |
| 192 | * _mei_irq_thread_close - processes close related operation. | 166 | * mei_cl_irq_close - processes close related operation from |
| 167 | * interrupt thread context - send disconnect request | ||
| 193 | * | 168 | * |
| 194 | * @dev: the device structure. | 169 | * @cl: client |
| 170 | * @cb: callback block. | ||
| 195 | * @slots: free slots. | 171 | * @slots: free slots. |
| 196 | * @cb_pos: callback block. | ||
| 197 | * @cl: private data of the file object. | ||
| 198 | * @cmpl_list: complete list. | 172 | * @cmpl_list: complete list. |
| 199 | * | 173 | * |
| 200 | * returns 0, OK; otherwise, error. | 174 | * returns 0, OK; otherwise, error. |
| 201 | */ | 175 | */ |
| 202 | static int _mei_irq_thread_close(struct mei_device *dev, s32 *slots, | 176 | static int mei_cl_irq_close(struct mei_cl *cl, struct mei_cl_cb *cb, |
| 203 | struct mei_cl_cb *cb_pos, | 177 | s32 *slots, struct mei_cl_cb *cmpl_list) |
| 204 | struct mei_cl *cl, | ||
| 205 | struct mei_cl_cb *cmpl_list) | ||
| 206 | { | 178 | { |
| 179 | struct mei_device *dev = cl->dev; | ||
| 180 | |||
| 207 | u32 msg_slots = | 181 | u32 msg_slots = |
| 208 | mei_data2slots(sizeof(struct hbm_client_connect_request)); | 182 | mei_data2slots(sizeof(struct hbm_client_connect_request)); |
| 209 | 183 | ||
| @@ -214,15 +188,15 @@ static int _mei_irq_thread_close(struct mei_device *dev, s32 *slots, | |||
| 214 | 188 | ||
| 215 | if (mei_hbm_cl_disconnect_req(dev, cl)) { | 189 | if (mei_hbm_cl_disconnect_req(dev, cl)) { |
| 216 | cl->status = 0; | 190 | cl->status = 0; |
| 217 | cb_pos->buf_idx = 0; | 191 | cb->buf_idx = 0; |
| 218 | list_move_tail(&cb_pos->list, &cmpl_list->list); | 192 | list_move_tail(&cb->list, &cmpl_list->list); |
| 219 | return -EIO; | 193 | return -EIO; |
| 220 | } | 194 | } |
| 221 | 195 | ||
| 222 | cl->state = MEI_FILE_DISCONNECTING; | 196 | cl->state = MEI_FILE_DISCONNECTING; |
| 223 | cl->status = 0; | 197 | cl->status = 0; |
| 224 | cb_pos->buf_idx = 0; | 198 | cb->buf_idx = 0; |
| 225 | list_move_tail(&cb_pos->list, &dev->ctrl_rd_list.list); | 199 | list_move_tail(&cb->list, &dev->ctrl_rd_list.list); |
| 226 | cl->timer_count = MEI_CONNECT_TIMEOUT; | 200 | cl->timer_count = MEI_CONNECT_TIMEOUT; |
| 227 | 201 | ||
| 228 | return 0; | 202 | return 0; |
| @@ -230,26 +204,26 @@ static int _mei_irq_thread_close(struct mei_device *dev, s32 *slots, | |||
| 230 | 204 | ||
| 231 | 205 | ||
| 232 | /** | 206 | /** |
| 233 | * _mei_irq_thread_read - processes read related operation. | 207 | * mei_cl_irq_close - processes client read related operation from the |
| 208 | * interrupt thread context - request for flow control credits | ||
| 234 | * | 209 | * |
| 235 | * @dev: the device structure. | 210 | * @cl: client |
| 211 | * @cb: callback block. | ||
| 236 | * @slots: free slots. | 212 | * @slots: free slots. |
| 237 | * @cb_pos: callback block. | ||
| 238 | * @cl: private data of the file object. | ||
| 239 | * @cmpl_list: complete list. | 213 | * @cmpl_list: complete list. |
| 240 | * | 214 | * |
| 241 | * returns 0, OK; otherwise, error. | 215 | * returns 0, OK; otherwise, error. |
| 242 | */ | 216 | */ |
| 243 | static int _mei_irq_thread_read(struct mei_device *dev, s32 *slots, | 217 | static int mei_cl_irq_read(struct mei_cl *cl, struct mei_cl_cb *cb, |
| 244 | struct mei_cl_cb *cb_pos, | 218 | s32 *slots, struct mei_cl_cb *cmpl_list) |
| 245 | struct mei_cl *cl, | ||
| 246 | struct mei_cl_cb *cmpl_list) | ||
| 247 | { | 219 | { |
| 220 | struct mei_device *dev = cl->dev; | ||
| 221 | |||
| 248 | u32 msg_slots = mei_data2slots(sizeof(struct hbm_flow_control)); | 222 | u32 msg_slots = mei_data2slots(sizeof(struct hbm_flow_control)); |
| 249 | 223 | ||
| 250 | if (*slots < msg_slots) { | 224 | if (*slots < msg_slots) { |
| 251 | /* return the cancel routine */ | 225 | /* return the cancel routine */ |
| 252 | list_del(&cb_pos->list); | 226 | list_del(&cb->list); |
| 253 | return -EMSGSIZE; | 227 | return -EMSGSIZE; |
| 254 | } | 228 | } |
| 255 | 229 | ||
| @@ -257,38 +231,38 @@ static int _mei_irq_thread_read(struct mei_device *dev, s32 *slots, | |||
| 257 | 231 | ||
| 258 | if (mei_hbm_cl_flow_control_req(dev, cl)) { | 232 | if (mei_hbm_cl_flow_control_req(dev, cl)) { |
| 259 | cl->status = -ENODEV; | 233 | cl->status = -ENODEV; |
| 260 | cb_pos->buf_idx = 0; | 234 | cb->buf_idx = 0; |
| 261 | list_move_tail(&cb_pos->list, &cmpl_list->list); | 235 | list_move_tail(&cb->list, &cmpl_list->list); |
| 262 | return -ENODEV; | 236 | return -ENODEV; |
| 263 | } | 237 | } |
| 264 | list_move_tail(&cb_pos->list, &dev->read_list.list); | 238 | list_move_tail(&cb->list, &dev->read_list.list); |
| 265 | 239 | ||
| 266 | return 0; | 240 | return 0; |
| 267 | } | 241 | } |
| 268 | 242 | ||
| 269 | 243 | ||
| 270 | /** | 244 | /** |
| 271 | * _mei_irq_thread_ioctl - processes ioctl related operation. | 245 | * mei_cl_irq_ioctl - processes client ioctl related operation from the |
| 246 | * interrupt thread context - send connection request | ||
| 272 | * | 247 | * |
| 273 | * @dev: the device structure. | 248 | * @cl: client |
| 249 | * @cb: callback block. | ||
| 274 | * @slots: free slots. | 250 | * @slots: free slots. |
| 275 | * @cb_pos: callback block. | ||
| 276 | * @cl: private data of the file object. | ||
| 277 | * @cmpl_list: complete list. | 251 | * @cmpl_list: complete list. |
| 278 | * | 252 | * |
| 279 | * returns 0, OK; otherwise, error. | 253 | * returns 0, OK; otherwise, error. |
| 280 | */ | 254 | */ |
| 281 | static int _mei_irq_thread_ioctl(struct mei_device *dev, s32 *slots, | 255 | static int mei_cl_irq_ioctl(struct mei_cl *cl, struct mei_cl_cb *cb, |
| 282 | struct mei_cl_cb *cb_pos, | 256 | s32 *slots, struct mei_cl_cb *cmpl_list) |
| 283 | struct mei_cl *cl, | ||
| 284 | struct mei_cl_cb *cmpl_list) | ||
| 285 | { | 257 | { |
| 258 | struct mei_device *dev = cl->dev; | ||
| 259 | |||
| 286 | u32 msg_slots = | 260 | u32 msg_slots = |
| 287 | mei_data2slots(sizeof(struct hbm_client_connect_request)); | 261 | mei_data2slots(sizeof(struct hbm_client_connect_request)); |
| 288 | 262 | ||
| 289 | if (*slots < msg_slots) { | 263 | if (*slots < msg_slots) { |
| 290 | /* return the cancel routine */ | 264 | /* return the cancel routine */ |
| 291 | list_del(&cb_pos->list); | 265 | list_del(&cb->list); |
| 292 | return -EMSGSIZE; | 266 | return -EMSGSIZE; |
| 293 | } | 267 | } |
| 294 | 268 | ||
| @@ -298,76 +272,17 @@ static int _mei_irq_thread_ioctl(struct mei_device *dev, s32 *slots, | |||
| 298 | 272 | ||
| 299 | if (mei_hbm_cl_connect_req(dev, cl)) { | 273 | if (mei_hbm_cl_connect_req(dev, cl)) { |
| 300 | cl->status = -ENODEV; | 274 | cl->status = -ENODEV; |
| 301 | cb_pos->buf_idx = 0; | 275 | cb->buf_idx = 0; |
| 302 | list_del(&cb_pos->list); | 276 | list_del(&cb->list); |
| 303 | return -ENODEV; | ||
| 304 | } else { | ||
| 305 | list_move_tail(&cb_pos->list, &dev->ctrl_rd_list.list); | ||
| 306 | cl->timer_count = MEI_CONNECT_TIMEOUT; | ||
| 307 | } | ||
| 308 | return 0; | ||
| 309 | } | ||
| 310 | |||
| 311 | /** | ||
| 312 | * mei_irq_thread_write_complete - write messages to device. | ||
| 313 | * | ||
| 314 | * @dev: the device structure. | ||
| 315 | * @slots: free slots. | ||
| 316 | * @cb: callback block. | ||
| 317 | * @cmpl_list: complete list. | ||
| 318 | * | ||
| 319 | * returns 0, OK; otherwise, error. | ||
| 320 | */ | ||
| 321 | static int mei_irq_thread_write_complete(struct mei_device *dev, s32 *slots, | ||
| 322 | struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list) | ||
| 323 | { | ||
| 324 | struct mei_msg_hdr mei_hdr; | ||
| 325 | struct mei_cl *cl = cb->cl; | ||
| 326 | size_t len = cb->request_buffer.size - cb->buf_idx; | ||
| 327 | u32 msg_slots = mei_data2slots(len); | ||
| 328 | |||
| 329 | mei_hdr.host_addr = cl->host_client_id; | ||
| 330 | mei_hdr.me_addr = cl->me_client_id; | ||
| 331 | mei_hdr.reserved = 0; | ||
| 332 | |||
| 333 | if (*slots >= msg_slots) { | ||
| 334 | mei_hdr.length = len; | ||
| 335 | mei_hdr.msg_complete = 1; | ||
| 336 | /* Split the message only if we can write the whole host buffer */ | ||
| 337 | } else if (*slots == dev->hbuf_depth) { | ||
| 338 | msg_slots = *slots; | ||
| 339 | len = (*slots * sizeof(u32)) - sizeof(struct mei_msg_hdr); | ||
| 340 | mei_hdr.length = len; | ||
| 341 | mei_hdr.msg_complete = 0; | ||
| 342 | } else { | ||
| 343 | /* wait for next time the host buffer is empty */ | ||
| 344 | return 0; | ||
| 345 | } | ||
| 346 | |||
| 347 | dev_dbg(&dev->pdev->dev, "buf: size = %d idx = %lu\n", | ||
| 348 | cb->request_buffer.size, cb->buf_idx); | ||
| 349 | dev_dbg(&dev->pdev->dev, MEI_HDR_FMT, MEI_HDR_PRM(&mei_hdr)); | ||
| 350 | |||
| 351 | *slots -= msg_slots; | ||
| 352 | if (mei_write_message(dev, &mei_hdr, | ||
| 353 | cb->request_buffer.data + cb->buf_idx)) { | ||
| 354 | cl->status = -ENODEV; | ||
| 355 | list_move_tail(&cb->list, &cmpl_list->list); | ||
| 356 | return -ENODEV; | 277 | return -ENODEV; |
| 357 | } | 278 | } |
| 358 | 279 | ||
| 359 | 280 | list_move_tail(&cb->list, &dev->ctrl_rd_list.list); | |
| 360 | cl->status = 0; | 281 | cl->timer_count = MEI_CONNECT_TIMEOUT; |
| 361 | cb->buf_idx += mei_hdr.length; | ||
| 362 | if (mei_hdr.msg_complete) { | ||
| 363 | if (mei_cl_flow_ctrl_reduce(cl)) | ||
| 364 | return -ENODEV; | ||
| 365 | list_move_tail(&cb->list, &dev->write_waiting_list.list); | ||
| 366 | } | ||
| 367 | |||
| 368 | return 0; | 282 | return 0; |
| 369 | } | 283 | } |
| 370 | 284 | ||
| 285 | |||
| 371 | /** | 286 | /** |
| 372 | * mei_irq_read_handler - bottom half read routine after ISR to | 287 | * mei_irq_read_handler - bottom half read routine after ISR to |
| 373 | * handle the read processing. | 288 | * handle the read processing. |
| @@ -481,7 +396,7 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) | |||
| 481 | { | 396 | { |
| 482 | 397 | ||
| 483 | struct mei_cl *cl; | 398 | struct mei_cl *cl; |
| 484 | struct mei_cl_cb *pos = NULL, *next = NULL; | 399 | struct mei_cl_cb *cb, *next; |
| 485 | struct mei_cl_cb *list; | 400 | struct mei_cl_cb *list; |
| 486 | s32 slots; | 401 | s32 slots; |
| 487 | int ret; | 402 | int ret; |
| @@ -498,19 +413,19 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) | |||
| 498 | dev_dbg(&dev->pdev->dev, "complete all waiting for write cb.\n"); | 413 | dev_dbg(&dev->pdev->dev, "complete all waiting for write cb.\n"); |
| 499 | 414 | ||
| 500 | list = &dev->write_waiting_list; | 415 | list = &dev->write_waiting_list; |
| 501 | list_for_each_entry_safe(pos, next, &list->list, list) { | 416 | list_for_each_entry_safe(cb, next, &list->list, list) { |
| 502 | cl = pos->cl; | 417 | cl = cb->cl; |
| 503 | if (cl == NULL) | 418 | if (cl == NULL) |
| 504 | continue; | 419 | continue; |
| 505 | 420 | ||
| 506 | cl->status = 0; | 421 | cl->status = 0; |
| 507 | list_del(&pos->list); | 422 | list_del(&cb->list); |
| 508 | if (MEI_WRITING == cl->writing_state && | 423 | if (MEI_WRITING == cl->writing_state && |
| 509 | pos->fop_type == MEI_FOP_WRITE && | 424 | cb->fop_type == MEI_FOP_WRITE && |
| 510 | cl != &dev->iamthif_cl) { | 425 | cl != &dev->iamthif_cl) { |
| 511 | dev_dbg(&dev->pdev->dev, "MEI WRITE COMPLETE\n"); | 426 | dev_dbg(&dev->pdev->dev, "MEI WRITE COMPLETE\n"); |
| 512 | cl->writing_state = MEI_WRITE_COMPLETE; | 427 | cl->writing_state = MEI_WRITE_COMPLETE; |
| 513 | list_add_tail(&pos->list, &cmpl_list->list); | 428 | list_add_tail(&cb->list, &cmpl_list->list); |
| 514 | } | 429 | } |
| 515 | if (cl == &dev->iamthif_cl) { | 430 | if (cl == &dev->iamthif_cl) { |
| 516 | dev_dbg(&dev->pdev->dev, "check iamthif flow control.\n"); | 431 | dev_dbg(&dev->pdev->dev, "check iamthif flow control.\n"); |
| @@ -552,25 +467,23 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) | |||
| 552 | 467 | ||
| 553 | /* complete control write list CB */ | 468 | /* complete control write list CB */ |
| 554 | dev_dbg(&dev->pdev->dev, "complete control write list cb.\n"); | 469 | dev_dbg(&dev->pdev->dev, "complete control write list cb.\n"); |
| 555 | list_for_each_entry_safe(pos, next, &dev->ctrl_wr_list.list, list) { | 470 | list_for_each_entry_safe(cb, next, &dev->ctrl_wr_list.list, list) { |
| 556 | cl = pos->cl; | 471 | cl = cb->cl; |
| 557 | if (!cl) { | 472 | if (!cl) { |
| 558 | list_del(&pos->list); | 473 | list_del(&cb->list); |
| 559 | return -ENODEV; | 474 | return -ENODEV; |
| 560 | } | 475 | } |
| 561 | switch (pos->fop_type) { | 476 | switch (cb->fop_type) { |
| 562 | case MEI_FOP_CLOSE: | 477 | case MEI_FOP_CLOSE: |
| 563 | /* send disconnect message */ | 478 | /* send disconnect message */ |
| 564 | ret = _mei_irq_thread_close(dev, &slots, pos, | 479 | ret = mei_cl_irq_close(cl, cb, &slots, cmpl_list); |
| 565 | cl, cmpl_list); | ||
| 566 | if (ret) | 480 | if (ret) |
| 567 | return ret; | 481 | return ret; |
| 568 | 482 | ||
| 569 | break; | 483 | break; |
| 570 | case MEI_FOP_READ: | 484 | case MEI_FOP_READ: |
| 571 | /* send flow control message */ | 485 | /* send flow control message */ |
| 572 | ret = _mei_irq_thread_read(dev, &slots, pos, | 486 | ret = mei_cl_irq_read(cl, cb, &slots, cmpl_list); |
| 573 | cl, cmpl_list); | ||
| 574 | if (ret) | 487 | if (ret) |
| 575 | return ret; | 488 | return ret; |
| 576 | 489 | ||
| @@ -579,8 +492,7 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) | |||
| 579 | /* connect message */ | 492 | /* connect message */ |
| 580 | if (mei_cl_is_other_connecting(cl)) | 493 | if (mei_cl_is_other_connecting(cl)) |
| 581 | continue; | 494 | continue; |
| 582 | ret = _mei_irq_thread_ioctl(dev, &slots, pos, | 495 | ret = mei_cl_irq_ioctl(cl, cb, &slots, cmpl_list); |
| 583 | cl, cmpl_list); | ||
| 584 | if (ret) | 496 | if (ret) |
| 585 | return ret; | 497 | return ret; |
| 586 | 498 | ||
| @@ -593,8 +505,8 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) | |||
| 593 | } | 505 | } |
| 594 | /* complete write list CB */ | 506 | /* complete write list CB */ |
| 595 | dev_dbg(&dev->pdev->dev, "complete write list cb.\n"); | 507 | dev_dbg(&dev->pdev->dev, "complete write list cb.\n"); |
| 596 | list_for_each_entry_safe(pos, next, &dev->write_list.list, list) { | 508 | list_for_each_entry_safe(cb, next, &dev->write_list.list, list) { |
| 597 | cl = pos->cl; | 509 | cl = cb->cl; |
| 598 | if (cl == NULL) | 510 | if (cl == NULL) |
| 599 | continue; | 511 | continue; |
| 600 | if (mei_cl_flow_ctrl_creds(cl) <= 0) { | 512 | if (mei_cl_flow_ctrl_creds(cl) <= 0) { |
| @@ -605,14 +517,13 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) | |||
| 605 | } | 517 | } |
| 606 | 518 | ||
| 607 | if (cl == &dev->iamthif_cl) | 519 | if (cl == &dev->iamthif_cl) |
| 608 | ret = mei_amthif_irq_write_complete(dev, &slots, | 520 | ret = mei_amthif_irq_write_complete(cl, cb, |
| 609 | pos, cmpl_list); | 521 | &slots, cmpl_list); |
| 610 | else | 522 | else |
| 611 | ret = mei_irq_thread_write_complete(dev, &slots, pos, | 523 | ret = mei_cl_irq_write_complete(cl, cb, |
| 612 | cmpl_list); | 524 | &slots, cmpl_list); |
| 613 | if (ret) | 525 | if (ret) |
| 614 | return ret; | 526 | return ret; |
| 615 | |||
| 616 | } | 527 | } |
| 617 | return 0; | 528 | return 0; |
| 618 | } | 529 | } |
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c index 053139f61086..5e11b5b9b65d 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c | |||
| @@ -194,7 +194,6 @@ static ssize_t mei_read(struct file *file, char __user *ubuf, | |||
| 194 | struct mei_cl_cb *cb_pos = NULL; | 194 | struct mei_cl_cb *cb_pos = NULL; |
| 195 | struct mei_cl_cb *cb = NULL; | 195 | struct mei_cl_cb *cb = NULL; |
| 196 | struct mei_device *dev; | 196 | struct mei_device *dev; |
| 197 | int i; | ||
| 198 | int rets; | 197 | int rets; |
| 199 | int err; | 198 | int err; |
| 200 | 199 | ||
| @@ -210,38 +209,26 @@ static ssize_t mei_read(struct file *file, char __user *ubuf, | |||
| 210 | goto out; | 209 | goto out; |
| 211 | } | 210 | } |
| 212 | 211 | ||
| 213 | if ((cl->sm_state & MEI_WD_STATE_INDEPENDENCE_MSG_SENT) == 0) { | ||
| 214 | /* Do not allow to read watchdog client */ | ||
| 215 | i = mei_me_cl_by_uuid(dev, &mei_wd_guid); | ||
| 216 | if (i >= 0) { | ||
| 217 | struct mei_me_client *me_client = &dev->me_clients[i]; | ||
| 218 | if (cl->me_client_id == me_client->client_id) { | ||
| 219 | rets = -EBADF; | ||
| 220 | goto out; | ||
| 221 | } | ||
| 222 | } | ||
| 223 | } else { | ||
| 224 | cl->sm_state &= ~MEI_WD_STATE_INDEPENDENCE_MSG_SENT; | ||
| 225 | } | ||
| 226 | |||
| 227 | if (cl == &dev->iamthif_cl) { | 212 | if (cl == &dev->iamthif_cl) { |
| 228 | rets = mei_amthif_read(dev, file, ubuf, length, offset); | 213 | rets = mei_amthif_read(dev, file, ubuf, length, offset); |
| 229 | goto out; | 214 | goto out; |
| 230 | } | 215 | } |
| 231 | 216 | ||
| 232 | if (cl->read_cb && cl->read_cb->buf_idx > *offset) { | 217 | if (cl->read_cb) { |
| 233 | cb = cl->read_cb; | ||
| 234 | goto copy_buffer; | ||
| 235 | } else if (cl->read_cb && cl->read_cb->buf_idx > 0 && | ||
| 236 | cl->read_cb->buf_idx <= *offset) { | ||
| 237 | cb = cl->read_cb; | 218 | cb = cl->read_cb; |
| 238 | rets = 0; | 219 | /* read what left */ |
| 239 | goto free; | 220 | if (cb->buf_idx > *offset) |
| 240 | } else if ((!cl->read_cb || !cl->read_cb->buf_idx) && *offset > 0) { | 221 | goto copy_buffer; |
| 241 | /*Offset needs to be cleaned for contiguous reads*/ | 222 | /* offset is beyond buf_idx we have no more data return 0 */ |
| 223 | if (cb->buf_idx > 0 && cb->buf_idx <= *offset) { | ||
| 224 | rets = 0; | ||
| 225 | goto free; | ||
| 226 | } | ||
| 227 | /* Offset needs to be cleaned for contiguous reads*/ | ||
| 228 | if (cb->buf_idx == 0 && *offset > 0) | ||
| 229 | *offset = 0; | ||
| 230 | } else if (*offset > 0) { | ||
| 242 | *offset = 0; | 231 | *offset = 0; |
| 243 | rets = 0; | ||
| 244 | goto out; | ||
| 245 | } | 232 | } |
| 246 | 233 | ||
| 247 | err = mei_cl_read_start(cl, length); | 234 | err = mei_cl_read_start(cl, length); |
| @@ -420,16 +407,6 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf, | |||
| 420 | if (rets) | 407 | if (rets) |
| 421 | goto out; | 408 | goto out; |
| 422 | 409 | ||
| 423 | cl->sm_state = 0; | ||
| 424 | if (length == 4 && | ||
| 425 | ((memcmp(mei_wd_state_independence_msg[0], | ||
| 426 | write_cb->request_buffer.data, 4) == 0) || | ||
| 427 | (memcmp(mei_wd_state_independence_msg[1], | ||
| 428 | write_cb->request_buffer.data, 4) == 0) || | ||
| 429 | (memcmp(mei_wd_state_independence_msg[2], | ||
| 430 | write_cb->request_buffer.data, 4) == 0))) | ||
| 431 | cl->sm_state |= MEI_WD_STATE_INDEPENDENCE_MSG_SENT; | ||
| 432 | |||
| 433 | if (cl == &dev->iamthif_cl) { | 410 | if (cl == &dev->iamthif_cl) { |
| 434 | rets = mei_amthif_write(dev, write_cb); | 411 | rets = mei_amthif_write(dev, write_cb); |
| 435 | 412 | ||
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 4de5140e7379..7b918b2fb894 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h | |||
| @@ -56,11 +56,6 @@ extern const uuid_le mei_amthif_guid; | |||
| 56 | extern const uuid_le mei_wd_guid; | 56 | extern const uuid_le mei_wd_guid; |
| 57 | 57 | ||
| 58 | /* | 58 | /* |
| 59 | * Watchdog independence state message | ||
| 60 | */ | ||
| 61 | extern const u8 mei_wd_state_independence_msg[3][4]; | ||
| 62 | |||
| 63 | /* | ||
| 64 | * Number of Maximum MEI Clients | 59 | * Number of Maximum MEI Clients |
| 65 | */ | 60 | */ |
| 66 | #define MEI_CLIENTS_MAX 256 | 61 | #define MEI_CLIENTS_MAX 256 |
| @@ -201,7 +196,6 @@ struct mei_cl { | |||
| 201 | u8 timer_count; | 196 | u8 timer_count; |
| 202 | enum mei_file_transaction_states reading_state; | 197 | enum mei_file_transaction_states reading_state; |
| 203 | enum mei_file_transaction_states writing_state; | 198 | enum mei_file_transaction_states writing_state; |
| 204 | int sm_state; | ||
| 205 | struct mei_cl_cb *read_cb; | 199 | struct mei_cl_cb *read_cb; |
| 206 | 200 | ||
| 207 | /* MEI CL bus data */ | 201 | /* MEI CL bus data */ |
| @@ -239,7 +233,7 @@ struct mei_hw_ops { | |||
| 239 | bool (*host_is_ready) (struct mei_device *dev); | 233 | bool (*host_is_ready) (struct mei_device *dev); |
| 240 | 234 | ||
| 241 | bool (*hw_is_ready) (struct mei_device *dev); | 235 | bool (*hw_is_ready) (struct mei_device *dev); |
| 242 | void (*hw_reset) (struct mei_device *dev, bool enable); | 236 | int (*hw_reset) (struct mei_device *dev, bool enable); |
| 243 | int (*hw_start) (struct mei_device *dev); | 237 | int (*hw_start) (struct mei_device *dev); |
| 244 | void (*hw_config) (struct mei_device *dev); | 238 | void (*hw_config) (struct mei_device *dev); |
| 245 | 239 | ||
| @@ -502,8 +496,8 @@ struct mei_cl_cb *mei_amthif_find_read_list_entry(struct mei_device *dev, | |||
| 502 | 496 | ||
| 503 | void mei_amthif_run_next_cmd(struct mei_device *dev); | 497 | void mei_amthif_run_next_cmd(struct mei_device *dev); |
| 504 | 498 | ||
| 505 | int mei_amthif_irq_write_complete(struct mei_device *dev, s32 *slots, | 499 | int mei_amthif_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, |
| 506 | struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list); | 500 | s32 *slots, struct mei_cl_cb *cmpl_list); |
| 507 | 501 | ||
| 508 | void mei_amthif_complete(struct mei_device *dev, struct mei_cl_cb *cb); | 502 | void mei_amthif_complete(struct mei_device *dev, struct mei_cl_cb *cb); |
| 509 | int mei_amthif_irq_read_msg(struct mei_device *dev, | 503 | int mei_amthif_irq_read_msg(struct mei_device *dev, |
| @@ -522,15 +516,6 @@ void mei_nfc_host_exit(void); | |||
| 522 | */ | 516 | */ |
| 523 | extern const uuid_le mei_nfc_guid; | 517 | extern const uuid_le mei_nfc_guid; |
| 524 | 518 | ||
| 525 | int mei_amthif_irq_write_complete(struct mei_device *dev, s32 *slots, | ||
| 526 | struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list); | ||
| 527 | |||
| 528 | void mei_amthif_complete(struct mei_device *dev, struct mei_cl_cb *cb); | ||
| 529 | int mei_amthif_irq_read_message(struct mei_cl_cb *complete_list, | ||
| 530 | struct mei_device *dev, struct mei_msg_hdr *mei_hdr); | ||
| 531 | int mei_amthif_irq_read(struct mei_device *dev, s32 *slots); | ||
| 532 | |||
| 533 | |||
| 534 | int mei_wd_send(struct mei_device *dev); | 519 | int mei_wd_send(struct mei_device *dev); |
| 535 | int mei_wd_stop(struct mei_device *dev); | 520 | int mei_wd_stop(struct mei_device *dev); |
| 536 | int mei_wd_host_init(struct mei_device *dev); | 521 | int mei_wd_host_init(struct mei_device *dev); |
| @@ -554,14 +539,14 @@ static inline void mei_hw_config(struct mei_device *dev) | |||
| 554 | { | 539 | { |
| 555 | dev->ops->hw_config(dev); | 540 | dev->ops->hw_config(dev); |
| 556 | } | 541 | } |
| 557 | static inline void mei_hw_reset(struct mei_device *dev, bool enable) | 542 | static inline int mei_hw_reset(struct mei_device *dev, bool enable) |
| 558 | { | 543 | { |
| 559 | dev->ops->hw_reset(dev, enable); | 544 | return dev->ops->hw_reset(dev, enable); |
| 560 | } | 545 | } |
| 561 | 546 | ||
| 562 | static inline void mei_hw_start(struct mei_device *dev) | 547 | static inline int mei_hw_start(struct mei_device *dev) |
| 563 | { | 548 | { |
| 564 | dev->ops->hw_start(dev); | 549 | return dev->ops->hw_start(dev); |
| 565 | } | 550 | } |
| 566 | 551 | ||
| 567 | static inline void mei_clear_interrupts(struct mei_device *dev) | 552 | static inline void mei_clear_interrupts(struct mei_device *dev) |
diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index 0f268329bd3a..1b3844e82379 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c | |||
| @@ -43,9 +43,6 @@ | |||
| 43 | #include "hw-me.h" | 43 | #include "hw-me.h" |
| 44 | #include "client.h" | 44 | #include "client.h" |
| 45 | 45 | ||
| 46 | /* AMT device is a singleton on the platform */ | ||
| 47 | static struct pci_dev *mei_pdev; | ||
| 48 | |||
| 49 | /* mei_pci_tbl - PCI Device ID Table */ | 46 | /* mei_pci_tbl - PCI Device ID Table */ |
| 50 | static DEFINE_PCI_DEVICE_TABLE(mei_me_pci_tbl) = { | 47 | static DEFINE_PCI_DEVICE_TABLE(mei_me_pci_tbl) = { |
| 51 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82946GZ)}, | 48 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82946GZ)}, |
| @@ -88,8 +85,6 @@ static DEFINE_PCI_DEVICE_TABLE(mei_me_pci_tbl) = { | |||
| 88 | 85 | ||
| 89 | MODULE_DEVICE_TABLE(pci, mei_me_pci_tbl); | 86 | MODULE_DEVICE_TABLE(pci, mei_me_pci_tbl); |
| 90 | 87 | ||
| 91 | static DEFINE_MUTEX(mei_mutex); | ||
| 92 | |||
| 93 | /** | 88 | /** |
| 94 | * mei_quirk_probe - probe for devices that doesn't valid ME interface | 89 | * mei_quirk_probe - probe for devices that doesn't valid ME interface |
| 95 | * | 90 | * |
| @@ -126,17 +121,12 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 126 | struct mei_me_hw *hw; | 121 | struct mei_me_hw *hw; |
| 127 | int err; | 122 | int err; |
| 128 | 123 | ||
| 129 | mutex_lock(&mei_mutex); | ||
| 130 | 124 | ||
| 131 | if (!mei_me_quirk_probe(pdev, ent)) { | 125 | if (!mei_me_quirk_probe(pdev, ent)) { |
| 132 | err = -ENODEV; | 126 | err = -ENODEV; |
| 133 | goto end; | 127 | goto end; |
| 134 | } | 128 | } |
| 135 | 129 | ||
| 136 | if (mei_pdev) { | ||
| 137 | err = -EEXIST; | ||
| 138 | goto end; | ||
| 139 | } | ||
| 140 | /* enable pci dev */ | 130 | /* enable pci dev */ |
| 141 | err = pci_enable_device(pdev); | 131 | err = pci_enable_device(pdev); |
| 142 | if (err) { | 132 | if (err) { |
| @@ -195,13 +185,10 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 195 | if (err) | 185 | if (err) |
| 196 | goto release_irq; | 186 | goto release_irq; |
| 197 | 187 | ||
| 198 | mei_pdev = pdev; | ||
| 199 | pci_set_drvdata(pdev, dev); | 188 | pci_set_drvdata(pdev, dev); |
| 200 | 189 | ||
| 201 | schedule_delayed_work(&dev->timer_work, HZ); | 190 | schedule_delayed_work(&dev->timer_work, HZ); |
| 202 | 191 | ||
| 203 | mutex_unlock(&mei_mutex); | ||
| 204 | |||
| 205 | pr_debug("initialization successful.\n"); | 192 | pr_debug("initialization successful.\n"); |
| 206 | 193 | ||
| 207 | return 0; | 194 | return 0; |
| @@ -220,7 +207,6 @@ release_regions: | |||
| 220 | disable_device: | 207 | disable_device: |
| 221 | pci_disable_device(pdev); | 208 | pci_disable_device(pdev); |
| 222 | end: | 209 | end: |
| 223 | mutex_unlock(&mei_mutex); | ||
| 224 | dev_err(&pdev->dev, "initialization failed.\n"); | 210 | dev_err(&pdev->dev, "initialization failed.\n"); |
| 225 | return err; | 211 | return err; |
| 226 | } | 212 | } |
| @@ -238,9 +224,6 @@ static void mei_me_remove(struct pci_dev *pdev) | |||
| 238 | struct mei_device *dev; | 224 | struct mei_device *dev; |
| 239 | struct mei_me_hw *hw; | 225 | struct mei_me_hw *hw; |
| 240 | 226 | ||
| 241 | if (mei_pdev != pdev) | ||
| 242 | return; | ||
| 243 | |||
| 244 | dev = pci_get_drvdata(pdev); | 227 | dev = pci_get_drvdata(pdev); |
| 245 | if (!dev) | 228 | if (!dev) |
| 246 | return; | 229 | return; |
| @@ -251,8 +234,6 @@ static void mei_me_remove(struct pci_dev *pdev) | |||
| 251 | dev_err(&pdev->dev, "stop\n"); | 234 | dev_err(&pdev->dev, "stop\n"); |
| 252 | mei_stop(dev); | 235 | mei_stop(dev); |
| 253 | 236 | ||
| 254 | mei_pdev = NULL; | ||
| 255 | |||
| 256 | /* disable interrupts */ | 237 | /* disable interrupts */ |
| 257 | mei_disable_interrupts(dev); | 238 | mei_disable_interrupts(dev); |
| 258 | 239 | ||
diff --git a/drivers/misc/mei/wd.c b/drivers/misc/mei/wd.c index 6251a4ee7067..b8921432e89d 100644 --- a/drivers/misc/mei/wd.c +++ b/drivers/misc/mei/wd.c | |||
| @@ -31,12 +31,6 @@ | |||
| 31 | static const u8 mei_start_wd_params[] = { 0x02, 0x12, 0x13, 0x10 }; | 31 | static const u8 mei_start_wd_params[] = { 0x02, 0x12, 0x13, 0x10 }; |
| 32 | static const u8 mei_stop_wd_params[] = { 0x02, 0x02, 0x14, 0x10 }; | 32 | static const u8 mei_stop_wd_params[] = { 0x02, 0x02, 0x14, 0x10 }; |
| 33 | 33 | ||
| 34 | const u8 mei_wd_state_independence_msg[3][4] = { | ||
| 35 | {0x05, 0x02, 0x51, 0x10}, | ||
| 36 | {0x05, 0x02, 0x52, 0x10}, | ||
| 37 | {0x07, 0x02, 0x01, 0x10} | ||
| 38 | }; | ||
| 39 | |||
| 40 | /* | 34 | /* |
| 41 | * AMT Watchdog Device | 35 | * AMT Watchdog Device |
| 42 | */ | 36 | */ |
diff --git a/drivers/misc/pch_phub.c b/drivers/misc/pch_phub.c index 931e635aa491..a5925f7f17f6 100644 --- a/drivers/misc/pch_phub.c +++ b/drivers/misc/pch_phub.c | |||
| @@ -633,17 +633,13 @@ static ssize_t show_pch_mac(struct device *dev, struct device_attribute *attr, | |||
| 633 | static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr, | 633 | static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr, |
| 634 | const char *buf, size_t count) | 634 | const char *buf, size_t count) |
| 635 | { | 635 | { |
| 636 | u8 mac[6]; | 636 | u8 mac[ETH_ALEN]; |
| 637 | ssize_t rom_size; | 637 | ssize_t rom_size; |
| 638 | struct pch_phub_reg *chip = dev_get_drvdata(dev); | 638 | struct pch_phub_reg *chip = dev_get_drvdata(dev); |
| 639 | 639 | ||
| 640 | if (count != 18) | 640 | if (!mac_pton(buf, mac)) |
| 641 | return -EINVAL; | 641 | return -EINVAL; |
| 642 | 642 | ||
| 643 | sscanf(buf, "%02x:%02x:%02x:%02x:%02x:%02x", | ||
| 644 | (u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], (u32 *)&mac[3], | ||
| 645 | (u32 *)&mac[4], (u32 *)&mac[5]); | ||
| 646 | |||
| 647 | chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size); | 643 | chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size); |
| 648 | if (!chip->pch_phub_extrom_base_address) | 644 | if (!chip->pch_phub_extrom_base_address) |
| 649 | return -ENOMEM; | 645 | return -ENOMEM; |
| @@ -669,8 +665,6 @@ static struct bin_attribute pch_bin_attr = { | |||
| 669 | static int pch_phub_probe(struct pci_dev *pdev, | 665 | static int pch_phub_probe(struct pci_dev *pdev, |
| 670 | const struct pci_device_id *id) | 666 | const struct pci_device_id *id) |
| 671 | { | 667 | { |
| 672 | int retval; | ||
| 673 | |||
| 674 | int ret; | 668 | int ret; |
| 675 | struct pch_phub_reg *chip; | 669 | struct pch_phub_reg *chip; |
| 676 | 670 | ||
| @@ -713,13 +707,13 @@ static int pch_phub_probe(struct pci_dev *pdev, | |||
| 713 | if (id->driver_data == 1) { /* EG20T PCH */ | 707 | if (id->driver_data == 1) { /* EG20T PCH */ |
| 714 | const char *board_name; | 708 | const char *board_name; |
| 715 | 709 | ||
| 716 | retval = sysfs_create_file(&pdev->dev.kobj, | 710 | ret = sysfs_create_file(&pdev->dev.kobj, |
| 717 | &dev_attr_pch_mac.attr); | 711 | &dev_attr_pch_mac.attr); |
| 718 | if (retval) | 712 | if (ret) |
| 719 | goto err_sysfs_create; | 713 | goto err_sysfs_create; |
| 720 | 714 | ||
| 721 | retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); | 715 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); |
| 722 | if (retval) | 716 | if (ret) |
| 723 | goto exit_bin_attr; | 717 | goto exit_bin_attr; |
| 724 | 718 | ||
| 725 | pch_phub_read_modify_write_reg(chip, | 719 | pch_phub_read_modify_write_reg(chip, |
| @@ -743,8 +737,8 @@ static int pch_phub_probe(struct pci_dev *pdev, | |||
| 743 | chip->pch_opt_rom_start_address = PCH_PHUB_ROM_START_ADDR_EG20T; | 737 | chip->pch_opt_rom_start_address = PCH_PHUB_ROM_START_ADDR_EG20T; |
| 744 | chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_EG20T; | 738 | chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_EG20T; |
| 745 | } else if (id->driver_data == 2) { /* ML7213 IOH */ | 739 | } else if (id->driver_data == 2) { /* ML7213 IOH */ |
| 746 | retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); | 740 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); |
| 747 | if (retval) | 741 | if (ret) |
| 748 | goto err_sysfs_create; | 742 | goto err_sysfs_create; |
| 749 | /* set the prefech value | 743 | /* set the prefech value |
| 750 | * Device2(USB OHCI #1/ USB EHCI #1/ USB Device):a | 744 | * Device2(USB OHCI #1/ USB EHCI #1/ USB Device):a |
| @@ -766,12 +760,12 @@ static int pch_phub_probe(struct pci_dev *pdev, | |||
| 766 | PCH_PHUB_ROM_START_ADDR_ML7223; | 760 | PCH_PHUB_ROM_START_ADDR_ML7223; |
| 767 | chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223; | 761 | chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223; |
| 768 | } else if (id->driver_data == 4) { /* ML7223 IOH Bus-n*/ | 762 | } else if (id->driver_data == 4) { /* ML7223 IOH Bus-n*/ |
| 769 | retval = sysfs_create_file(&pdev->dev.kobj, | 763 | ret = sysfs_create_file(&pdev->dev.kobj, |
| 770 | &dev_attr_pch_mac.attr); | 764 | &dev_attr_pch_mac.attr); |
| 771 | if (retval) | 765 | if (ret) |
| 772 | goto err_sysfs_create; | 766 | goto err_sysfs_create; |
| 773 | retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); | 767 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); |
| 774 | if (retval) | 768 | if (ret) |
| 775 | goto exit_bin_attr; | 769 | goto exit_bin_attr; |
| 776 | /* set the prefech value | 770 | /* set the prefech value |
| 777 | * Device2(USB OHCI #0,1,2,3/ USB EHCI #0):a | 771 | * Device2(USB OHCI #0,1,2,3/ USB EHCI #0):a |
| @@ -783,13 +777,13 @@ static int pch_phub_probe(struct pci_dev *pdev, | |||
| 783 | PCH_PHUB_ROM_START_ADDR_ML7223; | 777 | PCH_PHUB_ROM_START_ADDR_ML7223; |
| 784 | chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223; | 778 | chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223; |
| 785 | } else if (id->driver_data == 5) { /* ML7831 */ | 779 | } else if (id->driver_data == 5) { /* ML7831 */ |
| 786 | retval = sysfs_create_file(&pdev->dev.kobj, | 780 | ret = sysfs_create_file(&pdev->dev.kobj, |
| 787 | &dev_attr_pch_mac.attr); | 781 | &dev_attr_pch_mac.attr); |
| 788 | if (retval) | 782 | if (ret) |
| 789 | goto err_sysfs_create; | 783 | goto err_sysfs_create; |
| 790 | 784 | ||
| 791 | retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); | 785 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); |
| 792 | if (retval) | 786 | if (ret) |
| 793 | goto exit_bin_attr; | 787 | goto exit_bin_attr; |
| 794 | 788 | ||
| 795 | /* set the prefech value */ | 789 | /* set the prefech value */ |
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index c4acac74725c..f74fc0ca2ef9 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c | |||
| @@ -876,8 +876,9 @@ int gru_set_context_option(unsigned long arg) | |||
| 876 | switch (req.op) { | 876 | switch (req.op) { |
| 877 | case sco_blade_chiplet: | 877 | case sco_blade_chiplet: |
| 878 | /* Select blade/chiplet for GRU context */ | 878 | /* Select blade/chiplet for GRU context */ |
| 879 | if (req.val1 < -1 || req.val1 >= GRU_MAX_BLADES || !gru_base[req.val1] || | 879 | if (req.val0 < -1 || req.val0 >= GRU_CHIPLETS_PER_HUB || |
| 880 | req.val0 < -1 || req.val0 >= GRU_CHIPLETS_PER_HUB) { | 880 | req.val1 < -1 || req.val1 >= GRU_MAX_BLADES || |
| 881 | (req.val1 >= 0 && !gru_base[req.val1])) { | ||
| 881 | ret = -EINVAL; | 882 | ret = -EINVAL; |
| 882 | } else { | 883 | } else { |
| 883 | gts->ts_user_blade_id = req.val1; | 884 | gts->ts_user_blade_id = req.val1; |
diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c index 797d7962cc88..4f7635922394 100644 --- a/drivers/misc/sgi-gru/gruprocfs.c +++ b/drivers/misc/sgi-gru/gruprocfs.c | |||
| @@ -160,15 +160,11 @@ static int options_show(struct seq_file *s, void *p) | |||
| 160 | static ssize_t options_write(struct file *file, const char __user *userbuf, | 160 | static ssize_t options_write(struct file *file, const char __user *userbuf, |
| 161 | size_t count, loff_t *data) | 161 | size_t count, loff_t *data) |
| 162 | { | 162 | { |
| 163 | char buf[20]; | 163 | int ret; |
| 164 | 164 | ||
| 165 | if (count >= sizeof(buf)) | 165 | ret = kstrtoul_from_user(userbuf, count, 0, &gru_options); |
| 166 | return -EINVAL; | 166 | if (ret) |
| 167 | if (copy_from_user(buf, userbuf, count)) | 167 | return ret; |
| 168 | return -EFAULT; | ||
| 169 | buf[count] = '\0'; | ||
| 170 | if (strict_strtoul(buf, 0, &gru_options)) | ||
| 171 | return -EINVAL; | ||
| 172 | 168 | ||
| 173 | return count; | 169 | return count; |
| 174 | } | 170 | } |
diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c index d971817182f7..82dc5748f873 100644 --- a/drivers/misc/sgi-xp/xpc_main.c +++ b/drivers/misc/sgi-xp/xpc_main.c | |||
| @@ -92,7 +92,7 @@ int xpc_disengage_timelimit = XPC_DISENGAGE_DEFAULT_TIMELIMIT; | |||
| 92 | static int xpc_disengage_min_timelimit; /* = 0 */ | 92 | static int xpc_disengage_min_timelimit; /* = 0 */ |
| 93 | static int xpc_disengage_max_timelimit = 120; | 93 | static int xpc_disengage_max_timelimit = 120; |
| 94 | 94 | ||
| 95 | static ctl_table xpc_sys_xpc_hb_dir[] = { | 95 | static struct ctl_table xpc_sys_xpc_hb_dir[] = { |
| 96 | { | 96 | { |
| 97 | .procname = "hb_interval", | 97 | .procname = "hb_interval", |
| 98 | .data = &xpc_hb_interval, | 98 | .data = &xpc_hb_interval, |
| @@ -111,7 +111,7 @@ static ctl_table xpc_sys_xpc_hb_dir[] = { | |||
| 111 | .extra2 = &xpc_hb_check_max_interval}, | 111 | .extra2 = &xpc_hb_check_max_interval}, |
| 112 | {} | 112 | {} |
| 113 | }; | 113 | }; |
| 114 | static ctl_table xpc_sys_xpc_dir[] = { | 114 | static struct ctl_table xpc_sys_xpc_dir[] = { |
| 115 | { | 115 | { |
| 116 | .procname = "hb", | 116 | .procname = "hb", |
| 117 | .mode = 0555, | 117 | .mode = 0555, |
| @@ -126,7 +126,7 @@ static ctl_table xpc_sys_xpc_dir[] = { | |||
| 126 | .extra2 = &xpc_disengage_max_timelimit}, | 126 | .extra2 = &xpc_disengage_max_timelimit}, |
| 127 | {} | 127 | {} |
| 128 | }; | 128 | }; |
| 129 | static ctl_table xpc_sys_dir[] = { | 129 | static struct ctl_table xpc_sys_dir[] = { |
| 130 | { | 130 | { |
| 131 | .procname = "xpc", | 131 | .procname = "xpc", |
| 132 | .mode = 0555, | 132 | .mode = 0555, |
diff --git a/drivers/misc/spear13xx_pcie_gadget.c b/drivers/misc/spear13xx_pcie_gadget.c index 7deb25dc86a7..2e13614d41e8 100644 --- a/drivers/misc/spear13xx_pcie_gadget.c +++ b/drivers/misc/spear13xx_pcie_gadget.c | |||
| @@ -316,8 +316,12 @@ static ssize_t pcie_gadget_store_no_of_msi( | |||
| 316 | struct spear_pcie_gadget_config *config, | 316 | struct spear_pcie_gadget_config *config, |
| 317 | const char *buf, size_t count) | 317 | const char *buf, size_t count) |
| 318 | { | 318 | { |
| 319 | if (strict_strtoul(buf, 0, &config->requested_msi)) | 319 | int ret; |
| 320 | return -EINVAL; | 320 | |
| 321 | ret = kstrtoul(buf, 0, &config->requested_msi); | ||
| 322 | if (ret) | ||
| 323 | return ret; | ||
| 324 | |||
| 321 | if (config->requested_msi > 32) | 325 | if (config->requested_msi > 32) |
| 322 | config->requested_msi = 32; | 326 | config->requested_msi = 32; |
| 323 | 327 | ||
| @@ -330,9 +334,11 @@ static ssize_t pcie_gadget_store_inta( | |||
| 330 | { | 334 | { |
| 331 | struct pcie_app_reg __iomem *app_reg = config->va_app_base; | 335 | struct pcie_app_reg __iomem *app_reg = config->va_app_base; |
| 332 | ulong en; | 336 | ulong en; |
| 337 | int ret; | ||
| 333 | 338 | ||
| 334 | if (strict_strtoul(buf, 0, &en)) | 339 | ret = kstrtoul(buf, 0, &en); |
| 335 | return -EINVAL; | 340 | if (ret) |
| 341 | return ret; | ||
| 336 | 342 | ||
| 337 | if (en) | 343 | if (en) |
| 338 | writel(readl(&app_reg->app_ctrl_0) | (1 << SYS_INT_ID), | 344 | writel(readl(&app_reg->app_ctrl_0) | (1 << SYS_INT_ID), |
| @@ -351,9 +357,11 @@ static ssize_t pcie_gadget_store_send_msi( | |||
| 351 | struct pcie_app_reg __iomem *app_reg = config->va_app_base; | 357 | struct pcie_app_reg __iomem *app_reg = config->va_app_base; |
| 352 | ulong vector; | 358 | ulong vector; |
| 353 | u32 ven_msi; | 359 | u32 ven_msi; |
| 360 | int ret; | ||
| 354 | 361 | ||
| 355 | if (strict_strtoul(buf, 0, &vector)) | 362 | ret = kstrtoul(buf, 0, &vector); |
| 356 | return -EINVAL; | 363 | if (ret) |
| 364 | return ret; | ||
| 357 | 365 | ||
| 358 | if (!config->configured_msi) | 366 | if (!config->configured_msi) |
| 359 | return -EINVAL; | 367 | return -EINVAL; |
| @@ -395,9 +403,11 @@ static ssize_t pcie_gadget_store_vendor_id( | |||
| 395 | const char *buf, size_t count) | 403 | const char *buf, size_t count) |
| 396 | { | 404 | { |
| 397 | ulong id; | 405 | ulong id; |
| 406 | int ret; | ||
| 398 | 407 | ||
| 399 | if (strict_strtoul(buf, 0, &id)) | 408 | ret = kstrtoul(buf, 0, &id); |
| 400 | return -EINVAL; | 409 | if (ret) |
| 410 | return ret; | ||
| 401 | 411 | ||
| 402 | spear_dbi_write_reg(config, PCI_VENDOR_ID, 2, id); | 412 | spear_dbi_write_reg(config, PCI_VENDOR_ID, 2, id); |
| 403 | 413 | ||
| @@ -420,9 +430,11 @@ static ssize_t pcie_gadget_store_device_id( | |||
| 420 | const char *buf, size_t count) | 430 | const char *buf, size_t count) |
| 421 | { | 431 | { |
| 422 | ulong id; | 432 | ulong id; |
| 433 | int ret; | ||
| 423 | 434 | ||
| 424 | if (strict_strtoul(buf, 0, &id)) | 435 | ret = kstrtoul(buf, 0, &id); |
| 425 | return -EINVAL; | 436 | if (ret) |
| 437 | return ret; | ||
| 426 | 438 | ||
| 427 | spear_dbi_write_reg(config, PCI_DEVICE_ID, 2, id); | 439 | spear_dbi_write_reg(config, PCI_DEVICE_ID, 2, id); |
| 428 | 440 | ||
| @@ -443,9 +455,12 @@ static ssize_t pcie_gadget_store_bar0_size( | |||
| 443 | ulong size; | 455 | ulong size; |
| 444 | u32 pos, pos1; | 456 | u32 pos, pos1; |
| 445 | u32 no_of_bit = 0; | 457 | u32 no_of_bit = 0; |
| 458 | int ret; | ||
| 459 | |||
| 460 | ret = kstrtoul(buf, 0, &size); | ||
| 461 | if (ret) | ||
| 462 | return ret; | ||
| 446 | 463 | ||
| 447 | if (strict_strtoul(buf, 0, &size)) | ||
| 448 | return -EINVAL; | ||
| 449 | /* min bar size is 256 */ | 464 | /* min bar size is 256 */ |
| 450 | if (size <= 0x100) | 465 | if (size <= 0x100) |
| 451 | size = 0x100; | 466 | size = 0x100; |
| @@ -490,9 +505,11 @@ static ssize_t pcie_gadget_store_bar0_address( | |||
| 490 | { | 505 | { |
| 491 | struct pcie_app_reg __iomem *app_reg = config->va_app_base; | 506 | struct pcie_app_reg __iomem *app_reg = config->va_app_base; |
| 492 | ulong address; | 507 | ulong address; |
| 508 | int ret; | ||
| 493 | 509 | ||
| 494 | if (strict_strtoul(buf, 0, &address)) | 510 | ret = kstrtoul(buf, 0, &address); |
| 495 | return -EINVAL; | 511 | if (ret) |
| 512 | return ret; | ||
| 496 | 513 | ||
| 497 | address &= ~(config->bar0_size - 1); | 514 | address &= ~(config->bar0_size - 1); |
| 498 | if (config->va_bar0_address) | 515 | if (config->va_bar0_address) |
| @@ -518,9 +535,11 @@ static ssize_t pcie_gadget_store_bar0_rw_offset( | |||
| 518 | const char *buf, size_t count) | 535 | const char *buf, size_t count) |
| 519 | { | 536 | { |
| 520 | ulong offset; | 537 | ulong offset; |
| 538 | int ret; | ||
| 521 | 539 | ||
| 522 | if (strict_strtoul(buf, 0, &offset)) | 540 | ret = kstrtoul(buf, 0, &offset); |
| 523 | return -EINVAL; | 541 | if (ret) |
| 542 | return ret; | ||
| 524 | 543 | ||
| 525 | if (offset % 4) | 544 | if (offset % 4) |
| 526 | return -EINVAL; | 545 | return -EINVAL; |
| @@ -549,9 +568,11 @@ static ssize_t pcie_gadget_store_bar0_data( | |||
| 549 | const char *buf, size_t count) | 568 | const char *buf, size_t count) |
| 550 | { | 569 | { |
| 551 | ulong data; | 570 | ulong data; |
| 571 | int ret; | ||
| 552 | 572 | ||
| 553 | if (strict_strtoul(buf, 0, &data)) | 573 | ret = kstrtoul(buf, 0, &data); |
| 554 | return -EINVAL; | 574 | if (ret) |
| 575 | return ret; | ||
| 555 | 576 | ||
| 556 | if (!config->va_bar0_address) | 577 | if (!config->va_bar0_address) |
| 557 | return -ENOMEM; | 578 | return -ENOMEM; |
| @@ -776,7 +797,7 @@ static int spear_pcie_gadget_probe(struct platform_device *pdev) | |||
| 776 | goto err_iounmap_app; | 797 | goto err_iounmap_app; |
| 777 | } | 798 | } |
| 778 | 799 | ||
| 779 | dev_set_drvdata(&pdev->dev, target); | 800 | platform_set_drvdata(pdev, target); |
| 780 | 801 | ||
| 781 | irq = platform_get_irq(pdev, 0); | 802 | irq = platform_get_irq(pdev, 0); |
| 782 | if (irq < 0) { | 803 | if (irq < 0) { |
| @@ -814,9 +835,11 @@ static int spear_pcie_gadget_probe(struct platform_device *pdev) | |||
| 814 | clk = clk_get_sys("pcie1", NULL); | 835 | clk = clk_get_sys("pcie1", NULL); |
| 815 | if (IS_ERR(clk)) { | 836 | if (IS_ERR(clk)) { |
| 816 | pr_err("%s:couldn't get clk for pcie1\n", __func__); | 837 | pr_err("%s:couldn't get clk for pcie1\n", __func__); |
| 838 | status = PTR_ERR(clk); | ||
| 817 | goto err_irq; | 839 | goto err_irq; |
| 818 | } | 840 | } |
| 819 | if (clk_enable(clk)) { | 841 | status = clk_enable(clk); |
| 842 | if (status) { | ||
| 820 | pr_err("%s:couldn't enable clk for pcie1\n", __func__); | 843 | pr_err("%s:couldn't enable clk for pcie1\n", __func__); |
| 821 | goto err_irq; | 844 | goto err_irq; |
| 822 | } | 845 | } |
| @@ -828,9 +851,11 @@ static int spear_pcie_gadget_probe(struct platform_device *pdev) | |||
| 828 | clk = clk_get_sys("pcie2", NULL); | 851 | clk = clk_get_sys("pcie2", NULL); |
| 829 | if (IS_ERR(clk)) { | 852 | if (IS_ERR(clk)) { |
| 830 | pr_err("%s:couldn't get clk for pcie2\n", __func__); | 853 | pr_err("%s:couldn't get clk for pcie2\n", __func__); |
| 854 | status = PTR_ERR(clk); | ||
| 831 | goto err_irq; | 855 | goto err_irq; |
| 832 | } | 856 | } |
| 833 | if (clk_enable(clk)) { | 857 | status = clk_enable(clk); |
| 858 | if (status) { | ||
| 834 | pr_err("%s:couldn't enable clk for pcie2\n", __func__); | 859 | pr_err("%s:couldn't enable clk for pcie2\n", __func__); |
| 835 | goto err_irq; | 860 | goto err_irq; |
| 836 | } | 861 | } |
| @@ -863,7 +888,7 @@ static int spear_pcie_gadget_remove(struct platform_device *pdev) | |||
| 863 | res0 = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 888 | res0 = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 864 | res1 = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 889 | res1 = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
| 865 | irq = platform_get_irq(pdev, 0); | 890 | irq = platform_get_irq(pdev, 0); |
| 866 | target = dev_get_drvdata(&pdev->dev); | 891 | target = platform_get_drvdata(pdev); |
| 867 | config = &target->config; | 892 | config = &target->config; |
| 868 | 893 | ||
| 869 | free_irq(irq, NULL); | 894 | free_irq(irq, NULL); |
diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c index 437192e43006..d87cc91bc016 100644 --- a/drivers/misc/sram.c +++ b/drivers/misc/sram.c | |||
| @@ -45,15 +45,12 @@ static int sram_probe(struct platform_device *pdev) | |||
| 45 | int ret; | 45 | int ret; |
| 46 | 46 | ||
| 47 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 47 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 48 | if (!res) | 48 | virt_base = devm_ioremap_resource(&pdev->dev, res); |
| 49 | return -EINVAL; | 49 | if (IS_ERR(virt_base)) |
| 50 | return PTR_ERR(virt_base); | ||
| 50 | 51 | ||
| 51 | size = resource_size(res); | 52 | size = resource_size(res); |
| 52 | 53 | ||
| 53 | virt_base = devm_request_and_ioremap(&pdev->dev, res); | ||
| 54 | if (!virt_base) | ||
| 55 | return -EADDRNOTAVAIL; | ||
| 56 | |||
| 57 | sram = devm_kzalloc(&pdev->dev, sizeof(*sram), GFP_KERNEL); | 54 | sram = devm_kzalloc(&pdev->dev, sizeof(*sram), GFP_KERNEL); |
| 58 | if (!sram) | 55 | if (!sram) |
| 59 | return -ENOMEM; | 56 | return -ENOMEM; |
diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c index 83269f1d16e3..83907c720594 100644 --- a/drivers/misc/ti-st/st_kim.c +++ b/drivers/misc/ti-st/st_kim.c | |||
| @@ -680,7 +680,7 @@ void st_kim_ref(struct st_data_s **core_data, int id) | |||
| 680 | *core_data = NULL; | 680 | *core_data = NULL; |
| 681 | return; | 681 | return; |
| 682 | } | 682 | } |
| 683 | kim_gdata = dev_get_drvdata(&pdev->dev); | 683 | kim_gdata = platform_get_drvdata(pdev); |
| 684 | *core_data = kim_gdata->core_data; | 684 | *core_data = kim_gdata->core_data; |
| 685 | } | 685 | } |
| 686 | 686 | ||
| @@ -735,7 +735,7 @@ static int kim_probe(struct platform_device *pdev) | |||
| 735 | pr_err("no mem to allocate"); | 735 | pr_err("no mem to allocate"); |
| 736 | return -ENOMEM; | 736 | return -ENOMEM; |
| 737 | } | 737 | } |
| 738 | dev_set_drvdata(&pdev->dev, kim_gdata); | 738 | platform_set_drvdata(pdev, kim_gdata); |
| 739 | 739 | ||
| 740 | err = st_core_init(&kim_gdata->core_data); | 740 | err = st_core_init(&kim_gdata->core_data); |
| 741 | if (err != 0) { | 741 | if (err != 0) { |
| @@ -810,7 +810,7 @@ static int kim_remove(struct platform_device *pdev) | |||
| 810 | struct ti_st_plat_data *pdata = pdev->dev.platform_data; | 810 | struct ti_st_plat_data *pdata = pdev->dev.platform_data; |
| 811 | struct kim_data_s *kim_gdata; | 811 | struct kim_data_s *kim_gdata; |
| 812 | 812 | ||
| 813 | kim_gdata = dev_get_drvdata(&pdev->dev); | 813 | kim_gdata = platform_get_drvdata(pdev); |
| 814 | 814 | ||
| 815 | /* Free the Bluetooth/FM/GPIO | 815 | /* Free the Bluetooth/FM/GPIO |
| 816 | * nShutdown gpio from the system | 816 | * nShutdown gpio from the system |
diff --git a/drivers/misc/ti_dac7512.c b/drivers/misc/ti_dac7512.c index 1d86407189eb..9b237221bc4e 100644 --- a/drivers/misc/ti_dac7512.c +++ b/drivers/misc/ti_dac7512.c | |||
| @@ -33,9 +33,11 @@ static ssize_t dac7512_store_val(struct device *dev, | |||
| 33 | struct spi_device *spi = to_spi_device(dev); | 33 | struct spi_device *spi = to_spi_device(dev); |
| 34 | unsigned char tmp[2]; | 34 | unsigned char tmp[2]; |
| 35 | unsigned long val; | 35 | unsigned long val; |
| 36 | int ret; | ||
| 36 | 37 | ||
| 37 | if (strict_strtoul(buf, 10, &val) < 0) | 38 | ret = kstrtoul(buf, 10, &val); |
| 38 | return -EINVAL; | 39 | if (ret) |
| 40 | return ret; | ||
| 39 | 41 | ||
| 40 | tmp[0] = val >> 8; | 42 | tmp[0] = val >> 8; |
| 41 | tmp[1] = val & 0xff; | 43 | tmp[1] = val & 0xff; |
diff --git a/drivers/misc/tsl2550.c b/drivers/misc/tsl2550.c index 1dfde4d543db..5bc10fa193de 100644 --- a/drivers/misc/tsl2550.c +++ b/drivers/misc/tsl2550.c | |||
| @@ -204,7 +204,7 @@ static ssize_t tsl2550_store_power_state(struct device *dev, | |||
| 204 | unsigned long val = simple_strtoul(buf, NULL, 10); | 204 | unsigned long val = simple_strtoul(buf, NULL, 10); |
| 205 | int ret; | 205 | int ret; |
| 206 | 206 | ||
| 207 | if (val < 0 || val > 1) | 207 | if (val > 1) |
| 208 | return -EINVAL; | 208 | return -EINVAL; |
| 209 | 209 | ||
| 210 | mutex_lock(&data->update_lock); | 210 | mutex_lock(&data->update_lock); |
| @@ -236,7 +236,7 @@ static ssize_t tsl2550_store_operating_mode(struct device *dev, | |||
| 236 | unsigned long val = simple_strtoul(buf, NULL, 10); | 236 | unsigned long val = simple_strtoul(buf, NULL, 10); |
| 237 | int ret; | 237 | int ret; |
| 238 | 238 | ||
| 239 | if (val < 0 || val > 1) | 239 | if (val > 1) |
| 240 | return -EINVAL; | 240 | return -EINVAL; |
| 241 | 241 | ||
| 242 | if (data->power_state == 0) | 242 | if (data->power_state == 0) |
