mirror of
https://github.com/Qortal/Brooklyn.git
synced 2025-02-11 17:55:54 +00:00
I have a dozen personalities and none of them is like them two fags Mike and T3Q
This commit is contained in:
parent
bcf49726af
commit
108444ef65
@ -3896,8 +3896,8 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
dev_err(host->dev, "BUG: invalid board index %u\n", board_idx);
|
dev_alert(host->dev, "BUG: invalid board index %u\n", board_idx);
|
||||||
return 1;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hpriv->hp_flags = hp_flags;
|
hpriv->hp_flags = hp_flags;
|
||||||
|
@ -1257,7 +1257,7 @@ static int nv_common_early_init(void *handle)
|
|||||||
AMD_PG_SUPPORT_VCN_DPG |
|
AMD_PG_SUPPORT_VCN_DPG |
|
||||||
AMD_PG_SUPPORT_JPEG;
|
AMD_PG_SUPPORT_JPEG;
|
||||||
if (adev->pdev->device == 0x1681)
|
if (adev->pdev->device == 0x1681)
|
||||||
adev->external_rev_id = adev->rev_id + 0x19;
|
adev->external_rev_id = 0x20;
|
||||||
else
|
else
|
||||||
adev->external_rev_id = adev->rev_id + 0x01;
|
adev->external_rev_id = adev->rev_id + 0x01;
|
||||||
break;
|
break;
|
||||||
|
@ -366,32 +366,32 @@ static struct wm_table lpddr5_wm_table = {
|
|||||||
.wm_inst = WM_A,
|
.wm_inst = WM_A,
|
||||||
.wm_type = WM_TYPE_PSTATE_CHG,
|
.wm_type = WM_TYPE_PSTATE_CHG,
|
||||||
.pstate_latency_us = 11.65333,
|
.pstate_latency_us = 11.65333,
|
||||||
.sr_exit_time_us = 5.32,
|
.sr_exit_time_us = 11.5,
|
||||||
.sr_enter_plus_exit_time_us = 6.38,
|
.sr_enter_plus_exit_time_us = 14.5,
|
||||||
.valid = true,
|
.valid = true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.wm_inst = WM_B,
|
.wm_inst = WM_B,
|
||||||
.wm_type = WM_TYPE_PSTATE_CHG,
|
.wm_type = WM_TYPE_PSTATE_CHG,
|
||||||
.pstate_latency_us = 11.65333,
|
.pstate_latency_us = 11.65333,
|
||||||
.sr_exit_time_us = 9.82,
|
.sr_exit_time_us = 11.5,
|
||||||
.sr_enter_plus_exit_time_us = 11.196,
|
.sr_enter_plus_exit_time_us = 14.5,
|
||||||
.valid = true,
|
.valid = true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.wm_inst = WM_C,
|
.wm_inst = WM_C,
|
||||||
.wm_type = WM_TYPE_PSTATE_CHG,
|
.wm_type = WM_TYPE_PSTATE_CHG,
|
||||||
.pstate_latency_us = 11.65333,
|
.pstate_latency_us = 11.65333,
|
||||||
.sr_exit_time_us = 9.89,
|
.sr_exit_time_us = 11.5,
|
||||||
.sr_enter_plus_exit_time_us = 11.24,
|
.sr_enter_plus_exit_time_us = 14.5,
|
||||||
.valid = true,
|
.valid = true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.wm_inst = WM_D,
|
.wm_inst = WM_D,
|
||||||
.wm_type = WM_TYPE_PSTATE_CHG,
|
.wm_type = WM_TYPE_PSTATE_CHG,
|
||||||
.pstate_latency_us = 11.65333,
|
.pstate_latency_us = 11.65333,
|
||||||
.sr_exit_time_us = 9.748,
|
.sr_exit_time_us = 11.5,
|
||||||
.sr_enter_plus_exit_time_us = 11.102,
|
.sr_enter_plus_exit_time_us = 14.5,
|
||||||
.valid = true,
|
.valid = true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -518,14 +518,21 @@ static unsigned int find_clk_for_voltage(
|
|||||||
unsigned int voltage)
|
unsigned int voltage)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int max_voltage = 0;
|
||||||
|
int clock = 0;
|
||||||
|
|
||||||
for (i = 0; i < NUM_SOC_VOLTAGE_LEVELS; i++) {
|
for (i = 0; i < NUM_SOC_VOLTAGE_LEVELS; i++) {
|
||||||
if (clock_table->SocVoltage[i] == voltage)
|
if (clock_table->SocVoltage[i] == voltage) {
|
||||||
return clocks[i];
|
return clocks[i];
|
||||||
|
} else if (clock_table->SocVoltage[i] >= max_voltage &&
|
||||||
|
clock_table->SocVoltage[i] < voltage) {
|
||||||
|
max_voltage = clock_table->SocVoltage[i];
|
||||||
|
clock = clocks[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(0);
|
ASSERT(clock);
|
||||||
return 0;
|
return clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcn31_clk_mgr_helper_populate_bw_params(
|
void dcn31_clk_mgr_helper_populate_bw_params(
|
||||||
|
@ -76,10 +76,6 @@ void dcn31_init_hw(struct dc *dc)
|
|||||||
if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
|
if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
|
||||||
dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
|
dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
|
||||||
|
|
||||||
// Initialize the dccg
|
|
||||||
if (res_pool->dccg->funcs->dccg_init)
|
|
||||||
res_pool->dccg->funcs->dccg_init(res_pool->dccg);
|
|
||||||
|
|
||||||
if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
|
if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
|
||||||
|
|
||||||
REG_WRITE(REFCLK_CNTL, 0);
|
REG_WRITE(REFCLK_CNTL, 0);
|
||||||
@ -106,6 +102,9 @@ void dcn31_init_hw(struct dc *dc)
|
|||||||
hws->funcs.bios_golden_init(dc);
|
hws->funcs.bios_golden_init(dc);
|
||||||
hws->funcs.disable_vga(dc->hwseq);
|
hws->funcs.disable_vga(dc->hwseq);
|
||||||
}
|
}
|
||||||
|
// Initialize the dccg
|
||||||
|
if (res_pool->dccg->funcs->dccg_init)
|
||||||
|
res_pool->dccg->funcs->dccg_init(res_pool->dccg);
|
||||||
|
|
||||||
if (dc->debug.enable_mem_low_power.bits.dmcu) {
|
if (dc->debug.enable_mem_low_power.bits.dmcu) {
|
||||||
// Force ERAM to shutdown if DMCU is not enabled
|
// Force ERAM to shutdown if DMCU is not enabled
|
||||||
|
@ -217,8 +217,8 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_1_soc = {
|
|||||||
.num_states = 5,
|
.num_states = 5,
|
||||||
.sr_exit_time_us = 9.0,
|
.sr_exit_time_us = 9.0,
|
||||||
.sr_enter_plus_exit_time_us = 11.0,
|
.sr_enter_plus_exit_time_us = 11.0,
|
||||||
.sr_exit_z8_time_us = 402.0,
|
.sr_exit_z8_time_us = 442.0,
|
||||||
.sr_enter_plus_exit_z8_time_us = 520.0,
|
.sr_enter_plus_exit_z8_time_us = 560.0,
|
||||||
.writeback_latency_us = 12.0,
|
.writeback_latency_us = 12.0,
|
||||||
.dram_channel_width_bytes = 4,
|
.dram_channel_width_bytes = 4,
|
||||||
.round_trip_ping_latency_dcfclk_cycles = 106,
|
.round_trip_ping_latency_dcfclk_cycles = 106,
|
||||||
@ -928,7 +928,7 @@ static const struct dc_debug_options debug_defaults_drv = {
|
|||||||
.disable_dcc = DCC_ENABLE,
|
.disable_dcc = DCC_ENABLE,
|
||||||
.vsr_support = true,
|
.vsr_support = true,
|
||||||
.performance_trace = false,
|
.performance_trace = false,
|
||||||
.max_downscale_src_width = 3840,/*upto 4K*/
|
.max_downscale_src_width = 4096,/*upto true 4K*/
|
||||||
.disable_pplib_wm_range = false,
|
.disable_pplib_wm_range = false,
|
||||||
.scl_reset_length10 = true,
|
.scl_reset_length10 = true,
|
||||||
.sanity_checks = false,
|
.sanity_checks = false,
|
||||||
@ -1590,6 +1590,13 @@ static int dcn31_populate_dml_pipes_from_context(
|
|||||||
pipe = &res_ctx->pipe_ctx[i];
|
pipe = &res_ctx->pipe_ctx[i];
|
||||||
timing = &pipe->stream->timing;
|
timing = &pipe->stream->timing;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Immediate flip can be set dynamically after enabling the plane.
|
||||||
|
* We need to require support for immediate flip or underflow can be
|
||||||
|
* intermittently experienced depending on peak b/w requirements.
|
||||||
|
*/
|
||||||
|
pipes[pipe_cnt].pipe.src.immediate_flip = true;
|
||||||
|
|
||||||
pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
|
pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
|
||||||
pipes[pipe_cnt].pipe.src.gpuvm = true;
|
pipes[pipe_cnt].pipe.src.gpuvm = true;
|
||||||
pipes[pipe_cnt].pipe.src.dcc_fraction_of_zs_req_luma = 0;
|
pipes[pipe_cnt].pipe.src.dcc_fraction_of_zs_req_luma = 0;
|
||||||
|
@ -5398,9 +5398,9 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
|||||||
|
|
||||||
v->MaximumReadBandwidthWithPrefetch =
|
v->MaximumReadBandwidthWithPrefetch =
|
||||||
v->MaximumReadBandwidthWithPrefetch
|
v->MaximumReadBandwidthWithPrefetch
|
||||||
+ dml_max4(
|
+ dml_max3(
|
||||||
v->VActivePixelBandwidth[i][j][k],
|
v->VActivePixelBandwidth[i][j][k]
|
||||||
v->VActiveCursorBandwidth[i][j][k]
|
+ v->VActiveCursorBandwidth[i][j][k]
|
||||||
+ v->NoOfDPP[i][j][k]
|
+ v->NoOfDPP[i][j][k]
|
||||||
* (v->meta_row_bandwidth[i][j][k]
|
* (v->meta_row_bandwidth[i][j][k]
|
||||||
+ v->dpte_row_bandwidth[i][j][k]),
|
+ v->dpte_row_bandwidth[i][j][k]),
|
||||||
|
@ -105,6 +105,7 @@ static enum mod_hdcp_status remove_display_from_topology_v3(
|
|||||||
dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
|
dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
|
||||||
|
|
||||||
psp_dtm_invoke(psp, dtm_cmd->cmd_id);
|
psp_dtm_invoke(psp, dtm_cmd->cmd_id);
|
||||||
|
mutex_unlock(&psp->dtm_context.mutex);
|
||||||
|
|
||||||
if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
|
if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
|
||||||
status = remove_display_from_topology_v2(hdcp, index);
|
status = remove_display_from_topology_v2(hdcp, index);
|
||||||
@ -115,8 +116,6 @@ static enum mod_hdcp_status remove_display_from_topology_v3(
|
|||||||
HDCP_TOP_REMOVE_DISPLAY_TRACE(hdcp, display->index);
|
HDCP_TOP_REMOVE_DISPLAY_TRACE(hdcp, display->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&psp->dtm_context.mutex);
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,6 +204,7 @@ static enum mod_hdcp_status add_display_to_topology_v3(
|
|||||||
dtm_cmd->dtm_in_message.topology_update_v3.link_hdcp_cap = link->hdcp_supported_informational;
|
dtm_cmd->dtm_in_message.topology_update_v3.link_hdcp_cap = link->hdcp_supported_informational;
|
||||||
|
|
||||||
psp_dtm_invoke(psp, dtm_cmd->cmd_id);
|
psp_dtm_invoke(psp, dtm_cmd->cmd_id);
|
||||||
|
mutex_unlock(&psp->dtm_context.mutex);
|
||||||
|
|
||||||
if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
|
if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
|
||||||
status = add_display_to_topology_v2(hdcp, display);
|
status = add_display_to_topology_v2(hdcp, display);
|
||||||
@ -214,8 +214,6 @@ static enum mod_hdcp_status add_display_to_topology_v3(
|
|||||||
HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index);
|
HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&psp->dtm_context.mutex);
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1300,18 +1300,6 @@ static enum drm_mode_status ast_mode_valid(struct drm_connector *connector,
|
|||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum drm_connector_status ast_connector_detect(struct drm_connector
|
|
||||||
*connector, bool force)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = ast_get_modes(connector);
|
|
||||||
if (r <= 0)
|
|
||||||
return connector_status_disconnected;
|
|
||||||
|
|
||||||
return connector_status_connected;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ast_connector_destroy(struct drm_connector *connector)
|
static void ast_connector_destroy(struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct ast_connector *ast_connector = to_ast_connector(connector);
|
struct ast_connector *ast_connector = to_ast_connector(connector);
|
||||||
@ -1327,7 +1315,6 @@ static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {
|
|||||||
|
|
||||||
static const struct drm_connector_funcs ast_connector_funcs = {
|
static const struct drm_connector_funcs ast_connector_funcs = {
|
||||||
.reset = drm_atomic_helper_connector_reset,
|
.reset = drm_atomic_helper_connector_reset,
|
||||||
.detect = ast_connector_detect,
|
|
||||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||||
.destroy = ast_connector_destroy,
|
.destroy = ast_connector_destroy,
|
||||||
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
|
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
|
||||||
@ -1355,8 +1342,7 @@ static int ast_connector_init(struct drm_device *dev)
|
|||||||
connector->interlace_allowed = 0;
|
connector->interlace_allowed = 0;
|
||||||
connector->doublescan_allowed = 0;
|
connector->doublescan_allowed = 0;
|
||||||
|
|
||||||
connector->polled = DRM_CONNECTOR_POLL_CONNECT |
|
connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
DRM_CONNECTOR_POLL_DISCONNECT;
|
|
||||||
|
|
||||||
drm_connector_attach_encoder(connector, encoder);
|
drm_connector_attach_encoder(connector, encoder);
|
||||||
|
|
||||||
@ -1425,8 +1411,6 @@ int ast_mode_config_init(struct ast_private *ast)
|
|||||||
|
|
||||||
drm_mode_config_reset(dev);
|
drm_mode_config_reset(dev);
|
||||||
|
|
||||||
drm_kms_helper_poll_init(dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -545,7 +545,7 @@ config MMC_OMAP_HS
|
|||||||
|
|
||||||
config MMC_WBSD
|
config MMC_WBSD
|
||||||
tristate "Winbond W83L51xD SD/MMC Card Interface support"
|
tristate "Winbond W83L51xD SD/MMC Card Interface support"
|
||||||
depends on ISA_DMA_API
|
depends on ISA_DMA_API && !M68K
|
||||||
help
|
help
|
||||||
This selects the Winbond(R) W83L51xD Secure digital and
|
This selects the Winbond(R) W83L51xD Secure digital and
|
||||||
Multimedia card Interface.
|
Multimedia card Interface.
|
||||||
|
@ -282,6 +282,9 @@ static void __cqhci_enable(struct cqhci_host *cq_host)
|
|||||||
|
|
||||||
cqhci_writel(cq_host, cqcfg, CQHCI_CFG);
|
cqhci_writel(cq_host, cqcfg, CQHCI_CFG);
|
||||||
|
|
||||||
|
if (cqhci_readl(cq_host, CQHCI_CTL) & CQHCI_HALT)
|
||||||
|
cqhci_writel(cq_host, 0, CQHCI_CTL);
|
||||||
|
|
||||||
mmc->cqe_on = true;
|
mmc->cqe_on = true;
|
||||||
|
|
||||||
if (cq_host->ops->enable)
|
if (cq_host->ops->enable)
|
||||||
|
@ -464,6 +464,18 @@ static s8 dw_mci_exynos_get_best_clksmpl(u8 candiates)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there is no cadiates value, then it needs to return -EIO.
|
||||||
|
* If there are candiates values and don't find bset clk sample value,
|
||||||
|
* then use a first candiates clock sample value.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < iter; i++) {
|
||||||
|
__c = ror8(candiates, i);
|
||||||
|
if ((__c & 0x1) == 0x1) {
|
||||||
|
loc = i;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
out:
|
out:
|
||||||
return loc;
|
return loc;
|
||||||
}
|
}
|
||||||
@ -494,6 +506,8 @@ static int dw_mci_exynos_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
|
|||||||
priv->tuned_sample = found;
|
priv->tuned_sample = found;
|
||||||
} else {
|
} else {
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
dev_warn(&mmc->class_dev,
|
||||||
|
"There is no candiates value about clksmpl!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1187,6 +1187,7 @@ static void esdhc_reset_tuning(struct sdhci_host *host)
|
|||||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||||
struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
|
struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
|
||||||
u32 ctrl;
|
u32 ctrl;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Reset the tuning circuit */
|
/* Reset the tuning circuit */
|
||||||
if (esdhc_is_usdhc(imx_data)) {
|
if (esdhc_is_usdhc(imx_data)) {
|
||||||
@ -1199,7 +1200,22 @@ static void esdhc_reset_tuning(struct sdhci_host *host)
|
|||||||
} else if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) {
|
} else if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) {
|
||||||
ctrl = readl(host->ioaddr + SDHCI_AUTO_CMD_STATUS);
|
ctrl = readl(host->ioaddr + SDHCI_AUTO_CMD_STATUS);
|
||||||
ctrl &= ~ESDHC_MIX_CTRL_SMPCLK_SEL;
|
ctrl &= ~ESDHC_MIX_CTRL_SMPCLK_SEL;
|
||||||
|
ctrl &= ~ESDHC_MIX_CTRL_EXE_TUNE;
|
||||||
writel(ctrl, host->ioaddr + SDHCI_AUTO_CMD_STATUS);
|
writel(ctrl, host->ioaddr + SDHCI_AUTO_CMD_STATUS);
|
||||||
|
/* Make sure ESDHC_MIX_CTRL_EXE_TUNE cleared */
|
||||||
|
ret = readl_poll_timeout(host->ioaddr + SDHCI_AUTO_CMD_STATUS,
|
||||||
|
ctrl, !(ctrl & ESDHC_MIX_CTRL_EXE_TUNE), 1, 50);
|
||||||
|
if (ret == -ETIMEDOUT)
|
||||||
|
dev_warn(mmc_dev(host->mmc),
|
||||||
|
"Warning! clear execute tuning bit failed\n");
|
||||||
|
/*
|
||||||
|
* SDHCI_INT_DATA_AVAIL is W1C bit, set this bit will clear the
|
||||||
|
* usdhc IP internal logic flag execute_tuning_with_clr_buf, which
|
||||||
|
* will finally make sure the normal data transfer logic correct.
|
||||||
|
*/
|
||||||
|
ctrl = readl(host->ioaddr + SDHCI_INT_STATUS);
|
||||||
|
ctrl |= SDHCI_INT_DATA_AVAIL;
|
||||||
|
writel(ctrl, host->ioaddr + SDHCI_INT_STATUS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -616,16 +616,12 @@ static int intel_select_drive_strength(struct mmc_card *card,
|
|||||||
return intel_host->drv_strength;
|
return intel_host->drv_strength;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bxt_get_cd(struct mmc_host *mmc)
|
static int sdhci_get_cd_nogpio(struct mmc_host *mmc)
|
||||||
{
|
{
|
||||||
int gpio_cd = mmc_gpio_get_cd(mmc);
|
|
||||||
struct sdhci_host *host = mmc_priv(mmc);
|
struct sdhci_host *host = mmc_priv(mmc);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (!gpio_cd)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&host->lock, flags);
|
spin_lock_irqsave(&host->lock, flags);
|
||||||
|
|
||||||
if (host->flags & SDHCI_DEVICE_DEAD)
|
if (host->flags & SDHCI_DEVICE_DEAD)
|
||||||
@ -638,6 +634,21 @@ static int bxt_get_cd(struct mmc_host *mmc)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int bxt_get_cd(struct mmc_host *mmc)
|
||||||
|
{
|
||||||
|
int gpio_cd = mmc_gpio_get_cd(mmc);
|
||||||
|
|
||||||
|
if (!gpio_cd)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return sdhci_get_cd_nogpio(mmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mrfld_get_cd(struct mmc_host *mmc)
|
||||||
|
{
|
||||||
|
return sdhci_get_cd_nogpio(mmc);
|
||||||
|
}
|
||||||
|
|
||||||
#define SDHCI_INTEL_PWR_TIMEOUT_CNT 20
|
#define SDHCI_INTEL_PWR_TIMEOUT_CNT 20
|
||||||
#define SDHCI_INTEL_PWR_TIMEOUT_UDELAY 100
|
#define SDHCI_INTEL_PWR_TIMEOUT_UDELAY 100
|
||||||
|
|
||||||
@ -975,7 +986,7 @@ static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
|
|||||||
slot->host->mmc->caps2 |= MMC_CAP2_CQE;
|
slot->host->mmc->caps2 |= MMC_CAP2_CQE;
|
||||||
|
|
||||||
if (slot->chip->pdev->device != PCI_DEVICE_ID_INTEL_GLK_EMMC) {
|
if (slot->chip->pdev->device != PCI_DEVICE_ID_INTEL_GLK_EMMC) {
|
||||||
slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES,
|
slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
|
||||||
slot->host->mmc_host_ops.hs400_enhanced_strobe =
|
slot->host->mmc_host_ops.hs400_enhanced_strobe =
|
||||||
intel_hs400_enhanced_strobe;
|
intel_hs400_enhanced_strobe;
|
||||||
slot->host->mmc->caps2 |= MMC_CAP2_CQE_DCMD;
|
slot->host->mmc->caps2 |= MMC_CAP2_CQE_DCMD;
|
||||||
@ -1341,6 +1352,14 @@ static int intel_mrfld_mmc_probe_slot(struct sdhci_pci_slot *slot)
|
|||||||
MMC_CAP_1_8V_DDR;
|
MMC_CAP_1_8V_DDR;
|
||||||
break;
|
break;
|
||||||
case INTEL_MRFLD_SD:
|
case INTEL_MRFLD_SD:
|
||||||
|
slot->cd_idx = 0;
|
||||||
|
slot->cd_override_level = true;
|
||||||
|
/*
|
||||||
|
* There are two PCB designs of SD card slot with the opposite
|
||||||
|
* card detection sense. Quirk this out by ignoring GPIO state
|
||||||
|
* completely in the custom ->get_cd() callback.
|
||||||
|
*/
|
||||||
|
slot->host->mmc_host_ops.get_cd = mrfld_get_cd;
|
||||||
slot->host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
|
slot->host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
|
||||||
break;
|
break;
|
||||||
case INTEL_MRFLD_SDIO:
|
case INTEL_MRFLD_SDIO:
|
||||||
|
@ -2042,6 +2042,12 @@ void sdhci_set_power_noreg(struct sdhci_host *host, unsigned char mode,
|
|||||||
break;
|
break;
|
||||||
case MMC_VDD_32_33:
|
case MMC_VDD_32_33:
|
||||||
case MMC_VDD_33_34:
|
case MMC_VDD_33_34:
|
||||||
|
/*
|
||||||
|
* 3.4 ~ 3.6V are valid only for those platforms where it's
|
||||||
|
* known that the voltage range is supported by hardware.
|
||||||
|
*/
|
||||||
|
case MMC_VDD_34_35:
|
||||||
|
case MMC_VDD_35_36:
|
||||||
pwr = SDHCI_POWER_330;
|
pwr = SDHCI_POWER_330;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -195,6 +195,10 @@ static void tmio_mmc_reset(struct tmio_mmc_host *host)
|
|||||||
sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK, host->sdcard_irq_mask_all);
|
sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK, host->sdcard_irq_mask_all);
|
||||||
host->sdcard_irq_mask = host->sdcard_irq_mask_all;
|
host->sdcard_irq_mask = host->sdcard_irq_mask_all;
|
||||||
|
|
||||||
|
if (host->native_hotplug)
|
||||||
|
tmio_mmc_enable_mmc_irqs(host,
|
||||||
|
TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT);
|
||||||
|
|
||||||
tmio_mmc_set_bus_width(host, host->mmc->ios.bus_width);
|
tmio_mmc_set_bus_width(host, host->mmc->ios.bus_width);
|
||||||
|
|
||||||
if (host->pdata->flags & TMIO_MMC_SDIO_IRQ) {
|
if (host->pdata->flags & TMIO_MMC_SDIO_IRQ) {
|
||||||
@ -956,8 +960,15 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||||||
case MMC_POWER_OFF:
|
case MMC_POWER_OFF:
|
||||||
tmio_mmc_power_off(host);
|
tmio_mmc_power_off(host);
|
||||||
/* For R-Car Gen2+, we need to reset SDHI specific SCC */
|
/* For R-Car Gen2+, we need to reset SDHI specific SCC */
|
||||||
if (host->pdata->flags & TMIO_MMC_MIN_RCAR2)
|
if (host->pdata->flags & TMIO_MMC_MIN_RCAR2) {
|
||||||
host->reset(host);
|
host->reset(host);
|
||||||
|
|
||||||
|
if (host->native_hotplug)
|
||||||
|
tmio_mmc_enable_mmc_irqs(host,
|
||||||
|
TMIO_STAT_CARD_REMOVE |
|
||||||
|
TMIO_STAT_CARD_INSERT);
|
||||||
|
}
|
||||||
|
|
||||||
host->set_clock(host, 0);
|
host->set_clock(host, 0);
|
||||||
break;
|
break;
|
||||||
case MMC_POWER_UP:
|
case MMC_POWER_UP:
|
||||||
@ -1185,10 +1196,6 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
|
|||||||
_host->set_clock(_host, 0);
|
_host->set_clock(_host, 0);
|
||||||
tmio_mmc_reset(_host);
|
tmio_mmc_reset(_host);
|
||||||
|
|
||||||
if (_host->native_hotplug)
|
|
||||||
tmio_mmc_enable_mmc_irqs(_host,
|
|
||||||
TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT);
|
|
||||||
|
|
||||||
spin_lock_init(&_host->lock);
|
spin_lock_init(&_host->lock);
|
||||||
mutex_init(&_host->ios_lock);
|
mutex_init(&_host->ios_lock);
|
||||||
|
|
||||||
|
@ -576,7 +576,7 @@ static void check_vub300_port_status(struct vub300_mmc_host *vub300)
|
|||||||
GET_SYSTEM_PORT_STATUS,
|
GET_SYSTEM_PORT_STATUS,
|
||||||
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
0x0000, 0x0000, &vub300->system_port_status,
|
0x0000, 0x0000, &vub300->system_port_status,
|
||||||
sizeof(vub300->system_port_status), HZ);
|
sizeof(vub300->system_port_status), 1000);
|
||||||
if (sizeof(vub300->system_port_status) == retval)
|
if (sizeof(vub300->system_port_status) == retval)
|
||||||
new_system_port_status(vub300);
|
new_system_port_status(vub300);
|
||||||
}
|
}
|
||||||
@ -1241,7 +1241,7 @@ static void __download_offload_pseudocode(struct vub300_mmc_host *vub300,
|
|||||||
SET_INTERRUPT_PSEUDOCODE,
|
SET_INTERRUPT_PSEUDOCODE,
|
||||||
USB_DIR_OUT | USB_TYPE_VENDOR |
|
USB_DIR_OUT | USB_TYPE_VENDOR |
|
||||||
USB_RECIP_DEVICE, 0x0000, 0x0000,
|
USB_RECIP_DEVICE, 0x0000, 0x0000,
|
||||||
xfer_buffer, xfer_length, HZ);
|
xfer_buffer, xfer_length, 1000);
|
||||||
kfree(xfer_buffer);
|
kfree(xfer_buffer);
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto copy_error_message;
|
goto copy_error_message;
|
||||||
@ -1284,7 +1284,7 @@ static void __download_offload_pseudocode(struct vub300_mmc_host *vub300,
|
|||||||
SET_TRANSFER_PSEUDOCODE,
|
SET_TRANSFER_PSEUDOCODE,
|
||||||
USB_DIR_OUT | USB_TYPE_VENDOR |
|
USB_DIR_OUT | USB_TYPE_VENDOR |
|
||||||
USB_RECIP_DEVICE, 0x0000, 0x0000,
|
USB_RECIP_DEVICE, 0x0000, 0x0000,
|
||||||
xfer_buffer, xfer_length, HZ);
|
xfer_buffer, xfer_length, 1000);
|
||||||
kfree(xfer_buffer);
|
kfree(xfer_buffer);
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto copy_error_message;
|
goto copy_error_message;
|
||||||
@ -1991,7 +1991,7 @@ static void __set_clock_speed(struct vub300_mmc_host *vub300, u8 buf[8],
|
|||||||
usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
||||||
SET_CLOCK_SPEED,
|
SET_CLOCK_SPEED,
|
||||||
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
0x00, 0x00, buf, buf_array_size, HZ);
|
0x00, 0x00, buf, buf_array_size, 1000);
|
||||||
if (retval != 8) {
|
if (retval != 8) {
|
||||||
dev_err(&vub300->udev->dev, "SET_CLOCK_SPEED"
|
dev_err(&vub300->udev->dev, "SET_CLOCK_SPEED"
|
||||||
" %dkHz failed with retval=%d\n", kHzClock, retval);
|
" %dkHz failed with retval=%d\n", kHzClock, retval);
|
||||||
@ -2013,14 +2013,14 @@ static void vub300_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||||||
usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
||||||
SET_SD_POWER,
|
SET_SD_POWER,
|
||||||
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
0x0000, 0x0000, NULL, 0, HZ);
|
0x0000, 0x0000, NULL, 0, 1000);
|
||||||
/* must wait for the VUB300 u-proc to boot up */
|
/* must wait for the VUB300 u-proc to boot up */
|
||||||
msleep(600);
|
msleep(600);
|
||||||
} else if ((ios->power_mode == MMC_POWER_UP) && !vub300->card_powered) {
|
} else if ((ios->power_mode == MMC_POWER_UP) && !vub300->card_powered) {
|
||||||
usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
||||||
SET_SD_POWER,
|
SET_SD_POWER,
|
||||||
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
0x0001, 0x0000, NULL, 0, HZ);
|
0x0001, 0x0000, NULL, 0, 1000);
|
||||||
msleep(600);
|
msleep(600);
|
||||||
vub300->card_powered = 1;
|
vub300->card_powered = 1;
|
||||||
} else if (ios->power_mode == MMC_POWER_ON) {
|
} else if (ios->power_mode == MMC_POWER_ON) {
|
||||||
@ -2275,14 +2275,14 @@ static int vub300_probe(struct usb_interface *interface,
|
|||||||
GET_HC_INF0,
|
GET_HC_INF0,
|
||||||
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
0x0000, 0x0000, &vub300->hc_info,
|
0x0000, 0x0000, &vub300->hc_info,
|
||||||
sizeof(vub300->hc_info), HZ);
|
sizeof(vub300->hc_info), 1000);
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto error5;
|
goto error5;
|
||||||
retval =
|
retval =
|
||||||
usb_control_msg(vub300->udev, usb_rcvctrlpipe(vub300->udev, 0),
|
usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
||||||
SET_ROM_WAIT_STATES,
|
SET_ROM_WAIT_STATES,
|
||||||
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
firmware_rom_wait_states, 0x0000, NULL, 0, HZ);
|
firmware_rom_wait_states, 0x0000, NULL, 0, 1000);
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto error5;
|
goto error5;
|
||||||
dev_info(&vub300->udev->dev,
|
dev_info(&vub300->udev->dev,
|
||||||
@ -2297,7 +2297,7 @@ static int vub300_probe(struct usb_interface *interface,
|
|||||||
GET_SYSTEM_PORT_STATUS,
|
GET_SYSTEM_PORT_STATUS,
|
||||||
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
0x0000, 0x0000, &vub300->system_port_status,
|
0x0000, 0x0000, &vub300->system_port_status,
|
||||||
sizeof(vub300->system_port_status), HZ);
|
sizeof(vub300->system_port_status), 1000);
|
||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
goto error4;
|
goto error4;
|
||||||
} else if (sizeof(vub300->system_port_status) == retval) {
|
} else if (sizeof(vub300->system_port_status) == retval) {
|
||||||
|
@ -147,8 +147,8 @@ config RESET_OXNAS
|
|||||||
bool
|
bool
|
||||||
|
|
||||||
config RESET_PISTACHIO
|
config RESET_PISTACHIO
|
||||||
bool "Pistachio Reset Driver" if COMPILE_TEST
|
bool "Pistachio Reset Driver"
|
||||||
default MACH_PISTACHIO
|
depends on MIPS || COMPILE_TEST
|
||||||
help
|
help
|
||||||
This enables the reset driver for ImgTec Pistachio SoCs.
|
This enables the reset driver for ImgTec Pistachio SoCs.
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ static int brcm_rescal_reset_set(struct reset_controller_dev *rcdev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = readl_poll_timeout(base + BRCM_RESCAL_STATUS, reg,
|
ret = readl_poll_timeout(base + BRCM_RESCAL_STATUS, reg,
|
||||||
!(reg & BRCM_RESCAL_STATUS_BIT), 100, 1000);
|
(reg & BRCM_RESCAL_STATUS_BIT), 100, 1000);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(data->dev, "time out on SATA/PCIe rescal\n");
|
dev_err(data->dev, "time out on SATA/PCIe rescal\n");
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -92,3 +92,29 @@ void __init socfpga_reset_init(void)
|
|||||||
for_each_matching_node(np, socfpga_early_reset_dt_ids)
|
for_each_matching_node(np, socfpga_early_reset_dt_ids)
|
||||||
a10_reset_init(np);
|
a10_reset_init(np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The early driver is problematic, because it doesn't register
|
||||||
|
* itself as a driver. This causes certain device links to prevent
|
||||||
|
* consumer devices from probing. The hacky solution is to register
|
||||||
|
* an empty driver, whose only job is to attach itself to the reset
|
||||||
|
* manager and call probe.
|
||||||
|
*/
|
||||||
|
static const struct of_device_id socfpga_reset_dt_ids[] = {
|
||||||
|
{ .compatible = "altr,rst-mgr", },
|
||||||
|
{ /* sentinel */ },
|
||||||
|
};
|
||||||
|
|
||||||
|
static int reset_simple_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver reset_socfpga_driver = {
|
||||||
|
.probe = reset_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "socfpga-reset",
|
||||||
|
.of_match_table = socfpga_reset_dt_ids,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
builtin_platform_driver(reset_socfpga_driver);
|
||||||
|
@ -20,6 +20,7 @@ static int tegra_bpmp_reset_common(struct reset_controller_dev *rstc,
|
|||||||
struct tegra_bpmp *bpmp = to_tegra_bpmp(rstc);
|
struct tegra_bpmp *bpmp = to_tegra_bpmp(rstc);
|
||||||
struct mrq_reset_request request;
|
struct mrq_reset_request request;
|
||||||
struct tegra_bpmp_message msg;
|
struct tegra_bpmp_message msg;
|
||||||
|
int err;
|
||||||
|
|
||||||
memset(&request, 0, sizeof(request));
|
memset(&request, 0, sizeof(request));
|
||||||
request.cmd = command;
|
request.cmd = command;
|
||||||
@ -30,7 +31,13 @@ static int tegra_bpmp_reset_common(struct reset_controller_dev *rstc,
|
|||||||
msg.tx.data = &request;
|
msg.tx.data = &request;
|
||||||
msg.tx.size = sizeof(request);
|
msg.tx.size = sizeof(request);
|
||||||
|
|
||||||
return tegra_bpmp_transfer(bpmp, &msg);
|
err = tegra_bpmp_transfer(bpmp, &msg);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
if (msg.rx.ret)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_bpmp_reset_module(struct reset_controller_dev *rstc,
|
static int tegra_bpmp_reset_module(struct reset_controller_dev *rstc,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user