mfd:rk616:support power down in suspend,add config to enable/disable debug message

This commit is contained in:
yxj
2013-06-25 09:17:13 +08:00
parent 9fb44f94a4
commit d78f2d3e8f
5 changed files with 62 additions and 49 deletions

View File

@@ -852,6 +852,12 @@ config MFD_RK616
if you say yes here you get support for the RK616, with func as
HDMI、LCD、LVDS、CODEC、MIPI.
config RK616_DEBUG
bool "RK616(JettaB) debug enable"
depends on MFD_RK616
help
if you say y here ,it will enable rk616 debug function
endif # MFD_SUPPORT
menu "Multimedia Capabilities Port drivers"

19
drivers/mfd/rk616-core.c Normal file → Executable file
View File

@@ -1,4 +1,3 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/delay.h>
@@ -129,7 +128,6 @@ static ssize_t rk616_reg_write (struct file *file, const char __user *buf, size_
if (copy_from_user(kbuf, buf, count))
return -EFAULT;
sscanf(kbuf, "%x%x", &reg,&val);
dev_dbg(rk616->dev,"%s:reg:0x%04x val:0x%08x\n",__func__,reg,val);
rk616->write_dev(rk616,reg,&val);
return count;
}
@@ -244,7 +242,7 @@ static int rk616_pll_wait_lock(struct mfd_rk616 *rk616,int id)
ret = rk616->read_dev(rk616,CRU_PLL0_CON1 + offset,&val);
if (val&PLL0_LOCK)
{
dev_info(rk616->dev,"PLL%d locked\n",id);
rk616_dbg(rk616->dev,"PLL%d locked\n",id);
break;
}
msleep(1);
@@ -252,7 +250,7 @@ static int rk616_pll_wait_lock(struct mfd_rk616 *rk616,int id)
}
if (delay == 0)
{
printk(KERN_ALERT "rk616 wait PLL%d lock time out!\n",id);
dev_err(rk616->dev,"rk616 wait PLL%d lock time out!\n",id);
}
return 0;
@@ -385,7 +383,17 @@ static int rk616_clk_common_init(struct mfd_rk616 *rk616)
return 0;
}
static int rk616_core_suspend(struct device *dev, pm_message_t state)
{
return 0;
}
static int rk616_core_resume(struct device* dev)
{
struct mfd_rk616 *rk616 = dev_get_drvdata(dev);
rk616_clk_common_init(rk616);
return 0;
}
static int rk616_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
int ret;
@@ -456,7 +464,6 @@ static int rk616_i2c_probe(struct i2c_client *client,const struct i2c_device_id
ret = mfd_add_devices(rk616->dev, -1,
rk616_devs, ARRAY_SIZE(rk616_devs),
NULL, rk616->irq_base);
dev_info(&client->dev,"rk616 core probe success!\n");
return 0;
}
@@ -483,6 +490,8 @@ static struct i2c_driver rk616_i2c_driver = {
.driver = {
.name = "rk616",
.owner = THIS_MODULE,
.suspend = &rk616_core_suspend,
.resume = &rk616_core_resume,
},
.probe = &rk616_i2c_probe,
.remove = &rk616_i2c_remove,

45
drivers/mfd/rk616-vif.c Normal file → Executable file
View File

@@ -1,10 +1,10 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/mfd/rk616.h>
extern int rk616_pll_set_rate(struct mfd_rk616 *rk616,int id,u32 cfg_val,u32 frac);
extern int rk616_pll_pwr_down(struct mfd_rk616 *rk616,int id);
@@ -44,7 +44,7 @@ extern int rk616_pll_pwr_down(struct mfd_rk616 *rk616,int id);
}
dev_info(rk616->dev,"rk616 vif%d disable\n",id);
rk616_dbg(rk616->dev,"rk616 vif%d disable\n",id);
return 0;
}
@@ -76,7 +76,7 @@ int rk616_vif_enable(struct mfd_rk616 *rk616,int id)
ret = rk616->write_dev(rk616,VIF0_REG0 + offset,&val);
dev_info(rk616->dev,"rk616 vif%d enable\n",id);
rk616_dbg(rk616->dev,"rk616 vif%d enable\n",id);
return 0;
@@ -97,7 +97,7 @@ static int rk616_vif_bypass(struct mfd_rk616 *rk616,int id)
ret = rk616->write_dev(rk616,CRU_CLKSEL2_CON,&val);
dev_info(rk616->dev,"rk616 vif%d bypass\n",id);
rk616_dbg(rk616->dev,"rk616 vif%d bypass\n",id);
return 0;
}
@@ -237,7 +237,7 @@ static int rk616_scaler_disable(struct mfd_rk616 *rk616)
val &= (~SCL_EN); //disable scaler
val |= (SCL_EN<<16);
ret = rk616->write_dev(rk616,SCL_REG0,&val);
dev_info(rk616->dev,"rk616 scaler disable\n");
rk616_dbg(rk616->dev,"rk616 scaler disable\n");
return 0;
}
@@ -417,7 +417,7 @@ int rk616_scaler_cfg(struct mfd_rk616 *rk616,rk_screen *screen)
rk616->write_dev(rk616,SCL_REG8,&scl_reg8_value);
rk616->write_dev(rk616,SCL_REG0,&scl_reg0_value);
dev_info(rk616->dev,"rk616 scaler enable\n");
rk616_dbg(rk616->dev,"rk616 scaler enable\n");
#endif
return 0;
@@ -629,13 +629,13 @@ int rk616_set_router(struct mfd_rk616 *rk616,rk_screen *screen,bool enable)
{
ret = rk616_dual_input_cfg(rk616,screen,enable);
dev_info(rk616->dev,"rk616 use dual input for dual display!\n");
rk616_dbg(rk616->dev,"rk616 use dual input for dual display!\n");
}
else if((pdata->lcd0_func == INPUT) && (pdata->lcd1_func == UNUSED))
{
ret = rk616_lcd0_input_lcd1_unused_cfg(rk616,screen,enable);
dev_info(rk616->dev,
rk616_dbg(rk616->dev,
"rk616 use lcd0 as input and lvds/rgb "
"port as output for dual display\n");
}
@@ -643,14 +643,14 @@ int rk616_set_router(struct mfd_rk616 *rk616,rk_screen *screen,bool enable)
{
ret = rk616_lcd0_input_lcd1_output_cfg(rk616,screen,enable);
dev_info(rk616->dev,
rk616_dbg(rk616->dev,
"rk616 use lcd0 as input and lcd1 as "
"output for dual display\n");
}
else if((pdata->lcd0_func == UNUSED) && (pdata->lcd1_func == INPUT))
{
ret = rk616_lcd0_unused_lcd1_input_cfg(rk616,screen,enable);
dev_info(rk616->dev,
rk616_dbg(rk616->dev,
"rk616 use lcd1 as input and lvds/rgb as "
"output for dual display\n");
}
@@ -692,6 +692,22 @@ static int rk616_router_cfg(struct mfd_rk616 *rk616)
}
static int rk616_dither_cfg(struct mfd_rk616 *rk616,rk_screen *screen,bool enable)
{
u32 val = 0;
int ret = 0;
val = FRC_DCLK_INV | (FRC_DCLK_INV << 16);
if((screen->face != OUT_P888) && enable) //enable frc dither if the screen is not 24bit
val |= FRC_DITHER_EN | (FRC_DITHER_EN << 16);
//val |= (FRC_DITHER_EN << 16);
else
val |= (FRC_DITHER_EN << 16);
ret = rk616->write_dev(rk616,FRC_REG,&val);
return 0;
}
int rk616_display_router_cfg(struct mfd_rk616 *rk616,rk_screen *screen,bool enable)
{
int ret;
@@ -702,13 +718,12 @@ int rk616_display_router_cfg(struct mfd_rk616 *rk616,rk_screen *screen,bool enab
ret = rk616_router_cfg(rk616);
ret = rk616_vif_cfg(rk616,hdmi_screen,0);
ret = rk616_vif_cfg(rk616,hdmi_screen,1);
ret = rk616_scaler_cfg(rk616,screen);
ret = rk616_scaler_cfg(rk616,screen);
ret = rk616_dither_cfg(rk616,screen,enable);
return 0;
}
int rk616_set_vif(struct mfd_rk616 *rk616,rk_screen *screen,bool connect)
{
struct rk616_platform_data *pdata;
@@ -736,12 +751,12 @@ int rk616_set_vif(struct mfd_rk616 *rk616,rk_screen *screen,bool connect)
{
rk616_dual_input_cfg(rk616,screen,connect);
dev_info(rk616->dev,"rk616 use dual input for dual display!\n");
rk616_dbg(rk616->dev,"rk616 use dual input for dual display!\n");
}
else if((pdata->lcd0_func == INPUT) && (pdata->lcd1_func == UNUSED))
{
rk616_lcd0_input_lcd1_unused_cfg(rk616,screen,connect);
dev_info(rk616->dev,"rk616 use lcd0 input for hdmi display!\n");
rk616_dbg(rk616->dev,"rk616 use lcd0 input for hdmi display!\n");
}
rk616_router_cfg(rk616);
rk616_vif_cfg(rk616,screen,0);

34
drivers/video/rockchip/transmitter/rk616_lvds.c Normal file → Executable file
View File

@@ -4,6 +4,7 @@
#include <linux/slab.h>
#include "rk616_lvds.h"
struct rk616_lvds *g_lvds;
@@ -46,7 +47,7 @@ static int rk616_lvds_cfg(struct mfd_rk616 *rk616,rk_screen *screen)
(LVDS_HBP_ODD_MASK);
ret = rk616->write_dev(rk616,CRU_LVDS_CON0,&val);
dev_info(rk616->dev,"rk616 use dual lvds channel.......\n");
rk616_dbg(rk616->dev,"rk616 use dual lvds channel.......\n");
}
else //single lvds channel
{
@@ -59,7 +60,7 @@ static int rk616_lvds_cfg(struct mfd_rk616 *rk616,rk_screen *screen)
(LVDS_OUT_FORMAT_MASK) | (LVDS_DCLK_INV << 16);
ret = rk616->write_dev(rk616,CRU_LVDS_CON0,&val);
dev_info(rk616->dev,"rk616 use single lvds channel.......\n");
rk616_dbg(rk616->dev,"rk616 use single lvds channel.......\n");
}
@@ -75,7 +76,7 @@ static int rk616_lvds_cfg(struct mfd_rk616 *rk616,rk_screen *screen)
val &= ~(LVDS_OUT_EN);
val |= (LVDS_OUT_EN << 16);
ret = rk616->write_dev(rk616,CRU_IO_CON0,&val);
dev_info(rk616->dev,"rk616 use RGB output.....\n");
rk616_dbg(rk616->dev,"rk616 use RGB output.....\n");
}
}
@@ -85,25 +86,6 @@ static int rk616_lvds_cfg(struct mfd_rk616 *rk616,rk_screen *screen)
}
static int rk616_dither_cfg(struct mfd_rk616 *rk616,rk_screen *screen,bool enable)
{
u32 val = 0;
int ret = 0;
val = FRC_DCLK_INV | (FRC_DCLK_INV << 16);
if((screen->face != OUT_P888) && enable) //enable frc dither if the screen is not 24bit
val |= FRC_DITHER_EN | (FRC_DITHER_EN << 16);
//val |= (FRC_DITHER_EN << 16);
else
val |= (FRC_DITHER_EN << 16);
ret = rk616->write_dev(rk616,FRC_REG,&val);
return 0;
}
int rk616_scaler_set_param(rk_screen *screen,bool enable )//enable:0 bypass 1: scale
{
int ret;
@@ -113,10 +95,7 @@ int rk616_scaler_set_param(rk_screen *screen,bool enable )//enable:0 bypass 1: s
printk(KERN_ERR "%s:mfd rk616 is null!\n",__func__);
return -1;
}
ret = rk616_display_router_cfg(rk616,screen,enable);
ret = rk616_dither_cfg(rk616,screen,enable);
ret = rk616_lvds_cfg(rk616,screen);
return ret;
}
@@ -126,10 +105,7 @@ static int rk616_lvds_init_cfg(struct mfd_rk616 *rk616,rk_screen *screen)
{
int ret ;
ret = rk616_display_router_cfg(rk616,screen,0);
ret = rk616_dither_cfg(rk616,screen,0);
ret = rk616_lvds_cfg(rk616,screen);
return ret;
}
@@ -156,7 +132,7 @@ static void rk616_lvds_late_resume(struct early_suspend *h)
{
struct rk616_lvds *lvds = container_of(h, struct rk616_lvds,early_suspend);
struct mfd_rk616 *rk616 = lvds->rk616;
rk616_lvds_cfg(rk616,lvds->screen);
rk616_lvds_init_cfg(rk616,lvds->screen);
}
#endif

7
include/linux/mfd/rk616.h Normal file → Executable file
View File

@@ -7,6 +7,13 @@
#include <linux/clk.h>
#include <linux/delay.h>
#if defined(CONFIG_RK616_DEBUG)
#define rk616_dbg(dev, format, arg...) \
dev_info(dev , format , ## arg)
#else
#define rk616_dbg(dev, format, arg...) do{}while(0)
#endif
#define VIF0_REG0 0x0000
#define VIF0_DDR_CLK_EN (1<<3)
#define VIF0_DDR_PHASEN_EN (1<<2) //negative edge first en