mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 05:04:02 +02:00
mmc: Merge branch fixes into next
Merge the mmc fixes for v7.2-rc[n] into the next branch, to allow them to get tested together with the mmc changes that are targeted for the next release. Signed-off-by: Ulf Hansson <ulfh@kernel.org>
This commit is contained in:
commit
df92d47b3a
|
|
@ -193,7 +193,6 @@ allOf:
|
|||
- mediatek,mt8183-mmc
|
||||
- mediatek,mt8186-mmc
|
||||
- mediatek,mt8188-mmc
|
||||
- mediatek,mt8189-mmc
|
||||
- mediatek,mt8195-mmc
|
||||
- mediatek,mt8196-mmc
|
||||
- mediatek,mt8516-mmc
|
||||
|
|
@ -348,6 +347,34 @@ allOf:
|
|||
- const: axi_cg
|
||||
- const: ahb_cg
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: mediatek,mt8189-mmc
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 6
|
||||
items:
|
||||
- description: source clock
|
||||
- description: HCLK which used for host
|
||||
- description: independent source clock gate
|
||||
- description: bus clock used for internal register access
|
||||
- description: peripheral bus clock gate
|
||||
- description: AXI bus clock gate
|
||||
- description: crypto clock used for data encrypt/decrypt (optional)
|
||||
clock-names:
|
||||
minItems: 6
|
||||
items:
|
||||
- const: source
|
||||
- const: hclk
|
||||
- const: source_cg
|
||||
- const: bus_clk
|
||||
- const: pclk_cg
|
||||
- const: axi_cg
|
||||
- const: crypto
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
|
|
|
|||
|
|
@ -1338,6 +1338,10 @@ static int msb_ftl_initialize(struct msb_data *msb)
|
|||
return 0;
|
||||
|
||||
msb->zone_count = msb->block_count / MS_BLOCKS_IN_ZONE;
|
||||
if (msb->block_count > MS_MAX_ZONES * MS_BLOCKS_IN_ZONE) {
|
||||
pr_err("Too many blocks: %d\n", msb->block_count);
|
||||
return -EINVAL;
|
||||
}
|
||||
msb->logical_block_count = msb->zone_count * 496 - 2;
|
||||
|
||||
msb->used_blocks_bitmap = bitmap_zalloc(msb->block_count, GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -2715,7 +2715,6 @@ static void mmc_blk_rpmb_device_release(struct device *dev)
|
|||
{
|
||||
struct mmc_rpmb_data *rpmb = dev_get_drvdata(dev);
|
||||
|
||||
rpmb_dev_unregister(rpmb->rdev);
|
||||
mmc_blk_put(rpmb->md);
|
||||
ida_free(&mmc_rpmb_ida, rpmb->id);
|
||||
kfree(rpmb);
|
||||
|
|
@ -2930,8 +2929,8 @@ static int mmc_blk_alloc_rpmb_part(struct mmc_card *card,
|
|||
}
|
||||
|
||||
static void mmc_blk_remove_rpmb_part(struct mmc_rpmb_data *rpmb)
|
||||
|
||||
{
|
||||
rpmb_dev_unregister(rpmb->rdev);
|
||||
cdev_device_del(&rpmb->chrdev, &rpmb->dev);
|
||||
put_device(&rpmb->dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -318,9 +318,9 @@ static void mmc_test_free_mem(struct mmc_test_mem *mem)
|
|||
{
|
||||
if (!mem)
|
||||
return;
|
||||
while (mem->cnt--)
|
||||
__free_pages(mem->arr[mem->cnt].page,
|
||||
mem->arr[mem->cnt].order);
|
||||
for (unsigned int i = 0; i < mem->cnt; i++)
|
||||
__free_pages(mem->arr[i].page,
|
||||
mem->arr[i].order);
|
||||
kfree(mem);
|
||||
}
|
||||
|
||||
|
|
@ -341,6 +341,7 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
|
|||
unsigned long page_cnt = 0;
|
||||
unsigned long limit = nr_free_buffer_pages() >> 4;
|
||||
struct mmc_test_mem *mem;
|
||||
unsigned int idx = 0;
|
||||
|
||||
if (max_page_cnt > limit)
|
||||
max_page_cnt = limit;
|
||||
|
|
@ -375,23 +376,26 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
|
|||
goto out_free;
|
||||
break;
|
||||
}
|
||||
mem->arr[mem->cnt].page = page;
|
||||
mem->arr[mem->cnt].order = order;
|
||||
mem->cnt += 1;
|
||||
mem->arr[idx].page = page;
|
||||
mem->arr[idx].order = order;
|
||||
idx += 1;
|
||||
if (max_page_cnt <= (1UL << order))
|
||||
break;
|
||||
max_page_cnt -= 1UL << order;
|
||||
page_cnt += 1UL << order;
|
||||
if (mem->cnt >= max_segs) {
|
||||
if (idx >= mem->cnt) {
|
||||
if (page_cnt < min_page_cnt)
|
||||
goto out_free;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mem->cnt = idx;
|
||||
|
||||
return mem;
|
||||
|
||||
out_free:
|
||||
mem->cnt = idx;
|
||||
mmc_test_free_mem(mem);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2433,13 +2433,16 @@ static int dwcmshc_probe(struct platform_device *pdev)
|
|||
return err;
|
||||
|
||||
priv->bus_clk = devm_clk_get(dev, "bus");
|
||||
if (!IS_ERR(priv->bus_clk))
|
||||
clk_prepare_enable(priv->bus_clk);
|
||||
if (!IS_ERR(priv->bus_clk)) {
|
||||
err = clk_prepare_enable(priv->bus_clk);
|
||||
if (err)
|
||||
goto err_clk;
|
||||
}
|
||||
}
|
||||
|
||||
err = mmc_of_parse(host->mmc);
|
||||
if (err)
|
||||
goto err_clk;
|
||||
goto err_bus_clk;
|
||||
|
||||
sdhci_get_of_property(pdev);
|
||||
|
||||
|
|
@ -2453,7 +2456,7 @@ static int dwcmshc_probe(struct platform_device *pdev)
|
|||
if (pltfm_data->init) {
|
||||
err = pltfm_data->init(&pdev->dev, host, priv);
|
||||
if (err)
|
||||
goto err_clk;
|
||||
goto err_bus_clk;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
|
@ -2499,9 +2502,10 @@ static int dwcmshc_probe(struct platform_device *pdev)
|
|||
err_rpm:
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_put_noidle(dev);
|
||||
err_bus_clk:
|
||||
clk_disable_unprepare(priv->bus_clk);
|
||||
err_clk:
|
||||
clk_disable_unprepare(pltfm_host->clk);
|
||||
clk_disable_unprepare(priv->bus_clk);
|
||||
clk_bulk_disable_unprepare(priv->num_other_clks, priv->other_clks);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1586,7 +1586,7 @@ static int __command_write_data(struct vub300_mmc_host *vub300,
|
|||
return linear_length;
|
||||
}
|
||||
|
||||
static void __vub300_command_response(struct vub300_mmc_host *vub300,
|
||||
static bool __vub300_command_response(struct vub300_mmc_host *vub300,
|
||||
struct mmc_command *cmd,
|
||||
struct mmc_data *data, int data_length)
|
||||
{
|
||||
|
|
@ -1598,17 +1598,11 @@ static void __vub300_command_response(struct vub300_mmc_host *vub300,
|
|||
msecs_to_jiffies(msec_timeout));
|
||||
if (respretval == 0) { /* TIMED OUT */
|
||||
/* we don't know which of "out" and "res" if any failed */
|
||||
int result;
|
||||
vub300->usb_timed_out = 1;
|
||||
usb_kill_urb(vub300->command_out_urb);
|
||||
usb_kill_urb(vub300->command_res_urb);
|
||||
cmd->error = -ETIMEDOUT;
|
||||
result = usb_lock_device_for_reset(vub300->udev,
|
||||
vub300->interface);
|
||||
if (result == 0) {
|
||||
result = usb_reset_device(vub300->udev);
|
||||
usb_unlock_device(vub300->udev);
|
||||
}
|
||||
return true;
|
||||
} else if (respretval < 0) {
|
||||
/* we don't know which of "out" and "res" if any failed */
|
||||
usb_kill_urb(vub300->command_out_urb);
|
||||
|
|
@ -1704,6 +1698,8 @@ static void __vub300_command_response(struct vub300_mmc_host *vub300,
|
|||
} else {
|
||||
cmd->error = -EINVAL;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void construct_request_response(struct vub300_mmc_host *vub300,
|
||||
|
|
@ -1749,6 +1745,7 @@ static void vub300_cmndwork_thread(struct work_struct *work)
|
|||
struct mmc_request *req = vub300->req;
|
||||
struct mmc_command *cmd = vub300->cmd;
|
||||
struct mmc_data *data = vub300->data;
|
||||
bool reset_device;
|
||||
int data_length;
|
||||
mutex_lock(&vub300->cmd_mutex);
|
||||
init_completion(&vub300->command_complete);
|
||||
|
|
@ -1771,7 +1768,8 @@ static void vub300_cmndwork_thread(struct work_struct *work)
|
|||
data_length = __command_read_data(vub300, cmd, data);
|
||||
else
|
||||
data_length = __command_write_data(vub300, cmd, data);
|
||||
__vub300_command_response(vub300, cmd, data, data_length);
|
||||
reset_device = __vub300_command_response(vub300, cmd,
|
||||
data, data_length);
|
||||
vub300->req = NULL;
|
||||
vub300->cmd = NULL;
|
||||
vub300->data = NULL;
|
||||
|
|
@ -1779,6 +1777,16 @@ static void vub300_cmndwork_thread(struct work_struct *work)
|
|||
if (cmd->error == -ENOMEDIUM)
|
||||
check_vub300_port_status(vub300);
|
||||
mutex_unlock(&vub300->cmd_mutex);
|
||||
if (reset_device) {
|
||||
int result;
|
||||
|
||||
result = usb_lock_device_for_reset(vub300->udev,
|
||||
vub300->interface);
|
||||
if (result == 0) {
|
||||
result = usb_reset_device(vub300->udev);
|
||||
usb_unlock_device(vub300->udev);
|
||||
}
|
||||
}
|
||||
mmc_request_done(vub300->mmc, req);
|
||||
kref_put(&vub300->kref, vub300_delete);
|
||||
return;
|
||||
|
|
@ -2336,12 +2344,16 @@ static int vub300_probe(struct usb_interface *interface,
|
|||
interface_to_InterfaceNumber(interface));
|
||||
retval = mmc_add_host(mmc);
|
||||
if (retval)
|
||||
goto err_delete_timer;
|
||||
goto err_stop_io;
|
||||
|
||||
return 0;
|
||||
|
||||
err_delete_timer:
|
||||
timer_delete_sync(&vub300->inactivity_timer);
|
||||
err_stop_io:
|
||||
vub300->interface = NULL;
|
||||
kref_put(&vub300->kref, vub300_delete);
|
||||
|
||||
return retval;
|
||||
|
||||
err_free_host:
|
||||
mmc_free_host(mmc);
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user