Skip to content

Commit

Permalink
drivers/video: fsl-diu-fb: improve device tree usage
Browse files Browse the repository at this point in the history
Implement various improvements to the way the Freescale DIU framebuffer
driver access the device tree.

1) Use of_iomap() instead of of_address_to_resource() and ioremap()

2) Use be32_to_cpup() instead of directly dereferencing the device_node
   pointer.

3) Rename variable 'ofdev' to 'pdev' to avoid any confusion that it's
   a platform_device pointer, not an of_device pointer (of_device no
   longer exists).

Signed-off-by: Timur Tabi <timur@freescale.com>
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
  • Loading branch information
Timur Tabi authored and Florian Tobias Schandinat committed Sep 18, 2011
1 parent 89f08e3 commit 9e52ba6
Showing 1 changed file with 24 additions and 41 deletions.
65 changes: 24 additions & 41 deletions drivers/video/fsl-diu-fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1425,13 +1425,12 @@ static ssize_t show_monitor(struct device *device,
return 0;
}

static int __devinit fsl_diu_probe(struct platform_device *ofdev)
static int __devinit fsl_diu_probe(struct platform_device *pdev)
{
struct device_node *np = ofdev->dev.of_node;
struct device_node *np = pdev->dev.of_node;
struct mfb_info *mfbi;
phys_addr_t dummy_ad_addr = 0;
int ret, i, error = 0;
struct resource res;
struct fsl_diu_data *machine_data;
int diu_mode;

Expand All @@ -1441,9 +1440,9 @@ static int __devinit fsl_diu_probe(struct platform_device *ofdev)

for (i = 0; i < ARRAY_SIZE(machine_data->fsl_diu_info); i++) {
machine_data->fsl_diu_info[i] =
framebuffer_alloc(sizeof(struct mfb_info), &ofdev->dev);
framebuffer_alloc(sizeof(struct mfb_info), &pdev->dev);
if (!machine_data->fsl_diu_info[i]) {
dev_err(&ofdev->dev, "cannot allocate memory\n");
dev_err(&pdev->dev, "cannot allocate memory\n");
ret = -ENOMEM;
goto error2;
}
Expand All @@ -1463,19 +1462,9 @@ static int __devinit fsl_diu_probe(struct platform_device *ofdev)
}
}

ret = of_address_to_resource(np, 0, &res);
if (ret) {
dev_err(&ofdev->dev, "could not obtain DIU address\n");
goto error;
}
if (!res.start) {
dev_err(&ofdev->dev, "invalid DIU address\n");
goto error;
}

dr.diu_reg = ioremap(res.start, sizeof(struct diu));
dr.diu_reg = of_iomap(np, 0);
if (!dr.diu_reg) {
dev_err(&ofdev->dev, "Err: can't map DIU registers!\n");
dev_err(&pdev->dev, "cannot map DIU registers\n");
ret = -EFAULT;
goto error2;
}
Expand All @@ -1488,25 +1477,25 @@ static int __devinit fsl_diu_probe(struct platform_device *ofdev)
machine_data->irq = irq_of_parse_and_map(np, 0);

if (!machine_data->irq) {
dev_err(&ofdev->dev, "could not get DIU IRQ\n");
dev_err(&pdev->dev, "could not get DIU IRQ\n");
ret = -EINVAL;
goto error;
}
machine_data->monitor_port = monitor_port;

