diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/clk/at91/clk-main.c | 1 | ||||
-rw-r--r-- | drivers/clk/clk-fixed-factor.c | 1 | ||||
-rw-r--r-- | drivers/clk/clkdev.c | 2 | ||||
-rw-r--r-- | drivers/clk/imx/clk-imx7.c | 11 | ||||
-rw-r--r-- | drivers/clk/imx/clk-pllv3.c | 5 | ||||
-rw-r--r-- | drivers/crypto/caam/caamrng.c | 4 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 38 | ||||
-rw-r--r-- | drivers/mci/atmel_mci.c | 3 | ||||
-rw-r--r-- | drivers/mci/mci-core.c | 54 | ||||
-rw-r--r-- | drivers/net/macb.c | 4 | ||||
-rw-r--r-- | drivers/nvmem/snvs_lpgpr.c | 96 | ||||
-rw-r--r-- | drivers/of/of_path.c | 17 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-at91.c | 4 | ||||
-rw-r--r-- | drivers/regulator/Kconfig | 1 | ||||
-rw-r--r-- | drivers/regulator/pfuze.c | 67 | ||||
-rw-r--r-- | drivers/video/atmel_lcdfb.c | 2 | ||||
-rw-r--r-- | drivers/video/atmel_lcdfb_core.c | 1 | ||||
-rw-r--r-- | drivers/video/imx-ipu-v3/imx-ldb.c | 46 | ||||
-rw-r--r-- | drivers/video/ssd1307fb.c | 24 | ||||
-rw-r--r-- | drivers/video/tc358767.c | 2 |
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; |