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"
-
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/delay.h>
if (copy_from_user(kbuf, buf, count))
return -EFAULT;
sscanf(kbuf, "%x%x", ®,&val);
- dev_dbg(rk616->dev,"%s:reg:0x%04x val:0x%08x\n",__func__,reg,val);
rk616->write_dev(rk616,reg,&val);
return count;
}
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);
}
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;
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;
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;
}
.driver = {
.name = "rk616",
.owner = THIS_MODULE,
+ .suspend = &rk616_core_suspend,
+ .resume = &rk616_core_resume,
},
.probe = &rk616_i2c_probe,
.remove = &rk616_i2c_remove,
#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);
}
- dev_info(rk616->dev,"rk616 vif%d disable\n",id);
+ rk616_dbg(rk616->dev,"rk616 vif%d disable\n",id);
return 0;
}
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;
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;
}
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;
}
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;
{
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");
}
{
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");
}
}
+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;
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;
{
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);
#include <linux/slab.h>
#include "rk616_lvds.h"
+
struct rk616_lvds *g_lvds;
(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
{
(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");
}
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");
}
}
}
-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;
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;
}
{
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;
}
{
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
#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