summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/at91/clk-main.c1
-rw-r--r--drivers/clk/clk-fixed-factor.c1
-rw-r--r--drivers/clk/clkdev.c2
-rw-r--r--drivers/clk/imx/clk-imx7.c11
-rw-r--r--drivers/clk/imx/clk-pllv3.c5
-rw-r--r--drivers/crypto/caam/caamrng.c4
-rw-r--r--drivers/gpio/gpiolib.c38
-rw-r--r--drivers/mci/atmel_mci.c3
-rw-r--r--drivers/net/macb.c4
-rw-r--r--drivers/of/of_path.c17
-rw-r--r--drivers/pinctrl/pinctrl-at91.c4
-rw-r--r--drivers/regulator/Kconfig1
-rw-r--r--drivers/regulator/pfuze.c67
-rw-r--r--drivers/video/atmel_lcdfb.c2
-rw-r--r--drivers/video/atmel_lcdfb_core.c1
-rw-r--r--drivers/video/imx-ipu-v3/imx-ldb.c46
-rw-r--r--drivers/video/ssd1307fb.c24
-rw-r--r--drivers/video/tc358767.c2
18 files changed, 178 insertions, 55 deletions
diff --git a/drivers/clk/at91/clk-main.c b/drivers/clk/at91/clk-main.c
index 55bc618a37..77dfdef518 100644
--- a/drivers/clk/at91/clk-main.c
+++ b/drivers/clk/at91/clk-main.c
@@ -391,6 +391,7 @@ at91_clk_register_rm9200_main(struct regmap *regmap,
clkmain = xzalloc(sizeof(*clkmain));
+ clkmain->parent = parent_name;
clkmain->clk.name = name;
clkmain->clk.ops = &rm9200_main_ops;
clkmain->clk.parent_names = &clkmain->parent;
diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c
index 0be48558e6..021c43339f 100644
--- a/drivers/clk/clk-fixed-factor.c
+++ b/drivers/clk/clk-fixed-factor.c
@@ -56,7 +56,6 @@ static int clk_factor_set_rate(struct clk *clk, unsigned long rate,
struct clk_fixed_factor *fix = container_of(clk, struct clk_fixed_factor, clk);
if (clk->flags & CLK_SET_RATE_PARENT) {
- printk("%s: %ld -> parent %ld\n", __func__, rate, rate * fix->div / fix->mult);
return clk_set_rate(clk_get_parent(clk), rate * fix->div / fix->mult);
}
diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c
index 6b16663551..abdc415272 100644
--- a/drivers/clk/clkdev.c
+++ b/drivers/clk/clkdev.c
@@ -181,7 +181,7 @@ struct clk *clk_get(struct device_d *dev, const char *con_id)
if (dev) {
clk = of_clk_get_by_name(dev->device_node, con_id);
- if (!IS_ERR(clk) || PTR_ERR(clk) != -ENODEV)
+ if (!IS_ERR(clk) || PTR_ERR(clk) != -ENOENT)
return clk;
}
diff --git a/drivers/clk/imx/clk-imx7.c b/drivers/clk/imx/clk-imx7.c
index d3a036c0c3..b79c8c3016 100644
--- a/drivers/clk/imx/clk-imx7.c
+++ b/drivers/clk/imx/clk-imx7.c
@@ -364,17 +364,6 @@ static int const clks_init_on[] __initconst = {
static struct clk_onecell_data clk_data;
-static struct clk ** const uart_clks[] __initconst = {
- &clks[IMX7D_UART1_ROOT_CLK],
- &clks[IMX7D_UART2_ROOT_CLK],
- &clks[IMX7D_UART3_ROOT_CLK],
- &clks[IMX7D_UART4_ROOT_CLK],
- &clks[IMX7D_UART5_ROOT_CLK],
- &clks[IMX7D_UART6_ROOT_CLK],
- &clks[IMX7D_UART7_ROOT_CLK],
- NULL
-};
-
static int imx7_clk_initialized;
static int imx7_ccm_probe(struct device_d *dev)
diff --git a/drivers/clk/imx/clk-pllv3.c b/drivers/clk/imx/clk-pllv3.c
index 0e55a63e92..44642e88f3 100644
--- a/drivers/clk/imx/clk-pllv3.c
+++ b/drivers/clk/imx/clk-pllv3.c
@@ -370,6 +370,7 @@ struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
struct clk_pllv3 *pll;
const struct clk_ops *ops;
int ret;
+ u32 val;
pll = xzalloc(sizeof(*pll));
@@ -414,6 +415,10 @@ struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
pll->clk.parent_names = &pll->parent;
pll->clk.num_parents = 1;
+ val = readl(pll->base);
+ val &= ~BM_PLL_BYPASS;
+ writel(val, pll->base);
+
ret = clk_register(&pll->clk);
if (ret) {
free(pll);
diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c
index 31a92731d2..51c267e3d3 100644
--- a/drivers/crypto/caam/caamrng.c
+++ b/drivers/crypto/caam/caamrng.c
@@ -203,8 +203,6 @@ static inline int rng_create_job_desc(struct caam_rng_ctx *ctx, int buf_id)
init_job_desc_shared(desc, ctx->sh_desc_dma, sh_len, HDR_SHARE_DEFER |
HDR_REVERSE);
- bd->addr = (dma_addr_t)bd->buf;
-
append_seq_out_ptr_intlen(desc, bd->addr, RN_BUF_SIZE, 0);
#ifdef DEBUG
print_hex_dump(KERN_ERR, "rng job desc@: ", DUMP_PREFIX_OFFSET, 16, 4,
@@ -218,7 +216,7 @@ static int caam_init_buf(struct caam_rng_ctx *ctx, int buf_id)
struct buf_data *bd = &ctx->bufs[buf_id];
int err;
- bd->buf = dma_alloc(RN_BUF_SIZE);
+ bd->buf = dma_alloc_coherent(RN_BUF_SIZE, &bd->addr);
err = rng_create_job_desc(ctx, buf_id);
if (err)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index a3e17ada0d..67d771bae3 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -119,33 +119,34 @@ void gpio_free(unsigned gpio)
int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
{
int err;
+ struct gpio_info *gi = gpio_to_desc(gpio);
+
+ /*
+ * Not all of the flags below are mulit-bit, but, for the sake
+ * of consistency, the code is written as if all of them were.
+ */
+ const bool active_low = (flags & GPIOF_ACTIVE_LOW) == GPIOF_ACTIVE_LOW;
+ const bool dir_in = (flags & GPIOF_DIR_IN) == GPIOF_DIR_IN;
+ const bool logical = (flags & GPIOF_LOGICAL) == GPIOF_LOGICAL;
+ const bool init_active = (flags & GPIOF_INIT_ACTIVE) == GPIOF_INIT_ACTIVE;
+ const bool init_high = (flags & GPIOF_INIT_HIGH) == GPIOF_INIT_HIGH;
err = gpio_request(gpio, label);
if (err)
return err;
- if (flags & GPIOF_ACTIVE_LOW) {
- struct gpio_info *gi = gpio_to_desc(gpio);
- gi->active_low = true;
- }
+ gi->active_low = active_low;
- if (flags & GPIOF_DIR_IN) {
+ if (dir_in)
err = gpio_direction_input(gpio);
- } else if (flags & GPIOF_LOGICAL) {
- err = gpio_direction_active(gpio,
- !!(flags & GPIOF_INIT_ACTIVE));
- } else {
- err = gpio_direction_output(gpio,
- !!(flags & GPIOF_INIT_HIGH));
- }
+ else if (logical)
+ err = gpio_direction_active(gpio, init_active);
+ else
+ err = gpio_direction_output(gpio, init_high);
if (err)
- goto free_gpio;
-
- return 0;
+ gpio_free(gpio);
- free_gpio:
- gpio_free(gpio);
return err;
}
EXPORT_SYMBOL_GPL(gpio_request_one);
@@ -379,6 +380,9 @@ static int of_gpiochip_scan_hogs(struct gpio_chip *chip)
struct device_node *np;
int ret, i;
+ if (!IS_ENABLED(CONFIG_OFDEVICE) || !chip->dev->device_node)
+ return 0;
+
for_each_available_child_of_node(chip->dev->device_node, np) {
if (!of_property_read_bool(np, "gpio-hog"))
continue;
diff --git a/drivers/mci/atmel_mci.c b/drivers/mci/atmel_mci.c
index 317cf46022..0d3b245ced 100644
--- a/drivers/mci/atmel_mci.c
+++ b/drivers/mci/atmel_mci.c
@@ -474,7 +474,6 @@ static int atmci_request(struct mci_host *mci, struct mci_cmd *cmd, struct mci_d
static void atmci_info(struct device_d *mci_dev)
{
struct atmel_mci *host = mci_dev->priv;
- struct atmel_mci_platform_data *pd = host->hw_dev->platform_data;
printf(" Bus data width: %d bit\n", host->mci.bus_width);
@@ -490,7 +489,7 @@ static void atmci_info(struct device_d *mci_dev)
printf("- %u Hz upper limit", host->mci.f_max);
printf("\n Card detection support: %s\n",
- gpio_is_valid(pd->detect_pin) ? "yes" : "no");
+ gpio_is_valid(host->detect_pin) ? "yes" : "no");
}
/*
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 739a3dfbef..7721bcb56a 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -666,7 +666,7 @@ static int macb_probe(struct device_d *dev)
macb->miibus.dev.device_node = mdiobus;
macb->phy_addr = -1;
- pclk_name = NULL;
+ pclk_name = "pclk";
} else {
dev_err(dev, "macb: no platform_data\n");
return -ENODEV;
@@ -681,7 +681,7 @@ static int macb_probe(struct device_d *dev)
* Do some basic initialization so that we at least can talk
* to the PHY
*/
- macb->pclk = clk_get(dev, "macb_clk");
+ macb->pclk = clk_get(dev, pclk_name);
if (IS_ERR(macb->pclk)) {
dev_err(dev, "no macb_clk\n");
return PTR_ERR(macb->pclk);
diff --git a/drivers/of/of_path.c b/drivers/of/of_path.c
index 334eab841a..e53041b0a1 100644
--- a/drivers/of/of_path.c
+++ b/drivers/of/of_path.c
@@ -56,11 +56,26 @@ static int __of_find_path(struct device_node *node, const char *part, char **out
dev = of_find_device_by_node_path(node->full_name);
if (!dev) {
+ int ret;
+ const char *uuid;
struct device_node *devnode = node->parent;
- if (of_device_is_compatible(devnode, "fixed-partitions"))
+ if (of_device_is_compatible(devnode, "fixed-partitions")) {
devnode = devnode->parent;
+ /* when partuuid is specified short-circuit the search for the cdev */
+ ret = of_property_read_string(node, "partuuid", &uuid);
+ if (!ret) {
+ cdev = cdev_by_partuuid(uuid);
+ if (!cdev)
+ return -ENODEV;
+
+ *outpath = basprintf("/dev/%s", cdev->name);
+
+ return 0;
+ }
+ }
+
dev = of_find_device_by_node_path(devnode->full_name);
if (!dev)
return -ENODEV;
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index d52c184e44..0303869774 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -538,7 +538,7 @@ static int at91_pinctrl_init(void)
{
return platform_driver_register(&at91_pinctrl_driver);
}
-coredevice_initcall(at91_pinctrl_init);
+postcore_initcall(at91_pinctrl_init);
static int at91_gpio_get(struct gpio_chip *chip, unsigned offset)
{
@@ -718,4 +718,4 @@ static int at91_gpio_init(void)
{
return platform_driver_register(&at91_gpio_driver);
}
-coredevice_initcall(at91_gpio_init);
+postcore_initcall(at91_gpio_init);
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 6a6c6d2248..92db8dc0e0 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -19,5 +19,6 @@ config REGULATOR_BCM283X
config REGULATOR_PFUZE
bool "Freescale PFUZE100/200/3000 regulator driver"
depends on I2C
+ depends on ARCH_IMX6
endif
diff --git a/drivers/regulator/pfuze.c b/drivers/regulator/pfuze.c
index 2a5fb715ce..dc41e8f55b 100644
--- a/drivers/regulator/pfuze.c
+++ b/drivers/regulator/pfuze.c
@@ -26,10 +26,33 @@
#include <i2c/i2c.h>
+#include <poweroff.h>
+#include <mach/imx6.h>
+
#define DRIVERNAME "pfuze"
#define MC13XXX_NUMREGS 0x3f
+#define PFUZE100_SW1ABMODE 0x23
+#define PFUZE100_SW1CMODE 0x31
+#define PFUZE100_SW2MODE 0x38
+#define PFUZE100_SW3AMODE 0x3f
+#define PFUZE100_SW3BMODE 0x46
+#define PFUZE100_SW4MODE 0x4d
+#define PFUZE100_VGEN1VOL 0x6c
+#define PFUZE100_VGEN2VOL 0x6d
+#define PFUZE100_VGEN3VOL 0x6e
+#define PFUZE100_VGEN4VOL 0x6f
+#define PFUZE100_VGEN5VOL 0x70
+#define PFUZE100_VGEN6VOL 0x71
+
+#define PFUZE100_SWxMODE_MASK 0xf
+#define PFUZE100_SWxMODE_APS_APS 0x8
+#define PFUZE100_SWxMODE_APS_OFF 0x4
+
+#define PFUZE100_VGENxLPWR BIT(6)
+#define PFUZE100_VGENxSTBY BIT(5)
+
struct pfuze {
struct device_d *dev;
struct regmap *map;
@@ -85,6 +108,46 @@ static int pfuze_i2c_reg_write(void *ctx, unsigned int reg, unsigned int val)
return ret == 1 ? 0 : ret;
}
+static void pfuze_power_off_prepare(struct poweroff_handler *handler)
+{
+ dev_info(pfuze_dev->dev, "Configure standy mode for power off");
+
+ /* Switch from default mode: APS/APS to APS/Off */
+ regmap_write_bits(pfuze_dev->map, PFUZE100_SW1ABMODE,
+ PFUZE100_SWxMODE_MASK, PFUZE100_SWxMODE_APS_OFF);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_SW1CMODE,
+ PFUZE100_SWxMODE_MASK, PFUZE100_SWxMODE_APS_OFF);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_SW2MODE,
+ PFUZE100_SWxMODE_MASK, PFUZE100_SWxMODE_APS_OFF);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_SW3AMODE,
+ PFUZE100_SWxMODE_MASK, PFUZE100_SWxMODE_APS_OFF);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_SW3BMODE,
+ PFUZE100_SWxMODE_MASK, PFUZE100_SWxMODE_APS_OFF);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_SW4MODE,
+ PFUZE100_SWxMODE_MASK, PFUZE100_SWxMODE_APS_OFF);
+
+ regmap_write_bits(pfuze_dev->map, PFUZE100_VGEN1VOL,
+ PFUZE100_VGENxLPWR | PFUZE100_VGENxSTBY,
+ PFUZE100_VGENxSTBY);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_VGEN2VOL,
+ PFUZE100_VGENxLPWR | PFUZE100_VGENxSTBY,
+ PFUZE100_VGENxSTBY);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_VGEN3VOL,
+ PFUZE100_VGENxLPWR | PFUZE100_VGENxSTBY,
+ PFUZE100_VGENxSTBY);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_VGEN4VOL,
+ PFUZE100_VGENxLPWR | PFUZE100_VGENxSTBY,
+ PFUZE100_VGENxSTBY);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_VGEN5VOL,
+ PFUZE100_VGENxLPWR | PFUZE100_VGENxSTBY,
+ PFUZE100_VGENxSTBY);
+ regmap_write_bits(pfuze_dev->map, PFUZE100_VGEN6VOL,
+ PFUZE100_VGENxLPWR | PFUZE100_VGENxSTBY,
+ PFUZE100_VGENxSTBY);
+
+ imx6_pm_stby_poweroff();
+}
+
static struct regmap_bus regmap_pfuze_i2c_bus = {
.reg_write = pfuze_i2c_reg_write,
.reg_read = pfuze_i2c_reg_read,
@@ -122,6 +185,10 @@ static int __init pfuze_probe(struct device_d *dev)
if (pfuze_init_callback)
pfuze_init_callback(pfuze_dev->map);
+ if (of_property_read_bool(dev->device_node,
+ "fsl,pmic-stby-poweroff"))
+ return poweroff_handler_register_fn(pfuze_power_off_prepare);
+
return 0;
}
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c
index 20204c1dd4..a0e41d10c2 100644
--- a/drivers/video/atmel_lcdfb.c
+++ b/drivers/video/atmel_lcdfb.c
@@ -85,7 +85,7 @@ static void atmel_lcdfb_start(struct atmel_lcdfb_info *sinfo)
lcdc_writel(sinfo, ATMEL_LCDC_DMACON, pdata->default_dmacon);
lcdc_writel(sinfo, ATMEL_LCDC_PWRCON,
- (pdata->guard_time << ATMEL_LCDC_GUARDT_OFFSET)
+ (sinfo->guard_time << ATMEL_LCDC_GUARDT_OFFSET)
| ATMEL_LCDC_PWR);
}
diff --git a/drivers/video/atmel_lcdfb_core.c b/drivers/video/atmel_lcdfb_core.c
index 555799ea4b..f6c5d7c051 100644
--- a/drivers/video/atmel_lcdfb_core.c
+++ b/drivers/video/atmel_lcdfb_core.c
@@ -258,6 +258,7 @@ int atmel_lcdc_register(struct device_d *dev, struct atmel_lcdfb_devdata *data)
sinfo = xzalloc(sizeof(*sinfo));
sinfo->pdata = pdata;
+ sinfo->guard_time = pdata->guard_time;
iores = dev_request_mem_resource(dev, 0);
if (IS_ERR(iores))
return PTR_ERR(iores);
diff --git a/drivers/video/imx-ipu-v3/imx-ldb.c b/drivers/video/imx-ipu-v3/imx-ldb.c
index 14a86a42c1..33dbade870 100644
--- a/drivers/video/imx-ipu-v3/imx-ldb.c
+++ b/drivers/video/imx-ipu-v3/imx-ldb.c
@@ -114,6 +114,7 @@ static int imx_ldb_prepare(struct imx_ldb_channel *imx_ldb_ch, struct fb_videomo
int di)
{
struct imx_ldb *ldb = imx_ldb_ch->ldb;
+ int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN;
ldb->soc_data->prepare(imx_ldb_ch, di, PICOS2KHZ(mode->pixclock) * 1000UL);
@@ -135,6 +136,10 @@ static int imx_ldb_prepare(struct imx_ldb_channel *imx_ldb_ch, struct fb_videomo
if (imx_ldb_ch == &ldb->channel[0]) {
ldb->ldb_ctrl &= ~LDB_CH0_MODE_EN_MASK;
ldb->ldb_ctrl |= LDB_CH0_MODE_EN_TO_DI0;
+ if (dual) {
+ ldb->ldb_ctrl &= ~LDB_CH1_MODE_EN_MASK;
+ ldb->ldb_ctrl |= LDB_CH1_MODE_EN_TO_DI0;
+ }
}
if (imx_ldb_ch == &ldb->channel[1]) {
@@ -147,20 +152,11 @@ static int imx_ldb_prepare(struct imx_ldb_channel *imx_ldb_ch, struct fb_videomo
return 0;
}
-static int imx6q_ldb_prepare(struct imx_ldb_channel *imx_ldb_ch, int di,
- unsigned long pixclk)
+static int imx6q_set_clock(struct imx_ldb *ldb, int ipuno, int dino, int chno, unsigned long pixclk)
{
struct clk *diclk, *ldbclk;
- struct imx_ldb *ldb = imx_ldb_ch->ldb;
- int ret, ipuno, dino;
char *clkname;
- void __iomem *gpr3 = (void *)MX6_IOMUXC_BASE_ADDR + 0xc;
- uint32_t val;
- int shift;
- int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN;
-
- ipuno = ((di >> 1) & 1) + 1;
- dino = di & 0x1;
+ int ret;
clkname = basprintf("ipu%d_di%d_sel", ipuno, dino);
diclk = clk_lookup(clkname);
@@ -170,7 +166,7 @@ static int imx6q_ldb_prepare(struct imx_ldb_channel *imx_ldb_ch, int di,
return PTR_ERR(diclk);
}
- clkname = basprintf("ldb_di%d_podf", imx_ldb_ch->chno);
+ clkname = basprintf("ldb_di%d_podf", chno);
ldbclk = clk_lookup(clkname);
free(clkname);
if (IS_ERR(ldbclk)) {
@@ -184,10 +180,34 @@ static int imx6q_ldb_prepare(struct imx_ldb_channel *imx_ldb_ch, int di,
return ret;
}
+ clk_set_rate(clk_get_parent(ldbclk), pixclk);
+ clk_set_rate(ldbclk, pixclk);
+
+ return 0;
+}
+static int imx6q_ldb_prepare(struct imx_ldb_channel *imx_ldb_ch, int di,
+ unsigned long pixclk)
+{
+ struct imx_ldb *ldb = imx_ldb_ch->ldb;
+ int ipuno, dino;
+
+ void __iomem *gpr3 = (void *)MX6_IOMUXC_BASE_ADDR + 0xc;
+ uint32_t val;
+ int shift;
+ int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN;
+
+ ipuno = ((di >> 1) & 1) + 1;
+ dino = di & 0x1;
+
if (!dual)
pixclk *= 2;
- clk_set_rate(clk_get_parent(ldbclk), pixclk);
+ if (dual) {
+ imx6q_set_clock(ldb, ipuno, dino, 0, pixclk);
+ imx6q_set_clock(ldb, ipuno, dino, 1, pixclk);
+ } else {
+ imx6q_set_clock(ldb, ipuno, dino, imx_ldb_ch->chno, pixclk);
+ }
val = readl(gpr3);
shift = (imx_ldb_ch->chno == 0) ? 6 : 8;
diff --git a/drivers/video/ssd1307fb.c b/drivers/video/ssd1307fb.c
index 7437d340ee..54e02e7220 100644
--- a/drivers/video/ssd1307fb.c
+++ b/drivers/video/ssd1307fb.c
@@ -24,6 +24,7 @@
#include <of_device.h>
#include <gpio.h>
#include <of_gpio.h>
+#include <regulator.h>
#define SSD1307FB_DATA 0x40
#define SSD1307FB_COMMAND 0x80
@@ -70,6 +71,7 @@ struct ssd1307fb_par {
u32 prechargep1;
u32 prechargep2;
int reset;
+ struct regulator *vbat;
u32 seg_remap;
u32 vcomh;
u32 width;
@@ -422,6 +424,12 @@ static int ssd1307fb_probe(struct device_d *dev)
goto fb_alloc_error;
}
+ par->vbat = regulator_get(&client->dev, "vbat-supply");
+ if (IS_ERR(par->vbat)) {
+ dev_info(&client->dev, "Will not use VBAT");
+ par->vbat = NULL;
+ }
+
ret = of_property_read_u32(node, "solomon,width", &par->width);
if (ret) {
dev_err(&client->dev,
@@ -505,11 +513,26 @@ static int ssd1307fb_probe(struct device_d *dev)
goto reset_oled_error;
}
+ if (par->vbat) {
+ ret = regulator_disable(par->vbat);
+ if (ret < 0)
+ goto reset_oled_error;
+ }
+
i2c_set_clientdata(client, info);
/* Reset the screen */
gpio_set_value(par->reset, 0);
udelay(4);
+
+ if (par->vbat) {
+ ret = regulator_enable(par->vbat);
+ if (ret < 0)
+ goto reset_oled_error;
+ }
+
+ mdelay(100);
+
gpio_set_value(par->reset, 1);
udelay(4);
@@ -548,6 +571,7 @@ static int ssd1307fb_probe(struct device_d *dev)
panel_init_error:
reset_oled_error:
fb_alloc_error:
+ regulator_disable(par->vbat);
free(info);
return ret;
}
diff --git a/drivers/video/tc358767.c b/drivers/video/tc358767.c
index ab2e86ec43..d10dcf2f52 100644
--- a/drivers/video/tc358767.c
+++ b/drivers/video/tc358767.c
@@ -967,7 +967,7 @@ static int tc_main_link_setup(struct tc_data *tc)
goto err_dpcd_read;
if (tmp[0] != tc->assr) {
- dev_warn(dev, "Failed to switch display ASSR to %d, falling back to unscrambled mode\n",
+ dev_dbg(dev, "Failed to switch display ASSR to %d, falling back to unscrambled mode\n",
tc->assr);
/* trying with disabled scrambler */
tc->link.scrambler_dis = 1;