diff options
Diffstat (limited to 'drivers/gpio/gpio-rdc321x.c')
-rw-r--r-- | drivers/gpio/gpio-rdc321x.c | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/drivers/gpio/gpio-rdc321x.c b/drivers/gpio/gpio-rdc321x.c index 88577c3272a5..9fa7e53331c9 100644 --- a/drivers/gpio/gpio-rdc321x.c +++ b/drivers/gpio/gpio-rdc321x.c | |||
@@ -141,17 +141,15 @@ static int rdc321x_gpio_probe(struct platform_device *pdev) | |||
141 | return -ENODEV; | 141 | return -ENODEV; |
142 | } | 142 | } |
143 | 143 | ||
144 | rdc321x_gpio_dev = kzalloc(sizeof(struct rdc321x_gpio), GFP_KERNEL); | 144 | rdc321x_gpio_dev = devm_kzalloc(&pdev->dev, sizeof(struct rdc321x_gpio), |
145 | if (!rdc321x_gpio_dev) { | 145 | GFP_KERNEL); |
146 | dev_err(&pdev->dev, "failed to allocate private data\n"); | 146 | if (!rdc321x_gpio_dev) |
147 | return -ENOMEM; | 147 | return -ENOMEM; |
148 | } | ||
149 | 148 | ||
150 | r = platform_get_resource_byname(pdev, IORESOURCE_IO, "gpio-reg1"); | 149 | r = platform_get_resource_byname(pdev, IORESOURCE_IO, "gpio-reg1"); |
151 | if (!r) { | 150 | if (!r) { |
152 | dev_err(&pdev->dev, "failed to get gpio-reg1 resource\n"); | 151 | dev_err(&pdev->dev, "failed to get gpio-reg1 resource\n"); |
153 | err = -ENODEV; | 152 | return -ENODEV; |
154 | goto out_free; | ||
155 | } | 153 | } |
156 | 154 | ||
157 | spin_lock_init(&rdc321x_gpio_dev->lock); | 155 | spin_lock_init(&rdc321x_gpio_dev->lock); |
@@ -162,8 +160,7 @@ static int rdc321x_gpio_probe(struct platform_device *pdev) | |||
162 | r = platform_get_resource_byname(pdev, IORESOURCE_IO, "gpio-reg2"); | 160 | r = platform_get_resource_byname(pdev, IORESOURCE_IO, "gpio-reg2"); |
163 | if (!r) { | 161 | if (!r) { |
164 | dev_err(&pdev->dev, "failed to get gpio-reg2 resource\n"); | 162 | dev_err(&pdev->dev, "failed to get gpio-reg2 resource\n"); |
165 | err = -ENODEV; | 163 | return -ENODEV; |
166 | goto out_free; | ||
167 | } | 164 | } |
168 | 165 | ||
169 | rdc321x_gpio_dev->reg2_ctrl_base = r->start; | 166 | rdc321x_gpio_dev->reg2_ctrl_base = r->start; |
@@ -187,21 +184,17 @@ static int rdc321x_gpio_probe(struct platform_device *pdev) | |||
187 | rdc321x_gpio_dev->reg1_data_base, | 184 | rdc321x_gpio_dev->reg1_data_base, |
188 | &rdc321x_gpio_dev->data_reg[0]); | 185 | &rdc321x_gpio_dev->data_reg[0]); |
189 | if (err) | 186 | if (err) |
190 | goto out_free; | 187 | return err; |
191 | 188 | ||
192 | err = pci_read_config_dword(rdc321x_gpio_dev->sb_pdev, | 189 | err = pci_read_config_dword(rdc321x_gpio_dev->sb_pdev, |
193 | rdc321x_gpio_dev->reg2_data_base, | 190 | rdc321x_gpio_dev->reg2_data_base, |
194 | &rdc321x_gpio_dev->data_reg[1]); | 191 | &rdc321x_gpio_dev->data_reg[1]); |
195 | if (err) | 192 | if (err) |
196 | goto out_free; | 193 | return err; |
197 | 194 | ||
198 | dev_info(&pdev->dev, "registering %d GPIOs\n", | 195 | dev_info(&pdev->dev, "registering %d GPIOs\n", |
199 | rdc321x_gpio_dev->chip.ngpio); | 196 | rdc321x_gpio_dev->chip.ngpio); |
200 | return gpiochip_add(&rdc321x_gpio_dev->chip); | 197 | return gpiochip_add(&rdc321x_gpio_dev->chip); |
201 | |||
202 | out_free: | ||
203 | kfree(rdc321x_gpio_dev); | ||
204 | return err; | ||
205 | } | 198 | } |
206 | 199 | ||
207 | static int rdc321x_gpio_remove(struct platform_device *pdev) | 200 | static int rdc321x_gpio_remove(struct platform_device *pdev) |
@@ -213,8 +206,6 @@ static int rdc321x_gpio_remove(struct platform_device *pdev) | |||
213 | if (ret) | 206 | if (ret) |
214 | dev_err(&pdev->dev, "failed to unregister chip\n"); | 207 | dev_err(&pdev->dev, "failed to unregister chip\n"); |
215 | 208 | ||
216 | kfree(rdc321x_gpio_dev); | ||
217 | |||
218 | return ret; | 209 | return ret; |
219 | } | 210 | } |
220 | 211 | ||