|
@@ -213,7 +213,7 @@ static int gpio_flash_probe(struct platform_device *pdev)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
arr_size = sizeof(int) * gpios->end;
|
|
arr_size = sizeof(int) * gpios->end;
|
|
- state = kzalloc(sizeof(*state) + arr_size, GFP_KERNEL);
|
|
|
|
|
|
+ state = devm_kzalloc(&pdev->dev, sizeof(*state) + arr_size, GFP_KERNEL);
|
|
if (!state)
|
|
if (!state)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -234,9 +234,9 @@ static int gpio_flash_probe(struct platform_device *pdev)
|
|
state->map.copy_to = gf_copy_to;
|
|
state->map.copy_to = gf_copy_to;
|
|
state->map.bankwidth = pdata->width;
|
|
state->map.bankwidth = pdata->width;
|
|
state->map.size = state->win_size * (1 << state->gpio_count);
|
|
state->map.size = state->win_size * (1 << state->gpio_count);
|
|
- state->map.virt = ioremap_nocache(memory->start, state->win_size);
|
|
|
|
- if (!state->map.virt)
|
|
|
|
- return -ENOMEM;
|
|
|
|
|
|
+ state->map.virt = devm_ioremap_resource(&pdev->dev, memory);
|
|
|
|
+ if (IS_ERR(state->map.virt))
|
|
|
|
+ return PTR_ERR(state->map.virt);
|
|
|
|
|
|
state->map.phys = NO_XIP;
|
|
state->map.phys = NO_XIP;
|
|
state->map.map_priv_1 = (unsigned long)state;
|
|
state->map.map_priv_1 = (unsigned long)state;
|
|
@@ -245,12 +245,10 @@ static int gpio_flash_probe(struct platform_device *pdev)
|
|
|
|
|
|
i = 0;
|
|
i = 0;
|
|
do {
|
|
do {
|
|
- if (gpio_request(state->gpio_addrs[i], DRIVER_NAME)) {
|
|
|
|
|
|
+ if (devm_gpio_request(&pdev->dev, state->gpio_addrs[i],
|
|
|
|
+ DRIVER_NAME)) {
|
|
dev_err(&pdev->dev, "failed to request gpio %d\n",
|
|
dev_err(&pdev->dev, "failed to request gpio %d\n",
|
|
state->gpio_addrs[i]);
|
|
state->gpio_addrs[i]);
|
|
- while (i--)
|
|
|
|
- gpio_free(state->gpio_addrs[i]);
|
|
|
|
- kfree(state);
|
|
|
|
return -EBUSY;
|
|
return -EBUSY;
|
|
}
|
|
}
|
|
gpio_direction_output(state->gpio_addrs[i], 0);
|
|
gpio_direction_output(state->gpio_addrs[i], 0);
|
|
@@ -259,12 +257,8 @@ static int gpio_flash_probe(struct platform_device *pdev)
|
|
dev_notice(&pdev->dev, "probing %d-bit flash bus\n",
|
|
dev_notice(&pdev->dev, "probing %d-bit flash bus\n",
|
|
state->map.bankwidth * 8);
|
|
state->map.bankwidth * 8);
|
|
state->mtd = do_map_probe(memory->name, &state->map);
|
|
state->mtd = do_map_probe(memory->name, &state->map);
|
|
- if (!state->mtd) {
|
|
|
|
- for (i = 0; i < state->gpio_count; ++i)
|
|
|
|
- gpio_free(state->gpio_addrs[i]);
|
|
|
|
- kfree(state);
|
|
|
|
|
|
+ if (!state->mtd)
|
|
return -ENXIO;
|
|
return -ENXIO;
|
|
- }
|
|
|
|
state->mtd->dev.parent = &pdev->dev;
|
|
state->mtd->dev.parent = &pdev->dev;
|
|
|
|
|
|
mtd_device_parse_register(state->mtd, part_probe_types, NULL,
|
|
mtd_device_parse_register(state->mtd, part_probe_types, NULL,
|
|
@@ -276,13 +270,9 @@ static int gpio_flash_probe(struct platform_device *pdev)
|
|
static int gpio_flash_remove(struct platform_device *pdev)
|
|
static int gpio_flash_remove(struct platform_device *pdev)
|
|
{
|
|
{
|
|
struct async_state *state = platform_get_drvdata(pdev);
|
|
struct async_state *state = platform_get_drvdata(pdev);
|
|
- size_t i = 0;
|
|
|
|
- do {
|
|
|
|
- gpio_free(state->gpio_addrs[i]);
|
|
|
|
- } while (++i < state->gpio_count);
|
|
|
|
|
|
+
|
|
mtd_device_unregister(state->mtd);
|
|
mtd_device_unregister(state->mtd);
|
|
map_destroy(state->mtd);
|
|
map_destroy(state->mtd);
|
|
- kfree(state);
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|