From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754516AbcKJAMx (ORCPT ); Wed, 9 Nov 2016 19:12:53 -0500 Received: from mail-db5eur01on0129.outbound.protection.outlook.com ([104.47.2.129]:17092 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751157AbcKJAMv (ORCPT ); Wed, 9 Nov 2016 19:12:51 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peda@axentia.se; From: Peter Rosin To: CC: Peter Rosin , Liam Girdwood , "Mark Brown" , Rob Herring , Mark Rutland , Nicolas Ferre , "Jaroslav Kysela" , Takashi Iwai , , Subject: [PATCH v2 1/3] ASoC: atmel_ssc_dai: if not provided, default to sensible TCMR/RCMR periods Date: Wed, 9 Nov 2016 23:40:56 +0100 Message-ID: <1478731258-26084-2-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1478731258-26084-1-git-send-email-peda@axentia.se> References: <1478731258-26084-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [217.210.101.82] X-ClientProxiedBy: DB4PR01CA0034.eurprd01.prod.exchangelabs.com (10.242.152.24) To VI1PR0201MB2319.eurprd02.prod.outlook.com (10.168.63.21) X-MS-Office365-Filtering-Correlation-Id: 20cba5af-a203-4e21-153f-08d408f1907c X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;2:2wZwwd/7kAQ97szmHpOss4hVtmLESJOxzuO0pNo6Tds1jynnydt2O/BSnpPRcq19HKLs4Y6yKdqLziakgA/d4lnVERbcCOF+xYw7AKEFdnwPecYxOj3PEz3l++V47gIuoQHD/8SMzAYIyXa/akxoL60mnqxDqNi4r4X9yAEZ2NE3FAEuQuCHRNkRLrW2AV861o6fThwJqgc4cF8WXnt6zA==;3:d0Hl2Eo3YZKLRyRlEy8rL+JvaIoYy/UyJcUl+BTKhFfOlKyVxfRXk3dTCn43JNla0cvM6cTaVlo8Ftp5/cTTGiPAOZVtYo5EVotsm12ds5m4F78leF2GERwvtvhHpHDgDkoiu14V8F4MDZiRWIAvkw==;25:ER19w3G9q8QCjOHWzOpM4zlZn2Oz5gRLFBElFXWAWEgMpma5LyfA70JUvrEuxxYObZ226afDwJ934A2c4us0dbIfkB94oYj8ZrdlXBubH8XtCwOcXvyW+jHyC1Npl/H9/dQ7Unt+26sLaB3EO4hAWRYYFAlukekRsA/rfei0Xa6CAAmbSAuPpG/sSmy67xeldJaJR1CoPFoegazwxJlE+CXDYjRdV7mBMbJOIFrWb5Be0zFD7R0BxBR5Q3utpr63ouSaiteEMpwagTaJnQ4noGrwCDYksCV9UwS4dd0Z10XlabVRgbhyNdO6eiDDKPKa+RrC2HSLb+aXhzCtONiZ+ttYDWp9eMms4Ns3kTt8PA0jCbJDLIY+FDwAnFtEsHSeGu0d7dNhObPPRv7Mqtgnc4aMuB9QkmzTyXWk7RadlZdA94zN+iO50LJKjweeVCvk X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0201MB2319; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;31:HWS8qb/v/RLpXRGdFloDFNv9AoXtVx2uUq2HMGxo0Nznm6tTJUJWveirHfNJSuwa9343raxihMBMmt4YAxPt2JEWdSn+BFbVXbYAn+MuNWxy2zpGFJeVRQ8r6JlH7PL+6jMlRSAae6gmPcK7PwdoAbBZec55Z8V9ULFCKcBlrI8uy7WiY1Ff4ecFcYlstBv0LJiYMRPqKdtYXMMfTPRzsispB2ZclCbIkf8FC3VjN5AZRhJJdRlYhcWaS9AtYv4q;4:KXn40H8yw63o0F83SN0hQ8dqHRj6eKIDYAQ/4MKOULeF4Gp7EXmJfZWbwEO9t0glDdT2MLt6SmYkHgnuQzZm6BKES2io4PI8fJKlmwpslFXHNwfwSCrvK9FNuEsxqWowYFYvIamoeH/sJjNyln4r2YM3vDbzQWwDH+AjdvONPeUmTQfUxq1kbHQO1ezl7Tn3SzV0KxVvq31sBatQW7zVQm6fODxPl5WoY4Y/HbzSx1vOB4Y5EmfI/M0iQ2wKOrx0vX4LsD5FgqP6zp498vJQm6pkCzcyIffySierdDZkWm68p3qvqyG5RHGUqMcKLl5f9CsinHDfn2mcDWxxmEAy1O2hvxm+8V0y+PEKHoHR4qh+wMVe+p79hAXp4je0mEq7RsdSB8MpWlQhshq/u84yfld7UArflfV6etoUd0XVRrMv3zZue11P9lc91RJiL8i9 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6043046)(6042046);SRVR:VI1PR0201MB2319;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0201MB2319; X-Forefront-PRVS: 0121F24F22 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6069001)(6009001)(7916002)(189002)(199003)(42186005)(76176999)(50986999)(5003940100001)(2906002)(68736007)(47776003)(5660300001)(106356001)(305945005)(66066001)(77096005)(7846002)(7736002)(105586002)(2351001)(189998001)(74482002)(86362001)(101416001)(33646002)(97736004)(50466002)(36756003)(92566002)(50226002)(6666003)(8676002)(586003)(4326007)(81156014)(48376002)(2950100002)(81166006)(110136003)(6916009)(7416002)(3846002)(6116002)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0201MB2319;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;VI1PR0201MB2319;23:Lum00UHIdDE5aU7JfW7UxZFI6g03wGuJB2rwspQ?= =?us-ascii?Q?290+wlOwT6A4kMIuirZs6U3mRlVdWXr8nGLBwXn5CY7J/scR1+EWye50sTHf?= =?us-ascii?Q?Y2ZlIxgV3Iw4w7gXise5gRB31SnlUX0ywcrFljpcyfQB1H4r2kxkMYVqD3iM?= =?us-ascii?Q?lJjzwT5S0Pt0t/Kl4L4Z1TDPH+9V6NsFWjHIRunZUeUs7agzHNcMTiss9w2K?= =?us-ascii?Q?+iKPnzbX/KUd/ZAjD1D9LSSuRUID6LqrGeixfQUubnvIEvrTMcmlteiUnHM1?= =?us-ascii?Q?X3ad0N3cfdVZa9jKa1yCEm8TYJ1t2IYlePQS4POkrqk6YDCSUtzKwq88uNL4?= =?us-ascii?Q?nJTsA7gX6icBgO3hnCC2pLDb72mAvPZinUksaaTDO96XWH9CnO96tPDtkzL1?= =?us-ascii?Q?1wff3sTXMZR51OjLWPB5Yx0mq/76E2rQ1s9kYmtUlHY4lwsanrlyWvD3W/3R?= =?us-ascii?Q?uW4ruuEJegcFawC+/cA4MOYNC1Y9OY/ytyivPiKcaPJ1PwBxnHh/Z40DPg2f?= =?us-ascii?Q?UgWdofXpA8/HDG8u5noQ23Cf9Qt1Qr31NG3h97zDQ8+9IfzSSAP1VBACyQiV?= =?us-ascii?Q?y1pXf80oBY7VEg63usgR11Ps3tJ37uezhh+apm+hOxbis57kl95eADLNZGUK?= =?us-ascii?Q?X6mRTFrsB6c+94CNvPf/ZTjRBaI7K8Sa2Pc3FgEieZdZTdysTaoESNfX9j9L?= =?us-ascii?Q?Tbk2OtoJZeWTWmlir+vvdeaX1mLWziSfmIf95Vdytld+JVbIVw8nIJatol39?= =?us-ascii?Q?SWcye7klMlDLYLLfwfz6OWwyKJ9yv0bfZbNMNG85Ttnz3BNY2kEhIb6Kpa9V?= =?us-ascii?Q?oJKBFEUOPHVIm3o6xhtcXiWZH58zEfj33frNXWGVPfPPTumDjTRovWxUEvgk?= =?us-ascii?Q?15pea5uwZyw97Bl/bHR4rEvhx9kI4D83EhYPXqVcum+d5iNsFqsW0B4sr/SU?= =?us-ascii?Q?V1/q1/MgAyje3sM5Zp2NDVYP0gWvwZXS4fiMIcoYEpazwW1l0MyC4L2lDxJV?= =?us-ascii?Q?xs+Xd+pqkY0ZlInRvQxVLMc34whKI1NhGjnIXhyB7x8nzUlWoR0QbvB0tmfg?= =?us-ascii?Q?9ek/u9RKIqkuxTz/VDKZXbuOEPBOAo6nhCXj4HzNKjJ9WHSeGgw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;6:9KRMgBhAZPR5kNwA+lXlh4pDSTT83GiKczJA2XoLNPCcBIhjv/6CiSm0Y5OyI/7/GoYEQ3rpfnJQ2Dp6Y28UtdBZlpnc6eHV3Ne5K1CxuCe3zjCVO8QyyufnIe6wkIBWKrtEAC6O3j7kl5iEqCTNNKQTlYO/g+BdpryxaxrCAukn+p8VjeDMHVmzLqZMcE9sG0dYmzxM25ypN/amuqbYXjFpGsyaWN8GdC4ApGXPiKRNSkOJ1WJX8MqlPvNoKXMLFx1XPema82MOneUNO8tKeBPiWiL+FxxrFZuiC2CldmvyMrS0rqrvEK/jwO10q78LtqO+JVklYiRPvxtnMfMl/Q==;5:eeyk96xgLeENDcwXJuTp8SGAXsEoAbYil685EKbIIDGZjYjU9o46NS6KjdzzXmv7yqvlh6DciBTgaUyARXXprSiH/40BbUWLDw/xT+PBiD7WIOilTpwVPAUHeBCFTL00TtuyrRC0qn3BQvHMWNLsMw==;24:zQvGygR0GeRnV1bszDOHRY9/3YxfTsOF/nn4NxRnZrnfLkdFTe5jMsmwIC8XDOL5B7lq22P9GanzZ29av00ApQJHPsXel2oBa+tjuNzgb/U= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;7:NqHY3YSrum6frWiljq8obUxzIz4zP/t7BwsuafoSyp/we7Uyrnp85uxolpRSXqF8y5yEugDLXCDfIATMZTBFFPNAwC4Ml9yLwt/EvU008oNBbSKVlySw7jtScJFS5X5IRZpaIN+aKMpfomFObsMFw2c5KJFYWqTX++Orp5nQY5gmobrgxNhTqO5FvbKp16UcDrfoWLBkH2dJRGAGR7NGWCf4Iz7JivEMmFjfU5LJ04hH5FNqhh9gE0wvxUnRjfoXswCHrkgUwFzXs5dE13XGiIX+O0TPztHH9Q5hrSN9/iKwYleN10L34YiOgTa7jPyinXcK+iqgqAUs8vqIDPM2/Pn5FJ4NUEB1HjvfxsoPYsQ= X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Nov 2016 22:41:35.4355 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0201MB2319 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When this driver runs the dai link frame clock, and noone has stated differently, assume that all the bits of a frame are used. This relieves the cpu dai users from the duty to fill in the dividers for the common case. Signed-off-by: Peter Rosin --- sound/soc/atmel/atmel_ssc_dai.c | 29 +++++++++++++++++++++++------ sound/soc/atmel/atmel_ssc_dai.h | 1 + 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index 16e459aedffe..674191508437 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c @@ -380,6 +380,7 @@ static void atmel_ssc_shutdown(struct snd_pcm_substream *substream, ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_SWRST)); /* Clear the SSC dividers */ ssc_p->cmr_div = ssc_p->tcmr_period = ssc_p->rcmr_period = 0; + ssc_p->forced_divider = 0; } spin_unlock_irq(&ssc_p->lock); @@ -429,10 +430,12 @@ static int atmel_ssc_set_dai_clkdiv(struct snd_soc_dai *cpu_dai, break; case ATMEL_SSC_TCMR_PERIOD: + ssc_p->forced_divider |= BIT(ATMEL_SSC_TCMR_PERIOD); ssc_p->tcmr_period = div; break; case ATMEL_SSC_RCMR_PERIOD: + ssc_p->forced_divider |= BIT(ATMEL_SSC_RCMR_PERIOD); ssc_p->rcmr_period = div; break; @@ -459,6 +462,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, u32 tfmr, rfmr, tcmr, rcmr; int ret; int fslen, fslen_ext; + u32 tcmr_period; + u32 rcmr_period; /* * Currently, there is only one set of dma params for @@ -470,6 +475,18 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, else dir = 1; + /* + * If the cpu dai should provide the frame clock, + * but noone has provided the dividers needed for + * that to work, fall back to something sensible. + */ + tcmr_period = ssc_p->tcmr_period; + if (!(ssc_p->forced_divider & BIT(ATMEL_SSC_TCMR_PERIOD))) + tcmr_period = snd_soc_params_to_frame_size(params) / 2 - 1; + rcmr_period = ssc_p->rcmr_period; + if (!(ssc_p->forced_divider & BIT(ATMEL_SSC_RCMR_PERIOD))) + rcmr_period = snd_soc_params_to_frame_size(params) / 2 - 1; + dma_params = ssc_p->dma_params[dir]; channels = params_channels(params); @@ -524,7 +541,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, fslen_ext = (bits - 1) / 16; fslen = (bits - 1) % 16; - rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) + rcmr = SSC_BF(RCMR_PERIOD, rcmr_period) | SSC_BF(RCMR_STTDLY, START_DELAY) | SSC_BF(RCMR_START, SSC_START_FALLING_RF) | SSC_BF(RCMR_CKI, SSC_CKI_RISING) @@ -540,7 +557,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | SSC_BF(RFMR_LOOP, 0) | SSC_BF(RFMR_DATLEN, (bits - 1)); - tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) + tcmr = SSC_BF(TCMR_PERIOD, tcmr_period) | SSC_BF(TCMR_STTDLY, START_DELAY) | SSC_BF(TCMR_START, SSC_START_FALLING_RF) | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) @@ -606,7 +623,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, fslen_ext = (bits - 1) / 16; fslen = (bits - 1) % 16; - rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) + rcmr = SSC_BF(RCMR_PERIOD, rcmr_period) | SSC_BF(RCMR_STTDLY, START_DELAY) | SSC_BF(RCMR_START, SSC_START_FALLING_RF) | SSC_BF(RCMR_CKI, SSC_CKI_RISING) @@ -623,7 +640,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | SSC_BF(RFMR_LOOP, 0) | SSC_BF(RFMR_DATLEN, (bits - 1)); - tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) + tcmr = SSC_BF(TCMR_PERIOD, tcmr_period) | SSC_BF(TCMR_STTDLY, START_DELAY) | SSC_BF(TCMR_START, SSC_START_FALLING_RF) | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) @@ -650,7 +667,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, * MCK divider, and the BCLK signal is output * on the SSC TK line. */ - rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) + rcmr = SSC_BF(RCMR_PERIOD, rcmr_period) | SSC_BF(RCMR_STTDLY, 1) | SSC_BF(RCMR_START, SSC_START_RISING_RF) | SSC_BF(RCMR_CKI, SSC_CKI_RISING) @@ -665,7 +682,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | SSC_BF(RFMR_LOOP, 0) | SSC_BF(RFMR_DATLEN, (bits - 1)); - tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) + tcmr = SSC_BF(TCMR_PERIOD, tcmr_period) | SSC_BF(TCMR_STTDLY, 1) | SSC_BF(TCMR_START, SSC_START_RISING_RF) | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) diff --git a/sound/soc/atmel/atmel_ssc_dai.h b/sound/soc/atmel/atmel_ssc_dai.h index 80b153857a88..75194f582131 100644 --- a/sound/soc/atmel/atmel_ssc_dai.h +++ b/sound/soc/atmel/atmel_ssc_dai.h @@ -113,6 +113,7 @@ struct atmel_ssc_info { unsigned short cmr_div; unsigned short tcmr_period; unsigned short rcmr_period; + unsigned int forced_divider; struct atmel_pcm_dma_params *dma_params[2]; struct atmel_ssc_state ssc_state; unsigned long mck_rate; -- 2.1.4