.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * Copyright (C) 2009 ST-Ericsson SA |
---|
3 | 4 | * Copyright (C) 2009 STMicroelectronics |
---|
.. | .. |
---|
7 | 8 | * |
---|
8 | 9 | * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> |
---|
9 | 10 | * Author: Sachin Verma <sachin.verma@st.com> |
---|
10 | | - * |
---|
11 | | - * This program is free software; you can redistribute it and/or modify |
---|
12 | | - * it under the terms of the GNU General Public License version 2, as |
---|
13 | | - * published by the Free Software Foundation. |
---|
14 | 11 | */ |
---|
15 | 12 | #include <linux/init.h> |
---|
16 | 13 | #include <linux/module.h> |
---|
.. | .. |
---|
399 | 396 | * 2 whereas it is 3 for fast and fastplus mode of |
---|
400 | 397 | * operation. TODO - high speed support. |
---|
401 | 398 | */ |
---|
402 | | - div = (dev->clk_freq > 100000) ? 3 : 2; |
---|
| 399 | + div = (dev->clk_freq > I2C_MAX_STANDARD_MODE_FREQ) ? 3 : 2; |
---|
403 | 400 | |
---|
404 | 401 | /* |
---|
405 | 402 | * generate the mask for baud rate counters. The controller |
---|
.. | .. |
---|
423 | 420 | if (dev->sm > I2C_FREQ_MODE_FAST) { |
---|
424 | 421 | dev_err(&dev->adev->dev, |
---|
425 | 422 | "do not support this mode defaulting to std. mode\n"); |
---|
426 | | - brcr2 = i2c_clk/(100000 * 2) & 0xffff; |
---|
| 423 | + brcr2 = i2c_clk / (I2C_MAX_STANDARD_MODE_FREQ * 2) & 0xffff; |
---|
427 | 424 | writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR); |
---|
428 | 425 | writel(I2C_FREQ_MODE_STANDARD << 4, |
---|
429 | 426 | dev->virtbase + I2C_CR); |
---|
.. | .. |
---|
952 | 949 | { |
---|
953 | 950 | /* Default to 100 kHz if no frequency is given in the node */ |
---|
954 | 951 | if (of_property_read_u32(np, "clock-frequency", &nmk->clk_freq)) |
---|
955 | | - nmk->clk_freq = 100000; |
---|
| 952 | + nmk->clk_freq = I2C_MAX_STANDARD_MODE_FREQ; |
---|
956 | 953 | |
---|
957 | 954 | /* This driver only supports 'standard' and 'fast' modes of operation. */ |
---|
958 | | - if (nmk->clk_freq <= 100000) |
---|
| 955 | + if (nmk->clk_freq <= I2C_MAX_STANDARD_MODE_FREQ) |
---|
959 | 956 | nmk->sm = I2C_FREQ_MODE_STANDARD; |
---|
960 | 957 | else |
---|
961 | 958 | nmk->sm = I2C_FREQ_MODE_FAST; |
---|
.. | .. |
---|
973 | 970 | struct i2c_vendor_data *vendor = id->data; |
---|
974 | 971 | u32 max_fifo_threshold = (vendor->fifodepth / 2) - 1; |
---|
975 | 972 | |
---|
976 | | - dev = devm_kzalloc(&adev->dev, sizeof(struct nmk_i2c_dev), GFP_KERNEL); |
---|
977 | | - if (!dev) { |
---|
978 | | - dev_err(&adev->dev, "cannot allocate memory\n"); |
---|
979 | | - ret = -ENOMEM; |
---|
980 | | - goto err_no_mem; |
---|
981 | | - } |
---|
| 973 | + dev = devm_kzalloc(&adev->dev, sizeof(*dev), GFP_KERNEL); |
---|
| 974 | + if (!dev) |
---|
| 975 | + return -ENOMEM; |
---|
| 976 | + |
---|
982 | 977 | dev->vendor = vendor; |
---|
983 | 978 | dev->adev = adev; |
---|
984 | 979 | nmk_i2c_of_probe(np, dev); |
---|
.. | .. |
---|
999 | 994 | |
---|
1000 | 995 | dev->virtbase = devm_ioremap(&adev->dev, adev->res.start, |
---|
1001 | 996 | resource_size(&adev->res)); |
---|
1002 | | - if (!dev->virtbase) { |
---|
1003 | | - ret = -ENOMEM; |
---|
1004 | | - goto err_no_mem; |
---|
1005 | | - } |
---|
| 997 | + if (!dev->virtbase) |
---|
| 998 | + return -ENOMEM; |
---|
1006 | 999 | |
---|
1007 | 1000 | dev->irq = adev->irq[0]; |
---|
1008 | 1001 | ret = devm_request_irq(&adev->dev, dev->irq, i2c_irq_handler, 0, |
---|
1009 | 1002 | DRIVER_NAME, dev); |
---|
1010 | 1003 | if (ret) { |
---|
1011 | 1004 | dev_err(&adev->dev, "cannot claim the irq %d\n", dev->irq); |
---|
1012 | | - goto err_no_mem; |
---|
| 1005 | + return ret; |
---|
1013 | 1006 | } |
---|
1014 | 1007 | |
---|
1015 | | - dev->clk = devm_clk_get(&adev->dev, NULL); |
---|
| 1008 | + dev->clk = devm_clk_get_enabled(&adev->dev, NULL); |
---|
1016 | 1009 | if (IS_ERR(dev->clk)) { |
---|
1017 | | - dev_err(&adev->dev, "could not get i2c clock\n"); |
---|
1018 | | - ret = PTR_ERR(dev->clk); |
---|
1019 | | - goto err_no_mem; |
---|
1020 | | - } |
---|
1021 | | - |
---|
1022 | | - ret = clk_prepare_enable(dev->clk); |
---|
1023 | | - if (ret) { |
---|
1024 | | - dev_err(&adev->dev, "can't prepare_enable clock\n"); |
---|
1025 | | - goto err_no_mem; |
---|
| 1010 | + dev_err(&adev->dev, "could enable i2c clock\n"); |
---|
| 1011 | + return PTR_ERR(dev->clk); |
---|
1026 | 1012 | } |
---|
1027 | 1013 | |
---|
1028 | 1014 | init_hw(dev); |
---|
.. | .. |
---|
1045 | 1031 | |
---|
1046 | 1032 | ret = i2c_add_adapter(adap); |
---|
1047 | 1033 | if (ret) |
---|
1048 | | - goto err_no_adap; |
---|
| 1034 | + return ret; |
---|
1049 | 1035 | |
---|
1050 | 1036 | pm_runtime_put(&adev->dev); |
---|
1051 | 1037 | |
---|
1052 | 1038 | return 0; |
---|
1053 | | - |
---|
1054 | | - err_no_adap: |
---|
1055 | | - clk_disable_unprepare(dev->clk); |
---|
1056 | | - err_no_mem: |
---|
1057 | | - |
---|
1058 | | - return ret; |
---|
1059 | 1039 | } |
---|
1060 | 1040 | |
---|
1061 | | -static int nmk_i2c_remove(struct amba_device *adev) |
---|
| 1041 | +static void nmk_i2c_remove(struct amba_device *adev) |
---|
1062 | 1042 | { |
---|
1063 | | - struct resource *res = &adev->res; |
---|
1064 | 1043 | struct nmk_i2c_dev *dev = amba_get_drvdata(adev); |
---|
1065 | 1044 | |
---|
1066 | 1045 | i2c_del_adapter(&dev->adap); |
---|
.. | .. |
---|
1069 | 1048 | clear_all_interrupts(dev); |
---|
1070 | 1049 | /* disable the controller */ |
---|
1071 | 1050 | i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE); |
---|
1072 | | - clk_disable_unprepare(dev->clk); |
---|
1073 | | - if (res) |
---|
1074 | | - release_mem_region(res->start, resource_size(res)); |
---|
1075 | | - |
---|
1076 | | - return 0; |
---|
1077 | 1051 | } |
---|
1078 | 1052 | |
---|
1079 | 1053 | static struct i2c_vendor_data vendor_stn8815 = { |
---|
.. | .. |
---|
1126 | 1100 | subsys_initcall(nmk_i2c_init); |
---|
1127 | 1101 | module_exit(nmk_i2c_exit); |
---|
1128 | 1102 | |
---|
1129 | | -MODULE_AUTHOR("Sachin Verma, Srinidhi KASAGAR"); |
---|
| 1103 | +MODULE_AUTHOR("Sachin Verma"); |
---|
| 1104 | +MODULE_AUTHOR("Srinidhi KASAGAR"); |
---|
1130 | 1105 | MODULE_DESCRIPTION("Nomadik/Ux500 I2C driver"); |
---|
1131 | 1106 | MODULE_LICENSE("GPL"); |
---|