/* Area descriptor memory pool aligns to 64-bit boundary */
if (allocate_buf(&ofdev->dev, &pool.ad,
if (allocate_buf(&pdev->dev, &pool.ad,
sizeof(struct diu_ad) * FSL_AOI_NUM, 8))
return -ENOMEM;

/* Get memory for Gamma Table - 32-byte aligned memory */
if (allocate_buf(&ofdev->dev, &pool.gamma, 768, 32)) {
if (allocate_buf(&pdev->dev, &pool.gamma, 768, 32)) {
ret = -ENOMEM;
goto error;
}

/* For performance, cursor bitmap buffer aligns to 32-byte boundary */
if (allocate_buf(&ofdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2,
if (allocate_buf(&pdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2,
32)) {
ret = -ENOMEM;
goto error;
Expand Down Expand Up @@ -1548,16 +1537,13 @@ static int __devinit fsl_diu_probe(struct platform_device *ofdev)
mfbi->ad->paddr = pool.ad.paddr + i * sizeof(struct diu_ad);
ret = install_fb(machine_data->fsl_diu_info[i]);
if (ret) {
dev_err(&ofdev->dev,
"Failed to register framebuffer %d\n",
i);
dev_err(&pdev->dev, "could not register fb %d\n", i);
goto error;
}
}

if (request_irq_local(machine_data->irq)) {
dev_err(machine_data->fsl_diu_info[0]->dev,
"could not request irq for diu.");
dev_err(&pdev->dev, "could not claim irq\n");
goto error;
}

Expand All @@ -1569,25 +1555,24 @@ static int __devinit fsl_diu_probe(struct platform_device *ofdev)
error = device_create_file(machine_data->fsl_diu_info[0]->dev,
&machine_data->dev_attr);
if (error) {
dev_err(machine_data->fsl_diu_info[0]->dev,
"could not create sysfs %s file\n",
dev_err(&pdev->dev, "could not create sysfs file %s\n",
machine_data->dev_attr.attr.name);
}

dev_set_drvdata(&ofdev->dev, machine_data);
dev_set_drvdata(&pdev->dev, machine_data);
return 0;

error:
for (i = ARRAY_SIZE(machine_data->fsl_diu_info);
i > 0; i--)
uninstall_fb(machine_data->fsl_diu_info[i - 1]);
if (pool.ad.vaddr)
free_buf(&ofdev->dev, &pool.ad,
free_buf(&pdev->dev, &pool.ad,
sizeof(struct diu_ad) * FSL_AOI_NUM, 8);
if (pool.gamma.vaddr)
free_buf(&ofdev->dev, &pool.gamma, 768, 32);
free_buf(&pdev->dev, &pool.gamma, 768, 32);
if (pool.cursor.vaddr)
free_buf(&ofdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2,
free_buf(&pdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2,
32);
if (machine_data->dummy_aoi_virt)
fsl_diu_free(machine_data->dummy_aoi_virt, 64);
Expand All @@ -1602,25 +1587,23 @@ static int __devinit fsl_diu_probe(struct platform_device *ofdev)
return ret;
}


static int fsl_diu_remove(struct platform_device *ofdev)
static int fsl_diu_remove(struct platform_device *pdev)
{
struct fsl_diu_data *machine_data;
int i;

machine_data = dev_get_drvdata(&ofdev->dev);
machine_data = dev_get_drvdata(&pdev->dev);
disable_lcdc(machine_data->fsl_diu_info[0]);
free_irq_local(machine_data->irq);
for (i = ARRAY_SIZE(machine_data->fsl_diu_info); i > 0; i--)
uninstall_fb(machine_data->fsl_diu_info[i - 1]);
if (pool.ad.vaddr)
free_buf(&ofdev->dev, &pool.ad,
free_buf(&pdev->dev, &pool.ad,
sizeof(struct diu_ad) * FSL_AOI_NUM, 8);
if (pool.gamma.vaddr)
free_buf(&ofdev->dev, &pool.gamma, 768, 32);
free_buf(&pdev->dev, &pool.gamma, 768, 32);
if (pool.cursor.vaddr)
free_buf(&ofdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2,
32);
free_buf(&pdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2, 32);
if (machine_data->dummy_aoi_virt)
fsl_diu_free(machine_data->dummy_aoi_virt, 64);
iounmap(dr.diu_reg);
Expand Down Expand Up @@ -1722,7 +1705,7 @@ static int __init fsl_diu_init(void)
* Freescale PLRU requires 13/8 times the cache size to do a proper
* displacement flush
*/
coherence_data_size = *prop * 13;
coherence_data_size = be32_to_cpup(prop) * 13;
coherence_data_size /= 8;

prop = of_get_property(np, "d-cache-line-size", NULL);
Expand All @@ -1732,7 +1715,7 @@ static int __init fsl_diu_init(void)
of_node_put(np);
return -ENODEV;
}
d_cache_line_size = *prop;
d_cache_line_size = be32_to_cpup(prop);

of_node_put(np);
coherence_data = vmalloc(coherence_data_size);
Expand Down

0 comments on commit 9e52ba6

Please sign in to comment.