@@ -107,6 +107,15 @@ static int __init sh_mobile_sdhi_probe(struct platform_device *pdev)
mmc_data->hclk = clk_get_rate(priv->clk);
mmc_data->set_pwr = sh_mobile_sdhi_set_pwr;
mmc_data->capabilities = MMC_CAP_MMC_HIGHSPEED;
+
+ /* values are taken from the firmware based sh_sdhi.c driver */
+ mmc_data->max_hw_segs = 32;
+ mmc_data->max_phys_segs = 32;
+ mmc_data->max_blk_count = 65535; /* actually it's 65536, but the value 65536 is handled differently and we want to keep the code simple */
+ mmc_data->max_req_size = 131072;
+ mmc_data->max_seg_size = mmc_data->max_req_size;
+ mmc_data->max_blk_size = mmc_data->max_blk_size;
+
if (p) {
mmc_data->flags = p->tmio_flags;
mmc_data->ocr_mask = p->tmio_ocr_mask;
@@ -847,6 +847,20 @@ static int __devinit tmio_mmc_probe(struct platform_device *dev)
mmc->caps |= pdata->capabilities;
mmc->f_max = pdata->hclk;
mmc->f_min = mmc->f_max / 512;
+
+ if (pdata->max_hw_segs)
+ mmc->max_hw_segs = pdata->max_hw_segs;
+ if (pdata->max_phys_segs)
+ mmc->max_phys_segs = pdata->max_phys_segs;
+ if (pdata->max_seg_size)
+ mmc->max_seg_size = pdata->max_seg_size;
+ if (pdata->max_req_size)
+ mmc->max_req_size = pdata->max_req_size;
+ if (pdata->max_blk_size)
+ mmc->max_blk_size = pdata->max_blk_size;
+ if (pdata->max_blk_count)
+ mmc->max_blk_count = pdata->max_blk_count;
+
if (pdata->ocr_mask)
mmc->ocr_avail = pdata->ocr_mask;
else
@@ -71,6 +71,15 @@ struct tmio_mmc_data {
unsigned long capabilities;
unsigned long flags;
u32 ocr_mask; /* available voltages */
+
+ /* overrides for "struct mmc_host" variables */
+ unsigned int max_seg_size;
+ unsigned short max_hw_segs;
+ unsigned short max_phys_segs;
+ unsigned int max_req_size;
+ unsigned int max_blk_size;
+ unsigned int max_blk_count;
+
struct tmio_mmc_dma *dma;
void (*set_pwr)(struct platform_device *host, int state);
void (*set_clk_div)(struct platform_device *host, int state);