#include "glamo-regs.h"
#include "glamo-core.h"
-#ifndef DEBUG
-#define GLAMO_LOG(...)
-#else
-#define GLAMO_LOG(...) \
-do { \
- printk(KERN_DEBUG "in %s:%s:%d", __FILE__, __func__, __LINE__); \
- printk(KERN_DEBUG __VA_ARGS__); \
-} while (0);
-#endif
-
static void glamofb_program_mode(struct glamofb_handle* glamo);
struct glamofb_handle {
+ struct glamo_core *core;
struct fb_info *fb;
struct device *dev;
struct resource *reg;
};
static void glamo_output_enable(struct glamofb_handle *gfb) {
- struct glamo_core *gcore = gfb->mach_info->core;
+ struct glamo_core *gcore = gfb->core;
if (gfb->output_enabled)
return;
}
static void glamo_output_disable(struct glamofb_handle *gfb) {
- struct glamo_core *gcore = gfb->mach_info->core;
+ struct glamo_core *gcore = gfb->core;
if (!gfb->output_enabled)
return;
{
int i;
- if (glamo->mach_info->core->suspending) {
- dev_err(&glamo->mach_info->core->pdev->dev,
+ if (glamo->core->suspending) {
+ dev_err(&glamo->core->pdev->dev,
"IGNORING glamofb_run_script while "
"suspended\n");
return -EBUSY;
{
struct glamofb_handle *glamo = info->par;
- if (glamo->mach_info->core->suspending) {
- dev_err(&glamo->mach_info->core->pdev->dev,
+ if (glamo->core->suspending) {
+ dev_err(&glamo->core->pdev->dev,
"IGNORING glamofb_check_var while "
"suspended\n");
return -EBUSY;
{
int glamo_rot;
- if (glamo->mach_info->core->suspending) {
- dev_err(&glamo->mach_info->core->pdev->dev,
+ if (glamo->core->suspending) {
+ dev_err(&glamo->core->pdev->dev,
"IGNORING rotate_lcd while "
"suspended\n");
return;
static void glamofb_program_mode(struct glamofb_handle* gfb) {
int sync, bp, disp, fp, total;
unsigned long flags;
- struct glamo_core *gcore = gfb->mach_info->core;
+ struct glamo_core *gcore = gfb->core;
struct fb_var_screeninfo *var = &gfb->fb->var;
dev_dbg(&gcore->pdev->dev,
struct fb_var_screeninfo *var = &info->var;
struct fb_videomode *mode;
- if (glamo->mach_info->core->suspending) {
- dev_err(&glamo->mach_info->core->pdev->dev,
+ if (glamo->core->suspending) {
+ dev_err(&glamo->core->pdev->dev,
"IGNORING glamofb_set_par while "
"suspended\n");
return -EBUSY;
struct glamofb_handle *glamo = info->par;
unsigned int val;
- if (glamo->mach_info->core->suspending) {
- dev_err(&glamo->mach_info->core->pdev->dev,
+ if (glamo->core->suspending) {
+ dev_err(&glamo->core->pdev->dev,
"IGNORING glamofb_set_par while "
"suspended\n");
return -EBUSY;
static int glamofb_ioctl(struct fb_info *info, unsigned int cmd,
unsigned long arg) {
struct glamofb_handle *gfb = (struct glamofb_handle*)info->par;
- struct glamo_core *gcore = gfb->mach_info->core;
+ struct glamo_core *gcore = gfb->core;
int retval = -ENOTTY;
switch (cmd) {
{
int timeout = 2000000;
- if (gfb->mach_info->core->suspending) {
- dev_err(&gfb->mach_info->core->pdev->dev,
+ if (gfb->core->suspending) {
+ dev_err(&gfb->core->pdev->dev,
"IGNORING glamofb_cmd_mode while "
"suspended\n");
return -EBUSY;
dev_dbg(gfb->dev, "%s: waiting for cmdq empty: ",
__func__);
while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
- yield();
+ cpu_relax();
if (timeout < 0) {
printk(KERN_ERR"*************"
"glamofb cmd_queue never got empty"
timeout = 2000000;
while ((!reg_read(gfb, GLAMO_REG_LCD_STATUS2) & (1 << 12)) &&
(timeout--))
- /* yield() */;
+ cpu_relax();
if (timeout < 0) {
printk(KERN_ERR"*************"
"glamofb lcd never idle"
{
int timeout = 200000;
- if (gfb->mach_info->core->suspending) {
- dev_err(&gfb->mach_info->core->pdev->dev,
+ if (gfb->core->suspending) {
+ dev_err(&gfb->core->pdev->dev,
"IGNORING glamofb_cmd_write while "
"suspended\n");
return -EBUSY;
int rc = -EIO;
struct fb_info *fbinfo;
struct glamofb_handle *glamofb;
- struct glamo_fb_platform_data *mach_info = pdev->dev.platform_data;
+ struct glamo_core *core = dev_get_drvdata(pdev->dev.parent);
+ struct glamo_fb_platform_data *mach_info;
printk(KERN_INFO "SMEDIA Glamo frame buffer driver (C) 2007 "
"Openmoko, Inc.\n");
+ if (!core->pdata || !core->pdata->fb_data)
+ return -ENOENT;
+
+
fbinfo = framebuffer_alloc(sizeof(struct glamofb_handle), &pdev->dev);
if (!fbinfo)
return -ENOMEM;
+
glamofb = fbinfo->par;
glamofb->fb = fbinfo;
glamofb->dev = &pdev->dev;
platform_set_drvdata(pdev, glamofb);
- glamofb->mach_info = pdev->dev.platform_data;
+ mach_info = core->pdata->fb_data;
+ glamofb->core = core;
+ glamofb->mach_info = mach_info;
fbinfo->fix.visual = FB_VISUAL_TRUECOLOR;
fbinfo->fix.type = FB_TYPE_PACKED_PIXELS;
fbinfo->var.accel_flags = 0;
fbinfo->var.vmode = FB_VMODE_NONINTERLACED;
- glamo_engine_enable(mach_info->core, GLAMO_ENGINE_LCD);
- glamo_engine_reset(mach_info->core, GLAMO_ENGINE_LCD);
+ glamo_engine_enable(core, GLAMO_ENGINE_LCD);
+ glamo_engine_reset(core, GLAMO_ENGINE_LCD);
glamofb->output_enabled = 1;
glamofb->mode_set = 1;
static int glamofb_resume(struct device *dev)
{
struct glamofb_handle *gfb = dev_get_drvdata(dev);
- struct glamo_fb_platform_data *mach_info = dev->platform_data;
/* OK let's allow framebuffer ops again */
/* gfb->fb->screen_base = ioremap(gfb->fb_res->start,
resource_size(gfb->fb_res)); */
- glamo_engine_enable(mach_info->core, GLAMO_ENGINE_LCD);
- glamo_engine_reset(mach_info->core, GLAMO_ENGINE_LCD);
+ glamo_engine_enable(gfb->core, GLAMO_ENGINE_LCD);
+ glamo_engine_reset(gfb->core, GLAMO_ENGINE_LCD);
glamofb_init_regs(gfb);
#ifdef CONFIG_MFD_GLAMO_HWACCEL
#define DRIVER_NAME "glamo-mci"
struct glamo_mci_host {
- struct platform_device *pdev;
struct glamo_mmc_platform_data *pdata;
+ struct platform_device *pdev;
+ struct glamo_core *core;
struct mmc_host *mmc;
struct resource *mmio_mem;
struct resource *data_mem;
struct work_struct read_work;
unsigned clk_enabled : 1;
+
};
static void glamo_mci_send_request(struct mmc_host *mmc, struct mmc_request* mrq);
static void glamo_mci_clock_disable(struct glamo_mci_host *host) {
if (host->clk_enabled) {
- glamo_engine_div_disable(host->pdata->core, GLAMO_ENGINE_MMC);
+ glamo_engine_div_disable(host->core, GLAMO_ENGINE_MMC);
host->clk_enabled = 0;
}
}
del_timer_sync(&host->disable_timer);
if (!host->clk_enabled) {
- glamo_engine_div_enable(host->pdata->core, GLAMO_ENGINE_MMC);
+ glamo_engine_div_enable(host->core, GLAMO_ENGINE_MMC);
host->clk_enabled = 1;
}
}
if (freq) {
glamo_mci_clock_enable(host);
- real_rate = glamo_engine_reclock(host->pdata->core, GLAMO_ENGINE_MMC, freq);
+ real_rate = glamo_engine_reclock(host->core, GLAMO_ENGINE_MMC, freq);
} else {
glamo_mci_clock_disable(host);
}
* but something insane like suspend problems can mean
* we spin here forever, so we timeout after a LONG time
*/
- while ((!(readw(host->pdata->core->base +
+ while ((!(readw(host->core->base +
GLAMO_REG_IRQ_STATUS) & GLAMO_IRQ_MMC)) &&
(timeout--));
return -ETIMEDOUT;
}
/* ack this interrupt source */
- writew(GLAMO_IRQ_MMC, host->pdata->core->base +
+ writew(GLAMO_IRQ_MMC, host->core->base +
GLAMO_REG_IRQ_CLEAR);
/* yay we are an interrupt controller! -- call the ISR
goto done;
- if (!host->pdata->core->irq_works) {
+ if (!host->core->irq_works) {
if (glamo_mci_irq_poll(host, mrq->cmd))
goto done;
}
break;
case MMC_POWER_OFF:
default:
- glamo_engine_disable(host->pdata->core,
+ glamo_engine_disable(host->core,
GLAMO_ENGINE_MMC);
ret = regulator_disable(host->regulator);
static int glamo_mci_probe(struct platform_device *pdev)
{
- struct mmc_host *mmc;
- struct glamo_mci_host *host;
+ struct mmc_host *mmc;
+ struct glamo_mci_host *host;
+ struct glamo_core *core = dev_get_drvdata(pdev->dev.parent);
int ret;
dev_info(&pdev->dev, "glamo_mci driver (C)2007 Openmoko, Inc\n");
host = mmc_priv(mmc);
host->mmc = mmc;
host->pdev = pdev;
- host->pdata = pdev->dev.platform_data;
+ if (core->pdata)
+ host->pdata = core->pdata->mmc_data;
host->power_mode = MMC_POWER_OFF;
host->clk_enabled = 0;
+ host->core = core;
INIT_WORK(&host->irq_work, glamo_mci_irq_worker);
INIT_WORK(&host->read_work, glamo_mci_read_worker);
host->vdd = 0;
- host->clk_rate = glamo_pll_rate(host->pdata->core, GLAMO_PLL1);
+ host->clk_rate = glamo_pll_rate(host->core, GLAMO_PLL1);
/* explain our host controller capabilities */
mmc->ops = &glamo_mci_ops;
platform_set_drvdata(pdev, mmc);
- glamo_engine_enable(host->pdata->core, GLAMO_ENGINE_MMC);
- glamo_engine_reset(host->pdata->core, GLAMO_ENGINE_MMC);
+ glamo_engine_enable(host->core, GLAMO_ENGINE_MMC);
+ glamo_engine_reset(host->core, GLAMO_ENGINE_MMC);
glamo_reg_write(host, GLAMO_REG_MMC_WDATADS1,
(u16)(host->data_mem->start));
mmc_free_host(mmc);
- glamo_engine_disable(host->pdata->core, GLAMO_ENGINE_MMC);
+ glamo_engine_disable(host->core, GLAMO_ENGINE_MMC);
return 0;
}
struct glamo_mci_host *host = mmc_priv(mmc);
int ret;
- glamo_engine_enable(host->pdata->core, GLAMO_ENGINE_MMC);
- glamo_engine_reset(host->pdata->core, GLAMO_ENGINE_MMC);
+ glamo_engine_enable(host->core, GLAMO_ENGINE_MMC);
+ glamo_engine_reset(host->core, GLAMO_ENGINE_MMC);
glamo_reg_write(host, GLAMO_REG_MMC_WDATADS1,
(u16)(host->data_mem->start));