.. | .. |
---|
20 | 20 | #include <linux/io.h> |
---|
21 | 21 | #include <linux/slab.h> |
---|
22 | 22 | #include <linux/err.h> |
---|
23 | | -#include <linux/gpio.h> |
---|
| 23 | +#include <linux/gpio/driver.h> |
---|
24 | 24 | #include <linux/irqdomain.h> |
---|
25 | 25 | #include <linux/of_device.h> |
---|
26 | 26 | #include <linux/spinlock.h> |
---|
.. | .. |
---|
1002 | 1002 | return &(of_data->ctrl[id]); |
---|
1003 | 1003 | } |
---|
1004 | 1004 | |
---|
| 1005 | +static void samsung_banks_of_node_put(struct samsung_pinctrl_drv_data *d) |
---|
| 1006 | +{ |
---|
| 1007 | + struct samsung_pin_bank *bank; |
---|
| 1008 | + unsigned int i; |
---|
| 1009 | + |
---|
| 1010 | + bank = d->pin_banks; |
---|
| 1011 | + for (i = 0; i < d->nr_banks; ++i, ++bank) |
---|
| 1012 | + of_node_put(bank->of_node); |
---|
| 1013 | +} |
---|
| 1014 | + |
---|
1005 | 1015 | /* retrieve the soc specific data */ |
---|
1006 | 1016 | static const struct samsung_pin_ctrl * |
---|
1007 | 1017 | samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d, |
---|
.. | .. |
---|
1077 | 1087 | continue; |
---|
1078 | 1088 | bank = d->pin_banks; |
---|
1079 | 1089 | for (i = 0; i < d->nr_banks; ++i, ++bank) { |
---|
1080 | | - if (!strcmp(bank->name, np->name)) { |
---|
| 1090 | + if (of_node_name_eq(np, bank->name)) { |
---|
1081 | 1091 | bank->of_node = np; |
---|
1082 | 1092 | break; |
---|
1083 | 1093 | } |
---|
.. | .. |
---|
1116 | 1126 | if (ctrl->retention_data) { |
---|
1117 | 1127 | drvdata->retention_ctrl = ctrl->retention_data->init(drvdata, |
---|
1118 | 1128 | ctrl->retention_data); |
---|
1119 | | - if (IS_ERR(drvdata->retention_ctrl)) |
---|
1120 | | - return PTR_ERR(drvdata->retention_ctrl); |
---|
| 1129 | + if (IS_ERR(drvdata->retention_ctrl)) { |
---|
| 1130 | + ret = PTR_ERR(drvdata->retention_ctrl); |
---|
| 1131 | + goto err_put_banks; |
---|
| 1132 | + } |
---|
1121 | 1133 | } |
---|
1122 | 1134 | |
---|
1123 | 1135 | ret = samsung_pinctrl_register(pdev, drvdata); |
---|
1124 | 1136 | if (ret) |
---|
1125 | | - return ret; |
---|
| 1137 | + goto err_put_banks; |
---|
1126 | 1138 | |
---|
1127 | 1139 | ret = samsung_gpiolib_register(pdev, drvdata); |
---|
1128 | | - if (ret) { |
---|
1129 | | - samsung_pinctrl_unregister(pdev, drvdata); |
---|
1130 | | - return ret; |
---|
1131 | | - } |
---|
| 1140 | + if (ret) |
---|
| 1141 | + goto err_unregister; |
---|
1132 | 1142 | |
---|
1133 | 1143 | if (ctrl->eint_gpio_init) |
---|
1134 | 1144 | ctrl->eint_gpio_init(drvdata); |
---|
.. | .. |
---|
1138 | 1148 | platform_set_drvdata(pdev, drvdata); |
---|
1139 | 1149 | |
---|
1140 | 1150 | return 0; |
---|
| 1151 | + |
---|
| 1152 | +err_unregister: |
---|
| 1153 | + samsung_pinctrl_unregister(pdev, drvdata); |
---|
| 1154 | +err_put_banks: |
---|
| 1155 | + samsung_banks_of_node_put(drvdata); |
---|
| 1156 | + return ret; |
---|
1141 | 1157 | } |
---|
1142 | 1158 | |
---|
1143 | | -/** |
---|
| 1159 | +/* |
---|
1144 | 1160 | * samsung_pinctrl_suspend - save pinctrl state for suspend |
---|
1145 | 1161 | * |
---|
1146 | 1162 | * Save data for all banks handled by this device. |
---|
.. | .. |
---|
1187 | 1203 | return 0; |
---|
1188 | 1204 | } |
---|
1189 | 1205 | |
---|
1190 | | -/** |
---|
| 1206 | +/* |
---|
1191 | 1207 | * samsung_pinctrl_resume - restore pinctrl state from suspend |
---|
1192 | 1208 | * |
---|
1193 | 1209 | * Restore one of the banks that was saved during suspend. |
---|