SoC changes for omaps for v4.11 merge window. This adds support
for keeping the interconnect target module active for uart if earlycon is specified. And we're adding Aaro Koskinen as a co-maintainer for omap1 to make sure things stay working for omap1. The other changes are mostly clean-up of old legacy code: - Remove unused omap_display_init() - Make omapdss_find_dss_of_node() function static - Add support for earlycon - Tidy up omap1 usb logging output with pr_cont - Make omap_otg_init() static - Delete redundant CPU class checks for omap1 - Remove unused mpurate cmdline option that has not done anything for past 1.5 years at least -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEkgNvrZJU/QSQYIcQG9Q+yVyrpXMFAliHc5MRHHRvbnlAYXRv bWlkZS5jb20ACgkQG9Q+yVyrpXNVVBAAoNj2A8PfRJMYhQthtmUn0ORPe9QrF3k7 5WaIRWhithkRIJl+kVuGLTzR0Uqvzo1CCXug+rJxs0JQ6PJEe+cp++ygioZzjZwE t0oHugvT1+MYCM475OwMG9ajgKYBX/GMsWDmuuG5nLm1JRzWQfMAQsmuyP0Oey+D bWOC0Hlz1gHn2xrlvjZah54rkERaWnKUIdi1YMqAAjmh/RuDED5VNskOcacVbqI1 0C8wLC7mOviM3RyiQSCNTIKLC5illanjoZ/QHFnPLHV36KXJWCL/dB8gnAX+ORpF oCsL3t8erjq6cyhJIchs+UbqCEZv7HpIgbJBwc1oli3ExzS5iqmGQjhNkVN7Q+8Z TEQP6OhpPL4EXNEYOnE5pDgXATluWhD0rsg6XHt2CEsLZCOTzPTZCl0Of0vg3kcE eID7dz9CPXRquzyilVmyYla9Ty4XF3ePhdvLuI/06WgGU/M+6AvlZ40L8G73xKAu 0wHx2rpN0H4ySXsAtnyanCxld5njPGiLn5Ehmnib0CQU16Zxc6mbxVQVfaaSSbAu LJrLHBdeqWYEkUJV6n+lBg1WeCgL4qDolMTm8aRhESTCBHQEaLYXe57dluYCt0g2 2Rj1g/OuGFw+cViT2ICCvsAwE3jcHj32g8iJdnvfsypJ8pIO0znp2Sk7T7AYUXzw AafZ0ClGrws= =GiAL -----END PGP SIGNATURE----- Merge tag 'omap-for-v4.11/soc-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/soc SoC changes for omaps for v4.11 merge window. This adds support for keeping the interconnect target module active for uart if earlycon is specified. And we're adding Aaro Koskinen as a co-maintainer for omap1 to make sure things stay working for omap1. The other changes are mostly clean-up of old legacy code: - Remove unused omap_display_init() - Make omapdss_find_dss_of_node() function static - Add support for earlycon - Tidy up omap1 usb logging output with pr_cont - Make omap_otg_init() static - Delete redundant CPU class checks for omap1 - Remove unused mpurate cmdline option that has not done anything for past 1.5 years at least * tag 'omap-for-v4.11/soc-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: ARM: OMAP: clock: Remove unused mpurate cmdline option ARM: OMAP2+: omap_hwmod: Add support for earlycon MAINTAINERS: Add Aaro Koskinen as TI omap1 SoC co-maintainer ARM: OMAP1: USB: delete redundant CPU class checks ARM: OMAP1: USB: make omap_otg_init() static ARM: OMAP1: USB: tidy up logging output ARM: OMAP2+: Make the omapdss_find_dss_of_node() function static ARM: OMAP2+: Remove unused omap_display_init() function Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
Коммит
f0d0b8cb6b
19
MAINTAINERS
19
MAINTAINERS
|
@ -8919,7 +8919,20 @@ M: Josh Poimboeuf <jpoimboe@redhat.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: tools/objtool/
|
F: tools/objtool/
|
||||||
|
|
||||||
OMAP SUPPORT
|
OMAP1 SUPPORT
|
||||||
|
M: Aaro Koskinen <aaro.koskinen@iki.fi>
|
||||||
|
M: Tony Lindgren <tony@atomide.com>
|
||||||
|
L: linux-omap@vger.kernel.org
|
||||||
|
Q: http://patchwork.kernel.org/project/linux-omap/list/
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-omap1/
|
||||||
|
F: arch/arm/plat-omap/
|
||||||
|
F: arch/arm/configs/omap1_defconfig
|
||||||
|
F: drivers/i2c/busses/i2c-omap.c
|
||||||
|
F: include/linux/i2c-omap.h
|
||||||
|
|
||||||
|
OMAP2+ SUPPORT
|
||||||
M: Tony Lindgren <tony@atomide.com>
|
M: Tony Lindgren <tony@atomide.com>
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
W: http://www.muru.com/linux/omap/
|
W: http://www.muru.com/linux/omap/
|
||||||
|
@ -8927,8 +8940,8 @@ W: http://linux.omap.com/
|
||||||
Q: http://patchwork.kernel.org/project/linux-omap/list/
|
Q: http://patchwork.kernel.org/project/linux-omap/list/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/*omap*/
|
F: arch/arm/mach-omap2/
|
||||||
F: arch/arm/configs/omap1_defconfig
|
F: arch/arm/plat-omap/
|
||||||
F: arch/arm/configs/omap2plus_defconfig
|
F: arch/arm/configs/omap2plus_defconfig
|
||||||
F: drivers/i2c/busses/i2c-omap.c
|
F: drivers/i2c/busses/i2c-omap.c
|
||||||
F: drivers/irqchip/irq-omap-intc.c
|
F: drivers/irqchip/irq-omap-intc.c
|
||||||
|
|
|
@ -720,26 +720,6 @@ EXPORT_SYMBOL(clk_get_parent);
|
||||||
* OMAP specific clock functions shared between omap1 and omap2
|
* OMAP specific clock functions shared between omap1 and omap2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int __initdata mpurate;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* By default we use the rate set by the bootloader.
|
|
||||||
* You can override this with mpurate= cmdline option.
|
|
||||||
*/
|
|
||||||
static int __init omap_clk_setup(char *str)
|
|
||||||
{
|
|
||||||
get_option(&str, &mpurate);
|
|
||||||
|
|
||||||
if (!mpurate)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (mpurate < 1000)
|
|
||||||
mpurate *= 1000000;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
__setup("mpurate=", omap_clk_setup);
|
|
||||||
|
|
||||||
/* Used for clocks that always have same value as the parent clock */
|
/* Used for clocks that always have same value as the parent clock */
|
||||||
unsigned long followparent_recalc(struct clk *clk)
|
unsigned long followparent_recalc(struct clk *clk)
|
||||||
{
|
{
|
||||||
|
|
|
@ -173,8 +173,6 @@ struct clk_functions {
|
||||||
void (*clk_disable_unused)(struct clk *clk);
|
void (*clk_disable_unused)(struct clk *clk);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int mpurate;
|
|
||||||
|
|
||||||
extern int clk_init(struct clk_functions *custom_clocks);
|
extern int clk_init(struct clk_functions *custom_clocks);
|
||||||
extern void clk_preinit(struct clk *clk);
|
extern void clk_preinit(struct clk *clk);
|
||||||
extern int clk_register(struct clk *clk);
|
extern int clk_register(struct clk *clk);
|
||||||
|
|
|
@ -10,8 +10,6 @@
|
||||||
|
|
||||||
#include <linux/platform_data/usb-omap1.h>
|
#include <linux/platform_data/usb-omap1.h>
|
||||||
|
|
||||||
void omap_otg_init(struct omap_usb_config *config);
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_USB)
|
#if IS_ENABLED(CONFIG_USB)
|
||||||
void omap1_usb_init(struct omap_usb_config *pdata);
|
void omap1_usb_init(struct omap_usb_config *pdata);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Platform level USB initialization for FS USB OTG controller on omap1 and 24xx
|
* Platform level USB initialization for FS USB OTG controller on omap1
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 Texas Instruments, Inc.
|
* Copyright (C) 2004 Texas Instruments, Inc.
|
||||||
*
|
*
|
||||||
|
@ -58,11 +58,12 @@
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_OMAP_OTG
|
#ifdef CONFIG_ARCH_OMAP_OTG
|
||||||
|
|
||||||
void __init
|
static void __init
|
||||||
omap_otg_init(struct omap_usb_config *config)
|
omap_otg_init(struct omap_usb_config *config)
|
||||||
{
|
{
|
||||||
u32 syscon;
|
u32 syscon;
|
||||||
int alt_pingroup = 0;
|
int alt_pingroup = 0;
|
||||||
|
u16 w;
|
||||||
|
|
||||||
/* NOTE: no bus or clock setup (yet?) */
|
/* NOTE: no bus or clock setup (yet?) */
|
||||||
|
|
||||||
|
@ -87,39 +88,35 @@ omap_otg_init(struct omap_usb_config *config)
|
||||||
if (config->otg)
|
if (config->otg)
|
||||||
syscon |= OTG_EN;
|
syscon |= OTG_EN;
|
||||||
#endif
|
#endif
|
||||||
if (cpu_class_is_omap1())
|
pr_debug("USB_TRANSCEIVER_CTRL = %03x\n",
|
||||||
pr_debug("USB_TRANSCEIVER_CTRL = %03x\n",
|
omap_readl(USB_TRANSCEIVER_CTRL));
|
||||||
omap_readl(USB_TRANSCEIVER_CTRL));
|
|
||||||
pr_debug("OTG_SYSCON_2 = %08x\n", omap_readl(OTG_SYSCON_2));
|
pr_debug("OTG_SYSCON_2 = %08x\n", omap_readl(OTG_SYSCON_2));
|
||||||
omap_writel(syscon, OTG_SYSCON_2);
|
omap_writel(syscon, OTG_SYSCON_2);
|
||||||
|
|
||||||
printk("USB: hmc %d", config->hmc_mode);
|
printk("USB: hmc %d", config->hmc_mode);
|
||||||
if (!alt_pingroup)
|
if (!alt_pingroup)
|
||||||
printk(", usb2 alt %d wires", config->pins[2]);
|
pr_cont(", usb2 alt %d wires", config->pins[2]);
|
||||||
else if (config->pins[0])
|
else if (config->pins[0])
|
||||||
printk(", usb0 %d wires%s", config->pins[0],
|
pr_cont(", usb0 %d wires%s", config->pins[0],
|
||||||
is_usb0_device(config) ? " (dev)" : "");
|
is_usb0_device(config) ? " (dev)" : "");
|
||||||
if (config->pins[1])
|
if (config->pins[1])
|
||||||
printk(", usb1 %d wires", config->pins[1]);
|
pr_cont(", usb1 %d wires", config->pins[1]);
|
||||||
if (!alt_pingroup && config->pins[2])
|
if (!alt_pingroup && config->pins[2])
|
||||||
printk(", usb2 %d wires", config->pins[2]);
|
pr_cont(", usb2 %d wires", config->pins[2]);
|
||||||
if (config->otg)
|
if (config->otg)
|
||||||
printk(", Mini-AB on usb%d", config->otg - 1);
|
pr_cont(", Mini-AB on usb%d", config->otg - 1);
|
||||||
printk("\n");
|
pr_cont("\n");
|
||||||
|
|
||||||
if (cpu_class_is_omap1()) {
|
/* leave USB clocks/controllers off until needed */
|
||||||
u16 w;
|
w = omap_readw(ULPD_SOFT_REQ);
|
||||||
|
w &= ~SOFT_USB_CLK_REQ;
|
||||||
|
omap_writew(w, ULPD_SOFT_REQ);
|
||||||
|
|
||||||
/* leave USB clocks/controllers off until needed */
|
w = omap_readw(ULPD_CLOCK_CTRL);
|
||||||
w = omap_readw(ULPD_SOFT_REQ);
|
w &= ~USB_MCLK_EN;
|
||||||
w &= ~SOFT_USB_CLK_REQ;
|
w |= DIS_USB_PVCI_CLK;
|
||||||
omap_writew(w, ULPD_SOFT_REQ);
|
omap_writew(w, ULPD_CLOCK_CTRL);
|
||||||
|
|
||||||
w = omap_readw(ULPD_CLOCK_CTRL);
|
|
||||||
w &= ~USB_MCLK_EN;
|
|
||||||
w |= DIS_USB_PVCI_CLK;
|
|
||||||
omap_writew(w, ULPD_CLOCK_CTRL);
|
|
||||||
}
|
|
||||||
syscon = omap_readl(OTG_SYSCON_1);
|
syscon = omap_readl(OTG_SYSCON_1);
|
||||||
syscon |= HST_IDLE_EN|DEV_IDLE_EN|OTG_IDLE_EN;
|
syscon |= HST_IDLE_EN|DEV_IDLE_EN|OTG_IDLE_EN;
|
||||||
|
|
||||||
|
@ -166,7 +163,7 @@ omap_otg_init(struct omap_usb_config *config)
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
void omap_otg_init(struct omap_usb_config *config) {}
|
static void omap_otg_init(struct omap_usb_config *config) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_USB_OMAP)
|
#if IS_ENABLED(CONFIG_USB_OMAP)
|
||||||
|
@ -573,13 +570,13 @@ static void __init omap_1510_usb_init(struct omap_usb_config *config)
|
||||||
|
|
||||||
printk("USB: hmc %d", config->hmc_mode);
|
printk("USB: hmc %d", config->hmc_mode);
|
||||||
if (config->pins[0])
|
if (config->pins[0])
|
||||||
printk(", usb0 %d wires%s", config->pins[0],
|
pr_cont(", usb0 %d wires%s", config->pins[0],
|
||||||
is_usb0_device(config) ? " (dev)" : "");
|
is_usb0_device(config) ? " (dev)" : "");
|
||||||
if (config->pins[1])
|
if (config->pins[1])
|
||||||
printk(", usb1 %d wires", config->pins[1]);
|
pr_cont(", usb1 %d wires", config->pins[1]);
|
||||||
if (config->pins[2])
|
if (config->pins[2])
|
||||||
printk(", usb2 %d wires", config->pins[2]);
|
pr_cont(", usb2 %d wires", config->pins[2]);
|
||||||
printk("\n");
|
pr_cont("\n");
|
||||||
|
|
||||||
/* use DPLL for 48 MHz function clock */
|
/* use DPLL for 48 MHz function clock */
|
||||||
pr_debug("APLL %04x DPLL %04x REQ %04x\n", omap_readw(ULPD_APLL_CTRL),
|
pr_debug("APLL %04x DPLL %04x REQ %04x\n", omap_readw(ULPD_APLL_CTRL),
|
||||||
|
|
|
@ -78,8 +78,6 @@ int __init omap2_clk_setup_ll_ops(void)
|
||||||
* OMAP2+ specific clock functions
|
* OMAP2+ specific clock functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Private functions */
|
|
||||||
|
|
||||||
/* Public functions */
|
/* Public functions */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,65 +110,6 @@ void omap2_init_clk_clkdm(struct clk_hw *hw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __initdata mpurate;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* By default we use the rate set by the bootloader.
|
|
||||||
* You can override this with mpurate= cmdline option.
|
|
||||||
*/
|
|
||||||
static int __init omap_clk_setup(char *str)
|
|
||||||
{
|
|
||||||
get_option(&str, &mpurate);
|
|
||||||
|
|
||||||
if (!mpurate)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (mpurate < 1000)
|
|
||||||
mpurate *= 1000000;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
__setup("mpurate=", omap_clk_setup);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* omap2_clk_print_new_rates - print summary of current clock tree rates
|
|
||||||
* @hfclkin_ck_name: clk name for the off-chip HF oscillator
|
|
||||||
* @core_ck_name: clk name for the on-chip CORE_CLK
|
|
||||||
* @mpu_ck_name: clk name for the ARM MPU clock
|
|
||||||
*
|
|
||||||
* Prints a short message to the console with the HFCLKIN oscillator
|
|
||||||
* rate, the rate of the CORE clock, and the rate of the ARM MPU clock.
|
|
||||||
* Called by the boot-time MPU rate switching code. XXX This is intended
|
|
||||||
* to be handled by the OPP layer code in the near future and should be
|
|
||||||
* removed from the clock code. No return value.
|
|
||||||
*/
|
|
||||||
void __init omap2_clk_print_new_rates(const char *hfclkin_ck_name,
|
|
||||||
const char *core_ck_name,
|
|
||||||
const char *mpu_ck_name)
|
|
||||||
{
|
|
||||||
struct clk *hfclkin_ck, *core_ck, *mpu_ck;
|
|
||||||
unsigned long hfclkin_rate;
|
|
||||||
|
|
||||||
mpu_ck = clk_get(NULL, mpu_ck_name);
|
|
||||||
if (WARN(IS_ERR(mpu_ck), "clock: failed to get %s.\n", mpu_ck_name))
|
|
||||||
return;
|
|
||||||
|
|
||||||
core_ck = clk_get(NULL, core_ck_name);
|
|
||||||
if (WARN(IS_ERR(core_ck), "clock: failed to get %s.\n", core_ck_name))
|
|
||||||
return;
|
|
||||||
|
|
||||||
hfclkin_ck = clk_get(NULL, hfclkin_ck_name);
|
|
||||||
if (WARN(IS_ERR(hfclkin_ck), "Failed to get %s.\n", hfclkin_ck_name))
|
|
||||||
return;
|
|
||||||
|
|
||||||
hfclkin_rate = clk_get_rate(hfclkin_ck);
|
|
||||||
|
|
||||||
pr_info("Switched to new clocking rate (Crystal/Core/MPU): %ld.%01ld/%ld/%ld MHz\n",
|
|
||||||
(hfclkin_rate / 1000000), ((hfclkin_rate / 100000) % 10),
|
|
||||||
(clk_get_rate(core_ck) / 1000000),
|
|
||||||
(clk_get_rate(mpu_ck) / 1000000));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ti_clk_init_features - init clock features struct for the SoC
|
* ti_clk_init_features - init clock features struct for the SoC
|
||||||
*
|
*
|
||||||
|
|
|
@ -64,10 +64,6 @@
|
||||||
#define OMAP4XXX_EN_DPLL_FRBYPASS 0x6
|
#define OMAP4XXX_EN_DPLL_FRBYPASS 0x6
|
||||||
#define OMAP4XXX_EN_DPLL_LOCKED 0x7
|
#define OMAP4XXX_EN_DPLL_LOCKED 0x7
|
||||||
|
|
||||||
void omap2_clk_print_new_rates(const char *hfclkin_ck_name,
|
|
||||||
const char *core_ck_name,
|
|
||||||
const char *mpu_ck_name);
|
|
||||||
|
|
||||||
extern u16 cpu_mask;
|
extern u16 cpu_mask;
|
||||||
|
|
||||||
extern const struct clkops clkops_omap2_dflt_wait;
|
extern const struct clkops clkops_omap2_dflt_wait;
|
||||||
|
|
|
@ -46,8 +46,6 @@
|
||||||
#define DISPC_CONTROL3 0x0848
|
#define DISPC_CONTROL3 0x0848
|
||||||
#define DISPC_IRQSTATUS 0x0018
|
#define DISPC_IRQSTATUS 0x0018
|
||||||
|
|
||||||
#define DSS_SYSCONFIG 0x10
|
|
||||||
#define DSS_SYSSTATUS 0x14
|
|
||||||
#define DSS_CONTROL 0x40
|
#define DSS_CONTROL 0x40
|
||||||
#define DSS_SDI_CONTROL 0x44
|
#define DSS_SDI_CONTROL 0x44
|
||||||
#define DSS_PLL_CONTROL 0x48
|
#define DSS_PLL_CONTROL 0x48
|
||||||
|
@ -76,36 +74,6 @@ static struct platform_device omap_display_device = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
struct omap_dss_hwmod_data {
|
|
||||||
const char *oh_name;
|
|
||||||
const char *dev_name;
|
|
||||||
const int id;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct omap_dss_hwmod_data omap2_dss_hwmod_data[] __initconst = {
|
|
||||||
{ "dss_core", "omapdss_dss", -1 },
|
|
||||||
{ "dss_dispc", "omapdss_dispc", -1 },
|
|
||||||
{ "dss_rfbi", "omapdss_rfbi", -1 },
|
|
||||||
{ "dss_venc", "omapdss_venc", -1 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct omap_dss_hwmod_data omap3_dss_hwmod_data[] __initconst = {
|
|
||||||
{ "dss_core", "omapdss_dss", -1 },
|
|
||||||
{ "dss_dispc", "omapdss_dispc", -1 },
|
|
||||||
{ "dss_rfbi", "omapdss_rfbi", -1 },
|
|
||||||
{ "dss_venc", "omapdss_venc", -1 },
|
|
||||||
{ "dss_dsi1", "omapdss_dsi", 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initconst = {
|
|
||||||
{ "dss_core", "omapdss_dss", -1 },
|
|
||||||
{ "dss_dispc", "omapdss_dispc", -1 },
|
|
||||||
{ "dss_rfbi", "omapdss_rfbi", -1 },
|
|
||||||
{ "dss_dsi1", "omapdss_dsi", 0 },
|
|
||||||
{ "dss_dsi2", "omapdss_dsi", 1 },
|
|
||||||
{ "dss_hdmi", "omapdss_hdmi", -1 },
|
|
||||||
};
|
|
||||||
|
|
||||||
#define OMAP4_DSIPHY_SYSCON_OFFSET 0x78
|
#define OMAP4_DSIPHY_SYSCON_OFFSET 0x78
|
||||||
|
|
||||||
static struct regmap *omap4_dsi_mux_syscon;
|
static struct regmap *omap4_dsi_mux_syscon;
|
||||||
|
@ -162,104 +130,6 @@ static int omap_dss_set_min_bus_tput(struct device *dev, unsigned long tput)
|
||||||
return omap_pm_set_min_bus_tput(dev, OCP_INITIATOR_AGENT, tput);
|
return omap_pm_set_min_bus_tput(dev, OCP_INITIATOR_AGENT, tput);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct platform_device *create_dss_pdev(const char *pdev_name,
|
|
||||||
int pdev_id, const char *oh_name, void *pdata, int pdata_len,
|
|
||||||
struct platform_device *parent)
|
|
||||||
{
|
|
||||||
struct platform_device *pdev;
|
|
||||||
struct omap_device *od;
|
|
||||||
struct omap_hwmod *ohs[1];
|
|
||||||
struct omap_hwmod *oh;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
oh = omap_hwmod_lookup(oh_name);
|
|
||||||
if (!oh) {
|
|
||||||
pr_err("Could not look up %s\n", oh_name);
|
|
||||||
r = -ENODEV;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdev = platform_device_alloc(pdev_name, pdev_id);
|
|
||||||
if (!pdev) {
|
|
||||||
pr_err("Could not create pdev for %s\n", pdev_name);
|
|
||||||
r = -ENOMEM;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent != NULL)
|
|
||||||
pdev->dev.parent = &parent->dev;
|
|
||||||
|
|
||||||
if (pdev->id != -1)
|
|
||||||
dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
|
|
||||||
else
|
|
||||||
dev_set_name(&pdev->dev, "%s", pdev->name);
|
|
||||||
|
|
||||||
ohs[0] = oh;
|
|
||||||
od = omap_device_alloc(pdev, ohs, 1);
|
|
||||||
if (IS_ERR(od)) {
|
|
||||||
pr_err("Could not alloc omap_device for %s\n", pdev_name);
|
|
||||||
r = -ENOMEM;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = platform_device_add_data(pdev, pdata, pdata_len);
|
|
||||||
if (r) {
|
|
||||||
pr_err("Could not set pdata for %s\n", pdev_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = omap_device_register(pdev);
|
|
||||||
if (r) {
|
|
||||||
pr_err("Could not register omap_device for %s\n", pdev_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pdev;
|
|
||||||
|
|
||||||
err:
|
|
||||||
return ERR_PTR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct platform_device *create_simple_dss_pdev(const char *pdev_name,
|
|
||||||
int pdev_id, void *pdata, int pdata_len,
|
|
||||||
struct platform_device *parent)
|
|
||||||
{
|
|
||||||
struct platform_device *pdev;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
pdev = platform_device_alloc(pdev_name, pdev_id);
|
|
||||||
if (!pdev) {
|
|
||||||
pr_err("Could not create pdev for %s\n", pdev_name);
|
|
||||||
r = -ENOMEM;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent != NULL)
|
|
||||||
pdev->dev.parent = &parent->dev;
|
|
||||||
|
|
||||||
if (pdev->id != -1)
|
|
||||||
dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
|
|
||||||
else
|
|
||||||
dev_set_name(&pdev->dev, "%s", pdev->name);
|
|
||||||
|
|
||||||
r = platform_device_add_data(pdev, pdata, pdata_len);
|
|
||||||
if (r) {
|
|
||||||
pr_err("Could not set pdata for %s\n", pdev_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = platform_device_add(pdev);
|
|
||||||
if (r) {
|
|
||||||
pr_err("Could not register platform_device for %s\n", pdev_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pdev;
|
|
||||||
|
|
||||||
err:
|
|
||||||
return ERR_PTR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum omapdss_version __init omap_display_get_version(void)
|
static enum omapdss_version __init omap_display_get_version(void)
|
||||||
{
|
{
|
||||||
if (cpu_is_omap24xx())
|
if (cpu_is_omap24xx())
|
||||||
|
@ -293,132 +163,6 @@ static enum omapdss_version __init omap_display_get_version(void)
|
||||||
return OMAPDSS_VER_UNKNOWN;
|
return OMAPDSS_VER_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init omap_display_init(struct omap_dss_board_info *board_data)
|
|
||||||
{
|
|
||||||
int r = 0;
|
|
||||||
struct platform_device *pdev;
|
|
||||||
int i, oh_count;
|
|
||||||
const struct omap_dss_hwmod_data *curr_dss_hwmod;
|
|
||||||
struct platform_device *dss_pdev;
|
|
||||||
enum omapdss_version ver;
|
|
||||||
|
|
||||||
/* create omapdss device */
|
|
||||||
|
|
||||||
ver = omap_display_get_version();
|
|
||||||
|
|
||||||
if (ver == OMAPDSS_VER_UNKNOWN) {
|
|
||||||
pr_err("DSS not supported on this SoC\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
board_data->version = ver;
|
|
||||||
board_data->dsi_enable_pads = omap_dsi_enable_pads;
|
|
||||||
board_data->dsi_disable_pads = omap_dsi_disable_pads;
|
|
||||||
board_data->set_min_bus_tput = omap_dss_set_min_bus_tput;
|
|
||||||
|
|
||||||
omap_display_device.dev.platform_data = board_data;
|
|
||||||
|
|
||||||
r = platform_device_register(&omap_display_device);
|
|
||||||
if (r < 0) {
|
|
||||||
pr_err("Unable to register omapdss device\n");
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create devices for dss hwmods */
|
|
||||||
|
|
||||||
if (cpu_is_omap24xx()) {
|
|
||||||
curr_dss_hwmod = omap2_dss_hwmod_data;
|
|
||||||
oh_count = ARRAY_SIZE(omap2_dss_hwmod_data);
|
|
||||||
} else if (cpu_is_omap34xx()) {
|
|
||||||
curr_dss_hwmod = omap3_dss_hwmod_data;
|
|
||||||
oh_count = ARRAY_SIZE(omap3_dss_hwmod_data);
|
|
||||||
} else {
|
|
||||||
curr_dss_hwmod = omap4_dss_hwmod_data;
|
|
||||||
oh_count = ARRAY_SIZE(omap4_dss_hwmod_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First create the pdev for dss_core, which is used as a parent device
|
|
||||||
* by the other dss pdevs. Note: dss_core has to be the first item in
|
|
||||||
* the hwmod list.
|
|
||||||
*/
|
|
||||||
dss_pdev = create_dss_pdev(curr_dss_hwmod[0].dev_name,
|
|
||||||
curr_dss_hwmod[0].id,
|
|
||||||
curr_dss_hwmod[0].oh_name,
|
|
||||||
board_data, sizeof(*board_data),
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (IS_ERR(dss_pdev)) {
|
|
||||||
pr_err("Could not build omap_device for %s\n",
|
|
||||||
curr_dss_hwmod[0].oh_name);
|
|
||||||
|
|
||||||
return PTR_ERR(dss_pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i < oh_count; i++) {
|
|
||||||
pdev = create_dss_pdev(curr_dss_hwmod[i].dev_name,
|
|
||||||
curr_dss_hwmod[i].id,
|
|
||||||
curr_dss_hwmod[i].oh_name,
|
|
||||||
board_data, sizeof(*board_data),
|
|
||||||
dss_pdev);
|
|
||||||
|
|
||||||
if (IS_ERR(pdev)) {
|
|
||||||
pr_err("Could not build omap_device for %s\n",
|
|
||||||
curr_dss_hwmod[i].oh_name);
|
|
||||||
|
|
||||||
return PTR_ERR(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create devices for DPI and SDI */
|
|
||||||
|
|
||||||
pdev = create_simple_dss_pdev("omapdss_dpi", 0,
|
|
||||||
board_data, sizeof(*board_data), dss_pdev);
|
|
||||||
if (IS_ERR(pdev)) {
|
|
||||||
pr_err("Could not build platform_device for omapdss_dpi\n");
|
|
||||||
return PTR_ERR(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cpu_is_omap34xx()) {
|
|
||||||
pdev = create_simple_dss_pdev("omapdss_sdi", 0,
|
|
||||||
board_data, sizeof(*board_data), dss_pdev);
|
|
||||||
if (IS_ERR(pdev)) {
|
|
||||||
pr_err("Could not build platform_device for omapdss_sdi\n");
|
|
||||||
return PTR_ERR(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create DRM device */
|
|
||||||
r = omap_init_drm();
|
|
||||||
if (r < 0) {
|
|
||||||
pr_err("Unable to register omapdrm device\n");
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create vrfb device */
|
|
||||||
r = omap_init_vrfb();
|
|
||||||
if (r < 0) {
|
|
||||||
pr_err("Unable to register omapvrfb device\n");
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create FB device */
|
|
||||||
r = omap_init_fb();
|
|
||||||
if (r < 0) {
|
|
||||||
pr_err("Unable to register omapfb device\n");
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create V4L2 display device */
|
|
||||||
r = omap_init_vout();
|
|
||||||
if (r < 0) {
|
|
||||||
pr_err("Unable to register omap_vout device\n");
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dispc_disable_outputs(void)
|
static void dispc_disable_outputs(void)
|
||||||
{
|
{
|
||||||
u32 v, irq_mask = 0;
|
u32 v, irq_mask = 0;
|
||||||
|
@ -573,7 +317,7 @@ static const char * const omapdss_compat_names[] __initconst = {
|
||||||
"ti,dra7-dss",
|
"ti,dra7-dss",
|
||||||
};
|
};
|
||||||
|
|
||||||
struct device_node * __init omapdss_find_dss_of_node(void)
|
static struct device_node * __init omapdss_find_dss_of_node(void)
|
||||||
{
|
{
|
||||||
struct device_node *node;
|
struct device_node *node;
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -31,11 +31,4 @@ int omap_init_vrfb(void);
|
||||||
int omap_init_fb(void);
|
int omap_init_fb(void);
|
||||||
int omap_init_vout(void);
|
int omap_init_vout(void);
|
||||||
|
|
||||||
struct device_node * __init omapdss_find_dss_of_node(void);
|
|
||||||
|
|
||||||
struct omap_dss_board_info;
|
|
||||||
|
|
||||||
/* Init with the board info */
|
|
||||||
int omap_display_init(struct omap_dss_board_info *board_data);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3248,6 +3248,36 @@ int __init omap_hwmod_setup_one(const char *oh_name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* omap_hwmod_setup_earlycon_flags - set up flags for early console
|
||||||
|
*
|
||||||
|
* Enable DEBUG_OMAPUART_FLAGS for uart hwmod that is being used as
|
||||||
|
* early concole so that hwmod core doesn't reset and keep it in idle
|
||||||
|
* that specific uart.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_SERIAL_EARLYCON
|
||||||
|
static void __init omap_hwmod_setup_earlycon_flags(void)
|
||||||
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
struct omap_hwmod *oh;
|
||||||
|
const char *uart;
|
||||||
|
|
||||||
|
np = of_find_node_by_path("/chosen");
|
||||||
|
if (np) {
|
||||||
|
uart = of_get_property(np, "stdout-path", NULL);
|
||||||
|
if (uart) {
|
||||||
|
np = of_find_node_by_path(uart);
|
||||||
|
if (np) {
|
||||||
|
uart = of_get_property(np, "ti,hwmods", NULL);
|
||||||
|
oh = omap_hwmod_lookup(uart);
|
||||||
|
if (oh)
|
||||||
|
oh->flags |= DEBUG_OMAPUART_FLAGS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* omap_hwmod_setup_all - set up all registered IP blocks
|
* omap_hwmod_setup_all - set up all registered IP blocks
|
||||||
*
|
*
|
||||||
|
@ -3261,6 +3291,9 @@ static int __init omap_hwmod_setup_all(void)
|
||||||
_ensure_mpu_hwmod_is_setup(NULL);
|
_ensure_mpu_hwmod_is_setup(NULL);
|
||||||
|
|
||||||
omap_hwmod_for_each(_init, NULL);
|
omap_hwmod_for_each(_init, NULL);
|
||||||
|
#ifdef CONFIG_SERIAL_EARLYCON
|
||||||
|
omap_hwmod_setup_earlycon_flags();
|
||||||
|
#endif
|
||||||
omap_hwmod_for_each(_setup, NULL);
|
omap_hwmod_for_each(_setup, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче