mirror of
https://github.com/torvalds/linux.git
synced 2024-11-20 02:51:44 +00:00
Late omap soc changes for v4.18 merge window
This series contains two omap1 ams-delta GPIO clean-up patches to get started with removal of hard-coded GPIO numbers from drivers. And then the removal of board mach includes from drivers. The second patch mostly touches the ams-delta audio driver but is included here because of the removal of the latch gpios and is acked by Mark Brown. And there are two more am437x related PM patches to save and restore control module and timer registers for RTC only suspend mode. Looks like the patch title for the timer changes is a bit misleading, not all the timer code is yet living under drivers/clocksource. But I had already pushed out the branch before I noticed this. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEkgNvrZJU/QSQYIcQG9Q+yVyrpXMFAlsIImcRHHRvbnlAYXRv bWlkZS5jb20ACgkQG9Q+yVyrpXPX1BAAvdPioDGVefuV4hGTjj04lT3pj/a+Xl44 DV9osD2mWlFXF3FIxOhEcZcwzjKdCmeEm01jhw+gLJJboxB96w02tFJj5oAebEo5 ETD9F+Hu8TfvAAIegMaozlEdHmlmlGJ3COBBX+bOmfShwak4EDOEGbR5lpLYh2A1 /NJHjNOa7JLrl/oltnjJv1P6CggCCBFQyzIscJaGa2Dq5bAc04TYTCo83y6hVcmS VZDfoqKi0f576sAdCazCIxzFdmI6D9P2buEgiEWpmMaB/x+agiB5++wAhxs8C/Dw MH1HZuBdB87PBBPKNfXuL0MlYwKY/Gf7n0hGnTsuM7twy3tQsHB1fdQbvrx7E8Wz PyPwARIXuOKaqZL9g1RmUjWwKkx6j7Srh5UatOiLUSoMwkcJLBpjMYnkilbptZKA ofy1WoOV2NNzLPWHAMDTWxUjc8amOX9LhMehnLty4smwe7ZLiykTO++E9ozx/0g/ 62ihp6GRU3N7li3ZaXKk2yaaqE7h8fxLVCkw26bWew6RdNT0XBFyp8IQTNrQSyya z47RRfifRgzR2gklInsrt56pileyYYnK3WA0sXzvo0w09XVzbsYNuoA0maxzp/H8 BdIov5yuSkaaw9aj1yqfkL7sYI+Ss0QpsjHqa964o48kRdDWinWEPfZYCD7f2qzy IItK4y94bMg= =gBpR -----END PGP SIGNATURE----- Merge tag 'omap-for-v4.18/soc-late-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/soc Late omap soc changes for v4.18 merge window This series contains two omap1 ams-delta GPIO clean-up patches to get started with removal of hard-coded GPIO numbers from drivers. And then the removal of board mach includes from drivers. The second patch mostly touches the ams-delta audio driver but is included here because of the removal of the latch gpios and is acked by Mark Brown. And there are two more am437x related PM patches to save and restore control module and timer registers for RTC only suspend mode. Looks like the patch title for the timer changes is a bit misleading, not all the timer code is yet living under drivers/clocksource. But I had already pushed out the branch before I noticed this. * tag 'omap-for-v4.18/soc-late-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: OMAP: CLK: CLKSRC: Add suspend resume hooks ARM: AM43XX: Add functions to save/restore am43xx control registers ASoC: ams_delta: use GPIO lookup table ARM: OMAP1: ams-delta: add GPIO lookup tables Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
bd6cc4f2d2
@ -12,6 +12,7 @@
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
@ -202,7 +203,10 @@ static struct resource latch2_resources[] = {
|
||||
},
|
||||
};
|
||||
|
||||
#define LATCH2_LABEL "latch2"
|
||||
|
||||
static struct bgpio_pdata latch2_pdata = {
|
||||
.label = LATCH2_LABEL,
|
||||
.base = AMS_DELTA_LATCH2_GPIO_BASE,
|
||||
.ngpio = AMS_DELTA_LATCH2_NGPIO,
|
||||
};
|
||||
@ -217,6 +221,23 @@ static struct platform_device latch2_gpio_device = {
|
||||
},
|
||||
};
|
||||
|
||||
#define LATCH2_PIN_LCD_VBLEN 0
|
||||
#define LATCH2_PIN_LCD_NDISP 1
|
||||
#define LATCH2_PIN_NAND_NCE 2
|
||||
#define LATCH2_PIN_NAND_NRE 3
|
||||
#define LATCH2_PIN_NAND_NWP 4
|
||||
#define LATCH2_PIN_NAND_NWE 5
|
||||
#define LATCH2_PIN_NAND_ALE 6
|
||||
#define LATCH2_PIN_NAND_CLE 7
|
||||
#define LATCH2_PIN_KEYBRD_PWR 8
|
||||
#define LATCH2_PIN_KEYBRD_DATAOUT 9
|
||||
#define LATCH2_PIN_SCARD_RSTIN 10
|
||||
#define LATCH2_PIN_SCARD_CMDVCC 11
|
||||
#define LATCH2_PIN_MODEM_NRESET 12
|
||||
#define LATCH2_PIN_MODEM_CODEC 13
|
||||
#define LATCH2_PIN_HOOKFLASH1 14
|
||||
#define LATCH2_PIN_HOOKFLASH2 15
|
||||
|
||||
static const struct gpio latch_gpios[] __initconst = {
|
||||
{
|
||||
.gpio = LATCH1_GPIO_BASE + 6,
|
||||
@ -238,11 +259,6 @@ static const struct gpio latch_gpios[] __initconst = {
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "scard_cmdvcc",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_MODEM_CODEC,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "modem_codec",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_LATCH2_GPIO_BASE + 14,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
@ -323,6 +339,22 @@ static struct platform_device ams_delta_nand_device = {
|
||||
.resource = ams_delta_nand_resources,
|
||||
};
|
||||
|
||||
#define OMAP_GPIO_LABEL "gpio-0-15"
|
||||
|
||||
static struct gpiod_lookup_table ams_delta_nand_gpio_table = {
|
||||
.table = {
|
||||
GPIO_LOOKUP(OMAP_GPIO_LABEL, AMS_DELTA_GPIO_PIN_NAND_RB, "rdy",
|
||||
0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NCE, "nce", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NRE, "nre", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWP, "nwp", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWE, "nwe", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_ALE, "ale", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_CLE, "cle", 0),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource ams_delta_kp_resources[] = {
|
||||
[0] = {
|
||||
.start = INT_KEYBOARD,
|
||||
@ -358,6 +390,14 @@ static struct platform_device ams_delta_lcd_device = {
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table ams_delta_lcd_gpio_table = {
|
||||
.table = {
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_LCD_VBLEN, "vblen", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_LCD_NDISP, "ndisp", 0),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led gpio_leds[] __initconst = {
|
||||
{
|
||||
.name = "camera",
|
||||
@ -449,11 +489,35 @@ static struct platform_device ams_delta_audio_device = {
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table ams_delta_audio_gpio_table = {
|
||||
.table = {
|
||||
GPIO_LOOKUP(OMAP_GPIO_LABEL, AMS_DELTA_GPIO_PIN_HOOK_SWITCH,
|
||||
"hook_switch", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_MODEM_CODEC,
|
||||
"modem_codec", 0),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device cx20442_codec_device = {
|
||||
.name = "cx20442-codec",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table ams_delta_serio_gpio_table = {
|
||||
.table = {
|
||||
GPIO_LOOKUP(OMAP_GPIO_LABEL, AMS_DELTA_GPIO_PIN_KEYBRD_DATA,
|
||||
"data", 0),
|
||||
GPIO_LOOKUP(OMAP_GPIO_LABEL, AMS_DELTA_GPIO_PIN_KEYBRD_CLK,
|
||||
"clock", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_KEYBRD_PWR,
|
||||
"power", 0),
|
||||
GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_KEYBRD_DATAOUT,
|
||||
"dataout", 0),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *ams_delta_devices[] __initdata = {
|
||||
&latch1_gpio_device,
|
||||
&latch2_gpio_device,
|
||||
@ -468,6 +532,16 @@ static struct platform_device *late_devices[] __initdata = {
|
||||
&cx20442_codec_device,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = {
|
||||
&ams_delta_audio_gpio_table,
|
||||
&ams_delta_serio_gpio_table,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table *late_gpio_tables[] __initdata = {
|
||||
&ams_delta_lcd_gpio_table,
|
||||
&ams_delta_nand_gpio_table,
|
||||
};
|
||||
|
||||
static void __init ams_delta_init(void)
|
||||
{
|
||||
/* mux pins for uarts */
|
||||
@ -500,6 +574,20 @@ static void __init ams_delta_init(void)
|
||||
gpio_led_register_device(-1, &leds_pdata);
|
||||
platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
|
||||
|
||||
/*
|
||||
* As soon as devices have been registered, assign their dev_names
|
||||
* to respective GPIO lookup tables before they are added.
|
||||
*/
|
||||
ams_delta_audio_gpio_table.dev_id =
|
||||
dev_name(&ams_delta_audio_device.dev);
|
||||
/*
|
||||
* No device name is assigned to GPIO lookup table for serio device
|
||||
* as long as serio driver is not converted to platform device driver.
|
||||
*/
|
||||
|
||||
gpiod_add_lookup_tables(ams_delta_gpio_tables,
|
||||
ARRAY_SIZE(ams_delta_gpio_tables));
|
||||
|
||||
ams_delta_init_fiq();
|
||||
|
||||
omap_writew(omap_readw(ARM_RSTCT1) | 0x0004, ARM_RSTCT1);
|
||||
@ -570,6 +658,15 @@ static int __init late_init(void)
|
||||
|
||||
platform_add_devices(late_devices, ARRAY_SIZE(late_devices));
|
||||
|
||||
/*
|
||||
* As soon as devices have been registered, assign their dev_names
|
||||
* to respective GPIO lookup tables before they are added.
|
||||
*/
|
||||
ams_delta_lcd_gpio_table.dev_id = dev_name(&ams_delta_lcd_device.dev);
|
||||
ams_delta_nand_gpio_table.dev_id = dev_name(&ams_delta_nand_device.dev);
|
||||
|
||||
gpiod_add_lookup_tables(late_gpio_tables, ARRAY_SIZE(late_gpio_tables));
|
||||
|
||||
err = platform_device_register(&modem_nreset_device);
|
||||
if (err) {
|
||||
pr_err("Couldn't register the modem regulator device\n");
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/cpu_pm.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "iomap.h"
|
||||
@ -621,6 +622,110 @@ void __init omap3_ctrl_init(void)
|
||||
}
|
||||
#endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
|
||||
|
||||
static unsigned long am43xx_control_reg_offsets[] = {
|
||||
AM33XX_CONTROL_SYSCONFIG_OFFSET,
|
||||
AM33XX_CONTROL_STATUS_OFFSET,
|
||||
AM43XX_CONTROL_MPU_L2_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_CORE_SLDO_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_MPU_SLDO_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_CLK32KDIVRATIO_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_BANDGAP_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_BANDGAP_TRIM_OFFSET,
|
||||
AM33XX_CONTROL_PLL_CLKINPULOW_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_MOSC_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_DEEPSLEEP_CTRL_OFFSET,
|
||||
AM43XX_CONTROL_DISPLAY_PLL_SEL_OFFSET,
|
||||
AM33XX_CONTROL_INIT_PRIORITY_0_OFFSET,
|
||||
AM33XX_CONTROL_INIT_PRIORITY_1_OFFSET,
|
||||
AM33XX_CONTROL_TPTC_CFG_OFFSET,
|
||||
AM33XX_CONTROL_USB_CTRL0_OFFSET,
|
||||
AM33XX_CONTROL_USB_CTRL1_OFFSET,
|
||||
AM43XX_CONTROL_USB_CTRL2_OFFSET,
|
||||
AM43XX_CONTROL_GMII_SEL_OFFSET,
|
||||
AM43XX_CONTROL_MPUSS_CTRL_OFFSET,
|
||||
AM43XX_CONTROL_TIMER_CASCADE_CTRL_OFFSET,
|
||||
AM43XX_CONTROL_PWMSS_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_MREQPRIO_0_OFFSET,
|
||||
AM33XX_CONTROL_MREQPRIO_1_OFFSET,
|
||||
AM33XX_CONTROL_HW_EVENT_SEL_GRP1_OFFSET,
|
||||
AM33XX_CONTROL_HW_EVENT_SEL_GRP2_OFFSET,
|
||||
AM33XX_CONTROL_HW_EVENT_SEL_GRP3_OFFSET,
|
||||
AM33XX_CONTROL_HW_EVENT_SEL_GRP4_OFFSET,
|
||||
AM33XX_CONTROL_SMRT_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_MPUSS_HW_DEBUG_SEL_OFFSET,
|
||||
AM43XX_CONTROL_CQDETECT_STS_OFFSET,
|
||||
AM43XX_CONTROL_CQDETECT_STS2_OFFSET,
|
||||
AM43XX_CONTROL_VTP_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_VREF_CTRL_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_0_3_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_4_7_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_8_11_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_12_15_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_16_19_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_20_23_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_24_27_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_28_31_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_32_35_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_36_39_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_40_43_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_44_47_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_48_51_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_52_55_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_56_59_OFFSET,
|
||||
AM33XX_CONTROL_TPCC_EVT_MUX_60_63_OFFSET,
|
||||
AM33XX_CONTROL_TIMER_EVT_CAPT_OFFSET,
|
||||
AM33XX_CONTROL_ECAP_EVT_CAPT_OFFSET,
|
||||
AM33XX_CONTROL_ADC_EVT_CAPT_OFFSET,
|
||||
AM43XX_CONTROL_ADC1_EVT_CAPT_OFFSET,
|
||||
AM33XX_CONTROL_RESET_ISO_OFFSET,
|
||||
};
|
||||
|
||||
static u32 am33xx_control_vals[ARRAY_SIZE(am43xx_control_reg_offsets)];
|
||||
|
||||
/**
|
||||
* am43xx_control_save_context - Save the wakeup domain registers
|
||||
*
|
||||
* Save the wkup domain registers
|
||||
*/
|
||||
void am43xx_control_save_context(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(am43xx_control_reg_offsets); i++)
|
||||
am33xx_control_vals[i] =
|
||||
omap_ctrl_readl(am43xx_control_reg_offsets[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* am43xx_control_restore_context - Restore the wakeup domain registers
|
||||
*
|
||||
* Restore the wkup domain registers
|
||||
*/
|
||||
void am43xx_control_restore_context(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(am43xx_control_reg_offsets); i++)
|
||||
omap_ctrl_writel(am33xx_control_vals[i],
|
||||
am43xx_control_reg_offsets[i]);
|
||||
}
|
||||
|
||||
static int cpu_notifier(struct notifier_block *nb, unsigned long cmd, void *v)
|
||||
{
|
||||
switch (cmd) {
|
||||
case CPU_CLUSTER_PM_ENTER:
|
||||
if (enable_off_mode)
|
||||
am43xx_control_save_context();
|
||||
break;
|
||||
case CPU_CLUSTER_PM_EXIT:
|
||||
if (enable_off_mode)
|
||||
am43xx_control_restore_context();
|
||||
break;
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
struct control_init_data {
|
||||
int index;
|
||||
void __iomem *mem;
|
||||
@ -699,6 +804,7 @@ int __init omap_control_init(void)
|
||||
const struct omap_prcm_init_data *data;
|
||||
int ret;
|
||||
struct regmap *syscon;
|
||||
static struct notifier_block nb;
|
||||
|
||||
for_each_matching_node_and_match(np, omap_scrm_dt_match_table, &match) {
|
||||
data = match->data;
|
||||
@ -731,6 +837,12 @@ int __init omap_control_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* Only AM43XX can lose ctrl registers context during rtc-ddr suspend */
|
||||
if (soc_is_am43xx()) {
|
||||
nb.notifier_call = cpu_notifier;
|
||||
cpu_pm_register_notifier(&nb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -409,6 +409,67 @@
|
||||
#define AM33XX_DEV_FEATURE 0x604
|
||||
#define AM33XX_SGX_MASK BIT(29)
|
||||
|
||||
/* Additional AM33XX/AM43XX CONTROL registers */
|
||||
#define AM33XX_CONTROL_SYSCONFIG_OFFSET 0x0010
|
||||
#define AM33XX_CONTROL_STATUS_OFFSET 0x0040
|
||||
#define AM43XX_CONTROL_MPU_L2_CTRL_OFFSET 0x01e0
|
||||
#define AM33XX_CONTROL_CORTEX_VBBLDO_CTRL_OFFSET 0x041c
|
||||
#define AM33XX_CONTROL_CORE_SLDO_CTRL_OFFSET 0x0428
|
||||
#define AM33XX_CONTROL_MPU_SLDO_CTRL_OFFSET 0x042c
|
||||
#define AM33XX_CONTROL_CLK32KDIVRATIO_CTRL_OFFSET 0x0444
|
||||
#define AM33XX_CONTROL_BANDGAP_CTRL_OFFSET 0x0448
|
||||
#define AM33XX_CONTROL_BANDGAP_TRIM_OFFSET 0x044c
|
||||
#define AM33XX_CONTROL_PLL_CLKINPULOW_CTRL_OFFSET 0x0458
|
||||
#define AM33XX_CONTROL_MOSC_CTRL_OFFSET 0x0468
|
||||
#define AM33XX_CONTROL_RCOSC_CTRL_OFFSET 0x046c
|
||||
#define AM33XX_CONTROL_DEEPSLEEP_CTRL_OFFSET 0x0470
|
||||
#define AM43XX_CONTROL_DISPLAY_PLL_SEL_OFFSET 0x0534
|
||||
#define AM33XX_CONTROL_INIT_PRIORITY_0_OFFSET 0x0608
|
||||
#define AM33XX_CONTROL_INIT_PRIORITY_1_OFFSET 0x060c
|
||||
#define AM33XX_CONTROL_MMU_CFG_OFFSET 0x0610
|
||||
#define AM33XX_CONTROL_TPTC_CFG_OFFSET 0x0614
|
||||
#define AM33XX_CONTROL_USB_CTRL0_OFFSET 0x0620
|
||||
#define AM33XX_CONTROL_USB_CTRL1_OFFSET 0x0628
|
||||
#define AM33XX_CONTROL_USB_WKUP_CTRL_OFFSET 0x0648
|
||||
#define AM43XX_CONTROL_USB_CTRL2_OFFSET 0x064c
|
||||
#define AM43XX_CONTROL_GMII_SEL_OFFSET 0x0650
|
||||
#define AM43XX_CONTROL_MPUSS_CTRL_OFFSET 0x0654
|
||||
#define AM43XX_CONTROL_TIMER_CASCADE_CTRL_OFFSET 0x0658
|
||||
#define AM43XX_CONTROL_PWMSS_CTRL_OFFSET 0x0664
|
||||
#define AM33XX_CONTROL_MREQPRIO_0_OFFSET 0x0670
|
||||
#define AM33XX_CONTROL_MREQPRIO_1_OFFSET 0x0674
|
||||
#define AM33XX_CONTROL_HW_EVENT_SEL_GRP1_OFFSET 0x0690
|
||||
#define AM33XX_CONTROL_HW_EVENT_SEL_GRP2_OFFSET 0x0694
|
||||
#define AM33XX_CONTROL_HW_EVENT_SEL_GRP3_OFFSET 0x0698
|
||||
#define AM33XX_CONTROL_HW_EVENT_SEL_GRP4_OFFSET 0x069c
|
||||
#define AM33XX_CONTROL_SMRT_CTRL_OFFSET 0x06a0
|
||||
#define AM33XX_CONTROL_MPUSS_HW_DEBUG_SEL_OFFSET 0x06a4
|
||||
#define AM43XX_CONTROL_CQDETECT_STS_OFFSET 0x0e00
|
||||
#define AM43XX_CONTROL_CQDETECT_STS2_OFFSET 0x0e08
|
||||
#define AM43XX_CONTROL_VTP_CTRL_OFFSET 0x0e0c
|
||||
#define AM33XX_CONTROL_VREF_CTRL_OFFSET 0x0e14
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_0_3_OFFSET 0x0f90
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_4_7_OFFSET 0x0f94
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_8_11_OFFSET 0x0f98
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_12_15_OFFSET 0x0f9c
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_16_19_OFFSET 0x0fa0
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_20_23_OFFSET 0x0fa4
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_24_27_OFFSET 0x0fa8
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_28_31_OFFSET 0x0fac
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_32_35_OFFSET 0x0fb0
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_36_39_OFFSET 0x0fb4
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_40_43_OFFSET 0x0fb8
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_44_47_OFFSET 0x0fbc
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_48_51_OFFSET 0x0fc0
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_52_55_OFFSET 0x0fc4
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_56_59_OFFSET 0x0fc8
|
||||
#define AM33XX_CONTROL_TPCC_EVT_MUX_60_63_OFFSET 0x0fcc
|
||||
#define AM33XX_CONTROL_TIMER_EVT_CAPT_OFFSET 0x0fd0
|
||||
#define AM33XX_CONTROL_ECAP_EVT_CAPT_OFFSET 0x0fd4
|
||||
#define AM33XX_CONTROL_ADC_EVT_CAPT_OFFSET 0x0fd8
|
||||
#define AM43XX_CONTROL_ADC1_EVT_CAPT_OFFSET 0x0fdc
|
||||
#define AM33XX_CONTROL_RESET_ISO_OFFSET 0x1000
|
||||
|
||||
/* CONTROL OMAP STATUS register to identify OMAP3 features */
|
||||
#define OMAP3_CONTROL_OMAP_STATUS 0x044c
|
||||
|
||||
|
@ -70,6 +70,9 @@ static struct clock_event_device clockevent_gpt;
|
||||
/* Clockevent hwmod for am335x and am437x suspend */
|
||||
static struct omap_hwmod *clockevent_gpt_hwmod;
|
||||
|
||||
/* Clockesource hwmod for am437x suspend */
|
||||
static struct omap_hwmod *clocksource_gpt_hwmod;
|
||||
|
||||
#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
|
||||
static unsigned long arch_timer_freq;
|
||||
|
||||
@ -478,6 +481,26 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int omap2_gptimer_clksrc_load;
|
||||
|
||||
static void omap2_gptimer_clksrc_suspend(struct clocksource *unused)
|
||||
{
|
||||
omap2_gptimer_clksrc_load =
|
||||
__omap_dm_timer_read_counter(&clksrc, OMAP_TIMER_NONPOSTED);
|
||||
|
||||
omap_hwmod_idle(clocksource_gpt_hwmod);
|
||||
}
|
||||
|
||||
static void omap2_gptimer_clksrc_resume(struct clocksource *unused)
|
||||
{
|
||||
omap_hwmod_enable(clocksource_gpt_hwmod);
|
||||
|
||||
__omap_dm_timer_load_start(&clksrc,
|
||||
OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR,
|
||||
omap2_gptimer_clksrc_load,
|
||||
OMAP_TIMER_NONPOSTED);
|
||||
}
|
||||
|
||||
static void __init omap2_gptimer_clocksource_init(int gptimer_id,
|
||||
const char *fck_source,
|
||||
const char *property)
|
||||
@ -490,6 +513,15 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id,
|
||||
res = omap_dm_timer_init_one(&clksrc, fck_source, property,
|
||||
&clocksource_gpt.name,
|
||||
OMAP_TIMER_NONPOSTED);
|
||||
|
||||
if (soc_is_am43xx()) {
|
||||
clocksource_gpt.suspend = omap2_gptimer_clksrc_suspend;
|
||||
clocksource_gpt.resume = omap2_gptimer_clksrc_resume;
|
||||
|
||||
clocksource_gpt_hwmod =
|
||||
omap_hwmod_lookup(clocksource_gpt.name);
|
||||
}
|
||||
|
||||
BUG_ON(res);
|
||||
|
||||
__omap_dm_timer_load_start(&clksrc,
|
||||
|
@ -22,7 +22,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/module.h>
|
||||
@ -32,7 +32,6 @@
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/board-ams-delta.h>
|
||||
#include <linux/platform_data/asoc-ti-mcbsp.h>
|
||||
|
||||
#include "omap-mcbsp.h"
|
||||
@ -213,7 +212,6 @@ static const struct snd_kcontrol_new ams_delta_audio_controls[] = {
|
||||
static struct snd_soc_jack ams_delta_hook_switch;
|
||||
static struct snd_soc_jack_gpio ams_delta_hook_switch_gpios[] = {
|
||||
{
|
||||
.gpio = 4,
|
||||
.name = "hook_switch",
|
||||
.report = SND_JACK_HEADSET,
|
||||
.invert = 1,
|
||||
@ -259,6 +257,7 @@ static struct timer_list cx81801_timer;
|
||||
static bool cx81801_cmd_pending;
|
||||
static bool ams_delta_muted;
|
||||
static DEFINE_SPINLOCK(ams_delta_lock);
|
||||
static struct gpio_desc *gpiod_modem_codec;
|
||||
|
||||
static void cx81801_timeout(struct timer_list *unused)
|
||||
{
|
||||
@ -272,7 +271,7 @@ static void cx81801_timeout(struct timer_list *unused)
|
||||
/* Reconnect the codec DAI back from the modem to the CPU DAI
|
||||
* only if digital mute still off */
|
||||
if (!muted)
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC, 0);
|
||||
gpiod_set_value(gpiod_modem_codec, 0);
|
||||
}
|
||||
|
||||
/* Line discipline .open() */
|
||||
@ -381,8 +380,7 @@ static void cx81801_receive(struct tty_struct *tty,
|
||||
/* Apply config pulse by connecting the codec to the modem
|
||||
* if not already done */
|
||||
if (apply)
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC,
|
||||
AMS_DELTA_LATCH2_MODEM_CODEC);
|
||||
gpiod_set_value(gpiod_modem_codec, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -432,8 +430,7 @@ static int ams_delta_digital_mute(struct snd_soc_dai *dai, int mute)
|
||||
spin_unlock_bh(&ams_delta_lock);
|
||||
|
||||
if (apply)
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC,
|
||||
mute ? AMS_DELTA_LATCH2_MODEM_CODEC : 0);
|
||||
gpiod_set_value(gpiod_modem_codec, !!mute);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -469,14 +466,6 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
|
||||
/* Store a pointer to the codec structure for tty ldisc use */
|
||||
cx20442_codec = rtd->codec_dai->component;
|
||||
|
||||
/* Set up digital mute if not provided by the codec */
|
||||
if (!codec_dai->driver->ops) {
|
||||
codec_dai->driver->ops = &ams_delta_dai_ops;
|
||||
} else {
|
||||
ams_delta_ops.startup = ams_delta_startup;
|
||||
ams_delta_ops.shutdown = ams_delta_shutdown;
|
||||
}
|
||||
|
||||
/* Add hook switch - can be used to control the codec from userspace
|
||||
* even if line discipline fails */
|
||||
ret = snd_soc_card_jack_new(card, "hook_switch", SND_JACK_HEADSET,
|
||||
@ -486,7 +475,7 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
|
||||
"Failed to allocate resources for hook switch, "
|
||||
"will continue without one.\n");
|
||||
else {
|
||||
ret = snd_soc_jack_add_gpios(&ams_delta_hook_switch,
|
||||
ret = snd_soc_jack_add_gpiods(card->dev, &ams_delta_hook_switch,
|
||||
ARRAY_SIZE(ams_delta_hook_switch_gpios),
|
||||
ams_delta_hook_switch_gpios);
|
||||
if (ret)
|
||||
@ -495,6 +484,21 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
|
||||
"will continue with hook switch inactive.\n");
|
||||
}
|
||||
|
||||
gpiod_modem_codec = devm_gpiod_get(card->dev, "modem_codec",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(gpiod_modem_codec)) {
|
||||
dev_warn(card->dev, "Failed to obtain modem_codec GPIO\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Set up digital mute if not provided by the codec */
|
||||
if (!codec_dai->driver->ops) {
|
||||
codec_dai->driver->ops = &ams_delta_dai_ops;
|
||||
} else {
|
||||
ams_delta_ops.startup = ams_delta_startup;
|
||||
ams_delta_ops.shutdown = ams_delta_shutdown;
|
||||
}
|
||||
|
||||
/* Register optional line discipline for over the modem control */
|
||||
ret = tty_register_ldisc(N_V253, &cx81801_ops);
|
||||
if (ret) {
|
||||
|
Loading…
Reference in New Issue
Block a user