ARM: da8xx: use platform data for CFGCHIP syscon regmap
This converts from using a platform device for the CFGCHIP syscon regmap to using platform data to pass the regmap to consumers. A lazy getter function is used so that the regmap will only be created if it is actually used. This function will also be used in the clock init when we convert to the common clock framework. The USB PHY driver is currently the only consumer. This driver is updated to use platform data to get the CFGCHIP regmap instead of syscon_regmap_lookup_by_pdevname(). Signed-off-by: David Lechner <david@lechnology.com> Acked-by: Kishon Vijay Abraham I <kishon@ti.com> Signed-off-by: Sekhar Nori <nsekhar@ti.com>
This commit is contained in:
parent
e98bbbf3bd
commit
bdec5a6b57
9 changed files with 60 additions and 43 deletions
|
@ -551,10 +551,6 @@ static __init void da830_evm_init(void)
|
|||
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||
int ret;
|
||||
|
||||
ret = da8xx_register_cfgchip();
|
||||
if (ret)
|
||||
pr_warn("%s: CFGCHIP registration failed: %d\n", __func__, ret);
|
||||
|
||||
ret = da830_register_gpio();
|
||||
if (ret)
|
||||
pr_warn("%s: GPIO init failed: %d\n", __func__, ret);
|
||||
|
|
|
@ -1334,10 +1334,6 @@ static __init void da850_evm_init(void)
|
|||
{
|
||||
int ret;
|
||||
|
||||
ret = da8xx_register_cfgchip();
|
||||
if (ret)
|
||||
pr_warn("%s: CFGCHIP registration failed: %d\n", __func__, ret);
|
||||
|
||||
ret = da850_register_gpio();
|
||||
if (ret)
|
||||
pr_warn("%s: GPIO init failed: %d\n", __func__, ret);
|
||||
|
|
|
@ -502,10 +502,6 @@ static void __init mityomapl138_init(void)
|
|||
{
|
||||
int ret;
|
||||
|
||||
ret = da8xx_register_cfgchip();
|
||||
if (ret)
|
||||
pr_warn("%s: CFGCHIP registration failed: %d\n", __func__, ret);
|
||||
|
||||
/* for now, no special EDMA channels are reserved */
|
||||
ret = da850_register_edma(NULL);
|
||||
if (ret)
|
||||
|
|
|
@ -281,10 +281,6 @@ static __init void omapl138_hawk_init(void)
|
|||
{
|
||||
int ret;
|
||||
|
||||
ret = da8xx_register_cfgchip();
|
||||
if (ret)
|
||||
pr_warn("%s: CFGCHIP registration failed: %d\n", __func__, ret);
|
||||
|
||||
ret = da850_register_gpio();
|
||||
if (ret)
|
||||
pr_warn("%s: GPIO init failed: %d\n", __func__, ret);
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
* (at your option) any later version.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_data/syscon.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-contiguous.h>
|
||||
#include <linux/serial_8250.h>
|
||||
|
@ -1118,29 +1117,33 @@ int __init da850_register_sata(unsigned long refclkpn)
|
|||
}
|
||||
#endif
|
||||
|
||||
static struct syscon_platform_data da8xx_cfgchip_platform_data = {
|
||||
.label = "cfgchip",
|
||||
static struct regmap *da8xx_cfgchip;
|
||||
|
||||
/* regmap doesn't make a copy of this, so we need to keep the pointer around */
|
||||
static const char da8xx_cfgchip_name[] = "cfgchip";
|
||||
|
||||
static const struct regmap_config da8xx_cfgchip_config __initconst = {
|
||||
.name = da8xx_cfgchip_name,
|
||||
.reg_bits = 32,
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = DA8XX_CFGCHIP4_REG - DA8XX_CFGCHIP0_REG,
|
||||
};
|
||||
|
||||
static struct resource da8xx_cfgchip_resources[] = {
|
||||
{
|
||||
.start = DA8XX_SYSCFG0_BASE + DA8XX_CFGCHIP0_REG,
|
||||
.end = DA8XX_SYSCFG0_BASE + DA8XX_CFGCHIP4_REG + 3,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device da8xx_cfgchip_device = {
|
||||
.name = "syscon",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &da8xx_cfgchip_platform_data,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(da8xx_cfgchip_resources),
|
||||
.resource = da8xx_cfgchip_resources,
|
||||
};
|
||||
|
||||
int __init da8xx_register_cfgchip(void)
|
||||
/**
|
||||
* da8xx_get_cfgchip - Lazy gets CFGCHIP as regmap
|
||||
*
|
||||
* This is for use on non-DT boards only. For DT boards, use
|
||||
* syscon_regmap_lookup_by_compatible("ti,da830-cfgchip")
|
||||
*
|
||||
* Returns: Pointer to the CFGCHIP regmap or negative error code.
|
||||
*/
|
||||
struct regmap * __init da8xx_get_cfgchip(void)
|
||||
{
|
||||
return platform_device_register(&da8xx_cfgchip_device);
|
||||
if (IS_ERR_OR_NULL(da8xx_cfgchip))
|
||||
da8xx_cfgchip = regmap_init_mmio(NULL,
|
||||
DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP0_REG),
|
||||
&da8xx_cfgchip_config);
|
||||
|
||||
return da8xx_cfgchip;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/spi/spi.h>
|
||||
#include <linux/platform_data/davinci_asp.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/videodev2.h>
|
||||
|
||||
#include <mach/serial.h>
|
||||
|
@ -123,7 +124,7 @@ void da8xx_rproc_reserve_cma(void);
|
|||
int da8xx_register_rproc(void);
|
||||
int da850_register_gpio(void);
|
||||
int da830_register_gpio(void);
|
||||
int da8xx_register_cfgchip(void);
|
||||
struct regmap *da8xx_get_cfgchip(void);
|
||||
|
||||
extern struct platform_device da8xx_serial_device[];
|
||||
extern struct emac_platform_data da8xx_emac_pdata;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/mfd/da8xx-cfgchip.h>
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/platform_data/phy-da8xx-usb.h>
|
||||
#include <linux/platform_data/usb-davinci.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/usb/musb.h>
|
||||
|
@ -40,6 +41,11 @@ static struct platform_device da8xx_usb_phy = {
|
|||
|
||||
int __init da8xx_register_usb_phy(void)
|
||||
{
|
||||
struct da8xx_usb_phy_platform_data pdata;
|
||||
|
||||
pdata.cfgchip = da8xx_get_cfgchip();
|
||||
da8xx_usb_phy.dev.platform_data = &pdata;
|
||||
|
||||
return platform_device_register(&da8xx_usb_phy);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/platform_data/phy-da8xx-usb.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
|
@ -145,6 +146,7 @@ static struct phy *da8xx_usb_phy_of_xlate(struct device *dev,
|
|||
static int da8xx_usb_phy_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct da8xx_usb_phy_platform_data *pdata = dev->platform_data;
|
||||
struct device_node *node = dev->of_node;
|
||||
struct da8xx_usb_phy *d_phy;
|
||||
|
||||
|
@ -152,11 +154,11 @@ static int da8xx_usb_phy_probe(struct platform_device *pdev)
|
|||
if (!d_phy)
|
||||
return -ENOMEM;
|
||||
|
||||
if (node)
|
||||
if (pdata)
|
||||
d_phy->regmap = pdata->cfgchip;
|
||||
else
|
||||
d_phy->regmap = syscon_regmap_lookup_by_compatible(
|
||||
"ti,da830-cfgchip");
|
||||
else
|
||||
d_phy->regmap = syscon_regmap_lookup_by_pdevname("syscon");
|
||||
if (IS_ERR(d_phy->regmap)) {
|
||||
dev_err(dev, "Failed to get syscon\n");
|
||||
return PTR_ERR(d_phy->regmap);
|
||||
|
|
21
include/linux/platform_data/phy-da8xx-usb.h
Normal file
21
include/linux/platform_data/phy-da8xx-usb.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* phy-da8xx-usb - TI DaVinci DA8xx USB PHY driver
|
||||
*
|
||||
* Copyright (C) 2018 David Lechner <david@lechnology.com>
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_PLATFORM_DATA_PHY_DA8XX_USB_H__
|
||||
#define __LINUX_PLATFORM_DATA_PHY_DA8XX_USB_H__
|
||||
|
||||
#include <linux/regmap.h>
|
||||
|
||||
/**
|
||||
* da8xx_usb_phy_platform_data
|
||||
* @cfgchip: CFGCHIP syscon regmap
|
||||
*/
|
||||
struct da8xx_usb_phy_platform_data {
|
||||
struct regmap *cfgchip;
|
||||
};
|
||||
|
||||
#endif /* __LINUX_PLATFORM_DATA_PHY_DA8XX_USB_H__ */
|
Loading…
Reference in a new issue