Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932301AbcLNLt3 (ORCPT ); Wed, 14 Dec 2016 06:49:29 -0500 Received: from mail-he1eur01on0112.outbound.protection.outlook.com ([104.47.0.112]:38269 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753100AbcLNLtZ (ORCPT ); Wed, 14 Dec 2016 06:49:25 -0500 X-Greylist: delayed 58002 seconds by postgrey-1.27 at vger.kernel.org; Wed, 14 Dec 2016 06:49:24 EST Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=alexander.sverdlin@nokia.com; Subject: Re: [v5,1/6] usb: separate out sysdev pointer from usb_bus To: Sriram Dash , , References: <1479383028-27701-2-git-send-email-sriram.dash@nxp.com> CC: , , , , , , Arnd Bergmann , Grygorii Strashko , Sinjan Kumar , David Fisher , "Catalin Marinas" , "Thang Q. Nguyen" , Yoshihiro Shimoda , Stephen Boyd , Bjorn Andersson , "Ming Lei" , Jon Masters , Dann Frazier , Peter Chen From: Alexander Sverdlin Message-ID: <603b56ce-3d86-7639-977f-00730e5f21ec@nokia.com> Date: Tue, 13 Dec 2016 17:09:22 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.0 MIME-Version: 1.0 In-Reply-To: <1479383028-27701-2-git-send-email-sriram.dash@nxp.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [131.228.32.185] X-ClientProxiedBy: DB6PR1001CA0024.EURPRD10.PROD.OUTLOOK.COM (10.171.79.34) To VI1PR07MB1328.eurprd07.prod.outlook.com (10.164.92.142) X-MS-Office365-Filtering-Correlation-Id: b8225083-418c-4f17-3ec7-08d423726aad X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR07MB1328; X-Microsoft-Exchange-Diagnostics: 1;VI1PR07MB1328;3:kuNXGXXevtDvQb82mXJ77d7f+/pUrO888snWVdsi9Uzu9jXYcNrnHagKNeqL5QWcORJ4CkKNgyCmoumNWyMBa0LroPcoiyqSC1s0LAKn+t7NG4DajipdPru1PY1CpuP748T549m+br7msy3ka24fMxYNZYHMeI+NHf6kxQftEX5bsumcf1Wc7LmjZO400hxzfswKOZC+hHfckEDoxE70iKQMmWPh561RdmYz07Bhca1Hh6kRFbpuYbux7K4fVKc0u+/K4Vf/9WCGD9EJrhqkyQ==;25:mZ7MwffNtZXo8BKFfst7f95M38LiTppnulq6610CJYTm8bTXoLDxvYQUyr4eOH4tbDZ8u9UBEZmxiJTE/OwSZH8Y0KfN7Bp6bsn5vhmZBGmRExrdM65uR8/EuWqe7yWJWf8BLziIva9RSR5iyiplQD3CTqpB4wJKqXw5KZ3fFhdCqVHbW5aU7hKlc+iBotIgGymvksqhbcYwtNrja1Ig4wL4Jye4EtVYsdFRcNUK5R9srJ9I3nczLjEqVpxS7ItCr9YCyb5b31vEH73ddcqQOGhOmr0aS+KJXExXUjXshpah2JkBL3SeiT2j54uvRpFDp8R/vNMJaFiW3NJPr9d4bZ0fLwnbPqioLQ1iS1RDLnjFwSab489Y9S3IB3MVc8cDHVDq9udjdyIQ+bV2YAaoTsuyR3zPF/tNW09ocOysRdy3blrVGUTODjm8jSqCithCtYJRBXEhM4nyGVI+ZdoitQ== X-Microsoft-Exchange-Diagnostics: 1;VI1PR07MB1328;31:T+3Ha/1Nu86pG2NVZTWuj7GbKIOi+SKBxlSC0AJtJOXrZ5hCm+g2ZpAJQs/bm94nIWXhuIYI+L/q7eU4RgZ04QNRmDkyv8jUAG6vuZggmmV3jDwDwFKeHYxsLaq8+Mci7vFzjDbqBIxNSHr8HZtcbpuMgqTULyNSUZxR2twQN2y9Ix6l9XBA2NoNXyPF5bUfHjqsIBhzS/MBgSdeWPbc5S71UiOFH1RrH7btd4YLI8BoYaK38uEM9nvFQ3kyh4AX9iM4G2aOLPgucFkl89NQWw==;20:OGFcyt/H/1n03+dyIynfJMuN1C7fwkmMPIH8C2sijP7ub3QBJ2w8H8me0y3zR2DUpFQjRddUwR3NSGZmtjGyM1VqOTlid8yBNIclJpSk6+sNTo7nLRAW8tZxxePRs6/CCEeGE2/iZlNBPfP3vELtz+yBJVR8UdprFqKFdwz3H/1tOhctNvW552p5k9OPPxfXNiVncBvX2mVBEVCa1fP+n4J4nJ6FyofqdRy8a6m0YnhWXJVzEtKMcNtgr4G7Pl4mV2wsYmujSbJC6l5Bt3lqO44D38y3lrcIWwy/r3+9TTD88KA3JFINOISUx+AuuQdUicqjvXUcV0TFxLGrstPkpiYZVSIBjfg+BacQj64FE1+tirwvuiWWwm6N7tE7SVkl9jqY1K8mEEfefeDGyzoFUjUiKi6YQ0OSgyYzKLN/SIsnXipInTHz54pDB16NZRXCijTDZCfhw0bRcPtR3QlxsOAXtqXjeTrxq9lftFcr8TvgQSOYHg53vfJM6jcFcyM5 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917)(31051911155226)(185117386973197)(82608151540597)(198206253151910)(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026)(6041248)(20161123562025)(20161123564025)(20161123560025)(20161123555025)(6072148);SRVR:VI1PR07MB1328;BCL:0;PCL:0;RULEID:;SRVR:VI1PR07MB1328; X-Microsoft-Exchange-Diagnostics: 1;VI1PR07MB1328;4:Vgb3enuMLQ/+3iyW/fLtHT6m+oerYkXMO3bSxJDi3/Hb70pmFn5Y0OOp79JBNecgAIKE24MmBBjrllYAvHLvMDz9asP3fpo9nLUrqKOZPSNEBeRYBS0GAqKChXEByh1zAF+y/9F6DyDRk33iStV8XD0Vpcvy8+ZCItHvN6YG0fOLIidlb3EXoluMbBVPuJxJrmk3XkkycF5l0kMmwueF0qKm7/fq4RyOFZFkICRphREwMJBanjlxbM/IuGLajP/IQ0CihDbunDyUr20EBOnpmVuUzYWdXVK5KAq/EJ50EJ1WZ3XgFrkAuG2iql8A3sRfRFFkkToOxY9MXHven2/Jyx9guAKSY8B2D6OYXd3PewaOU3d9lKuRLwS1CsQrjV3UbYsYNySkawsJVEMn+3wOqGZaHMeYwdFqQYyhsL6KOWEA+FxtM2lsIEQEIsU23mVa2bTZKOYZGU0l3lTarLPOVZM/2Mh/AAZA0E69C1G6Lwi0nTz3+7O0qfFIC3T5RGI7O8bBkXuz8nZ7HE9dKtKg6h6+STY0wlCGgURvSOFSDBZXtcDsTq1rYiIphUcTvcQhPmQXeRQGHX+wZ+QEjhuQ5o2sjPydHUnCIfTAbYArsszue1z6Aksloa6WhBCGNmuO2yeeLcT3NtniVoR+tcs8IvhFXgwe1tefQh7EKyUH68Aqxps81PVdotPRUVc0QjjWgIKyGRoXTnoYlZsDl7ERGltbZuPKRgcm8+YR26D8u9r3hAzDISJ0X9EJsVS9yrd0LWBPiAJkTIdxiovNBCDdekauT9eVsr1r6IpRcBPPFTHH0F3MELqzFyl6sFiaBxzO X-Forefront-PRVS: 01559F388D X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(7916002)(39450400003)(39410400002)(39860400002)(39850400002)(39840400002)(199003)(189002)(24454002)(101416001)(83506001)(305945005)(76176999)(50986999)(68736007)(66066001)(54356999)(65806001)(65956001)(7736002)(2906002)(81156014)(8676002)(65826007)(47776003)(8666005)(189998001)(39060400001)(6486002)(2950100002)(77096006)(38730400001)(81166006)(92566002)(6116002)(3846002)(7416002)(5660300001)(4326007)(5001770100001)(90366009)(50466002)(36756003)(86362001)(4001350100001)(31696002)(64126003)(230700001)(97736004)(5890100001)(33646002)(31686004)(229853002)(2201001)(42186005)(23676002)(105586002)(106356001)(6666003)(7059030);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR07MB1328;H:[10.151.15.185];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA3TUIxMzI4OzIzOm42M2JOZkxnNUIrM0lqeFlMV0gvdE40NGUy?= =?utf-8?B?K2IrSEMwSWxCMTdWM2hFYnFScHQvcm9JZjJvdElKZTJkZlJNcXhBbHlWTnRM?= =?utf-8?B?S1VzMGpVdmtLTXF6eVhEVTB2bldjWWNzUXJvaDhrdDN2THZPUEh6MjFteEVt?= =?utf-8?B?Qm9kdnJ0bzZyQnArRWZpczhSUFNoNHdZaGY0RFc5OHdZbFBKWUZPeUwwOXBU?= =?utf-8?B?U0tzeW1KT1RYOUFuU0ZhZzRwbm9nNEZxOTF5QU5FeXRYSmhvczhUbjlmMk10?= =?utf-8?B?TllHNDZEZ2ZzQ0kwaW9Ldkl1ejFRY0lZejFjWnVoRzY2WEVwZzlaaGxMTXJY?= =?utf-8?B?YUxWU1BHWmpKRVNyQ3JLZ243eEp0Z0l5ZEF3R1BQUWNxemFiWmlYL2daNzlG?= =?utf-8?B?UXNZRTlrUjVCb0VBZENBT0JXTWYrZlpjNlNIYjVrSEUwc3hpNGxWc0xaZGRx?= =?utf-8?B?S09aa0E0WDJ6SEJENHJFVVJuL2dQZTE2ZEdqRmEvUzRvNDNSeHU1bXFaVGUw?= =?utf-8?B?bHZGT25rbG56RnoyNllPYXVSYU1seUFVZEt3N0RLMHRWMU1CNnNyTjFReVpu?= =?utf-8?B?STBNdlN6MDdoWEJQQU1Kb2VQZHkrcGZNU2pHdW9rRmNnbkh1ZXJxSVkvd1FX?= =?utf-8?B?MlArVUlWNFdvVWc3eUF1Y3RUWXhXb0VINlQwVWcyOEx2R04vSmdqSjU0U3Nw?= =?utf-8?B?QTlubEt5a09aQ0NFYjRTRzZra3ZrR0V4UURDU1R0OFhGc3F0OGNhdkdQN3lY?= =?utf-8?B?R2xlZTZLZG9USWtrdWhqZ3ZHVU44T2ZqNTJSU0l6bWh3aTJrNE5vZHE1V2xB?= =?utf-8?B?MExiUnkyQ1M0N0tHODdOMFJlUWlCaGl0RHdrMXJnd0ZlalMzbVhXeHp1Skgx?= =?utf-8?B?dDlwK2hPUkZKOUp5SVF3Z2tleVovelBOVmhmUGVQbzIydEZrNEIxcEhkZUxP?= =?utf-8?B?RHRBTDJhWHI0WllqWTJ6Q0ZTNkhJWGpKSzdNbVUweCtObHJ4MGY3QnZ0dkln?= =?utf-8?B?TWNRQXdFdWxSZDBuN0V0QjNHS1lENy80KzRHNHdLcHBJdDY1UFNQYTNGdTl1?= =?utf-8?B?Zk5JSUxnZEJ3ZFU1K0I1TWV6TzA5a2dKdE5tTFYrOTN0STFmbXl2Mi9HdUNP?= =?utf-8?B?NzFDc0NXTVloYmdiRm1KQUY0bVlvSVd5cUFLM2hYMDlYL015US96SVRHT1ZM?= =?utf-8?B?SzY3UlpDV1lPVGFRYW93dmtVZ1FSK3dFdXZyak9mS05VOGNXSlYwYzVXSm1o?= =?utf-8?B?M2sxbjd6RTZMRWliVnhOM2wyQjdsY1NLalQ4aEtHUWo3dTVaWHlMYXpnY1Za?= =?utf-8?B?dnprdW9lQW8rbUJlZnIxWmx2L2VsQXRsV1Jsc2dPZUtISVFtZnJ2MHlaSTk0?= =?utf-8?B?T3dXaGNoVStOZmZUU050dHVvVHJra0U3cDU2SU44M05pSlF1RFRRQk5xZmw1?= =?utf-8?B?aHVqOVdMM2ZTQmxieUFHclpzcG5jbFpHNWJlMHMzNDN6N0NxbUtHSUF6a0ZW?= =?utf-8?B?emFYZDVYMGhrNGYrSXlBbm43dDJlNDYyS0pGWDJNU1hOMTZSaysrWkRYK293?= =?utf-8?B?dWVGUmZRbzJsVXlOczc0WW1Ma2VEU09qdmdtSWhrRFE0OHArSFFuNS9ROVRw?= =?utf-8?B?ekV3QVphNHNJK0xzaVNjZUdMVllrRk5ROHJIWXNtM1pYUVFiRnM2UGw3Sm0w?= =?utf-8?B?Sm92V3VtM3djV25KaTFwUk5ncitXVmJQV3dBOXBSbU1pMUJTeFV5dmVRUmxX?= =?utf-8?B?cWtrVlVXd1JDVHcxY0d3MzIyak42T0JuTlhlUGZmZGs2WndCZFZJYjNXRFRS?= =?utf-8?B?dmlBUTIyRFpscDgrb3JoT20wOGY1TDhKdW9MUHF5K1lDZkQ5aU1wU2FWSkpj?= =?utf-8?B?SmhXQVBsRTJGRnJNM0FIMnZselNGdG02Nmxvc25Ic0xzZ0piVk5SN2llRHlh?= =?utf-8?B?ODNWT29DMzdiN0lnTlhWS0F5Q04rWXRpeWpycm00VFNUb1dPK2NqUDBnOG5J?= =?utf-8?B?OFlNT0tibVI3ZldEd3poVGZRNW55dUh2dlhPS2Z0cENmYlBtbmdvdXZvdzFh?= =?utf-8?Q?bNpBFhVDvUnucaKGjkoKzBOQp?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR07MB1328;6:wLG7+ZhVENh4WtJXjC323roUFpGQLm4ehX2L3K2T6iOSxZ5QicuX3pbwTPVkjPqTVQFXSKd4gv1KRJ60uDt5HTY95EKbY83AJZESNoDfxSZrN0QQaHOZYCMWsky6UPDyOf8NebU9beDfVyKNgK0jBY6Ui3l9z2MJhLDriq3qkxzhk7AlSpzd4NEekg0oFJaeUqwACNVXqlf73tDYSmAQxVTGlhpdGrMLWxCFyS5cYrhk5Yw7A0u9D7xh64CRhdpMUwKBqKt7niBFTXK1svSN0J39vFW2KRlVUuC/zVqp4pMz5DrBCssiyRLzDDEL0tNRHG+V6lkCORozXYSXAjX2ujw6atF7WE4XDA1/5+Bw8397j7Yqnai75yMAR7v3Tey0rKGlbcWltAwkcEqeEY+NmNtF+xeMtEXat84yjewbuzbVXspoTNgltilU0klChxOM9IT8RxzLERf7oloAw82v+A==;5:78EltpbNusDizZGCQFjxq5s9v1NfsXkKnzo36Nu+rZx2VZXVL3IcpEf2h1OAcBW2S4grVZHPex7Sq2UFaRpsNkOAYbqwI8r1igF79F9kV/uG6yL0yPqODRFBkqEylxP8uaUIGITjiaMcrD6X09Jh7A==;24:F1lr5yA3uWoui6ZGcuHvVOyUfdMSoo0tVc9HREDriWeiXQk5WNV2nEL8aUJfWQiOMSd5vcOWHAYG/MjdwK9X+Zd3FojSaRHRzRZ+5qMLmKc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR07MB1328;7:HXsoSzjTnD7LpismNk8A/94nU7KWHyTfjxIgPRxyXhRS4Vff0lSzJjS8kkMLuyWMdcFVuQgqDCiWUEfAHxA0XilU5gcVyEBy2WStbMriP/6vUscRN+4jqRStuzzUB7pmuy0HaiHahtVocsT39YwS0FI41fYTU86o5EJzVfnlHgZjB0RBBcrAdB1c5Pt2eb3mQdPlujxkDWf7Vl27laWFvZbx/Z8jPK2imCT5Xje0hP9ry+Yj/2qcn8fw4CrPBozBOIFDQptkvg7NhQLiqpAqs3wsZNo+CSeB8apciYbXh+iMEHDdsxRgC/UmzuTRyEfSpEtvS84SnAqOLKycEEvrKORR6nRlVzZZ0Ti887E3zk+ukyRYfbL2Me6bAg9UpVHdiOuCbaGpWLnY1s1Zxc0+wDTMfeKsyrDIvdlIi9eI/WTWkTQrLDBrQ03SNkbPtB/keTQr3Gtuh+/olk8u0XJOMg== X-OriginatorOrg: nokia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Dec 2016 16:09:26.8638 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR07MB1328 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 14538 Lines: 401 Hi! On 17/11/16 12:43, Sriram Dash wrote: > From: Arnd Bergmann > > For xhci-hcd platform device, all the DMA parameters are not > configured properly, notably dma ops for dwc3 devices. > > The idea here is that you pass in the parent of_node along with > the child device pointer, so it would behave exactly like the > parent already does. The difference is that it also handles all > the other attributes besides the mask. > > sysdev will represent the physical device, as seen from firmware > or bus.Splitting the usb_bus->controller field into the > Linux-internal device (used for the sysfs hierarchy, for printks > and for power management) and a new pointer (used for DMA, > DT enumeration and phy lookup) probably covers all that we really > need. > > Signed-off-by: Arnd Bergmann > Signed-off-by: Sriram Dash > Tested-by: Baolin Wang Successfully tested on arm64/axxia with DWC3 USB host, XHCIs properly inherit DMA configuration. Therefore: Tested-by: Alexander Sverdlin > Cc: Felipe Balbi > Cc: Grygorii Strashko > Cc: Sinjan Kumar > Cc: David Fisher > Cc: Catalin Marinas > Cc: "Thang Q. Nguyen" > Cc: Yoshihiro Shimoda > Cc: Stephen Boyd > Cc: Bjorn Andersson > Cc: Ming Lei > Cc: Jon Masters > Cc: Dann Frazier > Cc: Peter Chen > Cc: Leo Li > Tested-by: Brian Norris > --- > Changes in v5: > - No update > > Changes in v4: > - No update > > Changes in v3: > - usb is_device_dma_capable instead of directly accessing > dma props. > > Changes in v2: > - Split the patch wrt driver > > drivers/usb/core/buffer.c | 12 ++++++------ > drivers/usb/core/hcd.c | 48 ++++++++++++++++++++++++++++------------------- > drivers/usb/core/usb.c | 18 +++++++++--------- > include/linux/usb.h | 1 + > include/linux/usb/hcd.h | 3 +++ > 5 files changed, 48 insertions(+), 34 deletions(-) > > diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c > index 98e39f9..a6cd44a 100644 > --- a/drivers/usb/core/buffer.c > +++ b/drivers/usb/core/buffer.c > @@ -63,7 +63,7 @@ int hcd_buffer_create(struct usb_hcd *hcd) > int i, size; > > if (!IS_ENABLED(CONFIG_HAS_DMA) || > - (!hcd->self.controller->dma_mask && > + (!is_device_dma_capable(hcd->self.sysdev) && > !(hcd->driver->flags & HCD_LOCAL_MEM))) > return 0; > > @@ -72,7 +72,7 @@ int hcd_buffer_create(struct usb_hcd *hcd) > if (!size) > continue; > snprintf(name, sizeof(name), "buffer-%d", size); > - hcd->pool[i] = dma_pool_create(name, hcd->self.controller, > + hcd->pool[i] = dma_pool_create(name, hcd->self.sysdev, > size, size, 0); > if (!hcd->pool[i]) { > hcd_buffer_destroy(hcd); > @@ -127,7 +127,7 @@ void *hcd_buffer_alloc( > > /* some USB hosts just use PIO */ > if (!IS_ENABLED(CONFIG_HAS_DMA) || > - (!bus->controller->dma_mask && > + (!is_device_dma_capable(bus->sysdev) && > !(hcd->driver->flags & HCD_LOCAL_MEM))) { > *dma = ~(dma_addr_t) 0; > return kmalloc(size, mem_flags); > @@ -137,7 +137,7 @@ void *hcd_buffer_alloc( > if (size <= pool_max[i]) > return dma_pool_alloc(hcd->pool[i], mem_flags, dma); > } > - return dma_alloc_coherent(hcd->self.controller, size, dma, mem_flags); > + return dma_alloc_coherent(hcd->self.sysdev, size, dma, mem_flags); > } > > void hcd_buffer_free( > @@ -154,7 +154,7 @@ void hcd_buffer_free( > return; > > if (!IS_ENABLED(CONFIG_HAS_DMA) || > - (!bus->controller->dma_mask && > + (!is_device_dma_capable(bus->sysdev) && > !(hcd->driver->flags & HCD_LOCAL_MEM))) { > kfree(addr); > return; > @@ -166,5 +166,5 @@ void hcd_buffer_free( > return; > } > } > - dma_free_coherent(hcd->self.controller, size, addr, dma); > + dma_free_coherent(hcd->self.sysdev, size, addr, dma); > } > diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c > index 479e223..f8feb08 100644 > --- a/drivers/usb/core/hcd.c > +++ b/drivers/usb/core/hcd.c > @@ -1073,6 +1073,7 @@ static void usb_deregister_bus (struct usb_bus *bus) > static int register_root_hub(struct usb_hcd *hcd) > { > struct device *parent_dev = hcd->self.controller; > + struct device *sysdev = hcd->self.sysdev; > struct usb_device *usb_dev = hcd->self.root_hub; > const int devnum = 1; > int retval; > @@ -1119,7 +1120,7 @@ static int register_root_hub(struct usb_hcd *hcd) > /* Did the HC die before the root hub was registered? */ > if (HCD_DEAD(hcd)) > usb_hc_died (hcd); /* This time clean up */ > - usb_dev->dev.of_node = parent_dev->of_node; > + usb_dev->dev.of_node = sysdev->of_node; > } > mutex_unlock(&usb_bus_idr_lock); > > @@ -1465,19 +1466,19 @@ void usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) > dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; > if (IS_ENABLED(CONFIG_HAS_DMA) && > (urb->transfer_flags & URB_DMA_MAP_SG)) > - dma_unmap_sg(hcd->self.controller, > + dma_unmap_sg(hcd->self.sysdev, > urb->sg, > urb->num_sgs, > dir); > else if (IS_ENABLED(CONFIG_HAS_DMA) && > (urb->transfer_flags & URB_DMA_MAP_PAGE)) > - dma_unmap_page(hcd->self.controller, > + dma_unmap_page(hcd->self.sysdev, > urb->transfer_dma, > urb->transfer_buffer_length, > dir); > else if (IS_ENABLED(CONFIG_HAS_DMA) && > (urb->transfer_flags & URB_DMA_MAP_SINGLE)) > - dma_unmap_single(hcd->self.controller, > + dma_unmap_single(hcd->self.sysdev, > urb->transfer_dma, > urb->transfer_buffer_length, > dir); > @@ -1520,11 +1521,11 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, > return ret; > if (IS_ENABLED(CONFIG_HAS_DMA) && hcd->self.uses_dma) { > urb->setup_dma = dma_map_single( > - hcd->self.controller, > + hcd->self.sysdev, > urb->setup_packet, > sizeof(struct usb_ctrlrequest), > DMA_TO_DEVICE); > - if (dma_mapping_error(hcd->self.controller, > + if (dma_mapping_error(hcd->self.sysdev, > urb->setup_dma)) > return -EAGAIN; > urb->transfer_flags |= URB_SETUP_MAP_SINGLE; > @@ -1555,7 +1556,7 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, > } > > n = dma_map_sg( > - hcd->self.controller, > + hcd->self.sysdev, > urb->sg, > urb->num_sgs, > dir); > @@ -1570,12 +1571,12 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, > } else if (urb->sg) { > struct scatterlist *sg = urb->sg; > urb->transfer_dma = dma_map_page( > - hcd->self.controller, > + hcd->self.sysdev, > sg_page(sg), > sg->offset, > urb->transfer_buffer_length, > dir); > - if (dma_mapping_error(hcd->self.controller, > + if (dma_mapping_error(hcd->self.sysdev, > urb->transfer_dma)) > ret = -EAGAIN; > else > @@ -1585,11 +1586,11 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, > ret = -EAGAIN; > } else { > urb->transfer_dma = dma_map_single( > - hcd->self.controller, > + hcd->self.sysdev, > urb->transfer_buffer, > urb->transfer_buffer_length, > dir); > - if (dma_mapping_error(hcd->self.controller, > + if (dma_mapping_error(hcd->self.sysdev, > urb->transfer_dma)) > ret = -EAGAIN; > else > @@ -2511,8 +2512,8 @@ static void init_giveback_urb_bh(struct giveback_urb_bh *bh) > * Return: On success, a pointer to the created and initialized HCD structure. > * On failure (e.g. if memory is unavailable), %NULL. > */ > -struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver, > - struct device *dev, const char *bus_name, > +struct usb_hcd *__usb_create_hcd(const struct hc_driver *driver, > + struct device *sysdev, struct device *dev, const char *bus_name, > struct usb_hcd *primary_hcd) > { > struct usb_hcd *hcd; > @@ -2553,8 +2554,9 @@ struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver, > > usb_bus_init(&hcd->self); > hcd->self.controller = dev; > + hcd->self.sysdev = sysdev; > hcd->self.bus_name = bus_name; > - hcd->self.uses_dma = (dev->dma_mask != NULL); > + hcd->self.uses_dma = (sysdev->dma_mask != NULL); > > init_timer(&hcd->rh_timer); > hcd->rh_timer.function = rh_timer_func; > @@ -2569,6 +2571,14 @@ struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver, > "USB Host Controller"; > return hcd; > } > +EXPORT_SYMBOL_GPL(__usb_create_hcd); > + > +struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver, > + struct device *dev, const char *bus_name, > + struct usb_hcd *primary_hcd) > +{ > + return __usb_create_hcd(driver, dev, dev, bus_name, primary_hcd); > +} > EXPORT_SYMBOL_GPL(usb_create_shared_hcd); > > /** > @@ -2588,7 +2598,7 @@ EXPORT_SYMBOL_GPL(usb_create_shared_hcd); > struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, > struct device *dev, const char *bus_name) > { > - return usb_create_shared_hcd(driver, dev, bus_name, NULL); > + return __usb_create_hcd(driver, dev, dev, bus_name, NULL); > } > EXPORT_SYMBOL_GPL(usb_create_hcd); > > @@ -2715,7 +2725,7 @@ int usb_add_hcd(struct usb_hcd *hcd, > struct usb_device *rhdev; > > if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->usb_phy) { > - struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0); > + struct usb_phy *phy = usb_get_phy_dev(hcd->self.sysdev, 0); > > if (IS_ERR(phy)) { > retval = PTR_ERR(phy); > @@ -2733,7 +2743,7 @@ int usb_add_hcd(struct usb_hcd *hcd, > } > > if (IS_ENABLED(CONFIG_GENERIC_PHY) && !hcd->phy) { > - struct phy *phy = phy_get(hcd->self.controller, "usb"); > + struct phy *phy = phy_get(hcd->self.sysdev, "usb"); > > if (IS_ERR(phy)) { > retval = PTR_ERR(phy); > @@ -2781,7 +2791,7 @@ int usb_add_hcd(struct usb_hcd *hcd, > */ > retval = hcd_buffer_create(hcd); > if (retval != 0) { > - dev_dbg(hcd->self.controller, "pool alloc failed\n"); > + dev_dbg(hcd->self.sysdev, "pool alloc failed\n"); > goto err_create_buf; > } > > @@ -2791,7 +2801,7 @@ int usb_add_hcd(struct usb_hcd *hcd, > > rhdev = usb_alloc_dev(NULL, &hcd->self, 0); > if (rhdev == NULL) { > - dev_err(hcd->self.controller, "unable to allocate root hub\n"); > + dev_err(hcd->self.sysdev, "unable to allocate root hub\n"); > retval = -ENOMEM; > goto err_allocate_root_hub; > } > diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c > index 5921514..3abe83a 100644 > --- a/drivers/usb/core/usb.c > +++ b/drivers/usb/core/usb.c > @@ -450,9 +450,9 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, > * Note: calling dma_set_mask() on a USB device would set the > * mask for the entire HCD, so don't do that. > */ > - dev->dev.dma_mask = bus->controller->dma_mask; > - dev->dev.dma_pfn_offset = bus->controller->dma_pfn_offset; > - set_dev_node(&dev->dev, dev_to_node(bus->controller)); > + dev->dev.dma_mask = bus->sysdev->dma_mask; > + dev->dev.dma_pfn_offset = bus->sysdev->dma_pfn_offset; > + set_dev_node(&dev->dev, dev_to_node(bus->sysdev)); > dev->state = USB_STATE_ATTACHED; > dev->lpm_disable_count = 1; > atomic_set(&dev->urbnum, 0); > @@ -800,7 +800,7 @@ struct urb *usb_buffer_map(struct urb *urb) > if (!urb > || !urb->dev > || !(bus = urb->dev->bus) > - || !(controller = bus->controller)) > + || !(controller = bus->sysdev)) > return NULL; > > if (controller->dma_mask) { > @@ -838,7 +838,7 @@ void usb_buffer_dmasync(struct urb *urb) > || !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) > || !urb->dev > || !(bus = urb->dev->bus) > - || !(controller = bus->controller)) > + || !(controller = bus->sysdev)) > return; > > if (controller->dma_mask) { > @@ -872,7 +872,7 @@ void usb_buffer_unmap(struct urb *urb) > || !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) > || !urb->dev > || !(bus = urb->dev->bus) > - || !(controller = bus->controller)) > + || !(controller = bus->sysdev)) > return; > > if (controller->dma_mask) { > @@ -922,7 +922,7 @@ int usb_buffer_map_sg(const struct usb_device *dev, int is_in, > > if (!dev > || !(bus = dev->bus) > - || !(controller = bus->controller) > + || !(controller = bus->sysdev) > || !controller->dma_mask) > return -EINVAL; > > @@ -958,7 +958,7 @@ void usb_buffer_dmasync_sg(const struct usb_device *dev, int is_in, > > if (!dev > || !(bus = dev->bus) > - || !(controller = bus->controller) > + || !(controller = bus->sysdev) > || !controller->dma_mask) > return; > > @@ -986,7 +986,7 @@ void usb_buffer_unmap_sg(const struct usb_device *dev, int is_in, > > if (!dev > || !(bus = dev->bus) > - || !(controller = bus->controller) > + || !(controller = bus->sysdev) > || !controller->dma_mask) > return; > > diff --git a/include/linux/usb.h b/include/linux/usb.h > index eba1f10..f3f5d8a 100644 > --- a/include/linux/usb.h > +++ b/include/linux/usb.h > @@ -354,6 +354,7 @@ struct usb_devmap { > */ > struct usb_bus { > struct device *controller; /* host/master side hardware */ > + struct device *sysdev; /* as seen from firmware or bus */ > int busnum; /* Bus number (in order of reg) */ > const char *bus_name; /* stable id (PCI slot_name etc) */ > u8 uses_dma; /* Does the host controller use DMA? */ > diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h > index 66fc137..3860560 100644 > --- a/include/linux/usb/hcd.h > +++ b/include/linux/usb/hcd.h > @@ -437,6 +437,9 @@ extern int usb_hcd_alloc_bandwidth(struct usb_device *udev, > struct usb_host_interface *new_alt); > extern int usb_hcd_get_frame_number(struct usb_device *udev); > > +struct usb_hcd *__usb_create_hcd(const struct hc_driver *driver, > + struct device *sysdev, struct device *dev, const char *bus_name, > + struct usb_hcd *primary_hcd); > extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, > struct device *dev, const char *bus_name); > extern struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver, > -- Best regards, Alexander Sverdlin.