};
static struct rk1000 *rk1000;
+int cvbsmode = -1;
void rk1000_reset_ctrl(int enable)
{
return (ret == 2) ? 0 : -1;
}
+static ssize_t rk1000_show(struct kobject *kobj, struct kobj_attribute *attr,char *buf)
+{
+ int ret=-1;
+ int i=0;
+ unsigned char tv_encoder_regs[] = {0x00, 0x00, 0x00, 0x03, 0x00, 0x00};
+ unsigned char tv_encoder_control_regs[] = {0x43, 0x01};
+
+
+ for (i = 0; i < sizeof(tv_encoder_regs); i++) {
+ ret = rk1000_i2c_recv(I2C_ADDR_TVE, i, buf);
+ printk("---%x--\n",buf[0]);
+ if (ret < 0) {
+ pr_err("rk1000_tv_write_block err!\n");
+ return ret;
+ }
+ }
+
+ for (i = 0; i < sizeof(tv_encoder_control_regs); i++) {
+ ret = rk1000_i2c_recv(I2C_ADDR_CTRL,i + 3,buf);
+ printk("cntrl---%x--\n",buf[0]);
+ if (ret < 0) {
+ pr_err("rk1000_control_write_block err!\n");
+ return ret;
+ }
+ }
+ return 0;
+}
+
+static DEVICE_ATTR(rkcontrl, 0666, rk1000_show, NULL);
+
+
+static int __init bootloader_cvbs_setup(char *str){
+ static int ret;
+ if (str) {
+ printk("cvbs init tve.format is %s\n", str);
+ ret = sscanf(str, "%d", &cvbsmode);
+ }
+ return 0;
+}
+early_param("tve.format", bootloader_cvbs_setup);
#ifdef CONFIG_PM
static int rk1000_control_suspend(struct device *dev)
enum of_gpio_flags flags;
int ret;
+
DBG("[%s] start\n", __func__);
rk1000 = kmalloc(sizeof(*rk1000), GFP_KERNEL);
if (!rk1000) {
dev_err(&client->dev, ">> rk1000 core inf kmalloc fail!");
return -ENOMEM;
}
+
memset(rk1000, 0, sizeof(struct rk1000));
rk1000->client = client;
rk1000->dev = &client->dev;
rk1000_np = rk1000->dev->of_node;
- /********Get reset pin***********/
- rk1000->io_reset.gpio = of_get_named_gpio_flags(rk1000_np,
- "gpio-reset",
- 0, &flags);
- if (!gpio_is_valid(rk1000->io_reset.gpio)) {
- DBG("invalid rk1000->io_reset.gpio: %d\n",
- rk1000->io_reset.gpio);
- ret = -1;
- goto err;
- }
- ret = gpio_request(rk1000->io_reset.gpio, "rk1000-reset-io");
- if (ret != 0) {
- DBG("gpio_request rk1000->io_reset.gpio invalid: %d\n",
- rk1000->io_reset.gpio);
- goto err;
- }
- rk1000->io_reset.active = !(flags & OF_GPIO_ACTIVE_LOW);
- gpio_direction_output(rk1000->io_reset.gpio,
- !(rk1000->io_reset.active));
- msleep(20);
- /********Get power pin***********/
- rk1000->io_power.gpio = of_get_named_gpio_flags(rk1000_np,
- "gpio-power",
- 0, &flags);
- if (gpio_is_valid(rk1000->io_power.gpio)) {
- ret = gpio_request(rk1000->io_power.gpio, "rk1000-power-io");
+
+ if(cvbsmode<0){
+ /********Get reset pin***********/
+ rk1000->io_reset.gpio = of_get_named_gpio_flags(rk1000_np,
+ "gpio-reset",
+ 0, &flags);
+ if (!gpio_is_valid(rk1000->io_reset.gpio)) {
+ DBG("invalid rk1000->io_reset.gpio: %d\n",
+ rk1000->io_reset.gpio);
+ ret = -1;
+ goto err;
+ }
+ ret = gpio_request(rk1000->io_reset.gpio, "rk1000-reset-io");
if (ret != 0) {
- DBG("gpio_request rk1000->io_power.gpio invalid: %d\n",
- rk1000->io_power.gpio);
+ DBG("gpio_request rk1000->io_reset.gpio invalid: %d\n",
+ rk1000->io_reset.gpio);
goto err;
}
- rk1000->io_power.active = !(flags & OF_GPIO_ACTIVE_LOW);
- gpio_direction_output(rk1000->io_power.gpio,
- rk1000->io_power.active);
+ rk1000->io_reset.active = !(flags & OF_GPIO_ACTIVE_LOW);
+
+
+ gpio_direction_output(rk1000->io_reset.gpio,
+ !(rk1000->io_reset.active));
+ msleep(20);
+ /********Get power pin***********/
+ rk1000->io_power.gpio = of_get_named_gpio_flags(rk1000_np,
+ "gpio-power",
+ 0, &flags);
+ if (gpio_is_valid(rk1000->io_power.gpio)) {
+ ret = gpio_request(rk1000->io_power.gpio, "rk1000-power-io");
+ if (ret != 0) {
+ DBG("gpio_request rk1000->io_power.gpio invalid: %d\n",
+ rk1000->io_power.gpio);
+ goto err;
+ }
+ rk1000->io_power.active = !(flags & OF_GPIO_ACTIVE_LOW);
+ gpio_direction_output(rk1000->io_power.gpio,
+ rk1000->io_power.active);
+ }
+ /********rk1000 reset***********/
+ gpio_set_value(rk1000->io_reset.gpio, rk1000->io_reset.active);
+ msleep(100);
+ gpio_set_value(rk1000->io_reset.gpio, !(rk1000->io_reset.active));
}
- /********rk1000 reset***********/
- gpio_set_value(rk1000->io_reset.gpio, rk1000->io_reset.active);
- msleep(100);
- gpio_set_value(rk1000->io_reset.gpio, !(rk1000->io_reset.active));
rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_ADC, 0x88);
#ifdef CONFIG_SND_SOC_RK1000
rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_CODEC, 0x00);
rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_CODEC, 0x0d);
#endif
rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_I2C, 0x22);
- rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_TVE, 0x00);
+
+ if(cvbsmode<0){
+ rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_TVE, 0x00);
+ }
+ device_create_file(&client->dev, &dev_attr_rkcontrl);
DBG("rk1000 probe ok\n");
return 0;
err:
#include "rk1000_tve.h"
struct rk1000_tve rk1000_tve;
-
+int cvbsformat = -1;
int rk1000_tv_write_block(u8 reg, u8 *buf, u8 len)
{
return ret;
}
+static int __init bootloader_rk1000_setup(char *str){
+ static int ret;
+ if (str) {
+ printk("cvbs init tve.format is %s\n", str);
+ ret = sscanf(str, "%d", &cvbsformat);
+ }
+ return 0;
+}
+early_param("tve.format", bootloader_rk1000_setup);
+
int rk1000_switch_fb(const struct fb_videomode *modedb, int tv_mode)
{
struct rk_screen *screen;
else
screen->pin_vsync = 0;
screen->pin_den = 0;
- screen->pin_dclk = 1;
+ screen->pin_dclk = 0;
/* Swap rule */
screen->swap_rb = 0;
screen->swap_rg = 0;
screen.mode.vsync_len = 6;
rk_fb_switch_screen(&screen, 2 , rk1000_tve.video_source);
/* Power down RK1000 output DAC. */
- return rk1000_i2c_send(I2C_ADDR_TVE, 0x03, 0x07);
+ if(cvbsformat <0)
+ return rk1000_i2c_send(I2C_ADDR_TVE, 0x03, 0x07);
+ else
+ return 0;
}
pr_err("video src is lcdc%d, prop is %d\n", rk1000_tve.video_source,
rk1000_tve.property);
#endif
- rk1000_tve.mode = RK1000_TVOUT_DEAULT;
+ printk("-------|%d|-------\n",cvbsformat);
+ if (cvbsformat >= 0)
+ rk1000_tve.mode = cvbsformat + 1;
+ else
+ rk1000_tve.mode = RK1000_TVOUT_DEAULT;
+
rc = rk1000_tve_initial();
if (rc) {
dev_err(&client->dev, "rk1000 tvencoder probe error %d\n", rc);
};
static struct rk1000_monspecs cvbs_monspecs;
+extern int cvbsformat;
int rk1000_tv_ntsc_init(void)
{
unsigned char tv_encoder_control_regs[] = {0x43, 0x01};
int i;
int ret;
-
+ printk("---------%s----%d-----\n",__FUNCTION__,__LINE__);
for (i = 0; i < sizeof(tv_encoder_regs); i++) {
ret = rk1000_tv_write_block(i, tv_encoder_regs + i, 1);
if (ret < 0) {
unsigned char tv_encoder_control_regs[] = {0x41, 0x01};
int i;
int ret;
-
+
for (i = 0; i < sizeof(tv_encoder_regs); i++) {
ret = rk1000_tv_write_block(i, tv_encoder_regs+i, 1);
if (ret < 0) {
cvbs_monspecs.enable = 0;
rk1000_tv_standby(RK1000_TVOUT_CVBS);
} else if (enable == 1) {
- val = 0x07;
- rk1000_tv_write_block(0x03, &val, 1);
- rk1000_switch_fb(cvbs_monspecs.mode,
+
+ if(cvbsformat>=0){
+ rk1000_switch_fb(cvbs_monspecs.mode,
cvbs_monspecs.mode_set);
- msleep(600);
- val = 0x03;
- rk1000_tv_write_block(0x03, &val, 1);
+ cvbsformat=-1;
+ }else{
+ val = 0x07;
+ rk1000_tv_write_block(0x03, &val, 1);
+ rk1000_switch_fb(cvbs_monspecs.mode,
+ cvbs_monspecs.mode_set);
+ msleep(600);
+ val = 0x03;
+ rk1000_tv_write_block(0x03, &val, 1);
+ }
cvbs_monspecs.enable = 1;
}
}
cvbs_monspecs.ddev = rk_display_device_register(&display_rk1000_cvbs,
parent, NULL);
rk1000_tve.cvbs = &cvbs_monspecs;
- if (rk1000_tve.mode < TVOUT_YPBPR_720X480P_60)
+ if (rk1000_tve.mode < TVOUT_YPBPR_720X480P_60){
rk_display_device_enable(cvbs_monspecs.ddev);
+ }
return 0;
}