Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig
- index 7242b7f..1ff1f47 100644
- --- a/arch/arm/mach-msm/Kconfig
- +++ b/arch/arm/mach-msm/Kconfig
- @@ -1067,6 +1067,42 @@ config PHYS_OFFSET
- depends on MACH_HTCLEO
- default "0x11800000" if MACH_HTCLEO
- +config HTCLEO_CPU_VOLT
- + bool
- + default y if HTCLEO_NO_UNDERVOLT
- +
- +choice
- + prompt "The minimum amount of voltage feeds into the CPU is"
- +
- + default HTCLEO_NO_UNDERVOLT
- +
- + config HTCLEO_UNDERVOLT_1000
- + bool "1000 mV"
- +
- + config HTCLEO_UNDERVOLT_925
- + bool "925 mV"
- +
- + config HTCLEO_UNDERVOLT_800
- + bool "800 mV - does not work on every device"
- +
- + config HTCLEO_NO_UNDERVOLT
- + bool "DEFAULT - 1050mV"
- +
- +endchoice
- +
- +config HTCLEO_OVERCLOCK
- + bool "Support overclock to 1.113GHz"
- + default n
- + help
- + add overclock ability to 1.113GHz.
- +config HTCLEO_EXOVERCLOCK
- + bool "Support overclock to 1.305GHz"
- + depends on HTCLEO_OVERCLOCK
- + default n
- + help
- + add overclock ability to 1.305GHz.
- +
- +
- config HTC_FB_CONSOLE
- bool "Boot console for HTC phones (needs a font which has width <= 8)"
- default n
- diff --git a/arch/arm/mach-msm/acpuclock-scorpion.c b/arch/arm/mach-msm/acpuclock-scorpion.c
- index 44e9b60..e87e643 100644
- --- a/arch/arm/mach-msm/acpuclock-scorpion.c
- +++ b/arch/arm/mach-msm/acpuclock-scorpion.c
- @@ -73,6 +73,75 @@ struct clkctl_acpu_speed {
- #define SRC_PLL1 3 /* 768 MHz */
- struct clkctl_acpu_speed acpu_freq_tbl[] = {
- +#ifdef CONFIG_HTCLEO_UNDERVOLT_1000
- + { 19200, CCTL(CLK_TCXO, 1), SRC_RAW, 0, 0, 1000, 14000 },
- + { 128000, CCTL(CLK_TCXO, 1), SRC_AXI, 0, 0, 1000, 14000 },
- + { 245000, CCTL(CLK_MODEM_PLL, 1), SRC_RAW, 0, 0, 1000, 29000 },
- + //{ 256000, CCTL(CLK_GLOBAL_PLL, 3), SRC_RAW, 0, 0, 1000, 29000 },
- + { 384000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0A, 0, 1000, 58000 },
- + { 422400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0B, 0, 1000, 117000 },
- + { 460800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0C, 0, 1000, 117000 },
- + { 499200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0D, 0, 1025, 117000 },
- + { 537600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0E, 0, 1050, 117000 },
- + { 576000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0F, 0, 1050, 117000 },
- + { 614400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x10, 0, 1075, 117000 },
- + { 652800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x11, 0, 1100, 117000 },
- + { 691200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x12, 0, 1125, 117000 },
- + { 729600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x13, 0, 1150, 117000 },
- + { 768000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x14, 0, 1150, 128000 },
- + { 806400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x15, 0, 1175, 128000 },
- + { 844800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x16, 0, 1200, 128000 },
- + { 883200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x17, 0, 1200, 128000 },
- + { 921600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x18, 0, 1225, 128000 },
- + { 960000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x19, 0, 1225, 128000 },
- + { 998400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1A, 0, 1225, 128000 },
- +#elif CONFIG_HTCLEO_UNDERVOLT_925
- + // should work with most of HD2s
- + { 19200, CCTL(CLK_TCXO, 1), SRC_RAW, 0, 0, 925, 14000 },
- + { 128000, CCTL(CLK_TCXO, 1), SRC_AXI, 0, 0, 925, 14000 },
- + { 245000, CCTL(CLK_MODEM_PLL, 1), SRC_RAW, 0, 0, 925, 29000 },
- + //{ 256000, CCTL(CLK_GLOBAL_PLL, 3), SRC_RAW, 0, 0, 925, 29000 },
- + { 384000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0A, 0, 950, 58000 },
- + { 422400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0B, 0, 975, 117000 },
- + { 460800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0C, 0, 1000, 117000 },
- + { 499200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0D, 0, 1025, 117000 },
- + { 537600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0E, 0, 1050, 117000 },
- + { 576000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0F, 0, 1050, 117000 },
- + { 614400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x10, 0, 1075, 117000 },
- + { 652800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x11, 0, 1100, 117000 },
- + { 691200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x12, 0, 1125, 117000 },
- + { 729600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x13, 0, 1150, 117000 },
- + { 768000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x14, 0, 1150, 128000 },
- + { 806400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x15, 0, 1175, 128000 },
- + { 844800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x16, 0, 1200, 128000 },
- + { 883200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x17, 0, 1200, 128000 },
- + { 921600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x18, 0, 1225, 128000 },
- + { 960000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x19, 0, 1225, 128000 },
- + { 998400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1A, 0, 1225, 128000 },
- +#elif CONFIG_HTCLEO_UNDERVOLT_800
- + // not working yet
- + { 19200, CCTL(CLK_TCXO, 1), SRC_RAW, 0, 0, 850, 14000 },
- + { 128000, CCTL(CLK_TCXO, 1), SRC_AXI, 0, 0, 850, 14000 },
- + { 245000, CCTL(CLK_MODEM_PLL, 1), SRC_RAW, 0, 0, 850, 29000 },
- + //{ 256000, CCTL(CLK_GLOBAL_PLL, 3), SRC_RAW, 0, 0, 850, 29000 },
- + { 384000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0A, 0, 850, 58000 },
- + { 422400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0B, 0, 875, 117000 },
- + { 460800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0C, 0, 900, 117000 },
- + { 499200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0D, 0, 925, 117000 },
- + { 537600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0E, 0, 950, 117000 },
- + { 576000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x0F, 0, 950, 117000 },
- + { 614400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x10, 0, 975, 117000 },
- + { 652800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x11, 0, 1000, 117000 },
- + { 691200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x12, 0, 1025, 117000 },
- + { 729600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x13, 0, 1050, 117000 },
- + { 768000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x14, 0, 1125, 128000 },
- + { 806400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x15, 0, 1125, 128000 },
- + { 844800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x16, 0, 1150, 128000 },
- + { 883200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x17, 0, 1150, 128000 },
- + { 921600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x18, 0, 1175, 128000 },
- + { 960000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x19, 0, 1175, 128000 },
- + { 998400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1A, 0, 1200, 128000 },
- +#else
- { 19200, CCTL(CLK_TCXO, 1), SRC_RAW, 0, 0, 1050, 14000},
- { 128000, CCTL(CLK_TCXO, 1), SRC_AXI, 0, 0, 1050, 14000 },
- { 245000, CCTL(CLK_MODEM_PLL, 1), SRC_RAW, 0, 0, 1050, 29000 },
- @@ -95,6 +164,30 @@ struct clkctl_acpu_speed acpu_freq_tbl[] = {
- { 921600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x18, 0, 1300, 128000 },
- { 960000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x19, 0, 1300, 128000 },
- { 998400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1A, 0, 1300, 128000 },
- +#endif
- +#ifdef CONFIG_HTCLEO_OVERCLOCK
- +#ifdef CONFIG_HTCLEO_UNDERVOLT_1000
- + { 1036800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1B, 0, 1225, 128000 },
- + { 1075200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1C, 0, 1250, 128000 },
- + { 1113600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1D, 0, 1275, 128000 },
- +#elif CONFIG_HTCLEO_UNDERVOLT_925
- + { 1036800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1B, 0, 1225, 128000 },
- + { 1075200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1C, 0, 1250, 128000 },
- + { 1113600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1D, 0, 1275, 128000 },
- +#elif CONFIG_HTCLEO_UNDERVOLT_800
- + { 1036800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1B, 0, 1225, 128000 },
- + { 1075200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1C, 0, 1250, 128000 },
- + { 1113600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1D, 0, 1275, 128000 },
- +#else
- + { 1036800, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1B, 0, 1300, 128000 },
- + { 1075200, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1C, 0, 1300, 128000 },
- + { 1113600, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1D, 0, 1300, 128000 },
- +#endif
- +#endif
- +#ifdef CONFIG_HTCLEO_EXOVERCLOCK
- + { 1152000, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1E, 0, 1300, 128000 },
- + { 1190400, CCTL(CLK_TCXO, 1), SRC_SCPLL, 0x1F, 0, 1300, 128000 },
- +#endif
- { 0 },
- };
- @@ -120,9 +213,10 @@ static void __init acpuclk_init_cpufreq_table(void)
- freq_table[i].index = i;
- freq_table[i].frequency = CPUFREQ_ENTRY_INVALID;
- - /* Skip speeds using the global pll */
- - if (acpu_freq_tbl[i].acpu_khz == 256000 ||
- - acpu_freq_tbl[i].acpu_khz == 19200)
- + /* Skip speeds we don't want */
- + if ( acpu_freq_tbl[i].acpu_khz == 19200 ||
- + acpu_freq_tbl[i].acpu_khz == 128000 ||
- + acpu_freq_tbl[i].acpu_khz == 256000)
- continue;
- vdd = acpu_freq_tbl[i].vdd;
- @@ -411,6 +505,8 @@ static int pll_request(unsigned id, unsigned on)
- #define CT_CSR_PHYS 0xA8700000
- #define TCSR_SPARE2_ADDR (ct_csr_base + 0x60)
- +/* hastarin - This appears to remove the extra frequencies from the table
- + so only the highest frequency per VDD is available */
- void __init acpu_freq_tbl_fixup(void)
- {
- void __iomem *ct_csr_base;
- @@ -436,6 +532,9 @@ void __init acpu_freq_tbl_fixup(void)
- case 0x30:
- case 0x00:
- max_acpu_khz = 998400;
- +#ifdef CONFIG_HTCLEO_OVERCLOCK
- + max_acpu_khz = 1113600;
- +#endif
- break;
- case 0x10:
- max_acpu_khz = 1267200;
- @@ -485,11 +584,22 @@ static void __init acpuclk_init(void)
- */
- speed = acpu_freq_tbl;
- for (;;) {
- +#ifdef CONFIG_HTCLEO_OVERCLOCK
- + if (speed->acpu_khz == 883200)
- + break;
- +#else
- if (speed->acpu_khz == 768000)
- break;
- +#endif
- +#ifdef CONFIG_HTCLEO_OVERCLOCK
- + if (speed->acpu_khz == 0) {
- + pr_err("acpuclk_init: cannot find 883.2MHz\n");
- + BUG();
- +#else
- if (speed->acpu_khz == 0) {
- pr_err("acpuclk_init: cannot find 768MHz\n");
- BUG();
- +#endif
- }
- speed++;
- }
- diff --git a/arch/arm/mach-msm/board-htcleo.c b/arch/arm/mach-msm/board-htcleo.c
- index e13205b..b6d271b 100644
- --- a/arch/arm/mach-msm/board-htcleo.c
- +++ b/arch/arm/mach-msm/board-htcleo.c
- @@ -111,8 +111,8 @@ static struct regulator_init_data tps65023_data[5] =
- .constraints =
- {
- .name = "dcdc1", /* VREG_MSMC2_1V29 */
- - .min_uV = 1000000,
- - .max_uV = 1300000,
- + .min_uV = 925000,
- + .max_uV = 1350000,
- .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
- },
- .consumer_supplies = tps65023_dcdc1_supplies,
- diff --git a/arch/arm/mach-msm/cpufreq.c b/arch/arm/mach-msm/cpufreq.c
- old mode 100644
- new mode 100755
- index 5317991..3c27bff
- --- a/arch/arm/mach-msm/cpufreq.c
- +++ b/arch/arm/mach-msm/cpufreq.c
- @@ -22,6 +22,12 @@
- #include <linux/init.h>
- #include "acpuclock.h"
- +/* Make sure the kernel is not overclocked on boot to avoid potential freezing/boot loops
- +* for people with less capable hardware. */
- +//#define CPUFREQ_MAX 998400 max should be default freq
- +//#define CPUFREQ_MIN 245000 min should be the lowest freq in the table
- +
- +
- #ifdef CONFIG_MSM_CPU_FREQ_SCREEN
- static void msm_early_suspend(struct early_suspend *handler) {
- acpuclk_set_rate(CONFIG_MSM_CPU_FREQ_SCREEN_OFF * 1000, 0);
- @@ -90,6 +96,11 @@ static int __init msm_cpufreq_init(struct cpufreq_policy *policy)
- BUG_ON(cpufreq_frequency_table_cpuinfo(policy, table));
- policy->cur = acpuclk_get_rate();
- +
- + /* CPU Clock limitation
- + policy->max = CPUFREQ_MAX;
- + policy->min = CPUFREQ_MIN;*/
- +
- policy->cpuinfo.transition_latency =
- acpuclk_get_switch_time() * NSEC_PER_USEC;
- return 0;
- diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
- index ca7b088..d239415 100644
- --- a/drivers/cpufreq/Kconfig
- +++ b/drivers/cpufreq/Kconfig
- @@ -111,6 +111,13 @@ config CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
- governor. If unsure have a look at the help section of the
- driver. Fallback governor will be the performance governor.
- +config CPU_FREQ_DEFAULT_GOV_SMARTASS
- + bool "smartass"
- + select CPU_FREQ_GOV_SMARTASS
- + select CPU_FREQ_GOV_PERFORMANCE
- + help
- + Use the CPUFreq governor 'smartass' as default.
- +
- config CPU_FREQ_DEFAULT_GOV_INTERACTIVE
- bool "interactive"
- select CPU_FREQ_GOV_INTERACTIVE
- @@ -205,4 +212,12 @@ config CPU_FREQ_GOV_CONSERVATIVE
- If in doubt, say N.
- +config CPU_FREQ_GOV_SMARTASS
- + tristate "'smartass' cpufreq governor"
- + depends on CPU_FREQ
- + help
- + 'smartass' - a "smart" optimized governor for the hero!
- + If in doubt, say N.
- +
- +
- endif # CPU_FREQ
- diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
- index 30629f7..925dfd5 100644
- --- a/drivers/cpufreq/Makefile
- +++ b/drivers/cpufreq/Makefile
- @@ -10,6 +10,7 @@ obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o
- obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o
- obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o
- obj-$(CONFIG_CPU_FREQ_GOV_INTERACTIVE) += cpufreq_interactive.o
- +obj-$(CONFIG_CPU_FREQ_GOV_SMARTASS) += cpufreq_smartass.o
- # CPUfreq cross-arch helpers
- obj-$(CONFIG_CPU_FREQ_TABLE) += freq_table.o
- diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
- index c7b081b..bd3825d 100644
- --- a/drivers/cpufreq/cpufreq_conservative.c
- +++ b/drivers/cpufreq/cpufreq_conservative.c
- @@ -29,8 +29,8 @@
- * It helps to keep variable names smaller, simpler
- */
- -#define DEF_FREQUENCY_UP_THRESHOLD (80)
- -#define DEF_FREQUENCY_DOWN_THRESHOLD (20)
- +#define DEF_FREQUENCY_UP_THRESHOLD (65)
- +#define DEF_FREQUENCY_DOWN_THRESHOLD (30)
- /*
- * The polling frequency of this governor depends on the capability of
- diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
- index 26e4759..6ee17cb 100644
- --- a/drivers/cpufreq/cpufreq_ondemand.c
- +++ b/drivers/cpufreq/cpufreq_ondemand.c
- @@ -30,11 +30,11 @@
- * It helps to keep variable names smaller, simpler
- */
- -#define DEF_FREQUENCY_DOWN_DIFFERENTIAL (10)
- -#define DEF_FREQUENCY_UP_THRESHOLD (80)
- +#define DEF_FREQUENCY_DOWN_DIFFERENTIAL (30)
- +#define DEF_FREQUENCY_UP_THRESHOLD (65)
- #define MICRO_FREQUENCY_DOWN_DIFFERENTIAL (3)
- #define MICRO_FREQUENCY_UP_THRESHOLD (95)
- -#define MICRO_FREQUENCY_MIN_SAMPLE_RATE (10000)
- +#define MICRO_FREQUENCY_MIN_SAMPLE_RATE (9500)
- #define MIN_FREQUENCY_UP_THRESHOLD (11)
- #define MAX_FREQUENCY_UP_THRESHOLD (100)
- diff --git a/drivers/i2c/busses/i2c-msm.c b/drivers/i2c/busses/i2c-msm.c
- index 62dbc11..59cc801 100644
- --- a/drivers/i2c/busses/i2c-msm.c
- +++ b/drivers/i2c/busses/i2c-msm.c
- @@ -241,13 +241,26 @@ msm_i2c_interrupt(int irq, void *devid)
- return IRQ_HANDLED;
- }
- +#define MICROP_I2C_RCMD_GSENSOR_X_DATA 0x77
- +#define MICROP_I2C_RCMD_GSENSOR_Y_DATA 0x78
- +#define MICROP_I2C_RCMD_GSENSOR_Z_DATA 0x79
- +#define MICROP_I2C_ADDR 0x66
- +#define GSENSOR_TIMEDOUT 210
- +
- +static int is_gsensor_msg(struct i2c_msg msgs[])
- +{
- + return msgs->addr==MICROP_I2C_ADDR &&
- + (msgs->buf[0] == MICROP_I2C_RCMD_GSENSOR_X_DATA ||
- + msgs->buf[0] == MICROP_I2C_RCMD_GSENSOR_Y_DATA||
- + msgs->buf[0] == MICROP_I2C_RCMD_GSENSOR_Z_DATA);
- +}
- static int
- -msm_i2c_poll_notbusy(struct msm_i2c_dev *dev, int warn)
- +msm_i2c_poll_notbusy(struct msm_i2c_dev *dev, int warn, struct i2c_msg msgs[])
- {
- uint32_t retries = 0;
- - while (retries != 200) {
- + while (retries != (is_gsensor_msg(msgs) ? 100 : 200)) {
- uint32_t status = readl(dev->base + I2C_STATUS);
- if (!(status & I2C_STATUS_BUS_ACTIVE)) {
- @@ -259,8 +272,8 @@ msm_i2c_poll_notbusy(struct msm_i2c_dev *dev, int warn)
- if (retries++ > 100)
- msleep(10);
- }
- - dev_err(dev->dev, "Error waiting for notbusy\n");
- - return -ETIMEDOUT;
- + dev_err(dev->dev, "Error waiting for notbusy (addr=%02x, msgs=%02x)\n", msgs->addr, msgs->buf[0]);
- + return is_gsensor_msg(msgs) ? -GSENSOR_TIMEDOUT : -ETIMEDOUT;
- }
- static int
- @@ -333,7 +346,7 @@ msm_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
- {
- DECLARE_COMPLETION_ONSTACK(complete);
- struct msm_i2c_dev *dev = i2c_get_adapdata(adap);
- - int ret;
- + int ret, ret_wait;
- long timeout;
- unsigned long flags;
- @@ -346,7 +359,7 @@ msm_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
- clk_enable(dev->clk);
- enable_irq(dev->irq);
- - ret = msm_i2c_poll_notbusy(dev, 1);
- + ret = msm_i2c_poll_notbusy(dev, 1, msgs);
- if (ret) {
- dev_err(dev->dev, "Still busy in starting xfer(%02X)\n",
- msgs->addr);
- @@ -380,9 +393,7 @@ msm_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
- */
- timeout = wait_for_completion_timeout(&complete, HZ);
- - if (msm_i2c_poll_notbusy(dev, 0)) /* Read may not have stopped in time */
- - dev_err(dev->dev, "Still busy after xfer completion (%02X)\n",
- - msgs->addr);
- + ret_wait = msm_i2c_poll_notbusy(dev, 0, msgs);
- spin_lock_irqsave(&dev->lock, flags);
- if (dev->flush_cnt) {
- dev_warn(dev->dev, "%d unrequested bytes read\n",
- @@ -397,7 +408,17 @@ msm_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
- dev->flush_cnt = 0;
- dev->cnt = 0;
- spin_unlock_irqrestore(&dev->lock, flags);
- -
- + if (ret_wait) /* Read may not have stopped in time */
- + {
- + dev_err(dev->dev, "Still busy after xfer completion (%02X)\n", msgs->addr);
- + if (ret_wait == -GSENSOR_TIMEDOUT)
- + ret = 2; // in most situations the value of ret is 2 (dev->ret), we set it to 2 just to be sure that function i2c_read_block doesn't repeats the read
- + if (!dev->skip_recover) {
- + ret_wait = msm_i2c_recover_bus_busy(dev);
- + if (ret_wait)
- + goto err;
- + }
- + }
- if (!timeout) {
- dev_err(dev->dev, "Transaction timed out\n");
- ret = -ETIMEDOUT;
- diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
- index 61dca28..5d3c9df 100644
- --- a/include/linux/cpufreq.h
- +++ b/include/linux/cpufreq.h
- @@ -338,6 +338,9 @@ extern struct cpufreq_governor cpufreq_gov_ondemand;
- #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE)
- extern struct cpufreq_governor cpufreq_gov_conservative;
- #define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_conservative)
- +#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_SMARTASS)
- +extern struct cpufreq_governor cpufreq_gov_smartass;
- +#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_smartass)
- #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE)
- extern struct cpufreq_governor cpufreq_gov_interactive;
- #define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_interactive)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement