static int msm_gpio_get(struct gpio_chip *chip, unsigned offset) { int i = 0; if (offset < NR_MSM_GPIOS) i = (readl(GPIO_IN_OUT(offset)) & 0x03); return i; }
unsigned __msm_gpiomux_read(unsigned gpio) { int in_out, cfg; in_out = __raw_readl(GPIO_IN_OUT(gpio)); cfg = __raw_readl(GPIO_CFG(gpio)); return (in_out <<16) | cfg; }
void __init k2_init_cam(void) { int rc = 0; int voltage = 0; pr_info("[CAM] msm8930_cam_common_configs"); msm_gpiomux_install(msm8930_cam_common_configs, ARRAY_SIZE(msm8930_cam_common_configs)); platform_device_register(&msm_camera_server); platform_device_register(&msm8960_device_csiphy0); platform_device_register(&msm8960_device_csiphy1); platform_device_register(&msm8960_device_csid0); platform_device_register(&msm8960_device_csid1); platform_device_register(&msm8960_device_ispif); platform_device_register(&msm8960_device_vfe); platform_device_register(&msm8960_device_vpe); #ifdef CONFIG_I2C /* Pre-setting for i2c sensor device */ rc = gpio_request(CAM_PIN_GPIO_CAM_ID, "MSM_CAM_ID"); pr_info("[CAM] cam id gpio_request, %d\n", CAM_PIN_GPIO_CAM_ID); if (rc < 0) pr_err("[CAM] GPIO(%d) request failed\n", CAM_PIN_GPIO_CAM_ID); else { gpio_tlmm_config( GPIO_CFG(CAM_PIN_GPIO_CAM_ID, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE); msleep(1); /* direction: GPIO_CFG_INPUT */ voltage = readl(GPIO_IN_OUT(CAM_PIN_GPIO_CAM_ID)) & BIT(0); pr_info("[CAM] CAM ID voltage: %d\n", voltage); gpio_tlmm_config( GPIO_CFG(CAM_PIN_GPIO_CAM_ID, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE); gpio_free(CAM_PIN_GPIO_CAM_ID); } if (0) { /* Always probe ov5693 by default */ pr_info("[CAM] use s5k4e5yx and s5k6a1gx\n"); k2_camera_board_info.board_info = k2_camera_i2c_boardinfo_old; k2_camera_board_info.num_i2c_board_info = ARRAY_SIZE(k2_camera_i2c_boardinfo_old); } else { k2_camera_board_info.board_info = k2_camera_i2c_boardinfo; k2_camera_board_info.num_i2c_board_info = ARRAY_SIZE(k2_camera_i2c_boardinfo); } #endif }
void __msm_gpiomux_write(unsigned gpio, struct gpiomux_setting val) { uint32_t bits; bits = (val.drv << 6) | (val.func << 2) | val.pull; if (val.func == GPIOMUX_FUNC_GPIO) { bits |= val.dir > GPIOMUX_IN ? BIT(9) : 0; __raw_writel(val.dir == GPIOMUX_OUT_HIGH ? BIT(1) : 0, GPIO_IN_OUT(gpio)); } __raw_writel(bits, GPIO_CFG(gpio)); mb(); }
void __msm_gpio_get_dump_info(unsigned gpio, struct msm_gpio_dump_info *data) { unsigned flags; flags = __raw_readl(GPIO_CONFIG(gpio)); data->pull = flags & 0x3; data->func_sel = (flags >> 2) & 0xf; data->drv = (flags >> 6) & 0x7; data->dir = (flags >> 9) & 0x1; if (data->dir) data->value = (__raw_readl(GPIO_IN_OUT(gpio)) >> 1) & 0x1; else {
void msm_gpiomux_read(unsigned gpio, struct gpiomux_setting *val) { uint32_t bits = readl_relaxed(GPIO_CFG(gpio)); val->pull = bits & 0x3; val->func = (bits >> 2) & 0xf; val->drv = (bits >> 6) & 0x7; val->dir = bits & BIT_MASK(9) ? 1 : GPIOMUX_IN; if ((val->func == GPIOMUX_FUNC_GPIO) && (val->dir)) val->dir = readl_relaxed(GPIO_IN_OUT(gpio)) & BIT_MASK(1) ? GPIOMUX_OUT_HIGH : GPIOMUX_OUT_LOW; }
void __msm_gpiomux_write(unsigned gpio, struct gpiomux_setting val) { uint32_t bits; uint32_t gpio_in_out_value = 0; /* <npdc300018062> from here okajima 2012.4.12 */ /* brief: to change setting for GPIO_IN_OUT resistor by GPIO No */ if ((val.dir == GPIOMUX_OUT_HIGH) && (gpio != IN_CAMERA_GPIO) && (gpio != OUT_CAMERA_GPIO)) gpio_in_out_value = BIT(1); /* <npdc300018062> to here okajima 2012.4.12 */ bits = (val.drv << 6) | (val.func << 2) | val.pull; if (val.func == GPIOMUX_FUNC_GPIO) { bits |= val.dir > GPIOMUX_IN ? BIT(9) : 0; /* <npdc300018062> from here okajima 2012.4.12 */ /* brief: to change setting for GPIO_IN_OUT resistor by GPIO No */ /*__raw_writel(val.dir == GPIOMUX_OUT_HIGH ? BIT(1) : 0,*/ __raw_writel(gpio_in_out_value, /* <npdc300018062> to here okajima 2012.4.12 */ GPIO_IN_OUT(gpio)); } __raw_writel(bits, GPIO_CFG(gpio)); mb(); }
static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int val) { if (offset < NR_MSM_GPIOS) writel((val ? 0x02 : 0x00), GPIO_IN_OUT(offset)); }
void __msm_gpio_set_inout(unsigned gpio, unsigned val) { __raw_writel(val ? BIT(GPIO_OUT_BIT) : 0, GPIO_IN_OUT(gpio)); }
unsigned __msm_gpio_get_inout(unsigned gpio) { return __raw_readl(GPIO_IN_OUT(gpio)) & BIT(GPIO_IN_BIT); }
#if defined(CONFIG_HTC_POWER_DEBUG) && defined(CONFIG_PINCTRL_MSM_TLMM_V3) void __msm_gpio_get_dump_info(unsigned gpio, struct msm_gpio_dump_info *data) { unsigned flags; flags = __raw_readl(GPIO_CONFIG(gpio)); data->pull = flags & 0x3; data->func_sel = (flags >> 2) & 0xf; data->drv = (flags >> 6) & 0x7; data->dir = (flags >> 9) & 0x1; if (data->dir) data->value = (__raw_readl(GPIO_IN_OUT(gpio)) >> 1) & 0x1; else { data->value = __raw_readl(GPIO_IN_OUT(gpio)) & 0x1; data->int_en = __raw_readl(GPIO_INTR_CFG(gpio)) & 0x1; if (data->int_en) data->int_owner = (__raw_readl(GPIO_INTR_CFG(gpio)) >> 5) & 0x7; } } #endif unsigned __msm_gpio_get_intr_cfg_enable(unsigned gpio) { return __msm_gpio_get_intr_config(gpio) & INTR_ENABLE; } void __msm_gpio_set_intr_cfg_type(unsigned gpio, unsigned type) { unsigned cfg;