From: Adam Ford <aford173@xxxxxxxxx> Sorry about the wordy email. The reset controller stuff needs an overhaul, but this is an attempt to allow the last revision of the SGX driver to work with a modern kernel. Unfortunately, I get an error when I build the SGX driver: pvrsrvkm pvrsrvkm: SGX Platform data missing deassert_reset! So it's obviously missing something. If someone can point me in the righ direction. I need to deassert that by writing to a register but I am not sure exactly how to go about that. On the DM3730 I am using it appears to be RM_RSTST_SGX but this is is inconsistent with the SGX notes in section 8.2.1.2 of the DM3730 TRM. I want to make sure the SGX_FCLK is properly set to which I beleive shoudld 192MHz, but I am not sure which macros are the proper ones. diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 8a2b253..3f69d90 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -564,6 +564,14 @@ status = "disabled"; }; + sgx: sgx@5000000 { + compatible = "ti,sgx"; + ti,hwmods = "gfx"; + reg = <0x50000000 0x1000000>; + interrupts = <21>; + /* resets = <&prcm 0>; */ + }; + sham: sham@480c3000 { compatible = "ti,omap3-sham"; ti,hwmods = "sham"; diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index aff78d5..ca2fbb3 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -3654,6 +3654,52 @@ static struct omap_hwmod_ocp_if omap34xx_l4_core__ssi = { .user = OCP_USER_MPU | OCP_USER_SDMA, }; + +/* gfx */ +/* Pseudo hwmod for reset control purpose only */ + + +static struct omap_hwmod_class omap3xxx_gfx_hwmod_class = { + .name = "sgx", +}; + +static struct omap_hwmod_rst_info omap3xxx_gfx_resets[] = { + { .name = "sgx", .rst_shift = 0, .st_shift = 0}, +}; + +struct omap_hwmod omap3xx_gfx_hwmod = { + .name = "sgx", + .class = &omap3xxx_gfx_hwmod_class, + .clkdm_name = "sgx_clkdm", + .main_clk = "sgx_fck", + .prcm = { + .omap2 = { + .module_offs = OMAP3430ES2_SGX_MOD, + .prcm_reg_id = 1, + .module_bit = OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT, + } + }, + .rst_lines = omap3xxx_gfx_resets, + .rst_lines_cnt = ARRAY_SIZE(omap3xxx_gfx_resets), +}; + +static struct omap_hwmod_addr_space omap3xxx_sgx_addrs[] = { + { + .pa_start = 0x50000000, + .pa_end = 0x5000ff0c, + .flags = ADDR_TYPE_RT, + }, + { } +}; + +/* l3_main -> sgx */ +static struct omap_hwmod_ocp_if omap3xxx_l3_main__sgx = { + .master = &omap3xxx_l3_main_hwmod, + .slave = &omap3xx_gfx_hwmod, + .addr = omap3xxx_sgx_addrs, + .user = OCP_USER_MPU | OCP_USER_SDMA, +}; + static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = { &omap3xxx_l3_main__l4_core, &omap3xxx_l3_main__l4_per, @@ -3701,6 +3747,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = { &omap34xx_l4_core__mcspi4, &omap3xxx_l4_wkup__counter_32k, &omap3xxx_l3_main__gpmc, + &omap3xxx_l3_main__sgx, NULL, }; diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c index 339b859..b700f26 100644 --- a/arch/arm/mach-omap2/pdata-quirks.c +++ b/arch/arm/mach-omap2/pdata-quirks.c @@ -24,6 +24,7 @@ #include <linux/platform_data/iommu-omap.h> #include <linux/platform_data/wkup_m3.h> #include <linux/platform_data/pwm_omap_dmtimer.h> +#include <linux/platform_data/sgx-omap.h> #include <plat/dmtimer.h> #include "common.h" @@ -382,6 +383,12 @@ static void __init omap3_pandora_legacy_init(void) omap_hsmmc_late_init(pandora_mmc3); pandora_wl1251_init(); } + +static struct gfx_sgx_platform_data gfx_pdata = { + .reset_name = "sgx", + .deassert_reset = omap_device_deassert_hardreset, +}; + #endif /* CONFIG_ARCH_OMAP3 */ #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) @@ -479,6 +486,8 @@ static struct of_dev_auxdata omap_auxdata_lookup[] __initdata = { OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL), OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0", &am35xx_emac_pdata), + OF_DEV_AUXDATA("ti,sgx", 0x50000000, "50000000.sgx", + &gfx_pdata), #endif #ifdef CONFIG_SOC_AM33XX OF_DEV_AUXDATA("ti,am3352-wkup-m3", 0x44d00000, "44d00000.wkup_m3", diff --git a/include/linux/platform_data/sgx-omap.h b/include/linux/platform_data/sgx-omap.h new file mode 100644 index 0000000..aa59b2c --- /dev/null +++ b/include/linux/platform_data/sgx-omap.h @@ -0,0 +1,22 @@ +/* + * SGX Graphics Driver Platform Data + * + * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/ + * Darren Etheridge <detheridge@xxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include <linux/platform_device.h> + +struct gfx_sgx_platform_data { + const char *reset_name; + + int (*deassert_reset)(struct platform_device *pdev, const char *name); +}; -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html