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/mci/mci-core.c54
-rw-r--r--drivers/net/macb.c4
-rw-r--r--drivers/nvmem/snvs_lpgpr.c96
-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
20 files changed, 270 insertions, 113 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/mci/mci-core.c b/drivers/mci/mci-core.c
index 3da1c261a9..07911d43d7 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -469,7 +469,7 @@ static int mmc_change_freq(struct mci *mci)
return err;
}
- cardtype = mci->ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK;
+ cardtype = mci->ext_csd[EXT_CSD_DEVICE_TYPE] & EXT_CSD_CARD_TYPE_MASK;
err = mci_switch(mci, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
@@ -499,13 +499,13 @@ static int mmc_change_freq(struct mci *mci)
mci->card_caps |= MMC_CAP_MMC_HIGHSPEED;
if (IS_ENABLED(CONFIG_MCI_MMC_BOOT_PARTITIONS) &&
- mci->ext_csd[EXT_CSD_REV] >= 3 && mci->ext_csd[EXT_CSD_BOOT_MULT]) {
+ mci->ext_csd[EXT_CSD_REV] >= 3 && mci->ext_csd[EXT_CSD_BOOT_SIZE_MULT]) {
int idx;
unsigned int part_size;
for (idx = 0; idx < MMC_NUM_BOOT_PARTITION; idx++) {
char *name, *partname;
- part_size = mci->ext_csd[EXT_CSD_BOOT_MULT] << 17;
+ part_size = mci->ext_csd[EXT_CSD_BOOT_SIZE_MULT] << 17;
partname = basprintf("boot%d", idx);
name = basprintf("%s.%s", mci->cdevname, partname);
@@ -515,7 +515,7 @@ static int mmc_change_freq(struct mci *mci)
MMC_BLK_DATA_AREA_BOOT);
}
- mci->ext_csd_part_config = mci->ext_csd[EXT_CSD_PART_CONFIG];
+ mci->ext_csd_part_config = mci->ext_csd[EXT_CSD_PARTITION_CONFIG];
mci->bootpart = (mci->ext_csd_part_config >> 3) & 0x7;
}
@@ -770,6 +770,12 @@ static void mci_correct_version_from_ext_csd(struct mci *mci)
case 6:
mci->version = MMC_VERSION_4_5;
break;
+ case 7:
+ mci->version = MMC_VERSION_5_0;
+ break;
+ case 8:
+ mci->version = MMC_VERSION_5_1;
+ break;
}
}
}
@@ -863,10 +869,10 @@ static void mci_extract_card_capacity_from_csd(struct mci *mci)
csize = UNSTUFF_BITS(mci->csd, 48, 22);
mci->capacity = (1 + csize) << 10;
} else {
- mci->capacity = mci->ext_csd[EXT_CSD_SEC_CNT] << 0 |
- mci->ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
- mci->ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
- mci->ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
+ mci->capacity = mci->ext_csd[EXT_CSD_SEC_COUNT] << 0 |
+ mci->ext_csd[EXT_CSD_SEC_COUNT + 1] << 8 |
+ mci->ext_csd[EXT_CSD_SEC_COUNT + 2] << 16 |
+ mci->ext_csd[EXT_CSD_SEC_COUNT + 3] << 24;
}
} else {
cmult = UNSTUFF_BITS(mci->csd, 47, 3);
@@ -907,16 +913,16 @@ static int mmc_compare_ext_csds(struct mci *mci, unsigned bus_width)
if (bus_width == MMC_BUS_WIDTH_1)
goto out;
/* only compare read only fields */
- err = (mci->ext_csd[EXT_CSD_PARTITION_SUPPORT] ==
- bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
+ err = (mci->ext_csd[EXT_CSD_PARTITIONING_SUPPORT] ==
+ bw_ext_csd[EXT_CSD_PARTITIONING_SUPPORT]) &&
(mci->ext_csd[EXT_CSD_ERASED_MEM_CONT] ==
bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
(mci->ext_csd[EXT_CSD_REV] ==
bw_ext_csd[EXT_CSD_REV]) &&
- (mci->ext_csd[EXT_CSD_STRUCTURE] ==
- bw_ext_csd[EXT_CSD_STRUCTURE]) &&
- (mci->ext_csd[EXT_CSD_CARD_TYPE] ==
- bw_ext_csd[EXT_CSD_CARD_TYPE]) &&
+ (mci->ext_csd[EXT_CSD_CSD_STRUCTURE] ==
+ bw_ext_csd[EXT_CSD_CSD_STRUCTURE]) &&
+ (mci->ext_csd[EXT_CSD_DEVICE_TYPE] ==
+ bw_ext_csd[EXT_CSD_DEVICE_TYPE]) &&
(mci->ext_csd[EXT_CSD_S_A_TIMEOUT] ==
bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) &&
(mci->ext_csd[EXT_CSD_HC_WP_GRP_SIZE] ==
@@ -933,14 +939,14 @@ static int mmc_compare_ext_csds(struct mci *mci, unsigned bus_width)
bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) &&
(mci->ext_csd[EXT_CSD_TRIM_MULT] ==
bw_ext_csd[EXT_CSD_TRIM_MULT]) &&
- (mci->ext_csd[EXT_CSD_SEC_CNT + 0] ==
- bw_ext_csd[EXT_CSD_SEC_CNT + 0]) &&
- (mci->ext_csd[EXT_CSD_SEC_CNT + 1] ==
- bw_ext_csd[EXT_CSD_SEC_CNT + 1]) &&
- (mci->ext_csd[EXT_CSD_SEC_CNT + 2] ==
- bw_ext_csd[EXT_CSD_SEC_CNT + 2]) &&
- (mci->ext_csd[EXT_CSD_SEC_CNT + 3] ==
- bw_ext_csd[EXT_CSD_SEC_CNT + 3]) ?
+ (mci->ext_csd[EXT_CSD_SEC_COUNT + 0] ==
+ bw_ext_csd[EXT_CSD_SEC_COUNT + 0]) &&
+ (mci->ext_csd[EXT_CSD_SEC_COUNT + 1] ==
+ bw_ext_csd[EXT_CSD_SEC_COUNT + 1]) &&
+ (mci->ext_csd[EXT_CSD_SEC_COUNT + 2] ==
+ bw_ext_csd[EXT_CSD_SEC_COUNT + 2]) &&
+ (mci->ext_csd[EXT_CSD_SEC_COUNT + 3] ==
+ bw_ext_csd[EXT_CSD_SEC_COUNT + 3]) ?
0 : -EINVAL;
out:
@@ -1248,7 +1254,7 @@ static int mci_blk_part_switch(struct mci_part *part)
part_config |= part->part_cfg;
ret = mci_switch(mci, EXT_CSD_CMD_SET_NORMAL,
- EXT_CSD_PART_CONFIG, part_config);
+ EXT_CSD_PARTITION_CONFIG, part_config);
if (ret)
return ret;
@@ -1563,7 +1569,7 @@ static int mci_set_boot(struct param_d *param, void *priv)
mci->ext_csd_part_config |= mci->bootpart << 3;
return mci_switch(mci, EXT_CSD_CMD_SET_NORMAL,
- EXT_CSD_PART_CONFIG, mci->ext_csd_part_config);
+ EXT_CSD_PARTITION_CONFIG, mci->ext_csd_part_config);
}
static const char *mci_boot_names[] = {
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/nvmem/snvs_lpgpr.c b/drivers/nvmem/snvs_lpgpr.c
index 74118a6b75..6c79743cc0 100644
--- a/drivers/nvmem/snvs_lpgpr.c
+++ b/drivers/nvmem/snvs_lpgpr.c
@@ -11,45 +11,71 @@
#include <init.h>
#include <io.h>
#include <of.h>
+#include <of_device.h>
#include <malloc.h>
#include <regmap.h>
#include <mfd/syscon.h>
#include <linux/nvmem-provider.h>
+#define IMX6Q_SNVS_HPLR 0x00
+#define IMX6Q_GPR_SL BIT(5)
+#define IMX6Q_SNVS_LPLR 0x34
+#define IMX6Q_GPR_HL BIT(5)
+#define IMX6Q_SNVS_LPGPR 0x68
+
+struct snvs_lpgpr_cfg {
+ int offset;
+ int offset_hplr;
+ int offset_lplr;
+};
+
struct snvs_lpgpr_priv {
- struct device_d *dev;
- struct regmap *regmap;
- int offset;
- struct nvmem_config cfg;
+ struct device_d *dev;
+ struct regmap *regmap;
+ struct nvmem_config cfg;
+ const struct snvs_lpgpr_cfg *dcfg;
+};
+
+static const struct snvs_lpgpr_cfg snvs_lpgpr_cfg_imx6q = {
+ .offset = IMX6Q_SNVS_LPGPR,
+ .offset_hplr = IMX6Q_SNVS_HPLR,
+ .offset_lplr = IMX6Q_SNVS_LPLR,
};
-static int snvs_lpgpr_write(struct device_d *dev, const int reg,
- const void *_val, int bytes)
+static int snvs_lpgpr_write(struct device_d *dev, const int offset,
+ const void *val, int bytes)
{
struct snvs_lpgpr_priv *priv = dev->parent->priv;
- const u32 *val = _val;
- int i = 0, words = bytes / 4;
+ const struct snvs_lpgpr_cfg *dcfg = priv->dcfg;
+ unsigned int lock_reg;
+ int ret;
- while (words--)
- regmap_write(priv->regmap, priv->offset + reg + (i++ * 4),
- *val++);
+ ret = regmap_read(priv->regmap, dcfg->offset_hplr, &lock_reg);
+ if (ret < 0)
+ return ret;
- return 0;
+ if (lock_reg & IMX6Q_GPR_SL)
+ return -EPERM;
+
+ ret = regmap_read(priv->regmap, dcfg->offset_lplr, &lock_reg);
+ if (ret < 0)
+ return ret;
+
+ if (lock_reg & IMX6Q_GPR_HL)
+ return -EPERM;
+
+ return regmap_bulk_write(priv->regmap, dcfg->offset + offset, val,
+ bytes);
}
-static int snvs_lpgpr_read(struct device_d *dev, const int reg, void *_val,
- int bytes)
+static int snvs_lpgpr_read(struct device_d *dev, const int offset, void *val,
+ int bytes)
{
struct snvs_lpgpr_priv *priv = dev->parent->priv;
- u32 *val = _val;
- int i = 0, words = bytes / 4;
+ const struct snvs_lpgpr_cfg *dcfg = priv->dcfg;
- while (words--)
- regmap_read(priv->regmap, priv->offset + reg + (i++ * 4),
- val++);
-
-
- return 0;
+ return regmap_bulk_read(priv->regmap, dcfg->offset + offset,
+ val, bytes);
}
static const struct nvmem_bus snvs_lpgpr_nvmem_bus = {
@@ -60,10 +86,10 @@ static const struct nvmem_bus snvs_lpgpr_nvmem_bus = {
static int snvs_lpgpr_probe(struct device_d *dev)
{
struct device_node *node = dev->device_node;
+ struct device_node *syscon_node;
struct snvs_lpgpr_priv *priv;
struct nvmem_config *cfg;
struct nvmem_device *nvmem;
- int err;
if (!node)
return -ENOENT;
@@ -72,15 +98,17 @@ static int snvs_lpgpr_probe(struct device_d *dev)
if (!priv)
return -ENOMEM;
- priv->regmap = syscon_node_to_regmap(of_get_parent(node));
- if (IS_ERR(priv->regmap)) {
- free(priv);
- return PTR_ERR(priv->regmap);
- }
+ priv->dcfg = of_device_get_match_data(dev);
+ if (!priv->dcfg)
+ return -EINVAL;
- err = of_property_read_u32(node, "offset", &priv->offset);
- if (err)
- return err;
+ syscon_node = of_get_parent(node);
+ if (!syscon_node)
+ return -ENODEV;
+
+ priv->regmap = syscon_node_to_regmap(syscon_node);
+ if (IS_ERR(priv->regmap))
+ return PTR_ERR(priv->regmap);
cfg = &priv->cfg;
cfg->name = dev_name(dev);
@@ -102,13 +130,13 @@ static int snvs_lpgpr_probe(struct device_d *dev)
}
static __maybe_unused struct of_device_id snvs_lpgpr_dt_ids[] = {
- { .compatible = "fsl,imx6sl-snvs-lpgpr", },
- { .compatible = "fsl,imx6q-snvs-lpgpr", },
+ { .compatible = "fsl,imx6q-snvs-lpgpr", .data = &snvs_lpgpr_cfg_imx6q },
+ { .compatible = "fsl,imx6ul-snvs-lpgpr", .data = &snvs_lpgpr_cfg_imx6q },
{ },
};
static struct driver_d snvs_lpgpr_driver = {
- .name = "nvmem-snvs-lpgpr",
+ .name = "snvs_lpgpr",
.probe = snvs_lpgpr_probe,
.of_compatible = DRV_OF_COMPAT(snvs_lpgpr_dt_ids),
};
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 619f259ff4..2d366ae662 100644
--- a/drivers/video/tc358767.c
+++ b/drivers/video/tc358767.c
@@ -986,7 +986,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;